Merge branch 'jk/squelch-missing-link-warning-for-unreachable' into maint
authorJunio C Hamano <gitster@pobox.com>
Thu, 25 Jun 2015 18:02:09 +0000 (11:02 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 25 Jun 2015 18:02:10 +0000 (11:02 -0700)
Recent "git prune" traverses young unreachable objects to safekeep
old objects in the reachability chain from them, which sometimes
caused error messages that are unnecessarily alarming.

* jk/squelch-missing-link-warning-for-unreachable:
suppress errors on missing UNINTERESTING links
silence broken link warnings with revs->ignore_missing_links
add quieter versions of parse_{tree,commit}

commit.c
commit.h
list-objects.c
revision.c
t/t6501-freshen-objects.sh
tree.c
tree.h
index a8c7577d28a4b2a0b5fc13420f8a141871626087..0eee4107647c1fd0246b3c8d2e45a103ded844e5 100644 (file)
--- a/commit.c
+++ b/commit.c
@@ -353,7 +353,7 @@ int parse_commit_buffer(struct commit *item, const void *buffer, unsigned long s
        return 0;
 }
 
-int parse_commit(struct commit *item)
+int parse_commit_gently(struct commit *item, int quiet_on_missing)
 {
        enum object_type type;
        void *buffer;
@@ -366,7 +366,8 @@ int parse_commit(struct commit *item)
                return 0;
        buffer = read_sha1_file(item->object.sha1, &type, &size);
        if (!buffer)
-               return error("Could not read %s",
+               return quiet_on_missing ? -1 :
+                       error("Could not read %s",
                             sha1_to_hex(item->object.sha1));
        if (type != OBJ_COMMIT) {
                free(buffer);
index 9f189cb054266cd8f8c084853afbb678ca56c9e9..4789839bd02dd638ef03e7b42c4a1b3f9824455f 100644 (file)
--- a/commit.h
+++ b/commit.h
@@ -59,7 +59,11 @@ struct commit *lookup_commit_reference_by_name(const char *name);
 struct commit *lookup_commit_or_die(const unsigned char *sha1, const char *ref_name);
 
 int parse_commit_buffer(struct commit *item, const void *buffer, unsigned long size);
-int parse_commit(struct commit *item);
+int parse_commit_gently(struct commit *item, int quiet_on_missing);
+static inline int parse_commit(struct commit *item)
+{
+       return parse_commit_gently(item, 0);
+}
 void parse_commit_or_die(struct commit *item);
 
 /*
index 2a139b6ced68809f3a324f493325ec62c3a44044..41736d23727e2ff246d7000ee74a47ce80ea189d 100644 (file)
@@ -81,7 +81,7 @@ static void process_tree(struct rev_info *revs,
                die("bad tree object");
        if (obj->flags & (UNINTERESTING | SEEN))
                return;
-       if (parse_tree(tree) < 0) {
+       if (parse_tree_gently(tree, revs->ignore_missing_links) < 0) {
                if (revs->ignore_missing_links)
                        return;
                die("bad tree object %s", sha1_to_hex(obj->sha1));
index 7ddbaa083e9e59d3db270b96b47a20e6c99bdaa3..0b322b4fdc06724bdc3a664382ace20dbe17bb46 100644 (file)
@@ -817,7 +817,7 @@ static int add_parents_to_list(struct rev_info *revs, struct commit *commit,
                        parent = parent->next;
                        if (p)
                                p->object.flags |= UNINTERESTING;
-                       if (parse_commit(p) < 0)
+                       if (parse_commit_gently(p, 1) < 0)
                                continue;
                        if (p->parents)
                                mark_parents_uninteresting(p);
@@ -844,7 +844,7 @@ static int add_parents_to_list(struct rev_info *revs, struct commit *commit,
        for (parent = commit->parents; parent; parent = parent->next) {
                struct commit *p = parent->item;
 
-               if (parse_commit(p) < 0)
+               if (parse_commit_gently(p, revs->ignore_missing_links) < 0)
                        return -1;
                if (revs->show_source && !p->util)
                        p->util = commit->util;
index 157f3f91db1e54f3069e45a5087cdb6a8838c7db..2adf825076b9c8f774973dcc83686980dca7725b 100755 (executable)
@@ -129,4 +129,19 @@ for repack in '' true; do
        '
 done
 
+test_expect_success 'do not complain about existing broken links' '
+       cat >broken-commit <<-\EOF &&
+       tree 0000000000000000000000000000000000000001
+       parent 0000000000000000000000000000000000000002
+       author whatever <whatever@example.com> 1234 -0000
+       committer whatever <whatever@example.com> 1234 -0000
+
+       some message
+       EOF
+       commit=$(git hash-object -t commit -w broken-commit) &&
+       git gc 2>stderr &&
+       verbose git cat-file -e $commit &&
+       test_must_be_empty stderr
+'
+
 test_done
diff --git a/tree.c b/tree.c
index 58ebfce1bca609b0f7119eb210345c2065d02f40..413a5b1fa617df2f407d32ffdf78e58d9c42de58 100644 (file)
--- a/tree.c
+++ b/tree.c
@@ -204,7 +204,7 @@ int parse_tree_buffer(struct tree *item, void *buffer, unsigned long size)
        return 0;
 }
 
-int parse_tree(struct tree *item)
+int parse_tree_gently(struct tree *item, int quiet_on_missing)
 {
         enum object_type type;
         void *buffer;
@@ -214,7 +214,8 @@ int parse_tree(struct tree *item)
                return 0;
        buffer = read_sha1_file(item->object.sha1, &type, &size);
        if (!buffer)
-               return error("Could not read %s",
+               return quiet_on_missing ? -1 :
+                       error("Could not read %s",
                             sha1_to_hex(item->object.sha1));
        if (type != OBJ_TREE) {
                free(buffer);
diff --git a/tree.h b/tree.h
index d24125f84f01cddaecbd047b24e3a710014560a4..d24786cba2ca91d0bffd63490b4f71ac4a58de13 100644 (file)
--- a/tree.h
+++ b/tree.h
@@ -16,7 +16,11 @@ struct tree *lookup_tree(const unsigned char *sha1);
 
 int parse_tree_buffer(struct tree *item, void *buffer, unsigned long size);
 
-int parse_tree(struct tree *tree);
+int parse_tree_gently(struct tree *tree, int quiet_on_missing);
+static inline int parse_tree(struct tree *tree)
+{
+       return parse_tree_gently(tree, 0);
+}
 void free_tree_buffer(struct tree *tree);
 
 /* Parses and returns the tree in the given ent, chasing tags and commits. */