From: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
To: git@vger.kernel.org
Cc: "Junio C Hamano" <gitster@pobox.com>, "Jeff King" <peff@peff.net>,
"Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
Subject: [PATCH] versionsort: support reorder prerelease suffixes
Date: Thu, 26 Feb 2015 17:44:01 +0700 [thread overview]
Message-ID: <1424947441-19134-1-git-send-email-pclouds@gmail.com> (raw)
In-Reply-To: <CAPc5daVJJcC--mwq0PfAczge3zG44ToDKP853FkyZ3x1KUfsig@mail.gmail.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
Second round. Looking better. We can do
"1.0-pre12 < 1.0-rc0 < 1.0 < 1.0-post1" too but it relies on
config key's loading order, a bit iffy.
Documentation/config.txt | 7 +++++++
t/t7004-tag.sh | 28 +++++++++++++++++++++++++++
versioncmp.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 85 insertions(+)
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 04e2a71..8e078df 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -2539,6 +2539,13 @@ user.signingkey::
This option is passed unchanged to gpg's --local-user parameter,
so you may specify a key using any method that gpg supports.
+versionsort.prereleaseSuffix::
+ When version sort is used in linkgit:git-tag[1], prerelease
+ tags (e.g. "1.0-rc1") may appear after the main release
+ "1.0". By specifying the suffix "-rc" in this variable,
+ "1.0-rc1" will appear before "1.0". One variable assignment
+ per suffix.
+
web.browser::
Specify a web browser that may be used by some commands.
Currently only linkgit:git-instaweb[1] and linkgit:git-help[1]
diff --git a/t/t7004-tag.sh b/t/t7004-tag.sh
index 35c805a..8bfeef9 100755
--- a/t/t7004-tag.sh
+++ b/t/t7004-tag.sh
@@ -1459,6 +1459,34 @@ test_expect_success 'invalid sort parameter in configuratoin' '
test_cmp expect actual
'
+test_expect_success 'version sort with prerelease reordering' '
+ git config --unset tag.sort &&
+ git config versionsort.prereleaseSuffix -rc &&
+ git tag foo1.6-rc1 &&
+ git tag foo1.6-rc2 &&
+ git tag -l --sort=version:refname "foo*" >actual &&
+ cat >expect <<-\EOF &&
+ foo1.3
+ foo1.6-rc1
+ foo1.6-rc2
+ foo1.6
+ foo1.10
+ EOF
+ test_cmp expect actual
+'
+
+test_expect_success 'reverse version sort with prerelease reordering' '
+ git tag -l --sort=-version:refname "foo*" >actual &&
+ cat >expect <<-\EOF &&
+ foo1.10
+ foo1.6
+ foo1.6-rc2
+ foo1.6-rc1
+ foo1.3
+ EOF
+ test_cmp expect actual
+'
+
run_with_limited_stack () {
(ulimit -s 128 && "$@")
}
diff --git a/versioncmp.c b/versioncmp.c
index 7511e08..80bfd10 100644
--- a/versioncmp.c
+++ b/versioncmp.c
@@ -1,4 +1,5 @@
#include "cache.h"
+#include "string-list.h"
/*
* versioncmp(): copied from string/strverscmp.c in glibc commit
@@ -20,6 +21,48 @@
#define CMP 2
#define LEN 3
+static const struct string_list *prereleases;
+static int initialized;
+
+/*
+ * p1 and p2 point to the first different character in two strings. If
+ * either p1 or p2 starts with a prerelease suffix, it will be forced
+ * to be on top.
+ *
+ * If both p1 and p2 start with (different) suffix, the order is
+ * determined by config file.
+ *
+ * Note that we don't have to deal with the situation when both p1 and
+ * p2 start with the same suffix because the common part is already
+ * consumed by the caller.
+ *
+ * Return non-zero if *diff contains the return value for versioncmp()
+ */
+static int swap_prereleases(const void *p1_,
+ const void *p2_,
+ int *diff)
+{
+ const char *p1 = p1_;
+ const char *p2 = p2_;
+ int i, i1 = -1, i2 = -1;
+
+ for (i = 0; i < prereleases->nr; i++) {
+ const char *suffix = prereleases->items[i].string;
+ if (i1 == -1 && starts_with(p1, suffix))
+ i1 = i;
+ if (i2 == -1 && starts_with(p2, suffix))
+ i2 = i;
+ }
+ if (i1 == -1 && i2 == -1)
+ return 0;
+ if (i1 >= 0 && i2 >= 0)
+ *diff = i1 - i2;
+ else if (i1 >= 0)
+ *diff = -1;
+ else /* if (i2 >= 0) */
+ *diff = 1;
+ return 1;
+}
/*
* Compare S1 and S2 as strings holding indices/version numbers,
@@ -74,6 +117,13 @@ int versioncmp(const char *s1, const char *s2)
state += (c1 == '0') + (isdigit (c1) != 0);
}
+ if (!initialized) {
+ initialized = 1;
+ prereleases = git_config_get_value_multi("versionsort.prereleasesuffix");
+ }
+ if (prereleases && swap_prereleases(p1 - 1, p2 - 1, &diff))
+ return diff;
+
state = result_type[state * 3 + (((c2 == '0') + (isdigit (c2) != 0)))];
switch (state) {
--
2.3.0.rc1.137.g477eb31
next prev parent reply other threads:[~2015-02-26 10:43 UTC|newest]
Thread overview: 74+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-18 19:14 [RFH] GSoC 2015 application Jeff King
2015-02-18 19:32 ` Jeff King
2015-02-24 12:01 ` Johannes Schindelin
2015-02-24 12:06 ` [msysGit] " Jeff King
2015-02-24 12:25 ` Johannes Schindelin
2015-02-24 12:28 ` [msysGit] " Jeff King
2015-02-25 9:25 ` Johannes Schindelin
2015-02-25 9:39 ` Matthieu Moy
2015-02-25 10:25 ` Matthieu Moy
2015-02-25 12:15 ` Johannes Schindelin
2015-02-24 17:32 ` Matthieu Moy
2015-02-24 18:25 ` Junio C Hamano
2015-02-24 20:33 ` Johannes Schindelin
2015-02-24 21:02 ` Junio C Hamano
2015-02-24 23:56 ` Matthieu Moy
2015-02-25 0:34 ` [msysGit] " Stefan Beller
2015-02-25 9:25 ` Michael J Gruber
2015-02-25 8:44 ` Johannes Schindelin
2015-02-25 10:04 ` [msysGit] " Christian Couder
2015-02-25 10:02 ` Duy Nguyen
2015-02-25 12:10 ` Johannes Schindelin
2015-02-18 21:54 ` Junio C Hamano
2015-02-19 5:49 ` Junio C Hamano
2015-02-19 10:32 ` Matthieu Moy
2015-02-20 2:00 ` Jeff King
2015-02-20 10:06 ` Matthieu Moy
2015-02-20 10:22 ` Dennis Kaarsemaker
2015-02-20 10:34 ` Matthieu Moy
2015-02-20 23:06 ` Eric Sunshine
2015-02-20 10:31 ` [PATCH 1/3] microprojects: tweaks after discussion with Peff Matthieu Moy
2015-02-20 10:31 ` [PATCH 2/3] GSoC ideas: git bisect fixed/unfixed Matthieu Moy
2015-02-20 10:31 ` [PATCH 3/3] idea: Be nicer to the user on tracked/untracked merge conflicts Matthieu Moy
2015-02-20 3:26 ` [RFH] GSoC 2015 application Duy Nguyen
2015-02-20 7:13 ` Jeff King
2015-02-20 8:26 ` Junio C Hamano
2015-02-21 3:02 ` Support customized reordering in version sort Duy Nguyen
2015-02-21 3:25 ` Junio C Hamano
2015-02-21 3:33 ` Duy Nguyen
2015-02-21 5:12 ` Junio C Hamano
2015-02-21 5:37 ` Junio C Hamano
2015-02-26 10:44 ` Nguyễn Thái Ngọc Duy [this message]
2015-02-27 21:37 ` [PATCH] versionsort: support reorder prerelease suffixes Junio C Hamano
2015-03-05 1:28 ` Junio C Hamano
2015-03-09 1:01 ` Duy Nguyen
2015-03-10 7:52 ` Junio C Hamano
2015-03-10 8:03 ` Eric Sunshine
2015-03-10 10:16 ` [PATCH] config.txt: update versioncmp.prereleaseSuffix Nguyễn Thái Ngọc Duy
2015-02-20 5:35 ` [RFH] GSoC 2015 application Michael Haggerty
2015-02-20 7:29 ` Jeff King
2015-02-20 8:06 ` Junio C Hamano
2015-02-20 9:39 ` Matthieu Moy
2015-02-20 9:48 ` Jeff King
2015-02-20 11:35 ` Jeff King
2015-02-23 8:02 ` Matthieu Moy
2015-02-23 15:36 ` Jeff King
2015-03-04 22:05 ` Philip Oakley
2015-03-04 23:55 ` Stefan Beller
2015-03-05 0:17 ` Philip Oakley
2015-03-05 0:22 ` Junio C Hamano
2015-03-05 0:32 ` Stefan Beller
2015-03-05 1:17 ` Junio C Hamano
2015-03-05 6:19 ` Junio C Hamano
2015-03-06 11:24 ` Duy Nguyen
2015-03-05 0:26 ` Duy Nguyen
2015-03-05 10:28 ` Nguyễn Thái Ngọc Duy
2015-03-05 10:28 ` [PATCH 1/6] upload-pack: move shallow deepen code out of receive_needs() Nguyễn Thái Ngọc Duy
2015-03-05 10:28 ` [PATCH 2/6] upload-pack: move "shallow" sending code out of deepen() Nguyễn Thái Ngọc Duy
2015-03-05 10:28 ` [PATCH 3/6] upload-pack: remove unused variable "backup" Nguyễn Thái Ngọc Duy
2015-03-05 10:28 ` [PATCH 4/6] upload-pack: move "unshallow" sending code out of deepen() Nguyễn Thái Ngọc Duy
2015-03-05 10:28 ` [PATCH 5/6] shallow.c: implement a generic shallow boundary finder based on rev-list Nguyễn Thái Ngọc Duy
2015-03-05 10:28 ` [PATCH 6/6] upload-pack: example code to use get_shallow_commits_by_rev_list Nguyễn Thái Ngọc Duy
2015-02-26 13:10 ` [RFH] GSoC 2015 application Duy Nguyen
2015-03-04 10:31 ` Jeff King
2015-03-04 11:21 ` Duy Nguyen
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
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1424947441-19134-1-git-send-email-pclouds@gmail.com \
--to=pclouds@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=peff@peff.net \
/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.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
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 read-only IMAP folder(s) and NNTP newsgroup(s).