From b2a6d1c6868b6d5e7d2b4fa9129341220a1e848a Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Sat, 17 Jan 2009 22:27:08 -0800 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 --- bundle.c | 2 ++ object.c | 19 +++++++++++++++++++ object.h | 1 + t/t5701-clone-local.sh | 2 +- 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/bundle.c b/bundle.c index daecd8e1c..b20f2101f 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 50b652800..7e6a92c88 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 036bd66fe..319391663 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 */ diff --git a/t/t5701-clone-local.sh b/t/t5701-clone-local.sh index 14413f851..fe0fda282 100755 --- a/t/t5701-clone-local.sh +++ b/t/t5701-clone-local.sh @@ -11,7 +11,7 @@ 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 master HEAD && + git bundle create b1.bundle --all && git bundle create b2.bundle master && mkdir dir && cp b1.bundle dir/b3 -- 2.30.2