From: "Đoàn Trần Công Danh" <congdanhqx@gmail.com>
To: Jiang Xin <worldhello.net@gmail.com>
Cc: Junio C Hamano <gitster@pobox.com>,
Git List <git@vger.kernel.org>,
Jiang Xin <zhiyou.jx@alibaba-inc.com>
Subject: Re: [PATCH v3 1/2] bundle: lost objects when removing duplicate pendings
Date: Thu, 7 Jan 2021 22:37:17 +0700 [thread overview]
Message-ID: <X/cqrTgilKAW9P9G@danh.dev> (raw)
In-Reply-To: <20210107135025.2682-2-worldhello.net@gmail.com>
On 2021-01-07 08:50:24-0500, Jiang Xin <worldhello.net@gmail.com> wrote:
> From: Jiang Xin <zhiyou.jx@alibaba-inc.com>
>
> `git rev-list` will list one commit for the following command:
>
> $ git rev-list 'main^!'
> <tip-commit-of-main-branch>
>
> But providing the same rev-list args to `git bundle`, fail to create
> a bundle file.
>
> $ git bundle create - 'main^!'
> # v2 git bundle
> -<OID> <one-line-message>
>
> fatal: Refusing to create empty bundle.
>
> This is because when removing duplicate objects in function
> `object_array_remove_duplicates()`, one unique pending object which has
> the same name is deleted by mistake. The revision arg 'main^!' in the
> above example is parsed by `handle_revision_arg()`, and at lease two
> different objects will be appended to `revs.pending`, one points to the
> parent commit of the "main" branch, and the other points to the tip
> commit of the "main" branch. These two objects have the same name
> "main". Only one object is left with the name "main" after calling the
> function `object_array_remove_duplicates()`.
>
> And what's worse, when adding boundary commits into pending list, we use
> one-line commit message as names, and the arbitory names may surprise
> git-bundle.
>
> Only comparing objects themselves (".item") is also not good enough,
> because user may want to create a bundle with two identical objects but
> with different reference names, such as: "HEAD" and "refs/heads/main".
>
> Add new function `contains_object()` which compare both the address and
> the name of the object.
>
> Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
> ---
> object.c | 10 +-
> t/t6020-bundle-misc.sh | 488 +++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 494 insertions(+), 4 deletions(-)
> create mode 100755 t/t6020-bundle-misc.sh
>
> diff --git a/object.c b/object.c
> index 68f80b0b3d..98017bed8e 100644
> --- a/object.c
> +++ b/object.c
> @@ -412,15 +412,16 @@ void object_array_clear(struct object_array *array)
> }
>
> /*
> - * Return true iff array already contains an entry with name.
> + * Return true if array already contains an entry.
> */
> -static int contains_name(struct object_array *array, const char *name)
> +static int contains_object(struct object_array *array,
> + const struct object *item, const char *name)
> {
> unsigned nr = array->nr, i;
> struct object_array_entry *object = array->objects;
>
> for (i = 0; i < nr; i++, object++)
> - if (!strcmp(object->name, name))
> + if (item == object->item && !strcmp(object->name, name))
I think the comparison of `item == object->item` is a bit too fragile.
Yes, we all know `item` must be an entry of array.
However, it's separated from its usage may lead to misuse in the
future. Perhaps using `oidcmp` or adding a comment to indicate that
`item` must be an entry of `array`.
> return 1;
> return 0;
> }
> @@ -432,7 +433,8 @@ void object_array_remove_duplicates(struct object_array *array)
>
> array->nr = 0;
> for (src = 0; src < nr; src++) {
> - if (!contains_name(array, objects[src].name)) {
> + if (!contains_object(array, objects[src].item,
> + objects[src].name)) {
> if (src != array->nr)
> objects[array->nr] = objects[src];
> array->nr++;
> diff --git a/t/t6020-bundle-misc.sh b/t/t6020-bundle-misc.sh
> new file mode 100755
> index 0000000000..d15e67c8f7
> --- /dev/null
> +++ b/t/t6020-bundle-misc.sh
> @@ -0,0 +1,488 @@
> +#!/bin/sh
> +#
> +# Copyright (c) 2021 Jiang Xin
> +#
> +
> +test_description='Test git-bundle'
> +
> +GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
> +export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
> +
> +. ./test-lib.sh
> +
> +test_bundle_object_count () {
> + bundle=$1 &&
> + pack=${bundle%.bdl}.pack &&
> + convert_bundle_to_pack <"$bundle" >"$pack" &&
> + git index-pack "$pack" &&
> + git verify-pack -v "$pack" >verify.out &&
> + count=$(grep "^$OID_REGEX " verify.out | wc -l) &&
I think we can use 'grep -c' instead of `grep .. | wc -l`.
Or
grep "^$OID_REGEX " verify.out >verify.filtered &&
test_line_count = $2 verify.filtered
The same comment applied to test_thin_bundle_object_count
> + test $2 = $count && return 0
> + echo object count for $bundle is $count, not $2
> + return 1
> +}
> +
> +
> +test_thin_bundle_object_count () {
> + bundle=$1 &&
> + pack=${bundle%.bdl}.pack &&
> + convert_bundle_to_pack <"$bundle" |
> + test_must_fail git index-pack --stdin "$pack" &&
> + rm -f "$pack" &&
> + convert_bundle_to_pack <"$bundle" |
> + git index-pack --stdin --fix-thin "$pack" &&
> + git verify-pack -v "$pack" >verify.out &&
> + count=$(grep "^$OID_REGEX " verify.out | wc -l) &&
> + test $2 = $count && return 0
> + echo object count for $bundle is $count, not $2
> + return 1
> +}
> +
> +convert_bundle_to_pack () {
> + while read x && test -n "$x"
> + do
> + :;
> + done
> + cat
I'm not sure what you would expect in this case,
but in my experience, I replace this whole block with
sed '1,/^$/d'
also works.
IOW, I would apply this on top of your change:
----8<-----
diff --git a/t/t6020-bundle-misc.sh b/t/t6020-bundle-misc.sh
index 1f60fe180e..3a428454d7 100755
--- a/t/t6020-bundle-misc.sh
+++ b/t/t6020-bundle-misc.sh
@@ -16,10 +16,8 @@ test_bundle_object_count () {
convert_bundle_to_pack <"$bundle" >"$pack" &&
git index-pack "$pack" &&
git verify-pack -v "$pack" >verify.out &&
- count=$(grep "^$OID_REGEX " verify.out | wc -l) &&
- test $2 = $count && return 0
- echo object count for $bundle is $count, not $2
- return 1
+ grep "^$OID_REGEX " verify.out >verify.filtered &&
+ test_line_count = $2 verify.filtered
}
@@ -32,18 +30,12 @@ test_thin_bundle_object_count () {
convert_bundle_to_pack <"$bundle" |
git index-pack --stdin --fix-thin "$pack" &&
git verify-pack -v "$pack" >verify.out &&
- count=$(grep "^$OID_REGEX " verify.out | wc -l) &&
- test $2 = $count && return 0
- echo object count for $bundle is $count, not $2
- return 1
+ grep "^$OID_REGEX " verify.out >verify.filtered &&
+ test_line_count = $2 verify.filtered
}
convert_bundle_to_pack () {
- while read x && test -n "$x"
- do
- :;
- done
- cat
+ sed '1,/^$/d'
}
# Format the output of git commands to make a user-friendly and stable
----->8-----
For the below change, I haven't checked but I think test_commit should work, no?
-- Danh
> +}
> +
> +# Format the output of git commands to make a user-friendly and stable
> +# text. We can easily prepare the expect text without having to worry
> +# about future changes of the commit ID and spaces of the output.
> +make_user_friendly_and_stable_output () {
> + sed \
> + -e "s/ *\$//" \
> + -e "s/$A/<COMMIT-A>/g" \
> + -e "s/$B/<COMMIT-B>/g" \
> + -e "s/$C/<COMMIT-C>/g" \
> + -e "s/$D/<COMMIT-D>/g" \
> + -e "s/$E/<COMMIT-E>/g" \
> + -e "s/$F/<COMMIT-F>/g" \
> + -e "s/$G/<COMMIT-G>/g" \
> + -e "s/$H/<COMMIT-H>/g" \
> + -e "s/$I/<COMMIT-I>/g" \
> + -e "s/$J/<COMMIT-J>/g" \
> + -e "s/$K/<COMMIT-K>/g" \
> + -e "s/$L/<COMMIT-L>/g" \
> + -e "s/$M/<COMMIT-M>/g" \
> + -e "s/$N/<COMMIT-N>/g" \
> + -e "s/$O/<COMMIT-O>/g" \
> + -e "s/$P/<COMMIT-P>/g" \
> + -e "s/$(echo $A | cut -c1-7)[0-9a-f]*/<OID-A>/g" \
> + -e "s/$(echo $B | cut -c1-7)[0-9a-f]*/<OID-B>/g" \
> + -e "s/$(echo $C | cut -c1-7)[0-9a-f]*/<OID-C>/g" \
> + -e "s/$(echo $D | cut -c1-7)[0-9a-f]*/<OID-D>/g" \
> + -e "s/$(echo $E | cut -c1-7)[0-9a-f]*/<OID-E>/g" \
> + -e "s/$(echo $F | cut -c1-7)[0-9a-f]*/<OID-F>/g" \
> + -e "s/$(echo $G | cut -c1-7)[0-9a-f]*/<OID-G>/g" \
> + -e "s/$(echo $H | cut -c1-7)[0-9a-f]*/<OID-H>/g" \
> + -e "s/$(echo $I | cut -c1-7)[0-9a-f]*/<OID-I>/g" \
> + -e "s/$(echo $J | cut -c1-7)[0-9a-f]*/<OID-J>/g" \
> + -e "s/$(echo $K | cut -c1-7)[0-9a-f]*/<OID-K>/g" \
> + -e "s/$(echo $L | cut -c1-7)[0-9a-f]*/<OID-L>/g" \
> + -e "s/$(echo $M | cut -c1-7)[0-9a-f]*/<OID-M>/g" \
> + -e "s/$(echo $N | cut -c1-7)[0-9a-f]*/<OID-N>/g" \
> + -e "s/$(echo $O | cut -c1-7)[0-9a-f]*/<OID-O>/g" \
> + -e "s/$(echo $P | cut -c1-7)[0-9a-f]*/<OID-P>/g" \
> + -e "s/$TAG1/<TAG-1>/g" \
> + -e "s/$TAG2/<TAG-2>/g" \
> + -e "s/$TAG3/<TAG-3>/g" \
> + -e "s/$(echo $TAG1 | cut -c1-7)[0-9a-f]*/<OID-TAG-1>/g" \
> + -e "s/$(echo $TAG2 | cut -c1-7)[0-9a-f]*/<OID-TAG-2>/g" \
> + -e "s/$(echo $TAG3 | cut -c1-7)[0-9a-f]*/<OID-TAG-3>/g" \
> + -e "s/$ZERO_OID/<ZERO-OID>/g"
> +}
> +
> +# (C) (D, pull/1/head, topic/1)
> +# o --- o
> +# / \ (L)
> +# / \ o (H, topic/2) (M, tag:v2)
> +# / (F) \ / (N, tag:v3)
> +# / o --------- o (G, pull/2/head) o --- o --- o (release)
> +# / / \ \ / \
> +# o --- o --- o -------- o -- o ------------------ o ------- o --- o (main)
> +# (A) (B) (E, tag:v1) (I) (J) (K) (O) (P)
> +#
> +test_expect_success 'setup' '
> + # commit A & B
> + cat >main.txt <<-EOF &&
> + Commit A
> + EOF
> + git add main.txt &&
> + test_tick &&
> + git commit -m "Commit A" &&
> +
> + cat >main.txt <<-EOF &&
> + Commit B
> + EOF
> + git add main.txt &&
> + test_tick &&
> + git commit -m "Commit B" &&
> + A=$(git rev-parse HEAD~) &&
> + B=$(git rev-parse HEAD) &&
> +
> + # branch topic/1
> + git checkout -b topic/1 &&
> + cat >topic-1.txt <<-EOF &&
> + Commit C
> + EOF
> + git add topic-1.txt &&
> + test_tick &&
> + git commit -m "Commit C" &&
> +
> + cat >topic-1.txt <<-EOF &&
> + Commit D
> + EOF
> + git add -u &&
> + test_tick &&
> + git commit -m "Commit D" &&
> + git update-ref refs/pull/1/head HEAD &&
> + C=$(git rev-parse topic/1~) &&
> + D=$(git rev-parse topic/1) &&
> +
> + # commit E
> + git checkout main &&
> + cat >main.txt <<-EOF &&
> + Commit E
> + EOF
> + git add main.txt &&
> + test_tick &&
> + git commit -m "Commit E" &&
> + E=$(git rev-parse HEAD) &&
> + test_tick &&
> + git tag -m "v1" v1 HEAD &&
> + TAG1=$(git rev-parse refs/tags/v1) &&
> +
> + # branch topic/2
> + git checkout -b topic/2 &&
> + cat >topic-2.txt <<-EOF &&
> + Commit F
> + EOF
> + git add topic-2.txt &&
> + test_tick &&
> + git commit -m "Commit F" &&
> +
> + cat >topic-2.txt <<-EOF &&
> + Commit G
> + EOF
> + git add -u &&
> + test_tick &&
> + git commit -m "Commit G" &&
> + git update-ref refs/pull/2/head HEAD &&
> +
> + cat >topic-2.txt <<-EOF &&
> + Commit H
> + EOF
> + git add -u &&
> + test_tick &&
> + git commit -m "Commit H" &&
> + F=$(git rev-parse topic/2~2) &&
> + G=$(git rev-parse topic/2~) &&
> + H=$(git rev-parse topic/2) &&
> +
> + # merge commit I & J
> + git checkout main &&
> + test_tick &&
> + git merge --no-ff --no-edit topic/1 &&
> + test_tick &&
> + git merge --no-ff --no-edit refs/pull/2/head &&
> + I=$(git rev-parse HEAD~) &&
> + J=$(git rev-parse HEAD) &&
> +
> + # commit K
> + git checkout main &&
> + cat >main.txt <<-EOF &&
> + Commit K
> + EOF
> + git add main.txt &&
> + test_tick &&
> + git commit -m "Commit K" &&
> + K=$(git rev-parse HEAD) &&
> +
> + # branch release
> + git checkout -b release &&
> + cat >release.txt <<-EOF &&
> + Commit L
> + EOF
> + git add release.txt &&
> + test_tick &&
> + git commit -m "Commit L" &&
> +
> + cat >release.txt <<-EOF &&
> + Commit M
> + EOF
> + git add -u &&
> + test_tick &&
> + git commit -m "Commit M" &&
> + test_tick &&
> + git tag -m "v2" v2 HEAD &&
> +
> + cat >release.txt <<-EOF &&
> + Commit N
> + EOF
> + git add -u &&
> + test_tick &&
> + git commit -m "Commit N" &&
> + test_tick &&
> + git tag -m "v3" v3 HEAD &&
> + L=$(git rev-parse HEAD~2) &&
> + M=$(git rev-parse HEAD~) &&
> + N=$(git rev-parse HEAD) &&
> + TAG2=$(git rev-parse refs/tags/v2) &&
> + TAG3=$(git rev-parse refs/tags/v3) &&
> +
> + # merge commit O
> + git checkout main &&
> + test_tick &&
> + git merge --no-ff --no-edit tags/v2 &&
> + O=$(git rev-parse HEAD) &&
> +
> + # commit P
> + git checkout main &&
> + cat >main.txt <<-EOF &&
> + Commit P
> + EOF
> + git add main.txt &&
> + test_tick &&
> + git commit -m "Commit P" &&
> + P=$(git rev-parse HEAD)
> +'
> +
> +test_expect_success 'create bundle from special rev: main^!' '
> + git bundle create special-rev.bdl "main^!" &&
> +
> + git bundle list-heads special-rev.bdl |
> + make_user_friendly_and_stable_output >actual &&
> + cat >expect <<-EOF &&
> + <COMMIT-P> refs/heads/main
> + EOF
> + test_i18ncmp expect actual &&
> +
> + git bundle verify special-rev.bdl |
> + make_user_friendly_and_stable_output >actual &&
> + cat >expect <<-EOF &&
> + The bundle contains this ref:
> + <COMMIT-P> refs/heads/main
> + The bundle requires this ref:
> + <COMMIT-O>
> + EOF
> + test_i18ncmp expect actual &&
> +
> + test_bundle_object_count special-rev.bdl 3
> +'
> +
> +test_expect_success 'create bundle with --max-count option' '
> + git bundle create max-count.bdl --max-count 1 \
> + main \
> + "^release" \
> + refs/tags/v1 \
> + refs/pull/1/head \
> + refs/pull/2/head &&
> +
> + git bundle list-heads max-count.bdl |
> + make_user_friendly_and_stable_output >actual &&
> + cat >expect <<-EOF &&
> + <COMMIT-P> refs/heads/main
> + <TAG-1> refs/tags/v1
> + EOF
> + test_i18ncmp expect actual &&
> +
> + git bundle verify max-count.bdl |
> + make_user_friendly_and_stable_output >actual &&
> + cat >expect <<-EOF &&
> + The bundle contains these 2 refs:
> + <COMMIT-P> refs/heads/main
> + <TAG-1> refs/tags/v1
> + The bundle requires this ref:
> + <COMMIT-O>
> + EOF
> + test_i18ncmp expect actual &&
> +
> + test_bundle_object_count max-count.bdl 4
> +'
> +
> +test_expect_success 'create bundle with --since option' '
> + git bundle create since.bdl \
> + --since "Thu Apr 7 15:26:13 2005 -0700" \
> + --all &&
> +
> + git bundle list-heads since.bdl |
> + make_user_friendly_and_stable_output >actual &&
> + cat >expect <<-EOF &&
> + <COMMIT-P> refs/heads/main
> + <COMMIT-N> refs/heads/release
> + <TAG-2> refs/tags/v2
> + <TAG-3> refs/tags/v3
> + <COMMIT-P> HEAD
> + EOF
> + test_i18ncmp expect actual &&
> +
> + git bundle verify since.bdl |
> + make_user_friendly_and_stable_output >actual &&
> + cat >expect <<-EOF &&
> + The bundle contains these 5 refs:
> + <COMMIT-P> refs/heads/main
> + <COMMIT-N> refs/heads/release
> + <TAG-2> refs/tags/v2
> + <TAG-3> refs/tags/v3
> + <COMMIT-P> HEAD
> + The bundle requires these 2 refs:
> + <COMMIT-L>
> + <COMMIT-K>
> + EOF
> + test_i18ncmp expect actual &&
> +
> + test_thin_bundle_object_count since.bdl 16
> +'
> +
> +test_expect_success 'create bundle 1 - no prerequisites' '
> + git bundle create 1.bdl topic/1 topic/2 &&
> +
> + cat >expect <<-EOF &&
> + The bundle contains these 2 refs:
> + <COMMIT-D> refs/heads/topic/1
> + <COMMIT-H> refs/heads/topic/2
> + The bundle records a complete history.
> + EOF
> +
> + # verify bundle, which has no prerequisites
> + git bundle verify 1.bdl |
> + make_user_friendly_and_stable_output >actual &&
> + test_i18ncmp expect actual &&
> +
> + test_bundle_object_count 1.bdl 24
> +'
> +
> +test_expect_success 'create bundle 2 - has prerequisites' '
> + git bundle create 2.bdl \
> + --ignore-missing \
> + ^topic/deleted \
> + ^$D \
> + ^topic/2 \
> + release &&
> +
> + cat >expect <<-EOF &&
> + The bundle contains this ref:
> + <COMMIT-N> refs/heads/release
> + The bundle requires these 3 refs:
> + <COMMIT-D>
> + <COMMIT-E>
> + <COMMIT-G>
> + EOF
> +
> + git bundle verify 2.bdl |
> + make_user_friendly_and_stable_output >actual &&
> + test_i18ncmp expect actual &&
> +
> + test_bundle_object_count 2.bdl 16
> +'
> +
> +test_expect_success 'fail to verify bundle without prerequisites' '
> + git init --bare test1.git &&
> +
> + cat >expect <<-EOF &&
> + error: Repository lacks these prerequisite commits:
> + error: <COMMIT-D>
> + error: <COMMIT-E>
> + error: <COMMIT-G>
> + EOF
> +
> + test_must_fail git -C test1.git bundle verify ../2.bdl 2>&1 |
> + make_user_friendly_and_stable_output >actual &&
> + test_i18ncmp expect actual
> +'
> +
> +test_expect_success 'create bundle 3 - two refs, same object' '
> + git bundle create --version=3 3.bdl \
> + ^release \
> + ^topic/1 \
> + ^topic/2 \
> + main \
> + HEAD &&
> +
> + cat >expect <<-EOF &&
> + The bundle contains these 2 refs:
> + <COMMIT-P> refs/heads/main
> + <COMMIT-P> HEAD
> + The bundle requires these 2 refs:
> + <COMMIT-M>
> + <COMMIT-K>
> + EOF
> +
> + git bundle verify 3.bdl |
> + make_user_friendly_and_stable_output >actual &&
> + test_i18ncmp expect actual &&
> +
> + test_bundle_object_count 3.bdl 4
> +'
> +
> +test_expect_success 'create bundle 4 - with tags' '
> + git bundle create 4.bdl \
> + ^main \
> + ^release \
> + ^topic/1 \
> + ^topic/2 \
> + --all &&
> +
> + cat >expect <<-EOF &&
> + The bundle contains these 3 refs:
> + <TAG-1> refs/tags/v1
> + <TAG-2> refs/tags/v2
> + <TAG-3> refs/tags/v3
> + The bundle records a complete history.
> + EOF
> +
> + git bundle verify 4.bdl |
> + make_user_friendly_and_stable_output >actual &&
> + test_i18ncmp expect actual &&
> +
> + test_bundle_object_count 4.bdl 3
> +'
> +
> +test_expect_success 'clone from bundle' '
> + git clone --mirror 1.bdl mirror.git &&
> + git -C mirror.git show-ref |
> + make_user_friendly_and_stable_output >actual &&
> + cat >expect <<-EOF &&
> + <COMMIT-D> refs/heads/topic/1
> + <COMMIT-H> refs/heads/topic/2
> + EOF
> + test_cmp expect actual &&
> +
> + git -C mirror.git fetch ../2.bdl "+refs/*:refs/*" &&
> + git -C mirror.git show-ref |
> + make_user_friendly_and_stable_output >actual &&
> + cat >expect <<-EOF &&
> + <COMMIT-N> refs/heads/release
> + <COMMIT-D> refs/heads/topic/1
> + <COMMIT-H> refs/heads/topic/2
> + EOF
> + test_cmp expect actual &&
> +
> + git -C mirror.git fetch ../3.bdl "+refs/*:refs/*" &&
> + git -C mirror.git show-ref |
> + make_user_friendly_and_stable_output >actual &&
> + cat >expect <<-EOF &&
> + <COMMIT-P> refs/heads/main
> + <COMMIT-N> refs/heads/release
> + <COMMIT-D> refs/heads/topic/1
> + <COMMIT-H> refs/heads/topic/2
> + EOF
> + test_cmp expect actual &&
> +
> + git -C mirror.git fetch ../4.bdl "+refs/*:refs/*" &&
> + git -C mirror.git show-ref |
> + make_user_friendly_and_stable_output >actual &&
> + cat >expect <<-EOF &&
> + <COMMIT-P> refs/heads/main
> + <COMMIT-N> refs/heads/release
> + <COMMIT-D> refs/heads/topic/1
> + <COMMIT-H> refs/heads/topic/2
> + <TAG-1> refs/tags/v1
> + <TAG-2> refs/tags/v2
> + <TAG-3> refs/tags/v3
> + EOF
> + test_cmp expect actual
> +'
> +
> +test_done
> --
> 2.30.0.2.g06d2f50715
>
--
Danh
next prev parent reply other threads:[~2021-01-07 15:38 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-03 9:54 [PATCH] bundle: arguments can be read from stdin Jiang Xin
2021-01-04 23:41 ` Junio C Hamano
2021-01-05 16:30 ` [PATCH v2 1/2] bundle: lost objects when removing duplicate pendings Jiang Xin
2021-01-05 16:30 ` [PATCH v2 2/2] bundle: arguments can be read from stdin Jiang Xin
2021-01-07 13:50 ` [PATCH v3 0/2] improvements for git-bundle Jiang Xin
2021-01-07 13:50 ` [PATCH v3 1/2] bundle: lost objects when removing duplicate pendings Jiang Xin
2021-01-07 15:37 ` Đoàn Trần Công Danh [this message]
2021-01-08 13:14 ` Jiang Xin
2021-01-08 14:45 ` [PATCH v4 0/2] Improvements for git-bundle Jiang Xin
2021-01-08 14:45 ` [PATCH v4 1/2] bundle: lost objects when removing duplicate pendings Jiang Xin
2021-01-09 2:10 ` Junio C Hamano
2021-01-09 13:32 ` Jiang Xin
2021-01-09 22:02 ` Junio C Hamano
2021-01-10 14:30 ` [PATCH v5 0/3] improvements for git-bundle Jiang Xin
2021-01-10 14:30 ` [PATCH v5 1/3] test: add helper functions " Jiang Xin
2021-01-11 20:09 ` Junio C Hamano
2021-01-12 2:27 ` [PATCH v6 0/3] improvements " Jiang Xin
2021-01-12 2:27 ` [PATCH v6 1/3] test: add helper functions " Jiang Xin
2021-05-26 18:49 ` Runaway sed memory use in test on older sed+glibc (was "Re: [PATCH v6 1/3] test: add helper functions for git-bundle") Ævar Arnfjörð Bjarmason
2021-05-27 11:52 ` Jiang Xin
2021-05-27 12:19 ` Ævar Arnfjörð Bjarmason
2021-05-27 13:48 ` Jeff King
2021-05-27 19:19 ` Felipe Contreras
2021-06-01 9:45 ` Jiang Xin
2021-06-01 9:42 ` Jiang Xin
2021-06-01 11:50 ` Ævar Arnfjörð Bjarmason
2021-06-01 13:20 ` Jiang Xin
2021-06-01 14:49 ` [PATCH 1/2] t6020: fix bash incompatible issue Jiang Xin
2021-06-01 14:49 ` [PATCH 2/2] t6020: do not mangle trailing spaces in output Jiang Xin
2021-06-05 17:02 ` Ævar Arnfjörð Bjarmason
2021-06-12 5:07 ` [PATCH v2 0/4] Fixed t6020 bash compatible issue and fixed wrong sideband suffix issue Jiang Xin
2021-06-14 4:10 ` Junio C Hamano
2021-06-15 3:11 ` Jiang Xin
2021-06-17 3:14 ` [PATCH v3] t6020: fix incompatible parameter expansion Jiang Xin
2021-06-21 8:41 ` Ævar Arnfjörð Bjarmason
2021-06-12 5:07 ` [PATCH v2 1/4] t6020: fix bash incompatible issue Jiang Xin
2021-06-12 5:07 ` [PATCH v2 2/4] test: refactor create_commits_in() for t5411 and t5548 Jiang Xin
2021-06-12 5:07 ` [PATCH v2 3/4] sideband: append suffix for message whose CR in next pktline Jiang Xin
2021-06-13 7:47 ` Ævar Arnfjörð Bjarmason
2021-06-14 3:50 ` Junio C Hamano
2021-06-14 11:51 ` Jiang Xin
2021-06-15 1:17 ` Junio C Hamano
2021-06-15 1:47 ` Jiang Xin
2021-06-15 2:11 ` Nicolas Pitre
2021-06-15 3:04 ` Jiang Xin
2021-06-15 3:26 ` Nicolas Pitre
2021-06-15 4:46 ` Junio C Hamano
2021-06-15 7:17 ` Jiang Xin
2021-06-15 14:46 ` Nicolas Pitre
2021-06-12 5:07 ` [PATCH v2 4/4] test: compare raw output, not mangle tabs and spaces Jiang Xin
2021-01-12 2:27 ` [PATCH v6 2/3] bundle: lost objects when removing duplicate pendings Jiang Xin
2021-01-12 2:27 ` [PATCH v6 3/3] bundle: arguments can be read from stdin Jiang Xin
2021-01-10 14:30 ` [PATCH v5 2/3] bundle: lost objects when removing duplicate pendings Jiang Xin
2021-01-11 20:12 ` Junio C Hamano
2021-01-10 14:30 ` [PATCH v5 3/3] bundle: arguments can be read from stdin Jiang Xin
2021-01-09 15:09 ` [PATCH v4 1/2] bundle: lost objects when removing duplicate pendings Jiang Xin
2021-01-09 22:02 ` Junio C Hamano
2021-01-08 14:45 ` [PATCH v4 2/2] bundle: arguments can be read from stdin Jiang Xin
2021-01-09 2:18 ` Junio C Hamano
2021-01-07 13:50 ` [PATCH v3 " Jiang Xin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=X/cqrTgilKAW9P9G@danh.dev \
--to=congdanhqx@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=worldhello.net@gmail.com \
--cc=zhiyou.jx@alibaba-inc.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).