Teach git list-objects logic not to follow gitlinks

This allows us to pack superprojects and thus clone them (but not yet
check them out on the receiving side - that's the next patch)

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Linus Torvalds 2007-04-12 21:03:39 -07:00 committed by Junio C Hamano
parent ab22aed3b7
commit ea376fa7f2

View File

@ -25,6 +25,37 @@ static void process_blob(struct rev_info *revs,
add_object(obj, p, path, name); add_object(obj, p, path, name);
} }
/*
* Processing a gitlink entry currently does nothing, since
* we do not recurse into the subproject.
*
* We *could* eventually add a flag that actually does that,
* which would involve:
* - is the subproject actually checked out?
* - if so, see if the subproject has already been added
* to the alternates list, and add it if not.
* - process the commit (or tag) the gitlink points to
* recursively.
*
* However, it's unclear whether there is really ever any
* reason to see superprojects and subprojects as such a
* "unified" object pool (potentially resulting in a totally
* humongous pack - avoiding which was the whole point of
* having gitlinks in the first place!).
*
* So for now, there is just a note that we *could* follow
* the link, and how to do it. Whether it necessarily makes
* any sense what-so-ever to ever do that is another issue.
*/
static void process_gitlink(struct rev_info *revs,
const unsigned char *sha1,
struct object_array *p,
struct name_path *path,
const char *name)
{
/* Nothing to do */
}
static void process_tree(struct rev_info *revs, static void process_tree(struct rev_info *revs,
struct tree *tree, struct tree *tree,
struct object_array *p, struct object_array *p,
@ -56,6 +87,9 @@ static void process_tree(struct rev_info *revs,
process_tree(revs, process_tree(revs,
lookup_tree(entry.sha1), lookup_tree(entry.sha1),
p, &me, entry.path); p, &me, entry.path);
else if (S_ISDIRLNK(entry.mode))
process_gitlink(revs, entry.sha1,
p, &me, entry.path);
else else
process_blob(revs, process_blob(revs,
lookup_blob(entry.sha1), lookup_blob(entry.sha1),