{"thread":{"id":"11204","subject":"[PATCH] Restore ls-remote reference pattern matching","startedAt":"2007-12-09T02:35:48Z","lastAt":"2007-12-10T09:56:19Z","messageCount":10,"participants":["Daniel Barkalow","Junio C Hamano","Sergey Vlasov","Eyvind Bernhardsen"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"62450","messageId":"Pine.LNX.4.64.0712082134350.5349@iabervon.org","threadId":"11204","inReplyTo":null,"subject":"[PATCH] Restore ls-remote reference pattern matching","fromName":"Daniel Barkalow","fromEmail":"barkalow@iabervon.org","sentAt":"2007-12-09T02:35:48Z","receivedAt":"2007-12-09T02:35:48Z","isPatch":true,"sender":{"key":"barkalow@iabervon.org","avatar":"https://avatars.githubusercontent.com/u/55364219?v=4"},"body":"I entirely missed that \"git ls-remote <repo> <ref-pattern>...\" is\nsupposed to work. This restores it.\n\nSigned-off-by: Daniel Barkalow <barkalow@iabervon.org>\n---\nHow's this? I vaguely tested it, and it doesn't break existing tests, and \nit matches my guess at how the old code worked, at least maybe.\n\n builtin-ls-remote.c |   10 ++++++++--\n 1 files changed, 8 insertions(+), 2 deletions(-)\n\ndiff --git a/builtin-ls-remote.c b/builtin-ls-remote.c\nindex 56f3f88..f8669ce 100644\n--- a/builtin-ls-remote.c\n+++ b/builtin-ls-remote.c\n@@ -17,6 +17,7 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix)\n \tstruct remote *remote;\n \tstruct transport *transport;\n \tconst struct ref *ref;\n+\tconst char **refpathspec = NULL;\n \n \tsetup_git_directory_gently(&nongit);\n \n@@ -50,9 +51,12 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix)\n \t\tbreak;\n \t}\n \n-\tif (!dest || i != argc - 1)\n+\tif (!dest)\n \t\tusage(ls_remote_usage);\n \n+\tif (argc > i + 1)\n+\t\trefpathspec = get_pathspec(\"*\", argv + i);\n+\n \tremote = nongit ? NULL : remote_get(dest);\n \tif (remote && !remote->url_nr)\n \t\tdie(\"remote %s has no configured URL\", dest);\n@@ -66,7 +70,9 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix)\n \t\treturn 1;\n \n \twhile (ref) {\n-\t\tif (check_ref_type(ref, flags))\n+\t\tif (check_ref_type(ref, flags) && \n+\t\t    (!refpathspec || \n+\t\t     pathspec_match(refpathspec, NULL, ref->name, 0)))\n \t\t\tprintf(\"%s\t%s\\n\", sha1_to_hex(ref->old_sha1), ref->name);\n \t\tref = ref->next;\n \t}\n-- \n1.5.3.6.886.gb204\n"},{"id":"62452","messageId":"7vodd0tuuu.fsf@gitster.siamese.dyndns.org","threadId":"11204","inReplyTo":"Pine.LNX.4.64.0712082134350.5349@iabervon.org","subject":"Re: [PATCH] Restore ls-remote reference pattern matching","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2007-12-09T03:22:49Z","receivedAt":"2007-12-09T03:22:49Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Daniel Barkalow <barkalow@iabervon.org> writes:\n\n> How's this? I vaguely tested it, and it doesn't break existing tests, and \n> it matches my guess at how the old code worked, at least maybe.\n\nWell, contrib/examples/git-ls-remote.sh is your friend and you do not\nhave to \"guess\".\n\nIt did, for each ref $path it got from peek-remote, this:\n\n\t\tfor pat\n\t\tdo\n\t\t\tcase \"/$path\" in\n\t\t\t*/$pat )\n\t\t\t\tmatch=yes\n\t\t\t\tbreak ;;\n\t\t\tesac\n\t\tdone\n\nI do not think pathspec_match() matches the string in a way compatible\nwith the above loop, and calling get_pathspec(prefix, argv) with\nanything but a real path is a misuse of the interface.\n\nI think if you do fnmatch(3) that would be compatible with the shell\nloop.\n"},{"id":"62455","messageId":"Pine.LNX.4.64.0712082346310.5349@iabervon.org","threadId":"11204","inReplyTo":"7vodd0tuuu.fsf@gitster.siamese.dyndns.org","subject":"Re: [PATCH] Restore ls-remote reference pattern matching","fromName":"Daniel Barkalow","fromEmail":"barkalow@iabervon.org","sentAt":"2007-12-09T05:16:05Z","receivedAt":"2007-12-09T05:16:05Z","isPatch":true,"sender":{"key":"barkalow@iabervon.org","avatar":"https://avatars.githubusercontent.com/u/55364219?v=4"},"body":"On Sat, 8 Dec 2007, Junio C Hamano wrote:\n\n> Daniel Barkalow <barkalow@iabervon.org> writes:\n> \n> > How's this? I vaguely tested it, and it doesn't break existing tests, and \n> > it matches my guess at how the old code worked, at least maybe.\n> \n> Well, contrib/examples/git-ls-remote.sh is your friend and you do not\n> have to \"guess\".\n> \n> It did, for each ref $path it got from peek-remote, this:\n> \n> \t\tfor pat\n> \t\tdo\n> \t\t\tcase \"/$path\" in\n> \t\t\t*/$pat )\n> \t\t\t\tmatch=yes\n> \t\t\t\tbreak ;;\n> \t\t\tesac\n> \t\tdone\n> \n> I do not think pathspec_match() matches the string in a way compatible\n> with the above loop, and calling get_pathspec(prefix, argv) with\n> anything but a real path is a misuse of the interface.\n\nI'd found the same code (\"git log -p -- git-ls-remote.sh\" also reveals it, \nand I couldn't remember it's contrib/examples that things end up in), but \nI don't really follow that shell syntax.\n\n> I think if you do fnmatch(3) that would be compatible with the shell\n> loop.\n\nMaybe:\n--- cut here ---\nI entirely missed that \"git ls-remote <repo> <ref-pattern>...\" is\nsupposed to work. This restores it.\n\nSigned-off-by: Daniel Barkalow <barkalow@iabervon.org>\n---\nThis matches git-name-rev --refs=<ref-pattern>, anyway, which is the \nclosest example I could find. If this isn't the desired behavior, it's \nprobably easier to just edit this instead of trying to explain the right \nthing to me.\n\n builtin-ls-remote.c |   20 +++++++++++++++++---\n 1 files changed, 17 insertions(+), 3 deletions(-)\n\ndiff --git a/builtin-ls-remote.c b/builtin-ls-remote.c\nindex 56f3f88..d936c28 100644\n--- a/builtin-ls-remote.c\n+++ b/builtin-ls-remote.c\n@@ -17,6 +17,7 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix)\n \tstruct remote *remote;\n \tstruct transport *transport;\n \tconst struct ref *ref;\n+\tconst char **refpatterns = NULL;\n \n \tsetup_git_directory_gently(&nongit);\n \n@@ -50,9 +51,12 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix)\n \t\tbreak;\n \t}\n \n-\tif (!dest || i != argc - 1)\n+\tif (!dest)\n \t\tusage(ls_remote_usage);\n \n+\tif (argc > i + 1)\n+\t\trefpatterns = argv + i;\n+\n \tremote = nongit ? NULL : remote_get(dest);\n \tif (remote && !remote->url_nr)\n \t\tdie(\"remote %s has no configured URL\", dest);\n@@ -66,8 +70,18 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix)\n \t\treturn 1;\n \n \twhile (ref) {\n-\t\tif (check_ref_type(ref, flags))\n-\t\t\tprintf(\"%s\t%s\\n\", sha1_to_hex(ref->old_sha1), ref->name);\n+\t\tif (check_ref_type(ref, flags)) {\n+\t\t\tint match = 0;\n+\t\t\tif (refpatterns) {\n+\t\t\t\tfor (i = 0; refpatterns[i]; i++) {\n+\t\t\t\t\tif (!fnmatch(refpatterns[i], ref->name, 0))\n+\t\t\t\t\t\tmatch = 1;\n+\t\t\t\t}\n+\t\t\t} else\n+\t\t\t\tmatch = 1;\n+\t\t\tif (match)\n+\t\t\t\tprintf(\"%s\t%s\\n\", sha1_to_hex(ref->old_sha1), ref->name);\n+\t\t}\n \t\tref = ref->next;\n \t}\n \treturn 0;\n-- \n1.5.3.6.886.gb204\n"},{"id":"62459","messageId":"7v8x44tl7q.fsf@gitster.siamese.dyndns.org","threadId":"11204","inReplyTo":"Pine.LNX.4.64.0712082346310.5349@iabervon.org","subject":"Re: [PATCH] Restore ls-remote reference pattern matching","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2007-12-09T06:51:05Z","receivedAt":"2007-12-09T06:51:05Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Daniel Barkalow <barkalow@iabervon.org> writes:\n\n> I'd found the same code (\"git log -p -- git-ls-remote.sh\" also reveals it, \n> and I couldn't remember it's contrib/examples that things end up in), but \n> I don't really follow that shell syntax.\n\nSorry, I should have been more explicit.\n\nAt this point in the scripted version:\n\n\tfor pat\n\tdo\n\t\tcase \"/$path\" in\n\t\t*/$pat )\n\t\t\tmatch=yes\n\t\t\tbreak ;;\n\t\tesac\n\tdone\n\n - $path is what we read from peek-remote (or the equivalent from curl\n   for http), e.g. \"refs/heads/master\", or \"HEAD\".\n\n - we iterate over remainder of arguments to the script, assigning each\n   to $pat;\n\n - we check if the pattern \"*/$pat\" matches \"/$path\".  \"case\" matching\n   rule is an entire string match with globbing, so it is asking if\n   /$path ends with /$pat.  IOW, $pat=\"master\" matches:\n\n\t$path=refs/heads/master\n        $path=refs/remotes/origin/master\n\n   but it does not match $path=\"refs/heads/omaster\".\n\n---\n\n builtin-ls-remote.c |   44 ++++++++++++++++++++++++++++++++++++++------\n 1 files changed, 38 insertions(+), 6 deletions(-)\n\ndiff --git a/builtin-ls-remote.c b/builtin-ls-remote.c\nindex 56f3f88..bae7c48 100644\n--- a/builtin-ls-remote.c\n+++ b/builtin-ls-remote.c\n@@ -6,6 +6,35 @@\n static const char ls_remote_usage[] =\n \"git-ls-remote [--upload-pack=<git-upload-pack>] [<host>:]<directory>\";\n \n+/*\n+ * pattern is a list of tail-part of accepted refnames.  Is there one\n+ * among then that is a suffix of the path?  Directory boundary must\n+ * be honored when doing this match.  IOW, patterns \"master\" and\n+ * \"sa/master\" both match path \"refs/hold/sa/master\".  On the other\n+ * hand, path \"refs/hold/foosa/master\" is matched by \"master\" but not\n+ * by \"sa/master\".\n+ */\n+\n+static int tail_match(const char **pattern, const char *path)\n+{\n+\tint pathlen;\n+\tconst char *p;\n+\n+\tif (!*pattern)\n+\t\treturn 1; /* no restriction */\n+\n+\tfor (pathlen = strlen(path); (p = *pattern); pattern++) {\n+\t\tint pfxlen = pathlen - strlen(p);\n+\t\tif (pfxlen < 0)\n+\t\t\tcontinue; /* pattern is longer, will never match */\n+\t\tif (strcmp(path + pfxlen, p))\n+\t\t\tcontinue; /* no tail match */\n+\t\tif (!pfxlen || path[pfxlen - 1] == '/')\n+\t\t\treturn 1; /* fully match at directory boundary */\n+\t}\n+\treturn 0;\n+}\n+\n int cmd_ls_remote(int argc, const char **argv, const char *prefix)\n {\n \tint i;\n@@ -13,6 +42,7 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix)\n \tint nongit = 0;\n \tunsigned flags = 0;\n \tconst char *uploadpack = NULL;\n+\tconst char **pattern = NULL;\n \n \tstruct remote *remote;\n \tstruct transport *transport;\n@@ -50,9 +80,9 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix)\n \t\tbreak;\n \t}\n \n-\tif (!dest || i != argc - 1)\n+\tif (!dest)\n \t\tusage(ls_remote_usage);\n-\n+\tpattern = argv + i + 1;\n \tremote = nongit ? NULL : remote_get(dest);\n \tif (remote && !remote->url_nr)\n \t\tdie(\"remote %s has no configured URL\", dest);\n@@ -65,10 +95,12 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix)\n \tif (!ref)\n \t\treturn 1;\n \n-\twhile (ref) {\n-\t\tif (check_ref_type(ref, flags))\n-\t\t\tprintf(\"%s\t%s\\n\", sha1_to_hex(ref->old_sha1), ref->name);\n-\t\tref = ref->next;\n+\tfor ( ; ref; ref = ref->next) {\n+\t\tif (!check_ref_type(ref, flags))\n+\t\t\tcontinue;\n+\t\tif (!tail_match(pattern, ref->name))\n+\t\t\tcontinue;\n+\t\tprintf(\"%s\t%s\\n\", sha1_to_hex(ref->old_sha1), ref->name);\n \t}\n \treturn 0;\n }\n"},{"id":"62485","messageId":"20071209162632.a16bfd6e.vsu@altlinux.ru","threadId":"11204","inReplyTo":"7v8x44tl7q.fsf@gitster.siamese.dyndns.org","subject":"Re: [PATCH] Restore ls-remote reference pattern matching","fromName":"Sergey Vlasov","fromEmail":"vsu@altlinux.ru","sentAt":"2007-12-09T13:26:32Z","receivedAt":"2007-12-09T13:26:32Z","isPatch":true,"sender":{"key":"vsu@altlinux.ru","avatar":"https://avatars.githubusercontent.com/u/616082?v=4"},"body":"On Sat, 08 Dec 2007 22:51:05 -0800 Junio C Hamano wrote:\n\n[...]\n> \tfor pat\n> \tdo\n> \t\tcase \"/$path\" in\n> \t\t*/$pat )\n> \t\t\tmatch=yes\n> \t\t\tbreak ;;\n> \t\tesac\n> \tdone\n[...]\n> +/*\n> + * pattern is a list of tail-part of accepted refnames.  Is there one\n> + * among then that is a suffix of the path?  Directory boundary must\n> + * be honored when doing this match.  IOW, patterns \"master\" and\n> + * \"sa/master\" both match path \"refs/hold/sa/master\".  On the other\n> + * hand, path \"refs/hold/foosa/master\" is matched by \"master\" but not\n> + * by \"sa/master\".\n> + */\n> +\n> +static int tail_match(const char **pattern, const char *path)\n> +{\n> +\tint pathlen;\n> +\tconst char *p;\n> +\n> +\tif (!*pattern)\n> +\t\treturn 1; /* no restriction */\n> +\n> +\tfor (pathlen = strlen(path); (p = *pattern); pattern++) {\n> +\t\tint pfxlen = pathlen - strlen(p);\n> +\t\tif (pfxlen < 0)\n> +\t\t\tcontinue; /* pattern is longer, will never match */\n> +\t\tif (strcmp(path + pfxlen, p))\n> +\t\t\tcontinue; /* no tail match */\n> +\t\tif (!pfxlen || path[pfxlen - 1] == '/')\n> +\t\t\treturn 1; /* fully match at directory boundary */\n> +\t}\n> +\treturn 0;\n> +}\n\nThis still does not match the behavior of the old shell implementation\ncompletely - because $pat was not quoted, shell pattern characters in\n$pat worked, and things like \"git ls-remote . 'refs/heads/something--*'\"\nwere possible (and used in some of my scripts), so a full fnmatch()\ncall is still needed.\n"},{"id":"62487","messageId":"02ECE8E0-3D11-47AE-9875-69D0CEA34453@orakel.ntnu.no","threadId":"11204","inReplyTo":"20071209162632.a16bfd6e.vsu@altlinux.ru","subject":"Re: [PATCH] Restore ls-remote reference pattern matching","fromName":"Eyvind Bernhardsen","fromEmail":"eyvind-git@orakel.ntnu.no","sentAt":"2007-12-09T15:31:21Z","receivedAt":"2007-12-09T15:31:21Z","isPatch":true,"sender":{"key":"eyvind.bernhardsen@gmail.com","avatar":"https://avatars.githubusercontent.com/u/106762?v=4"},"body":"On 9. des.. 2007, at 14.26, Sergey Vlasov wrote:\n> This still does not match the behavior of the old shell implementation\n> completely - because $pat was not quoted, shell pattern characters in\n> $pat worked, and things like \"git ls-remote . 'refs/heads/something-- \n> *'\"\n> were possible (and used in some of my scripts), so a full fnmatch()\n> call is still needed.\n\n\nThe example in the ls-remote manpage (\"git ls-remote --tags <remote> v \n\\*\") also fails because of this.\n\nEyvind Bernhardsen\n"},{"id":"62502","messageId":"7vmysjpwdq.fsf@gitster.siamese.dyndns.org","threadId":"11204","inReplyTo":"20071209162632.a16bfd6e.vsu@altlinux.ru","subject":"Re: [PATCH] Restore ls-remote reference pattern matching","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2007-12-09T18:15:45Z","receivedAt":"2007-12-09T18:15:45Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Sergey Vlasov <vsu@altlinux.ru> writes:\n\n> This still does not match the behavior of the old shell implementation\n> completely - because $pat was not quoted, shell pattern characters in\n> $pat worked, and things like \"git ls-remote . 'refs/heads/something--*'\"\n> were possible (and used in some of my scripts), so a full fnmatch()\n> call is still needed.\n\nAh, true.  I wanted to cheat but that was a mistake.\n"},{"id":"62520","messageId":"7vtzmrobrl.fsf@gitster.siamese.dyndns.org","threadId":"11204","inReplyTo":"20071209162632.a16bfd6e.vsu@altlinux.ru","subject":"Re: [PATCH] Restore ls-remote reference pattern matching","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2007-12-09T20:26:22Z","receivedAt":"2007-12-09T20:26:22Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Sergey Vlasov <vsu@altlinux.ru> writes:\n\n> This still does not match the behavior of the old shell implementation\n> completely - because $pat was not quoted, shell pattern characters in\n> $pat worked, and things like \"git ls-remote . 'refs/heads/something--*'\"\n> were possible (and used in some of my scripts), so a full fnmatch()\n> call is still needed.\n\nSigh...\n\n-- >8 --\nSubject: [PATCH] Re-fix ls-remote\n\nAn earlier attempt in 2ea7fe0 (ls-remote: resurrect pattern limit support) forgot\nthat the user string can also be a glob.  This should finally fix it.\n\nSigned-off-by: Junio C Hamano <gitster@pobox.com>\n---\n builtin-ls-remote.c |   39 +++++++++++++++++++++------------------\n 1 files changed, 21 insertions(+), 18 deletions(-)\n\ndiff --git a/builtin-ls-remote.c b/builtin-ls-remote.c\nindex e5d670a..c2caeea 100644\n--- a/builtin-ls-remote.c\n+++ b/builtin-ls-remote.c\n@@ -7,30 +7,22 @@ static const char ls_remote_usage[] =\n \"git-ls-remote [--upload-pack=<git-upload-pack>] [<host>:]<directory>\";\n \n /*\n- * pattern is a list of tail-part of accepted refnames.  Is there one\n- * among them that is a suffix of the path?  Directory boundary must\n- * be honored when checking this match.  IOW, patterns \"master\" and\n- * \"sa/master\" both match path \"refs/hold/sa/master\".  On the other\n- * hand, path \"refs/hold/foosa/master\" is matched by \"master\" but not\n- * by \"sa/master\".\n+ * Is there one among the list of patterns that match the tail part\n+ * of the path?\n  */\n-\n static int tail_match(const char **pattern, const char *path)\n {\n-\tint pathlen;\n \tconst char *p;\n+\tchar pathbuf[PATH_MAX];\n \n-\tif (!*pattern)\n+\tif (!pattern)\n \t\treturn 1; /* no restriction */\n \n-\tfor (pathlen = strlen(path); (p = *pattern); pattern++) {\n-\t\tint pfxlen = pathlen - strlen(p);\n-\t\tif (pfxlen < 0)\n-\t\t\tcontinue; /* pattern is longer, will never match */\n-\t\tif (strcmp(path + pfxlen, p))\n-\t\t\tcontinue; /* no tail match */\n-\t\tif (!pfxlen || path[pfxlen - 1] == '/')\n-\t\t\treturn 1; /* fully match at directory boundary */\n+\tif (snprintf(pathbuf, sizeof(pathbuf), \"/%s\", path) > sizeof(pathbuf))\n+\t\treturn error(\"insanely long ref %.*s...\", 20, path);\n+\twhile ((p = *(pattern++)) != NULL) {\n+\t\tif (!fnmatch(p, pathbuf, 0))\n+\t\t\treturn 1;\n \t}\n \treturn 0;\n }\n@@ -77,12 +69,23 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix)\n \t\t\tusage(ls_remote_usage);\n \t\t}\n \t\tdest = arg;\n+\t\ti++;\n \t\tbreak;\n \t}\n \n \tif (!dest)\n \t\tusage(ls_remote_usage);\n-\tpattern = argv + i + 1;\n+\n+\tif (argv[i]) {\n+\t\tint j;\n+\t\tpattern = xcalloc(sizeof(const char *), argc - i + 1);\n+\t\tfor (j = i; j < argc; j++) {\n+\t\t\tint len = strlen(argv[j]);\n+\t\t\tchar *p = xmalloc(len + 3);\n+\t\t\tsprintf(p, \"*/%s\", argv[j]);\n+\t\t\tpattern[j - i] = p;\n+\t\t}\n+\t}\n \tremote = nongit ? NULL : remote_get(dest);\n \tif (remote && !remote->url_nr)\n \t\tdie(\"remote %s has no configured URL\", dest);\n-- \n1.5.3.7-1142-gbb4e\n"},{"id":"62554","messageId":"5C669468-71F1-4E28-9E15-1EAA4893135F@orakel.ntnu.no","threadId":"11204","inReplyTo":"7vtzmrobrl.fsf@gitster.siamese.dyndns.org","subject":"Re: [PATCH] Restore ls-remote reference pattern matching","fromName":"Eyvind Bernhardsen","fromEmail":"eyvind-git@orakel.ntnu.no","sentAt":"2007-12-10T09:16:42Z","receivedAt":"2007-12-10T09:16:42Z","isPatch":true,"sender":{"key":"eyvind.bernhardsen@gmail.com","avatar":"https://avatars.githubusercontent.com/u/106762?v=4"},"body":"\nOn 9. des. 2007, at 21.26, Junio C Hamano wrote:\n\n> Sergey Vlasov <vsu@altlinux.ru> writes:\n>\n>> This still does not match the behavior of the old shell  \n>> implementation\n>> completely - because $pat was not quoted, shell pattern characters in\n>> $pat worked, and things like \"git ls-remote . 'refs/heads/ \n>> something--*'\"\n>> were possible (and used in some of my scripts), so a full fnmatch()\n>> call is still needed.\n>\n> Sigh...\n\nThis patch makes ls-remote work as expected for me.\n-- \nEyvind\n"},{"id":"62557","messageId":"7vhciqna9o.fsf@gitster.siamese.dyndns.org","threadId":"11204","inReplyTo":"5C669468-71F1-4E28-9E15-1EAA4893135F@orakel.ntnu.no","subject":"Re: [PATCH] Restore ls-remote reference pattern matching","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2007-12-10T09:56:19Z","receivedAt":"2007-12-10T09:56:19Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Eyvind Bernhardsen <eyvind-git@orakel.ntnu.no> writes:\n\n> This patch makes ls-remote work as expected for me.\n\nThanks, the patch is queued for master.\n"}]}