From 912072d53a6f257fbbfd8a103e14248ae2382b6d Mon Sep 17 00:00:00 2001 From: Kacper Kornet Date: Tue, 21 Aug 2012 09:46:06 +0200 Subject: [PATCH 1/2] t6300: test sort with multiple keys Documentation of git-for-each-ref says that --sort= option can be used multiple times, in which case the last key becomes the primary key. However this functionality was never checked in test suite and is currently broken. This commit adds appropriate test in preparation for fix. Signed-off-by: Kacper Kornet Signed-off-by: Junio C Hamano --- t/t6300-for-each-ref.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/t/t6300-for-each-ref.sh b/t/t6300-for-each-ref.sh index 172178490a..a0d82d4937 100755 --- a/t/t6300-for-each-ref.sh +++ b/t/t6300-for-each-ref.sh @@ -456,4 +456,14 @@ test_atom refs/tags/signed-long contents "subject line body contents $sig" +cat >expected <<\EOF +408fe76d02a785a006c2e9c669b7be5589ede96d refs/tags/master +90b5ebede4899eda64893bc2a4c8f1d6fb6dfc40 refs/tags/bogo +EOF + +test_expect_failure 'Verify sort with multiple keys' ' + git for-each-ref --format="%(objectname) %(taggeremail) %(refname)" --sort=objectname --sort=taggeremail \ + refs/tags/bogo refs/tags/master > actual && + test_cmp expected actual +' test_done From 3b51222ceceed022f45193db19c57cf53f0164df Mon Sep 17 00:00:00 2001 From: Kacper Kornet Date: Tue, 21 Aug 2012 09:47:26 +0200 Subject: [PATCH 2/2] for-each-ref: Fix sort with multiple keys The linked list describing sort options was not correctly set up in opt_parse_sort. In the result, contrary to the documentation, only the last of multiple --sort options to git-for-each-ref was taken into account. This commit fixes it. Signed-off-by: Kacper Kornet Signed-off-by: Junio C Hamano --- builtin/for-each-ref.c | 4 +++- t/t6300-for-each-ref.sh | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c index b01d76a243..0c5294e5e8 100644 --- a/builtin/for-each-ref.c +++ b/builtin/for-each-ref.c @@ -962,7 +962,9 @@ static int opt_parse_sort(const struct option *opt, const char *arg, int unset) if (!arg) /* should --no-sort void the list ? */ return -1; - *sort_tail = s = xcalloc(1, sizeof(*s)); + s = xcalloc(1, sizeof(*s)); + s->next = *sort_tail; + *sort_tail = s; if (*arg == '-') { s->reverse = 1; diff --git a/t/t6300-for-each-ref.sh b/t/t6300-for-each-ref.sh index a0d82d4937..752f5cb7d0 100755 --- a/t/t6300-for-each-ref.sh +++ b/t/t6300-for-each-ref.sh @@ -461,7 +461,7 @@ cat >expected <<\EOF 90b5ebede4899eda64893bc2a4c8f1d6fb6dfc40 refs/tags/bogo EOF -test_expect_failure 'Verify sort with multiple keys' ' +test_expect_success 'Verify sort with multiple keys' ' git for-each-ref --format="%(objectname) %(taggeremail) %(refname)" --sort=objectname --sort=taggeremail \ refs/tags/bogo refs/tags/master > actual && test_cmp expected actual