Junio C Hamano <gitster@xxxxxxxxx> writes: > Here is my work in progress. It introduces "ignore-missing-negative" > option to the revision traversal machinery, and squelches the places we > currently complain loudly and die when we expect an object to be > available, when the color we are going to paint the object with is > UNINTERESTING. > > I have a mild suspicion that it may even be the right thing to ignore them > unconditionally, and it might even match the intention of Linus's original > code. That would make many hunks in this patch much simpler. > > The evidences behind this suspicion are found in a handful of places in > revision.c. mark_blob_uninteresting() does not complain if the caller > fails to find the blob. mark_tree_uninteresting() does not, either. > mark_parents_uninteresting() does not, either, and it even has a comment > that strongly suggests the original intention was not to care about > missing UNINTERESTING objects. Here is what I ended up with doing. It lost "ignore-missing-negative" so missing UNINTERESTING objects are non-error events more uniformly, but on the other hand get_reference() which is about the command line arguments always wants the named objects to exist, even if they are marked as UNINTERESTING. I'll send [PATCH 1/2] which is an update to my previous fix as a follow-up to this message. -- >8 -- Subject: [PATCH 2/2] revision traversal: allow UNINTERESTING objects to be missing Most of the existing codepaths were meant to treat missing uninteresting objects to be a silently ignored non-error, but there were a few places in handle_commit() and add_parents_to_list(), which are two key functions in the revision traversal machinery, that cared: - When a tag refers to an object that we do not have, we barfed. We ignore such a tag if it is painted as UNINTERESTING with this change. - When digging deeper into the ancestry chain of a commit that is already painted as UNINTERESTING, in order to paint its parents UNINTERESTING, we barfed if parse_parent() for a parent commit object failed. We can ignore such a parent commit object. Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx> --- revision.c | 7 +++++-- t/t5519-push-alternates.sh | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/revision.c b/revision.c index db60f06..ea8ba0f 100644 --- a/revision.c +++ b/revision.c @@ -183,8 +183,11 @@ static struct commit *handle_commit(struct rev_info *revs, struct object *object if (!tag->tagged) die("bad tag"); object = parse_object(tag->tagged->sha1); - if (!object) + if (!object) { + if (flags & UNINTERESTING) + return NULL; die("bad object %s", sha1_to_hex(tag->tagged->sha1)); + } } /* @@ -480,7 +483,7 @@ static int add_parents_to_list(struct rev_info *revs, struct commit *commit, struct commit *p = parent->item; parent = parent->next; if (parse_commit(p) < 0) - return -1; + continue; p->object.flags |= UNINTERESTING; if (p->parents) mark_parents_uninteresting(p); diff --git a/t/t5519-push-alternates.sh b/t/t5519-push-alternates.sh index 6dfc55a..96be523 100755 --- a/t/t5519-push-alternates.sh +++ b/t/t5519-push-alternates.sh @@ -103,4 +103,41 @@ test_expect_success 'bob works and pushes' ' ) ' +test_expect_success 'alice works and pushes yet again' ' + ( + # Alice does not care what Bob does. She does not + # even have to be aware of his existence. She just + # keeps working and pushing + cd alice-work && + echo more and more alice >file && + git commit -a -m sixth.1 && + echo more and more alice >>file && + git commit -a -m sixth.2 && + echo more and more alice >>file && + git commit -a -m sixth.3 && + git push ../alice-pub + ) +' + +test_expect_success 'bob works and pushes again' ' + ( + cd alice-pub && + git cat-file commit master >../bob-work/commit + ) + ( + # This time Bob does not pull from Alice, and + # the master branch at her public repository points + # at a commit Bob does not fully know about, but + # he happens to have the commit object (but not the + # necessary tree) in his repository from Alice. + # This should not prevent the push by Bob from + # succeeding. + cd bob-work && + git hash-object -t commit -w commit && + echo even more bob >file && + git commit -a -m seventh && + git push ../bob-pub + ) +' + test_done -- 1.6.1.1.273.g0e555 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html