diff options
author | Daniel Barkalow <barkalow@iabervon.org> | 2005-09-14 21:31:42 -0400 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2005-09-15 13:19:29 -0700 |
commit | 22c6e1d0f76f58a425065d3e8e447b6366ccd98c (patch) | |
tree | 7e1880d5ddc037e4b05bb576776426a70dafbdae /fetch.c | |
parent | 61420a2cb45c01e55d5bfc6abc632b9a41bb73a7 (diff) | |
download | git-22c6e1d0f76f58a425065d3e8e447b6366ccd98c.tar.gz git-22c6e1d0f76f58a425065d3e8e447b6366ccd98c.tar.xz |
[PATCH] Fix fetch completeness assumptions
Don't assume that any commit we have is complete; assume that any ref
we have is complete.
Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'fetch.c')
-rw-r--r-- | fetch.c | 28 |
1 files changed, 26 insertions, 2 deletions
@@ -62,11 +62,21 @@ static int process_tree(struct tree *tree) return 0; } +struct commit_list *complete = NULL; + static int process_commit(struct commit *commit) { if (parse_commit(commit)) return -1; + while (complete && complete->item->date >= commit->date) { + pop_most_recent_commit(&complete, 1); + } + + + if (commit->object.flags & 1) + return 0; + memcpy(current_commit_sha1, commit->object.sha1, 20); if (get_tree) { @@ -78,8 +88,6 @@ static int process_commit(struct commit *commit) if (get_history) { struct commit_list *parents = commit->parents; for (; parents; parents = parents->next) { - if (has_sha1_file(parents->item->object.sha1)) - continue; if (process(parents->item->object.sha1, commit_type)) return -1; @@ -126,6 +134,7 @@ static int process_object(struct object *obj) static int process(unsigned char *sha1, const char *type) { struct object *obj = lookup_object_type(sha1, type); + if (has_sha1_file(sha1)) { parse_object(sha1); /* We already have it, so we should scan it now. */ @@ -179,6 +188,19 @@ static int interpret_target(char *target, unsigned char *sha1) return -1; } +static int mark_complete(const char *path, const unsigned char *sha1) +{ + struct object *obj = parse_object(sha1); + while (obj->type == tag_type) { + obj = ((struct tag *) obj)->tagged; + parse_object(obj->sha1); + } + if (obj->type == commit_type) { + obj->flags |= 1; + insert_by_date((struct commit *) obj, &complete); + } + return 0; +} int pull(char *target) { @@ -191,6 +213,8 @@ int pull(char *target) return -1; } + for_each_ref(mark_complete); + if (interpret_target(target, sha1)) return error("Could not interpret %s as something to pull", target); |