diff options
author | Junio C Hamano <gitster@pobox.com> | 2009-02-10 21:31:19 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2009-02-10 21:31:19 -0800 |
commit | f1c8a48a2de69bfc9837c53f2c52ffbe7239dc3e (patch) | |
tree | dbf5e4b02e89a51e9bd00cea133c105a51e86302 | |
parent | 8c5514906a532f154aa0db1199f46bbdeeffb0ad (diff) | |
parent | d3bee161fef7820e83b44b899c531228a5546e87 (diff) | |
download | git-f1c8a48a2de69bfc9837c53f2c52ffbe7239dc3e.tar.gz git-f1c8a48a2de69bfc9837c53f2c52ffbe7239dc3e.tar.xz |
Merge branch 'lh/submodule-tree-traversal' (early part)
* 'lh/submodule-tree-traversal' (early part):
tree.c: allow read_tree_recursive() to traverse gitlink entries
-rw-r--r-- | archive.c | 2 | ||||
-rw-r--r-- | builtin-ls-tree.c | 9 | ||||
-rw-r--r-- | merge-recursive.c | 2 | ||||
-rw-r--r-- | tree.c | 28 |
4 files changed, 32 insertions, 9 deletions
@@ -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, diff --git a/builtin-ls-tree.c b/builtin-ls-tree.c index 5b63e6ead..fca46312f 100644 --- a/builtin-ls-tree.c +++ b/builtin-ls-tree.c @@ -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; diff --git a/merge-recursive.c b/merge-recursive.c index b97026bd5..ee853b990 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -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) @@ -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; |