diff options
| -rw-r--r-- | Documentation/git-describe.txt | 4 | ||||
| -rw-r--r-- | builtin-describe.c | 21 | 
2 files changed, 20 insertions, 5 deletions
| diff --git a/Documentation/git-describe.txt b/Documentation/git-describe.txt index ac23e28f27..9c7a032342 100644 --- a/Documentation/git-describe.txt +++ b/Documentation/git-describe.txt @@ -51,6 +51,10 @@ OPTIONS  	being employed to standard error.  The tag name will still  	be printed to standard out. +--match <pattern>:: +	Only consider tags matching the given pattern (can be used to avoid +	leaking private tags made from the repository). +  EXAMPLES  -------- diff --git a/builtin-describe.c b/builtin-describe.c index 7a148a2c26..18eab47f6a 100644 --- a/builtin-describe.c +++ b/builtin-describe.c @@ -19,6 +19,7 @@ static int all;	/* Default to annotated tags only */  static int tags;	/* But allow any tags if --tags is specified */  static int abbrev = DEFAULT_ABBREV;  static int max_candidates = 10; +const char *pattern = NULL;  struct commit_name {  	int prio; /* annotated tag = 2, tag = 1, head = 0 */ @@ -57,9 +58,11 @@ static int get_name(const char *path, const unsigned char *sha1, int flag, void  	 * Otherwise only annotated tags are used.  	 */  	if (!prefixcmp(path, "refs/tags/")) { -		if (object->type == OBJ_TAG) +		if (object->type == OBJ_TAG) {  			prio = 2; -		else +			if (pattern && fnmatch(pattern, path + 10, 0)) +				prio = 0; +		} else  			prio = 1;  	}  	else @@ -253,7 +256,9 @@ int cmd_describe(int argc, const char **argv, const char *prefix)  		OPT_BOOLEAN(0, "tags",       &tags, "use any tag in .git/refs/tags"),  		OPT__ABBREV(&abbrev),  		OPT_INTEGER(0, "candidates", &max_candidates, -					"consider <n> most recent tags (default: 10)"), +			    "consider <n> most recent tags (default: 10)"), +		OPT_STRING(0, "match",       &pattern, "pattern", +			   "only consider tags matching <pattern>"),  		OPT_END(),  	}; @@ -266,12 +271,18 @@ int cmd_describe(int argc, const char **argv, const char *prefix)  	save_commit_buffer = 0;  	if (contains) { -		const char **args = xmalloc((4 + argc) * sizeof(char*)); +		const char **args = xmalloc((5 + argc) * sizeof(char*));  		int i = 0;  		args[i++] = "name-rev";  		args[i++] = "--name-only"; -		if (!all) +		if (!all) {  			args[i++] = "--tags"; +			if (pattern) { +				char *s = xmalloc(strlen("--refs=refs/tags/") + strlen(pattern) + 1); +				sprintf(s, "--refs=refs/tags/%s", pattern); +				args[i++] = s; +			} +		}  		memcpy(args + i, argv, argc * sizeof(char*));  		args[i + argc] = NULL;  		return cmd_name_rev(i + argc, args, prefix); | 
