mirror of
https://github.com/git/git.git
synced 2025-12-12 20:36:24 +01:00
tree.c: allow read_tree_recursive() to traverse gitlink entries
When the callback function invoked from read_tree_recursive() returns the value `READ_TREE_RECURSIVE` for a gitlink entry, the traversal will now continue into the tree connected to the gitlinked commit. This functionality can be used to allow inter-repository operations, but since the current users of read_tree_recursive() does not yet support such operations, they have been modified where necessary to make sure that they never return READ_TREE_RECURSIVE for gitlink entries (hence no change in behaviour should be introduces by this patch alone). Signed-off-by: Lars Hjemli <hjemli@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
621f1b4bcf
commit
d3bee161fe
28
tree.c
28
tree.c
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user