Junio C Hamano <gitster@xxxxxxxxx> writes: > Johannes Schindelin <Johannes.Schindelin@xxxxxx> writes: > ... >> Note that this affects creating bundles with --all; I contend that it >> is a good change to add the HEAD, so that cloning from such a bundle >> will give you a current branch. However, I had to fix t5701 as it >> assumed that --all does not imply HEAD. > > Sorry, but I do not understand. > >> diff --git a/t/t5701-clone-local.sh b/t/t5701-clone-local.sh >> index 8dfaaa4..14413f8 100755 >> --- a/t/t5701-clone-local.sh >> +++ b/t/t5701-clone-local.sh >> @@ -11,8 +11,8 @@ test_expect_success 'preparing origin repository' ' >> git clone --bare . x && >> test "$(GIT_CONFIG=a.git/config git config --bool core.bare)" = true && >> test "$(GIT_CONFIG=x/config git config --bool core.bare)" = true >> - git bundle create b1.bundle --all HEAD && >> - git bundle create b2.bundle --all && >> + git bundle create b1.bundle master HEAD && >> + git bundle create b2.bundle master && > > Because --all did not imply HEAD, "--all HEAD" used to be the way to say > "everything and HEAD". Now --all does imply HEAD, but it should still be > a valid way to say "everything, by the way, do not forget HEAD". > > Does the first one need to be changed to "master HEAD"? If "--all HEAD" > makes the rest of the test unhappy because HEAD is listed twice, perhaps > that is an independent bug that needs to be fixed? > > For that matter, what does "git bundle create x HEAD HEAD" do? Does it > list HEAD twice? With a patch like this, I think b1.bundle can be created with "--all HEAD" as before. Of course, to advertise that --all now includes HEAD and it is a _good_ thing, we may want to even say "git bundle create b1.bundle --all" in the above test sequence. Creation of b2.bundle should say "master" explicitly as in your patch, because the point of that bundle is to test a use of such HEAD-less bundle in the later parts of the script. -- >8 -- Subject: [PATCH] bundle: allow the same ref to be given more than once "git bundle create x master master" used to create a bundle that lists the same branch (master) twice. Cloning from such a bundle resulted in a needless warning "warning: Duplicated ref: refs/remotes/origin/master". Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx> --- bundle.c | 2 ++ object.c | 19 +++++++++++++++++++ object.h | 1 + 3 files changed, 22 insertions(+), 0 deletions(-) diff --git a/bundle.c b/bundle.c index daecd8e..b20f210 100644 --- a/bundle.c +++ b/bundle.c @@ -240,6 +240,8 @@ int create_bundle(struct bundle_header *header, const char *path, return error("unrecognized argument: %s'", argv[i]); } + object_array_remove_duplicates(&revs.pending); + for (i = 0; i < revs.pending.nr; i++) { struct object_array_entry *e = revs.pending.objects + i; unsigned char sha1[20]; diff --git a/object.c b/object.c index 50b6528..7e6a92c 100644 --- a/object.c +++ b/object.c @@ -268,3 +268,22 @@ void add_object_array_with_mode(struct object *obj, const char *name, struct obj objects[nr].mode = mode; array->nr = ++nr; } + +void object_array_remove_duplicates(struct object_array *array) +{ + int ref, src, dst; + struct object_array_entry *objects = array->objects; + + for (ref = 0; ref < array->nr - 1; ref++) { + for (src = ref + 1, dst = src; + src < array->nr; + src++) { + if (!strcmp(objects[ref].name, objects[src].name)) + continue; + if (src != dst) + objects[dst] = objects[src]; + dst++; + } + array->nr = dst; + } +} diff --git a/object.h b/object.h index 036bd66..3193916 100644 --- a/object.h +++ b/object.h @@ -71,5 +71,6 @@ int object_list_contains(struct object_list *list, struct object *obj); /* Object array handling .. */ void add_object_array(struct object *obj, const char *name, struct object_array *array); void add_object_array_with_mode(struct object *obj, const char *name, struct object_array *array, unsigned mode); +void object_array_remove_duplicates(struct object_array *); #endif /* OBJECT_H */ -- 1.6.1.208.g58df -- 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