From d08bae7e221727e26baab984b792854b842130d7 Mon Sep 17 00:00:00 2001 From: Ilari Liusvaara Date: Wed, 20 Jan 2010 11:48:25 +0200 Subject: [PATCH 1/3] rev-parse --glob Add --glob= option to rev-parse and everything that accepts its options. This option matches all refs that match given shell glob pattern (complete with some DWIM logic). Example: 'git log --branches --not --glob=remotes/origin' To show what you have that origin doesn't. Signed-off-by: Ilari Liusvaara Signed-off-by: Junio C Hamano --- Documentation/git-log.txt | 11 +++ Documentation/git-rev-list.txt | 1 + Documentation/git-rev-parse.txt | 5 ++ Documentation/rev-list-options.txt | 7 ++ builtin-rev-parse.c | 5 ++ refs.c | 45 ++++++++++ refs.h | 1 + revision.c | 16 +++- t/t6018-rev-list-glob.sh | 134 +++++++++++++++++++++++++++++ 9 files changed, 223 insertions(+), 2 deletions(-) create mode 100755 t/t6018-rev-list-glob.sh diff --git a/Documentation/git-log.txt b/Documentation/git-log.txt index 3d79de11ec..0b874e3d1a 100644 --- a/Documentation/git-log.txt +++ b/Documentation/git-log.txt @@ -107,6 +107,17 @@ git log --follow builtin-rev-list.c:: those commits that occurred before the file was given its present name. +git log --branches --not --glob=remotes/origin/*:: + + Shows all commits that are in any of local branches but not in + any of remote tracking branches for 'origin' (what you have that + origin doesn't). + +git log master --not --glob=remotes/*/master:: + + Shows all commits that are in local master but not in any remote + repository master branches. + Discussion ---------- diff --git a/Documentation/git-rev-list.txt b/Documentation/git-rev-list.txt index 3341d1b62f..33122a3f33 100644 --- a/Documentation/git-rev-list.txt +++ b/Documentation/git-rev-list.txt @@ -24,6 +24,7 @@ SYNOPSIS [ \--branches ] [ \--tags ] [ \--remotes ] + [ \--glob=glob-pattern ] [ \--stdin ] [ \--quiet ] [ \--topo-order ] diff --git a/Documentation/git-rev-parse.txt b/Documentation/git-rev-parse.txt index 82045a2522..6eb8c14f62 100644 --- a/Documentation/git-rev-parse.txt +++ b/Documentation/git-rev-parse.txt @@ -112,6 +112,11 @@ OPTIONS --remotes:: Show tag refs found in `$GIT_DIR/refs/remotes`. +--glob=glob-pattern:: + Show refs matching shell glob pattern `glob-pattern`. If pattern + specified lacks leading 'refs/', it is automatically prepended. + If pattern lacks '?', '*', or '[', '/*' at the end is impiled. + --show-prefix:: When the command is invoked from a subdirectory, show the path of the current directory relative to the top-level diff --git a/Documentation/rev-list-options.txt b/Documentation/rev-list-options.txt index 1f57aed337..6d03c17a68 100644 --- a/Documentation/rev-list-options.txt +++ b/Documentation/rev-list-options.txt @@ -243,6 +243,13 @@ endif::git-rev-list[] Pretend as if all the refs in `$GIT_DIR/refs/remotes` are listed on the command line as ''. +--glob=glob-pattern:: + Pretend as if all the refs matching shell glob `glob-pattern` + are listed on the command line as ''. Leading 'refs/', + is automatically prepended if missing. If pattern lacks '?', '*', + or '[', '/*' at the end is impiled. + + ifndef::git-rev-list[] --bisect:: diff --git a/builtin-rev-parse.c b/builtin-rev-parse.c index 37d0233521..a635dded65 100644 --- a/builtin-rev-parse.c +++ b/builtin-rev-parse.c @@ -52,6 +52,7 @@ static int is_rev_argument(const char *arg) "--parents", "--pretty", "--remotes", + "--glob=", "--sparse", "--tags", "--topo-order", @@ -577,6 +578,10 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix) for_each_tag_ref(show_reference, NULL); continue; } + if (!prefixcmp(arg, "--glob=")) { + for_each_glob_ref(show_reference, arg + 7, NULL); + continue; + } if (!strcmp(arg, "--remotes")) { for_each_remote_ref(show_reference, NULL); continue; diff --git a/refs.c b/refs.c index 3e73a0a36d..34fff75b0d 100644 --- a/refs.c +++ b/refs.c @@ -519,6 +519,13 @@ const char *resolve_ref(const char *ref, unsigned char *sha1, int reading, int * return ref; } +/* The argument to filter_refs */ +struct ref_filter { + const char *pattern; + each_ref_fn *fn; + void *cb_data; +}; + int read_ref(const char *ref, unsigned char *sha1) { if (resolve_ref(ref, sha1, 1, NULL)) @@ -545,6 +552,15 @@ static int do_one_ref(const char *base, each_ref_fn fn, int trim, return fn(entry->name + trim, entry->sha1, entry->flag, cb_data); } +static int filter_refs(const char *ref, const unsigned char *sha, int flags, + void *data) +{ + struct ref_filter *filter = (struct ref_filter *)data; + if (fnmatch(filter->pattern, ref, 0)) + return 0; + return filter->fn(ref, sha, flags, filter->cb_data); +} + int peel_ref(const char *ref, unsigned char *sha1) { int flag; @@ -674,6 +690,35 @@ int for_each_replace_ref(each_ref_fn fn, void *cb_data) return do_for_each_ref("refs/replace/", fn, 13, 0, cb_data); } +int for_each_glob_ref(each_ref_fn fn, const char *pattern, void *cb_data) +{ + struct strbuf real_pattern = STRBUF_INIT; + struct ref_filter filter; + const char *has_glob_specials; + int ret; + + if (prefixcmp(pattern, "refs/")) + strbuf_addstr(&real_pattern, "refs/"); + strbuf_addstr(&real_pattern, pattern); + + has_glob_specials = strpbrk(pattern, "?*["); + if (!has_glob_specials) { + /* Append impiled '/' '*' if not present. */ + if (real_pattern.buf[real_pattern.len - 1] != '/') + strbuf_addch(&real_pattern, '/'); + /* No need to check for '*', there is none. */ + strbuf_addch(&real_pattern, '*'); + } + + filter.pattern = real_pattern.buf; + filter.fn = fn; + filter.cb_data = cb_data; + ret = for_each_ref(filter_refs, &filter); + + strbuf_release(&real_pattern); + return ret; +} + int for_each_rawref(each_ref_fn fn, void *cb_data) { return do_for_each_ref("refs/", fn, 0, diff --git a/refs.h b/refs.h index e141991851..78ad173f1b 100644 --- a/refs.h +++ b/refs.h @@ -25,6 +25,7 @@ extern int for_each_tag_ref(each_ref_fn, void *); extern int for_each_branch_ref(each_ref_fn, void *); extern int for_each_remote_ref(each_ref_fn, void *); extern int for_each_replace_ref(each_ref_fn, void *); +extern int for_each_glob_ref(each_ref_fn, const char *pattern, void *); /* can be used to learn about broken ref and symref */ extern int for_each_rawref(each_ref_fn, void *); diff --git a/revision.c b/revision.c index 25fa14d93e..162b182914 100644 --- a/revision.c +++ b/revision.c @@ -699,12 +699,18 @@ static int handle_one_ref(const char *path, const unsigned char *sha1, int flag, return 0; } +static void init_all_refs_cb(struct all_refs_cb *cb, struct rev_info *revs, + unsigned flags) +{ + cb->all_revs = revs; + cb->all_flags = flags; +} + static void handle_refs(struct rev_info *revs, unsigned flags, int (*for_each)(each_ref_fn, void *)) { struct all_refs_cb cb; - cb.all_revs = revs; - cb.all_flags = flags; + init_all_refs_cb(&cb, revs, flags); for_each(handle_one_ref, &cb); } @@ -1352,6 +1358,12 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch handle_refs(revs, flags, for_each_remote_ref); continue; } + if (!prefixcmp(arg, "--glob=")) { + struct all_refs_cb cb; + init_all_refs_cb(&cb, revs, flags); + for_each_glob_ref(handle_one_ref, arg + 7, &cb); + continue; + } if (!strcmp(arg, "--reflog")) { handle_reflog(revs, flags); continue; diff --git a/t/t6018-rev-list-glob.sh b/t/t6018-rev-list-glob.sh new file mode 100755 index 0000000000..1f251e1f43 --- /dev/null +++ b/t/t6018-rev-list-glob.sh @@ -0,0 +1,134 @@ +#!/bin/sh + +test_description='rev-list/rev-parse --glob' + +. ./test-lib.sh + +commit () { + test_tick && + echo $1 > foo && + git add foo && + git commit -m "$1" +} + +compare () { + # Split arguments on whitespace. + git $1 $2 >expected && + git $1 $3 >actual && + test_cmp expected actual +} + +test_expect_success 'setup' ' + + commit master && + git checkout -b subspace/one master && + commit one && + git checkout -b subspace/two master && + commit two && + git checkout -b subspace-x master && + commit subspace-x && + git checkout -b other/three master && + commit three && + git checkout -b someref master && + commit some && + git checkout master && + commit master2 +' + +test_expect_success 'rev-parse --glob=refs/heads/subspace/*' ' + + compare rev-parse "subspace/one subspace/two" "--glob=refs/heads/subspace/*" + +' + +test_expect_success 'rev-parse --glob=heads/subspace/*' ' + + compare rev-parse "subspace/one subspace/two" "--glob=heads/subspace/*" + +' + +test_expect_success 'rev-parse --glob=refs/heads/subspace/' ' + + compare rev-parse "subspace/one subspace/two" "--glob=refs/heads/subspace/" + +' + +test_expect_success 'rev-parse --glob=heads/subspace/' ' + + compare rev-parse "subspace/one subspace/two" "--glob=heads/subspace/" + +' + +test_expect_success 'rev-parse --glob=heads/subspace' ' + + compare rev-parse "subspace/one subspace/two" "--glob=heads/subspace" + +' + +test_expect_success 'rev-parse --glob=heads/subspace/* --glob=heads/other/*' ' + + compare rev-parse "subspace/one subspace/two other/three" "--glob=heads/subspace/* --glob=heads/other/*" + +' + +test_expect_success 'rev-parse --glob=heads/someref/* master' ' + + compare rev-parse "master" "--glob=heads/someref/* master" + +' + +test_expect_success 'rev-parse --glob=heads/*' ' + + compare rev-parse "master other/three someref subspace-x subspace/one subspace/two" "--glob=heads/*" + +' + +test_expect_success 'rev-list --glob=refs/heads/subspace/*' ' + + compare rev-list "subspace/one subspace/two" "--glob=refs/heads/subspace/*" + +' + +test_expect_success 'rev-list --glob=heads/subspace/*' ' + + compare rev-list "subspace/one subspace/two" "--glob=heads/subspace/*" + +' + +test_expect_success 'rev-list --glob=refs/heads/subspace/' ' + + compare rev-list "subspace/one subspace/two" "--glob=refs/heads/subspace/" + +' + +test_expect_success 'rev-list --glob=heads/subspace/' ' + + compare rev-list "subspace/one subspace/two" "--glob=heads/subspace/" + +' + +test_expect_success 'rev-list --glob=heads/subspace' ' + + compare rev-list "subspace/one subspace/two" "--glob=heads/subspace" + +' + +test_expect_success 'rev-list --glob=heads/someref/* master' ' + + compare rev-list "master" "--glob=heads/someref/* master" + +' + +test_expect_success 'rev-list --glob=heads/subspace/* --glob=heads/other/*' ' + + compare rev-list "subspace/one subspace/two other/three" "--glob=heads/subspace/* --glob=heads/other/*" + +' + +test_expect_success 'rev-list --glob=heads/*' ' + + compare rev-list "master other/three someref subspace-x subspace/one subspace/two" "--glob=heads/*" + +' + +test_done From b09fe971dea73ff6f5296ce533a566114b23ca4e Mon Sep 17 00:00:00 2001 From: Ilari Liusvaara Date: Wed, 20 Jan 2010 11:48:26 +0200 Subject: [PATCH 2/3] rev-parse --branches/--tags/--remotes=pattern Since local branch, tags and remote tracking branch namespaces are most often used, add shortcut notations for globbing those in manner similar to --glob option. With this, one can express the "what I have but origin doesn't?" as: 'git log --branches --not --remotes=origin' Original-idea-by: Johannes Sixt Signed-off-by: Ilari Liusvaara Signed-off-by: Junio C Hamano --- Documentation/git-log.txt | 4 +- Documentation/git-rev-list.txt | 6 +-- Documentation/git-rev-parse.txt | 19 ++++++--- Documentation/rev-list-options.txt | 18 ++++++--- builtin-rev-parse.c | 18 +++++++++ refs.c | 12 +++++- refs.h | 1 + revision.c | 18 +++++++++ t/t6018-rev-list-glob.sh | 63 +++++++++++++++++++++++++++++- 9 files changed, 139 insertions(+), 20 deletions(-) diff --git a/Documentation/git-log.txt b/Documentation/git-log.txt index 0b874e3d1a..0acd526303 100644 --- a/Documentation/git-log.txt +++ b/Documentation/git-log.txt @@ -107,13 +107,13 @@ git log --follow builtin-rev-list.c:: those commits that occurred before the file was given its present name. -git log --branches --not --glob=remotes/origin/*:: +git log --branches --not --remotes=origin:: Shows all commits that are in any of local branches but not in any of remote tracking branches for 'origin' (what you have that origin doesn't). -git log master --not --glob=remotes/*/master:: +git log master --not --remotes=*/master:: Shows all commits that are in local master but not in any remote repository master branches. diff --git a/Documentation/git-rev-list.txt b/Documentation/git-rev-list.txt index 33122a3f33..f85711676b 100644 --- a/Documentation/git-rev-list.txt +++ b/Documentation/git-rev-list.txt @@ -21,9 +21,9 @@ SYNOPSIS [ \--full-history ] [ \--not ] [ \--all ] - [ \--branches ] - [ \--tags ] - [ \--remotes ] + [ \--branches[=pattern] ] + [ \--tags=[pattern] ] + [ \--remotes=[pattern] ] [ \--glob=glob-pattern ] [ \--stdin ] [ \--quiet ] diff --git a/Documentation/git-rev-parse.txt b/Documentation/git-rev-parse.txt index 6eb8c14f62..afe8699999 100644 --- a/Documentation/git-rev-parse.txt +++ b/Documentation/git-rev-parse.txt @@ -103,14 +103,21 @@ OPTIONS --all:: Show all refs found in `$GIT_DIR/refs`. ---branches:: - Show branch refs found in `$GIT_DIR/refs/heads`. +--branches[=pattern]:: + Show branch refs found in `$GIT_DIR/refs/heads`. If `pattern` + is given, only branches matching given shell glob are shown. + If pattern lacks '?', '*', or '[', '/*' at the end is impiled. ---tags:: - Show tag refs found in `$GIT_DIR/refs/tags`. +--tags[=pattern]:: + Show tag refs found in `$GIT_DIR/refs/tags`. If `pattern` + is given, only tags matching given shell glob are shown. + If pattern lacks '?', '*', or '[', '/*' at the end is impiled. ---remotes:: - Show tag refs found in `$GIT_DIR/refs/remotes`. +--remotes[=pattern]:: + Show tag refs found in `$GIT_DIR/refs/remotes`. If `pattern` + is given, only remote tracking branches matching given shell glob + are shown. If pattern lacks '?', '*', or '[', '/*' at the end is + impiled. --glob=glob-pattern:: Show refs matching shell glob pattern `glob-pattern`. If pattern diff --git a/Documentation/rev-list-options.txt b/Documentation/rev-list-options.txt index 6d03c17a68..3ef71179d9 100644 --- a/Documentation/rev-list-options.txt +++ b/Documentation/rev-list-options.txt @@ -228,20 +228,26 @@ endif::git-rev-list[] Pretend as if all the refs in `$GIT_DIR/refs/` are listed on the command line as ''. ---branches:: +--branches[=pattern]:: Pretend as if all the refs in `$GIT_DIR/refs/heads` are listed - on the command line as ''. + on the command line as ''. If `pattern` is given, limit + branches to ones matching given shell glob. If pattern lacks '?', + '*', or '[', '/*' at the end is impiled. ---tags:: +--tags[=pattern]:: Pretend as if all the refs in `$GIT_DIR/refs/tags` are listed - on the command line as ''. + on the command line as ''. If `pattern` is given, limit + tags to ones matching given shell glob. If pattern lacks '?', '*', + or '[', '/*' at the end is impiled. ---remotes:: +--remotes[=pattern]:: Pretend as if all the refs in `$GIT_DIR/refs/remotes` are listed - on the command line as ''. + on the command line as ''. If `pattern`is given, limit + remote tracking branches to ones matching given shell glob. + If pattern lacks '?', '*', or '[', '/*' at the end is impiled. --glob=glob-pattern:: Pretend as if all the refs matching shell glob `glob-pattern` diff --git a/builtin-rev-parse.c b/builtin-rev-parse.c index a635dded65..d14fe20692 100644 --- a/builtin-rev-parse.c +++ b/builtin-rev-parse.c @@ -41,6 +41,7 @@ static int is_rev_argument(const char *arg) "--all", "--bisect", "--dense", + "--branches=", "--branches", "--header", "--max-age=", @@ -51,9 +52,11 @@ static int is_rev_argument(const char *arg) "--objects-edge", "--parents", "--pretty", + "--remotes=", "--remotes", "--glob=", "--sparse", + "--tags=", "--tags", "--topo-order", "--date-order", @@ -570,10 +573,20 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix) for_each_ref_in("refs/bisect/good", anti_reference, NULL); continue; } + if (!prefixcmp(arg, "--branches=")) { + for_each_glob_ref_in(show_reference, arg + 11, + "refs/heads/", NULL); + continue; + } if (!strcmp(arg, "--branches")) { for_each_branch_ref(show_reference, NULL); continue; } + if (!prefixcmp(arg, "--tags=")) { + for_each_glob_ref_in(show_reference, arg + 7, + "refs/tags/", NULL); + continue; + } if (!strcmp(arg, "--tags")) { for_each_tag_ref(show_reference, NULL); continue; @@ -582,6 +595,11 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix) for_each_glob_ref(show_reference, arg + 7, NULL); continue; } + if (!prefixcmp(arg, "--remotes=")) { + for_each_glob_ref_in(show_reference, arg + 10, + "refs/remotes/", NULL); + continue; + } if (!strcmp(arg, "--remotes")) { for_each_remote_ref(show_reference, NULL); continue; diff --git a/refs.c b/refs.c index 34fff75b0d..503a8c2bd0 100644 --- a/refs.c +++ b/refs.c @@ -690,15 +690,18 @@ int for_each_replace_ref(each_ref_fn fn, void *cb_data) return do_for_each_ref("refs/replace/", fn, 13, 0, cb_data); } -int for_each_glob_ref(each_ref_fn fn, const char *pattern, void *cb_data) +int for_each_glob_ref_in(each_ref_fn fn, const char *pattern, + const char *prefix, void *cb_data) { struct strbuf real_pattern = STRBUF_INIT; struct ref_filter filter; const char *has_glob_specials; int ret; - if (prefixcmp(pattern, "refs/")) + if (!prefix && prefixcmp(pattern, "refs/")) strbuf_addstr(&real_pattern, "refs/"); + else if (prefix) + strbuf_addstr(&real_pattern, prefix); strbuf_addstr(&real_pattern, pattern); has_glob_specials = strpbrk(pattern, "?*["); @@ -719,6 +722,11 @@ int for_each_glob_ref(each_ref_fn fn, const char *pattern, void *cb_data) return ret; } +int for_each_glob_ref(each_ref_fn fn, const char *pattern, void *cb_data) +{ + return for_each_glob_ref_in(fn, pattern, NULL, cb_data); +} + int for_each_rawref(each_ref_fn fn, void *cb_data) { return do_for_each_ref("refs/", fn, 0, diff --git a/refs.h b/refs.h index 78ad173f1b..f7648b9bd3 100644 --- a/refs.h +++ b/refs.h @@ -26,6 +26,7 @@ extern int for_each_branch_ref(each_ref_fn, void *); extern int for_each_remote_ref(each_ref_fn, void *); extern int for_each_replace_ref(each_ref_fn, void *); extern int for_each_glob_ref(each_ref_fn, const char *pattern, void *); +extern int for_each_glob_ref_in(each_ref_fn, const char *pattern, const char* prefix, void *); /* can be used to learn about broken ref and symref */ extern int for_each_rawref(each_ref_fn, void *); diff --git a/revision.c b/revision.c index 162b182914..1e9277d335 100644 --- a/revision.c +++ b/revision.c @@ -1364,6 +1364,24 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch for_each_glob_ref(handle_one_ref, arg + 7, &cb); continue; } + if (!prefixcmp(arg, "--branches=")) { + struct all_refs_cb cb; + init_all_refs_cb(&cb, revs, flags); + for_each_glob_ref_in(handle_one_ref, arg + 11, "refs/heads/", &cb); + continue; + } + if (!prefixcmp(arg, "--tags=")) { + struct all_refs_cb cb; + init_all_refs_cb(&cb, revs, flags); + for_each_glob_ref_in(handle_one_ref, arg + 7, "refs/tags/", &cb); + continue; + } + if (!prefixcmp(arg, "--remotes=")) { + struct all_refs_cb cb; + init_all_refs_cb(&cb, revs, flags); + for_each_glob_ref_in(handle_one_ref, arg + 10, "refs/remotes/", &cb); + continue; + } if (!strcmp(arg, "--reflog")) { handle_reflog(revs, flags); continue; diff --git a/t/t6018-rev-list-glob.sh b/t/t6018-rev-list-glob.sh index 1f251e1f43..8d3fa7d014 100755 --- a/t/t6018-rev-list-glob.sh +++ b/t/t6018-rev-list-glob.sh @@ -32,7 +32,9 @@ test_expect_success 'setup' ' git checkout -b someref master && commit some && git checkout master && - commit master2 + commit master2 && + git tag foo/bar master && + git update-ref refs/remotes/foo/baz master ' test_expect_success 'rev-parse --glob=refs/heads/subspace/*' ' @@ -65,6 +67,24 @@ test_expect_success 'rev-parse --glob=heads/subspace' ' ' +test_expect_success 'rev-parse --branches=subspace/*' ' + + compare rev-parse "subspace/one subspace/two" "--branches=subspace/*" + +' + +test_expect_success 'rev-parse --branches=subspace/' ' + + compare rev-parse "subspace/one subspace/two" "--branches=subspace/" + +' + +test_expect_success 'rev-parse --branches=subspace' ' + + compare rev-parse "subspace/one subspace/two" "--branches=subspace" + +' + test_expect_success 'rev-parse --glob=heads/subspace/* --glob=heads/other/*' ' compare rev-parse "subspace/one subspace/two other/three" "--glob=heads/subspace/* --glob=heads/other/*" @@ -83,6 +103,18 @@ test_expect_success 'rev-parse --glob=heads/*' ' ' +test_expect_success 'rev-parse --tags=foo' ' + + compare rev-parse "foo/bar" "--tags=foo" + +' + +test_expect_success 'rev-parse --remotes=foo' ' + + compare rev-parse "foo/baz" "--remotes=foo" + +' + test_expect_success 'rev-list --glob=refs/heads/subspace/*' ' compare rev-list "subspace/one subspace/two" "--glob=refs/heads/subspace/*" @@ -113,6 +145,23 @@ test_expect_success 'rev-list --glob=heads/subspace' ' ' +test_expect_success 'rev-list --branches=subspace/*' ' + + compare rev-list "subspace/one subspace/two" "--branches=subspace/*" + +' + +test_expect_success 'rev-list --branches=subspace/' ' + + compare rev-list "subspace/one subspace/two" "--branches=subspace/" + +' + +test_expect_success 'rev-list --branches=subspace' ' + + compare rev-list "subspace/one subspace/two" "--branches=subspace" + +' test_expect_success 'rev-list --glob=heads/someref/* master' ' compare rev-list "master" "--glob=heads/someref/* master" @@ -131,4 +180,16 @@ test_expect_success 'rev-list --glob=heads/*' ' ' +test_expect_success 'rev-list --tags=foo' ' + + compare rev-list "foo/bar" "--tags=foo" + +' + +test_expect_success 'rev-list --remotes=foo' ' + + compare rev-list "foo/baz" "--remotes=foo" + +' + test_done From e2b53e58081e6a30309625fc6194ccb42772846b Mon Sep 17 00:00:00 2001 From: Thomas Rast Date: Fri, 22 Jan 2010 01:21:38 +0100 Subject: [PATCH 3/3] Documentation: improve description of --glob=pattern and friends Consolidate the descriptions of --branches, --tags and --remotes a bit, to make it less repetitive. Improve the grammar a bit, and spell out the meaning of the 'append /*' rule. Signed-off-by: Thomas Rast Signed-off-by: Junio C Hamano --- Documentation/git-rev-parse.txt | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/Documentation/git-rev-parse.txt b/Documentation/git-rev-parse.txt index afe8699999..61f4835a10 100644 --- a/Documentation/git-rev-parse.txt +++ b/Documentation/git-rev-parse.txt @@ -104,25 +104,23 @@ OPTIONS Show all refs found in `$GIT_DIR/refs`. --branches[=pattern]:: - Show branch refs found in `$GIT_DIR/refs/heads`. If `pattern` - is given, only branches matching given shell glob are shown. - If pattern lacks '?', '*', or '[', '/*' at the end is impiled. - --tags[=pattern]:: - Show tag refs found in `$GIT_DIR/refs/tags`. If `pattern` - is given, only tags matching given shell glob are shown. - If pattern lacks '?', '*', or '[', '/*' at the end is impiled. - --remotes[=pattern]:: - Show tag refs found in `$GIT_DIR/refs/remotes`. If `pattern` - is given, only remote tracking branches matching given shell glob - are shown. If pattern lacks '?', '*', or '[', '/*' at the end is - impiled. + Show all branches, tags, or remote-tracking branches, + respectively (i.e., refs found in `$GIT_DIR/refs/heads`, + `$GIT_DIR/refs/tags`, or `$GIT_DIR/refs/remotes`, + respectively). ++ +If a `pattern` is given, only refs matching the given shell glob are +shown. If the pattern does not contain a globbing character (`?`, +`\*`, or `[`), it is turned into a prefix match by appending `/\*`. ---glob=glob-pattern:: - Show refs matching shell glob pattern `glob-pattern`. If pattern - specified lacks leading 'refs/', it is automatically prepended. - If pattern lacks '?', '*', or '[', '/*' at the end is impiled. +--glob=pattern:: + Show all refs matching the shell glob pattern `pattern`. If + the pattern does not start with `refs/`, this is automatically + prepended. If the pattern does not contain a globbing + character (`?`, `\*`, or `[`), it is turned into a prefix + match by appending `/\*`. --show-prefix:: When the command is invoked from a subdirectory, show the