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

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

From
Karthik Nayak <karthik.188@gmail.com>
Date
Jun 13, 2015, 19:37 UTC
Message-ID
<1434224249-21476-1-git-send-email-karthik.188@gmail.com>
In-Reply-To
<CAOLa=ZR6hRFZjXmSPh+rUS6EROdjP8d3tgP0+Yh5VDBdngCOkA@mail.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 supports wildcard 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 | 64 ++++++++++++++++++++++++++++++++------------------
 1 file changed, 41 insertions(+), 23 deletions(-)
diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c
index f7e51a7..cc65620 100644
--- a/builtin/for-each-ref.c
+++ b/builtin/for-each-ref.c
@@ -851,6 +851,44 @@ struct grab_ref_cbdata {
 };
 
 /*
+ * Return 1 if the refname matches one of the patterns, otherwise 0.
+ * A pattern can be path prefix (e.g. a refname "refs/heads/master"
+ * matches a pattern "refs/heads/") or a wildcard (e.g. the same ref
+ * matches "refs/heads/m*",too).
+ */
+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 +904,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.3.435.g2403634.dirty
Previous: karthik nayakNext: Karthik Nayak
Message 2 of 16 in “Create ref-filter from for-each-ref”
  1. 0/11 Create ref-filter from for-each-refkarthik nayak, Jun 13, 2015
  2. 01/11 for-each-ref: extract helper functions out of grab_single_ref()Karthik Nayak, Jun 13, 2015
  3. 02/11 for-each-ref: clean up codeKarthik Nayak, Jun 13, 2015
  4. 03/11 for-each-ref: rename 'refinfo' to 'ref_array_item'Karthik Nayak, Jun 13, 2015
  5. 04/11 for-each-ref: introduce new structures for better organisationKarthik Nayak, Jun 13, 2015
  6. 05/11 for-each-ref: introduce 'ref_array_clear()'Karthik Nayak, Jun 13, 2015
  7. 06/11 for-each-ref: rename some functions and make them publicKarthik Nayak, Jun 13, 2015
  8. 07/11 for-each-ref: rename variables called sort to sortingKarthik Nayak, Jun 13, 2015
  9. 08/11 ref-filter: add 'ref-filter.h'Karthik Nayak, Jun 13, 2015
  10. 09/11 ref-filter: move code from 'for-each-ref'Karthik Nayak, Jun 13, 2015
  11. 10/11 for-each-ref: introduce filter_refs()Karthik Nayak, Jun 13, 2015
  12. 11/11 ref-filter: make 'ref_array_item' use a FLEX_ARRAY for refnameKarthik Nayak, Jun 13, 2015
  13. Matthieu MoyJun 14, 2015
  14. karthik nayakJun 14, 2015
  15. Junio C HamanoJun 15, 2015
  16. karthik nayakJun 15, 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.