Re: git describe fails without tags
From: Uwe Zeisberger <hidden>
Date: 2016-06-15 22:42:17
Subsystem:
the rest · Maintainer:
Linus Torvalds
Hello Junio, Junio C Hamano wrote:
quoted hunk ↗ jump to hunk
diff --git a/rev-parse.c b/rev-parse.c index 0c951af..c1646e4 100644 --- a/rev-parse.c +++ b/rev-parse.c@@ -20,6 +20,7 @@ static char *def = NULL; #define REVERSED 1 static int show_type = NORMAL; static int symbolic = 0; +static int abbrev = 0; static int output_sq = 0; static int revs_count = 0;@@ -95,6 +96,8 @@ static void show_rev(int type, const uns putchar('^'); if (symbolic && name) show(name); + else if (abbrev) + show(find_unique_abbrev(sha1, abbrev)); else show(sha1_to_hex(sha1)); }@@ -195,6 +198,17 @@ int main(int argc, char **argv) verify = 1; continue; } + if (!strcmp(arg, "--abbrev") || + !strncmp(arg, "--abbrev=", 9)) { + filter &= ~(DO_FLAGS|DO_NOREV); + verify = 1; + abbrev = DEFAULT_ABBREV; + if (arg[8] == '=') + abbrev = strtoul(arg + 9, NULL, 10); + if (abbrev < 0 || 40 <= abbrev) + abbrev = DEFAULT_ABBREV; + continue; + } if (!strcmp(arg, "--sq")) { output_sq = 1; continue;
I see two things to fix in that patch:
1) define DEFAULT_ABBREV (e.g. by moving it to cache.h, where
find_unique_abbrev is defined.)
2) describe.c allows only abbrev >= 4. (Allowing values less than 2
failes, because find_short_object_filename (and maybe others) assume
len to be at least 2.) I think 4 is sensible.
This results in the following patch:
--8<--
[PATCH] rev-parse: --abbrev option.
The new option behaves just like --verify, but outputs an abbreviated object
name that is unique within the repository.
This patch is a modification of a suggestion by Junio C Hamano.
Signed-off-by: Uwe Zeisberger <redacted>
---
cache.h | 2 ++
describe.c | 1 -
rev-parse.c | 14 ++++++++++++++
3 files changed, 16 insertions(+), 1 deletions(-)
0d43ec7461b38d6a1d1563fd7dc2ebf399eabe9ediff --git a/cache.h b/cache.h
index b493b65..139c670 100644
--- a/cache.h
+++ b/cache.h@@ -177,6 +177,8 @@ extern int check_repository_format(void) #define DATA_CHANGED 0x0020 #define TYPE_CHANGED 0x0040 +#define DEFAULT_ABBREV 8 /* maybe too many */ + /* Return a statically allocated filename matching the sha1 signature */ extern char *mkpath(const char *fmt, ...) __attribute__((format (printf, 1, 2))); extern char *git_path(const char *fmt, ...) __attribute__((format (printf, 1, 2)));
diff --git a/describe.c b/describe.c
index 4866510..6518f06 100644
--- a/describe.c
+++ b/describe.c@@ -11,7 +11,6 @@ static const char describe_usage[] = static int all = 0; /* Default to annotated tags only */ static int tags = 0; /* But allow any tags if --tags is specified */ -#define DEFAULT_ABBREV 8 /* maybe too many */ static int abbrev = DEFAULT_ABBREV; static int names = 0, allocs = 0;
diff --git a/rev-parse.c b/rev-parse.c
index 0c951af..58cff6f 100644
--- a/rev-parse.c
+++ b/rev-parse.c@@ -20,6 +20,7 @@ static char *def = NULL; #define REVERSED 1 static int show_type = NORMAL; static int symbolic = 0; +static int abbrev = 0; static int output_sq = 0; static int revs_count = 0;
@@ -95,6 +96,8 @@ static void show_rev(int type, const uns putchar('^'); if (symbolic && name) show(name); + else if (abbrev) + show(find_unique_abbrev(sha1, abbrev)); else show(sha1_to_hex(sha1)); }
@@ -195,6 +198,17 @@ int main(int argc, char **argv) verify = 1; continue; } + if (!strcmp(arg, "--abbrev") || + !strncmp(arg, "--abbrev=", 9)) { + filter &= ~(DO_FLAGS|DO_NOREV); + verify = 1; + abbrev = DEFAULT_ABBREV; + if (arg[8] == '=') + abbrev = strtoul(arg + 9, NULL, 10); + if (abbrev < 4 || 40 <= abbrev) + abbrev = DEFAULT_ABBREV; + continue; + } if (!strcmp(arg, "--sq")) { output_sq = 1; continue;
--
1.1.4.g3e6c
Best regards
Uwe
--
Uwe Zeisberger
http://www.google.com/search?q=72+PS+point+in+inch