git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v2] rev-parse --namespace

From
Junio C Hamano <gitster@pobox.com>
Date
Jan 19, 2010, 20:06 UTC
Message-ID
<7v3a21amh7.fsf@alter.siamese.dyndns.org>
In-Reply-To
<20100119183736.GA24204@Knoppix>
Ilari Liusvaara <ilari.liusvaara@elisanet.fi> writes:
> ..., if matching power would be extended,
> probably the easiest extension would be full-blown extended regular
> expressions.

As refs behave like a filesystem path and we try to use fnmatch() for anything that behave like a filesystem path, that would break consistency.

But a patch to add fnmatch() shouldn't be too bad; something like this (not even compile tested)?

 refs.c |   45 +++++++++++++++++++++++++++++++++++++--------
 1 files changed, 37 insertions(+), 8 deletions(-)
diff --git a/refs.c b/refs.c
index 5583f4b..0494c75 100644
--- a/refs.c
+++ b/refs.c
@@ -674,19 +674,48 @@ int for_each_replace_ref(each_ref_fn fn, void *cb_data)
 	return do_for_each_ref("refs/replace/", fn, 13, 0, cb_data);
 }
 
+struct ref_glob_filter {
+	each_ref_fn *user_callback;
+	void *user_cb_data;
+	const char *pattern;
+	int pattern_len;
+};
+
+static int ref_glob_filter_cb(const char *refname,
+			      const unsigned char *sha1,
+			      int flags, void *cb_data)
+{
+	struct ref_glob_filter *cb = cb_data;
+
+	/*
+	 * Reject if it does not produce a prefix match and
+	 * it doesn't pass fnmatch().
+	 */
+	if (!(cb->pattern_len <= strlen(refname)
+	      && !memcmp(cb->pattern, refname, cb->pattern_len)) &&
+	    fnmatch(cb->pattern, refname, 0))
+		return 0;
+	return cb->user_callback(refname, sha1, flags, cb->user_cb_data);
+}
+
 int for_each_namespace_ref(each_ref_fn fn, const char *ns_name, void *cb_data)
 {
-	struct strbuf real_prefix = STRBUF_INIT;
+	struct ref_glob_filter filter;
+	struct strbuf pattern = STRBUF_INIT;
 	int ret;
 
 	if (prefixcmp(ns_name, "refs/"))
-		strbuf_addstr(&real_prefix, "refs/");
-	strbuf_addstr(&real_prefix, ns_name);
-	if (real_prefix.buf[real_prefix.len - 1] != '/')
-		strbuf_addch(&real_prefix, '/');
-
-	ret = for_each_ref_in(real_prefix.buf, fn, cb_data);
-	strbuf_release(&real_prefix);
+		strbuf_addstr(&pattern, "refs/");
+	strbuf_addstr(&pattern, ns_name);
+	if (pattern.buf[pattern.len - 1] != '/')
+		strbuf_addch(&pattern, '/');
+	filter.pattern = pattern.buf;
+	filter.pattern_len = pattern.len;
+	filter.user_callback = fn;
+	filter.user_cb_data = cb_data;
+
+	ret = for_each_ref(ref_glob_filter_cb, &filter);
+	strbuf_release(&pattern);
 	return ret;
 }
 
Previous: Ilari LiusvaaraNext: Ilari Liusvaara
Message 9 of 14 in “rev-parse --namespace”
  1. rev-parse --namespaceIlari Liusvaara, Jan 18, 2010
  2. Junio C HamanoJan 18, 2010
  3. rev-parse --namespaceIlari Liusvaara, Jan 18, 2010
  4. Jeff KingJan 19, 2010
  5. Fix errors in t6018Ilari Liusvaara, Jan 19, 2010
  6. Junio C HamanoJan 19, 2010
  7. Thomas RastJan 19, 2010
  8. Ilari LiusvaaraJan 19, 2010
  9. Junio C HamanoJan 19, 2010
  10. Ilari LiusvaaraJan 19, 2010
  11. Thomas RastJan 19, 2010
  12. Ilari LiusvaaraJan 19, 2010
  13. Junio C HamanoJan 19, 2010
  14. Johannes SixtJan 20, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.