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

[PATCH v6 01/11] for-each-ref: extract helper functions out of grab_single_ref()

From
Karthik Nayak <karthik.188@gmail.com>
Date
Jun 6, 2015, 13:48 UTC
Message-ID
<1433598496-31287-1-git-send-email-karthik.188@gmail.com>
In-Reply-To
<5572F904.1080608@gmail.com>

Extract two helper functions out of grab_single_ref(). Firstly, new_refinfo() which is used to allocate memory for a new refinfo structure and copy the objectname, refname and flag to it. Secondly, match_name_as_path() which when given an array of patterns and the refname checks if the refname matches any of the patterns given while the pattern is a pathname, also while supporting wild characters.

This is a preperatory patch for restructuring 'for-each-ref' and eventually moving most of it to 'ref-filter' to provide the functionality to similar commands via public API's.

Helped-by: Junio C Hamano <gitster@pobox.com>
Mentored-by: Christian Couder <christian.couder@gmail.com>
Mentored-by: Matthieu Moy <matthieu.moy@grenoble-inp.fr>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
 builtin/for-each-ref.c | 63 ++++++++++++++++++++++++++++++++------------------
 1 file changed, 40 insertions(+), 23 deletions(-)
diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c
index f7e51a7..f939fd3 100644
--- a/builtin/for-each-ref.c
+++ b/builtin/for-each-ref.c
@@ -851,6 +851,43 @@ struct grab_ref_cbdata {
 };
 
 /*
+ * Given a refname, return 1 if the refname matches with one of the patterns
+ * while the pattern is a pathname like 'refs/tags' or 'refs/heads/master'
+ * and so on, else return 0. Supports use of wild characters.
+ */
+static int match_name_as_path(const char **pattern, const char *refname)
+{
+	int namelen = strlen(refname);
+	for (; *pattern; pattern++) {
+		const char *p = *pattern;
+		int plen = strlen(p);
+
+		if ((plen <= namelen) &&
+		    !strncmp(refname, p, plen) &&
+		    (refname[plen] == '\0' ||
+		     refname[plen] == '/' ||
+		     p[plen-1] == '/'))
+			return 1;
+		if (!wildmatch(p, refname, WM_PATHNAME, NULL))
+			return 1;
+	}
+	return 0;
+}
+
+/* Allocate space for a new refinfo and copy the objectname and flag to it */
+static struct refinfo *new_refinfo(const char *refname,
+				   const unsigned char *objectname,
+				   int flag)
+{
+	struct refinfo *ref = xcalloc(1, sizeof(struct refinfo));
+	ref->refname = xstrdup(refname);
+	hashcpy(ref->objectname, objectname);
+	ref->flag = flag;
+
+	return ref;
+}
+
+/*
  * A call-back given to for_each_ref().  Filter refs and keep them for
  * later object processing.
  */
@@ -866,35 +903,15 @@ static int grab_single_ref(const char *refname, const struct object_id *oid,
 		  return 0;
 	}
 
-	if (*cb->grab_pattern) {
-		const char **pattern;
-		int namelen = strlen(refname);
-		for (pattern = cb->grab_pattern; *pattern; pattern++) {
-			const char *p = *pattern;
-			int plen = strlen(p);
-
-			if ((plen <= namelen) &&
-			    !strncmp(refname, p, plen) &&
-			    (refname[plen] == '\0' ||
-			     refname[plen] == '/' ||
-			     p[plen-1] == '/'))
-				break;
-			if (!wildmatch(p, refname, WM_PATHNAME, NULL))
-				break;
-		}
-		if (!*pattern)
-			return 0;
-	}
+	if (*cb->grab_pattern && !match_name_as_path(cb->grab_pattern, refname))
+		return 0;
 
 	/*
 	 * We do not open the object yet; sort may only need refname
 	 * to do its job and the resulting list may yet to be pruned
 	 * by maxcount logic.
 	 */
-	ref = xcalloc(1, sizeof(*ref));
-	ref->refname = xstrdup(refname);
-	hashcpy(ref->objectname, oid->hash);
-	ref->flag = flag;
+	ref = new_refinfo(refname, oid->hash, flag);
 
 	cnt = cb->grab_cnt;
 	REALLOC_ARRAY(cb->grab_array, cnt + 1);
-- 
2.4.2
Previous: Karthik NayakNext: Karthik Nayak
Message 2 of 24 in “create ref-filter from for-each-ref”
  1. 0/11 create ref-filter from for-each-refKarthik Nayak, Jun 6, 2015
  2. 01/11 for-each-ref: extract helper functions out of grab_single_ref()Karthik Nayak, Jun 6, 2015
  3. 02/11 for-each-ref: clean up codeKarthik Nayak, Jun 6, 2015
  4. 03/11 for-each-ref: rename 'refinfo' to 'ref_array_item'Karthik Nayak, Jun 6, 2015
  5. 04/11 for-each-ref: introduce new structures for better organisationKarthik Nayak, Jun 6, 2015
  6. 05/11 for-each-ref: introduce 'ref_array_clear()'Karthik Nayak, Jun 6, 2015
  7. 06/11 for-each-ref: rename some functions and make them publicKarthik Nayak, Jun 6, 2015
  8. 07/11 for-each-ref: rename variables called sort to sortingKarthik Nayak, Jun 6, 2015
  9. 08/11 ref-filter: add 'ref-filter.h'Karthik Nayak, Jun 6, 2015
  10. 09/11 ref-filter: move code from 'for-each-ref'Karthik Nayak, Jun 6, 2015
  11. 09/11 ref-filter: move code from 'for-each-ref'Karthik Nayak, Jun 7, 2015
  12. Matthieu MoyJun 8, 2015
  13. Karthik NayakJun 8, 2015
  14. Junio C HamanoJun 8, 2015
  15. 10/11 for-each-ref: introduce filter_refs()Karthik Nayak, Jun 6, 2015
  16. 10/11 for-each-ref: introduce filter_refs()Karthik Nayak, Jun 7, 2015
  17. Junio C HamanoJun 8, 2015
  18. Karthik NayakJun 8, 2015
  19. 11/11 ref-filter: make 'ref_array_item' use a FLEX_ARRAY for refnameKarthik Nayak, Jun 6, 2015
  20. Junio C HamanoJun 8, 2015
  21. Karthik NayakJun 8, 2015
  22. Karthik NayakJun 7, 2015
  23. Matthieu MoyJun 8, 2015
  24. Karthik NayakJun 8, 2015

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.