Skip to content

Commit

Permalink
Merge branch 'lh/submodule-tree-traversal' (early part)
Browse files Browse the repository at this point in the history
* 'lh/submodule-tree-traversal' (early part):
  tree.c: allow read_tree_recursive() to traverse gitlink entries
  • Loading branch information
gitster committed Feb 11, 2009
2 parents 8c55149 + d3bee16 commit f1c8a48
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 9 deletions.
2 changes: 1 addition & 1 deletion archive.c
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ static int write_archive_entry(const unsigned char *sha1, const char *base,
err = write_entry(args, sha1, path.buf, path.len, mode, NULL, 0);
if (err)
return err;
return READ_TREE_RECURSIVE;
return (S_ISDIR(mode) ? READ_TREE_RECURSIVE : 0);
}

buffer = sha1_file_to_archive(path_without_prefix, sha1, mode,
Expand Down
9 changes: 2 additions & 7 deletions builtin-ls-tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,13 +68,8 @@ static int show_tree(const unsigned char *sha1, const char *base, int baselen,
*
* Something similar to this incomplete example:
*
if (show_subprojects(base, baselen, pathname)) {
struct child_process ls_tree;
ls_tree.dir = base;
ls_tree.argv = ls-tree;
start_command(&ls_tree);
}
if (show_subprojects(base, baselen, pathname))
retval = READ_TREE_RECURSIVE;
*
*/
type = commit_type;
Expand Down
2 changes: 1 addition & 1 deletion merge-recursive.c
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,7 @@ static int save_files_dirs(const unsigned char *sha1,
string_list_insert(newpath, &o->current_file_set);
free(newpath);

return READ_TREE_RECURSIVE;
return (S_ISDIR(mode) ? READ_TREE_RECURSIVE : 0);
}

static int get_files_dirs(struct merge_options *o, struct tree *tree)
Expand Down
28 changes: 28 additions & 0 deletions tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,34 @@ int read_tree_recursive(struct tree *tree,
if (retval)
return -1;
continue;
} else if (S_ISGITLINK(entry.mode)) {
int retval;
struct strbuf path;
unsigned int entrylen;
struct commit *commit;

entrylen = tree_entry_len(entry.path, entry.sha1);
strbuf_init(&path, baselen + entrylen + 1);
strbuf_add(&path, base, baselen);
strbuf_add(&path, entry.path, entrylen);
strbuf_addch(&path, '/');

commit = lookup_commit(entry.sha1);
if (!commit)
die("Commit %s in submodule path %s not found",
sha1_to_hex(entry.sha1), path.buf);

if (parse_commit(commit))
die("Invalid commit %s in submodule path %s",
sha1_to_hex(entry.sha1), path.buf);

retval = read_tree_recursive(commit->tree,
path.buf, path.len,
stage, match, fn, context);
strbuf_release(&path);
if (retval)
return -1;
continue;
}
}
return 0;
Expand Down

0 comments on commit f1c8a48

Please sign in to comment.