diff options
author | Junio C Hamano <gitster@pobox.com> | 2007-12-08 22:52:59 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2007-12-09 00:55:46 -0800 |
commit | 2ea7fe0d2c15a88e7e3131ad5e7e83c7320d8d0c (patch) | |
tree | ac64ee59506f0474c6487e1f1fe130ae51e6dcc0 | |
parent | 1e931cb4d197e30504b6d2cc77b0b045b0167df6 (diff) | |
download | git-2ea7fe0d2c15a88e7e3131ad5e7e83c7320d8d0c.tar.gz git-2ea7fe0d2c15a88e7e3131ad5e7e83c7320d8d0c.tar.xz |
ls-remote: resurrect pattern limit support
"git ls-remote $remote $name1 $name2..." used to limit the output to
refs that end with one of the $name given from the command line, but
recent rewrite to C forgot to implement that support.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | builtin-ls-remote.c | 44 |
1 files changed, 38 insertions, 6 deletions
diff --git a/builtin-ls-remote.c b/builtin-ls-remote.c index 56f3f8802..e5d670a93 100644 --- a/builtin-ls-remote.c +++ b/builtin-ls-remote.c @@ -6,6 +6,35 @@ static const char ls_remote_usage[] = "git-ls-remote [--upload-pack=<git-upload-pack>] [<host>:]<directory>"; +/* + * pattern is a list of tail-part of accepted refnames. Is there one + * among them that is a suffix of the path? Directory boundary must + * be honored when checking this match. IOW, patterns "master" and + * "sa/master" both match path "refs/hold/sa/master". On the other + * hand, path "refs/hold/foosa/master" is matched by "master" but not + * by "sa/master". + */ + +static int tail_match(const char **pattern, const char *path) +{ + int pathlen; + const char *p; + + if (!*pattern) + return 1; /* no restriction */ + + for (pathlen = strlen(path); (p = *pattern); pattern++) { + int pfxlen = pathlen - strlen(p); + if (pfxlen < 0) + continue; /* pattern is longer, will never match */ + if (strcmp(path + pfxlen, p)) + continue; /* no tail match */ + if (!pfxlen || path[pfxlen - 1] == '/') + return 1; /* fully match at directory boundary */ + } + return 0; +} + int cmd_ls_remote(int argc, const char **argv, const char *prefix) { int i; @@ -13,6 +42,7 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix) int nongit = 0; unsigned flags = 0; const char *uploadpack = NULL; + const char **pattern = NULL; struct remote *remote; struct transport *transport; @@ -50,9 +80,9 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix) break; } - if (!dest || i != argc - 1) + if (!dest) usage(ls_remote_usage); - + pattern = argv + i + 1; remote = nongit ? NULL : remote_get(dest); if (remote && !remote->url_nr) die("remote %s has no configured URL", dest); @@ -65,10 +95,12 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix) if (!ref) return 1; - while (ref) { - if (check_ref_type(ref, flags)) - printf("%s %s\n", sha1_to_hex(ref->old_sha1), ref->name); - ref = ref->next; + for ( ; ref; ref = ref->next) { + if (!check_ref_type(ref, flags)) + continue; + if (!tail_match(pattern, ref->name)) + continue; + printf("%s %s\n", sha1_to_hex(ref->old_sha1), ref->name); } return 0; } |