summaryrefslogtreecommitdiff
path: root/builtin
diff options
context:
space:
mode:
authorLibravatar Junio C Hamano <gitster@pobox.com>2017-09-29 11:23:41 +0900
committerLibravatar Junio C Hamano <gitster@pobox.com>2017-09-29 11:23:41 +0900
commit8c1bc7c244bf19e5c9fe5caa74389c022b8d24bc (patch)
tree3c1c70bb07c143f4e82ce9d2b0b1f9b3b1e7d130 /builtin
parentMerge branch 'jm/status-ignored-directory-optim' (diff)
parentdescribe: teach --match to handle branches and remotes (diff)
downloadtgif-8c1bc7c244bf19e5c9fe5caa74389c022b8d24bc.tar.xz
Merge branch 'mk/describe-match-with-all'
"git describe --match <pattern>" has been taught to play well with the "--all" option. * mk/describe-match-with-all: describe: teach --match to handle branches and remotes
Diffstat (limited to 'builtin')
-rw-r--r--builtin/describe.c29
1 files changed, 17 insertions, 12 deletions
diff --git a/builtin/describe.c b/builtin/describe.c
index 3dc1836480..29075dbd0f 100644
--- a/builtin/describe.c
+++ b/builtin/describe.c
@@ -129,13 +129,24 @@ static void add_to_known_names(const char *path,
static int get_name(const char *path, const struct object_id *oid, int flag, void *cb_data)
{
- int is_tag = starts_with(path, "refs/tags/");
+ int is_tag = 0;
struct object_id peeled;
int is_annotated, prio;
-
- /* Reject anything outside refs/tags/ unless --all */
- if (!all && !is_tag)
+ const char *path_to_match = NULL;
+
+ if (skip_prefix(path, "refs/tags/", &path_to_match)) {
+ is_tag = 1;
+ } else if (all) {
+ if ((exclude_patterns.nr || patterns.nr) &&
+ !skip_prefix(path, "refs/heads/", &path_to_match) &&
+ !skip_prefix(path, "refs/remotes/", &path_to_match)) {
+ /* Only accept reference of known type if there are match/exclude patterns */
+ return 0;
+ }
+ } else {
+ /* Reject anything outside refs/tags/ unless --all */
return 0;
+ }
/*
* If we're given exclude patterns, first exclude any tag which match
@@ -144,11 +155,8 @@ static int get_name(const char *path, const struct object_id *oid, int flag, voi
if (exclude_patterns.nr) {
struct string_list_item *item;
- if (!is_tag)
- return 0;
-
for_each_string_list_item(item, &exclude_patterns) {
- if (!wildmatch(item->string, path + 10, 0))
+ if (!wildmatch(item->string, path_to_match, 0))
return 0;
}
}
@@ -161,11 +169,8 @@ static int get_name(const char *path, const struct object_id *oid, int flag, voi
int found = 0;
struct string_list_item *item;
- if (!is_tag)
- return 0;
-
for_each_string_list_item(item, &patterns) {
- if (!wildmatch(item->string, path + 10, 0)) {
+ if (!wildmatch(item->string, path_to_match, 0)) {
found = 1;
break;
}