summaryrefslogtreecommitdiff
path: root/fetch-pack.c
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2005-10-19 21:55:49 -0700
committerJunio C Hamano <junkio@cox.net>2005-10-19 21:55:49 -0700
commitf1f0a2be9fe6e6734d900381de189c56e023be7e (patch)
treebf9433f09386b4e19a31ed42391a701c7d95c288 /fetch-pack.c
parentd6a73596e766b934e25182e7cdd8e6c2dbcc671e (diff)
downloadgit-f1f0a2be9fe6e6734d900381de189c56e023be7e.tar.gz
Be more careful tangling object chains while marking commits.
Also Johannes noticed we use parse_object to look up if we know that object already -- we should just ask the in-core object registry with lookup_object() for that. Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'fetch-pack.c')
-rw-r--r--fetch-pack.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/fetch-pack.c b/fetch-pack.c
index 4ee91f2ca2..8566ab1744 100644
--- a/fetch-pack.c
+++ b/fetch-pack.c
@@ -35,9 +35,12 @@ static int find_common(int fd[2], unsigned char *result_sha1,
* local ref), we tell them we have it but do not have to
* tell them about its ancestors, which they already know
* about.
+ *
+ * We use lookup_object here because we are only
+ * interested in the case we *know* the object is
+ * reachable and we have already scanned it.
*/
- if (has_sha1_file(remote) &&
- ((o = parse_object(remote)) != NULL) &&
+ if (((o = lookup_object(remote)) != NULL) &&
(o->flags & COMPLETE)) {
struct commit_list *p;
struct commit *commit =
@@ -120,10 +123,13 @@ static int mark_complete(const char *path, const unsigned char *sha1)
struct object *o = parse_object(sha1);
while (o && o->type == tag_type) {
+ struct tag *t = (struct tag *) o;
+ if (!t->tagged)
+ break; /* broken repository */
o->flags |= COMPLETE;
- o = parse_object(((struct tag *)o)->tagged->sha1);
+ o = parse_object(t->tagged->sha1);
}
- if (o->type == commit_type) {
+ if (o && o->type == commit_type) {
struct commit *commit = (struct commit *)o;
commit->object.flags |= COMPLETE;
insert_by_date(commit, &complete);