git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Stefan Beller <sbeller@google.com>
To: gitster@pobox.com, bmwill@google.com, pclouds@gmail.com
Cc: git@vger.kernel.org, Stefan Beller <sbeller@google.com>
Subject: [PATCH 13/35] attr: convert git_check_attrs() callers to use the new API
Date: Thu, 10 Nov 2016 12:34:06 -0800	[thread overview]
Message-ID: <20161110203428.30512-14-sbeller@google.com> (raw)
In-Reply-To: <20161110203428.30512-1-sbeller@google.com>

From: Junio C Hamano <gitster@pobox.com>

The remaining callers are all simple "I have N attributes I am
interested in.  I'll ask about them with various paths one by one".

After this step, no caller to git_check_attrs() remains.  After
removing it, we can extend "struct git_attr_check" struct with data
that can be used in optimizing the query for the specific N
attributes it contains.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 builtin/pack-objects.c | 19 +++++--------------
 convert.c              | 18 +++++++-----------
 ll-merge.c             | 33 ++++++++++++++-------------------
 userdiff.c             | 19 ++++++++-----------
 ws.c                   | 19 ++++++-------------
 5 files changed, 40 insertions(+), 68 deletions(-)

diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index 3cb38ed..3918c07 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -896,24 +896,15 @@ static void write_pack_file(void)
 			written, nr_result);
 }
 
-static void setup_delta_attr_check(struct git_attr_check_elem *check)
-{
-	static struct git_attr *attr_delta;
-
-	if (!attr_delta)
-		attr_delta = git_attr("delta");
-
-	check[0].attr = attr_delta;
-}
-
 static int no_try_delta(const char *path)
 {
-	struct git_attr_check_elem check[1];
+	static struct git_attr_check *check;
 
-	setup_delta_attr_check(check);
-	if (git_check_attrs(path, ARRAY_SIZE(check), check))
+	if (!check)
+		check = git_attr_check_initl("delta", NULL);
+	if (git_check_attr(path, check))
 		return 0;
-	if (ATTR_FALSE(check->value))
+	if (ATTR_FALSE(check->check[0].value))
 		return 1;
 	return 0;
 }
diff --git a/convert.c b/convert.c
index c95ae71..bb2435a 100644
--- a/convert.c
+++ b/convert.c
@@ -775,24 +775,20 @@ struct conv_attrs {
 	int ident;
 };
 
-static const char *conv_attr_name[] = {
-	"crlf", "ident", "filter", "eol", "text",
-};
-#define NUM_CONV_ATTRS ARRAY_SIZE(conv_attr_name)
-
 static void convert_attrs(struct conv_attrs *ca, const char *path)
 {
-	int i;
-	static struct git_attr_check_elem ccheck[NUM_CONV_ATTRS];
+	static struct git_attr_check *check;
 
-	if (!ccheck[0].attr) {
-		for (i = 0; i < NUM_CONV_ATTRS; i++)
-			ccheck[i].attr = git_attr(conv_attr_name[i]);
+	if (!check) {
+		check = git_attr_check_initl("crlf", "ident",
+					     "filter", "eol", "text",
+					     NULL);
 		user_convert_tail = &user_convert;
 		git_config(read_convert_config, NULL);
 	}
 
-	if (!git_check_attrs(path, NUM_CONV_ATTRS, ccheck)) {
+	if (!git_check_attr(path, check)) {
+		struct git_attr_check_elem *ccheck = check->check;
 		ca->crlf_action = git_path_check_crlf(ccheck + 4);
 		if (ca->crlf_action == CRLF_UNDEFINED)
 			ca->crlf_action = git_path_check_crlf(ccheck + 0);
diff --git a/ll-merge.c b/ll-merge.c
index eb2c37e..bc6479c 100644
--- a/ll-merge.c
+++ b/ll-merge.c
@@ -336,15 +336,6 @@ static const struct ll_merge_driver *find_ll_merge_driver(const char *merge_attr
 	return &ll_merge_drv[LL_TEXT_MERGE];
 }
 
-static int git_path_check_merge(const char *path, struct git_attr_check_elem check[2])
-{
-	if (!check[0].attr) {
-		check[0].attr = git_attr("merge");
-		check[1].attr = git_attr("conflict-marker-size");
-	}
-	return git_check_attrs(path, 2, check);
-}
-
 static void normalize_file(mmfile_t *mm, const char *path)
 {
 	struct strbuf strbuf = STRBUF_INIT;
@@ -362,7 +353,7 @@ int ll_merge(mmbuffer_t *result_buf,
 	     mmfile_t *theirs, const char *their_label,
 	     const struct ll_merge_options *opts)
 {
-	static struct git_attr_check_elem check[2];
+	static struct git_attr_check *check;
 	static const struct ll_merge_options default_opts;
 	const char *ll_driver_name = NULL;
 	int marker_size = DEFAULT_CONFLICT_MARKER_SIZE;
@@ -376,10 +367,14 @@ int ll_merge(mmbuffer_t *result_buf,
 		normalize_file(ours, path);
 		normalize_file(theirs, path);
 	}
-	if (!git_path_check_merge(path, check)) {
-		ll_driver_name = check[0].value;
-		if (check[1].value) {
-			marker_size = atoi(check[1].value);
+
+	if (!check)
+		check = git_attr_check_initl("merge", "conflict-marker-size", NULL);
+
+	if (!git_check_attr(path, check)) {
+		ll_driver_name = check->check[0].value;
+		if (check->check[1].value) {
+			marker_size = atoi(check->check[1].value);
 			if (marker_size <= 0)
 				marker_size = DEFAULT_CONFLICT_MARKER_SIZE;
 		}
@@ -398,13 +393,13 @@ int ll_merge(mmbuffer_t *result_buf,
 
 int ll_merge_marker_size(const char *path)
 {
-	static struct git_attr_check_elem check;
+	static struct git_attr_check *check;
 	int marker_size = DEFAULT_CONFLICT_MARKER_SIZE;
 
-	if (!check.attr)
-		check.attr = git_attr("conflict-marker-size");
-	if (!git_check_attrs(path, 1, &check) && check.value) {
-		marker_size = atoi(check.value);
+	if (!check)
+		check = git_attr_check_initl("conflict-marker-size", NULL);
+	if (!git_check_attr(path, check) && check->check[0].value) {
+		marker_size = atoi(check->check[0].value);
 		if (marker_size <= 0)
 			marker_size = DEFAULT_CONFLICT_MARKER_SIZE;
 	}
diff --git a/userdiff.c b/userdiff.c
index 4de3289..46dfd32 100644
--- a/userdiff.c
+++ b/userdiff.c
@@ -262,25 +262,22 @@ struct userdiff_driver *userdiff_find_by_name(const char *name) {
 
 struct userdiff_driver *userdiff_find_by_path(const char *path)
 {
-	static struct git_attr *attr;
-	struct git_attr_check_elem check;
-
-	if (!attr)
-		attr = git_attr("diff");
-	check.attr = attr;
+	static struct git_attr_check *check;
 
+	if (!check)
+		check = git_attr_check_initl("diff", NULL);
 	if (!path)
 		return NULL;
-	if (git_check_attrs(path, 1, &check))
+	if (git_check_attr(path, check))
 		return NULL;
 
-	if (ATTR_TRUE(check.value))
+	if (ATTR_TRUE(check->check[0].value))
 		return &driver_true;
-	if (ATTR_FALSE(check.value))
+	if (ATTR_FALSE(check->check[0].value))
 		return &driver_false;
-	if (ATTR_UNSET(check.value))
+	if (ATTR_UNSET(check->check[0].value))
 		return NULL;
-	return userdiff_find_by_name(check.value);
+	return userdiff_find_by_name(check->check[0].value);
 }
 
 struct userdiff_driver *userdiff_get_textconv(struct userdiff_driver *driver)
diff --git a/ws.c b/ws.c
index 7350905..bb3270c 100644
--- a/ws.c
+++ b/ws.c
@@ -71,24 +71,17 @@ unsigned parse_whitespace_rule(const char *string)
 	return rule;
 }
 
-static void setup_whitespace_attr_check(struct git_attr_check_elem *check)
-{
-	static struct git_attr *attr_whitespace;
-
-	if (!attr_whitespace)
-		attr_whitespace = git_attr("whitespace");
-	check[0].attr = attr_whitespace;
-}
-
 unsigned whitespace_rule(const char *pathname)
 {
-	struct git_attr_check_elem attr_whitespace_rule;
+	static struct git_attr_check *attr_whitespace_rule;
+
+	if (!attr_whitespace_rule)
+		attr_whitespace_rule = git_attr_check_initl("whitespace", NULL);
 
-	setup_whitespace_attr_check(&attr_whitespace_rule);
-	if (!git_check_attrs(pathname, 1, &attr_whitespace_rule)) {
+	if (!git_check_attr(pathname, attr_whitespace_rule)) {
 		const char *value;
 
-		value = attr_whitespace_rule.value;
+		value = attr_whitespace_rule->check[0].value;
 		if (ATTR_TRUE(value)) {
 			/* true (whitespace) */
 			unsigned all_rule = ws_tab_width(whitespace_rule_cfg);
-- 
2.10.1.469.g00a8914


  parent reply	other threads:[~2016-11-10 20:35 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-11-10 20:33 [PATCHv3 00/35] Revamp the attr subsystem! Stefan Beller
2016-11-10 20:33 ` [PATCH 01/35] commit.c: use strchrnul() to scan for one line Stefan Beller
2016-11-10 20:33 ` [PATCH 02/35] attr.c: " Stefan Beller
2016-11-10 20:33 ` [PATCH 03/35] attr.c: update a stale comment on "struct match_attr" Stefan Beller
2016-11-10 20:33 ` [PATCH 04/35] attr.c: explain the lack of attr-name syntax check in parse_attr() Stefan Beller
2016-11-10 20:33 ` [PATCH 05/35] attr.c: complete a sentence in a comment Stefan Beller
2016-11-10 20:33 ` [PATCH 06/35] attr.c: mark where #if DEBUG ends more clearly Stefan Beller
2016-11-10 20:34 ` [PATCH 07/35] attr.c: simplify macroexpand_one() Stefan Beller
2016-11-10 20:34 ` [PATCH 08/35] attr.c: tighten constness around "git_attr" structure Stefan Beller
2016-11-10 20:34 ` [PATCH 09/35] attr.c: plug small leak in parse_attr_line() Stefan Beller
2016-11-10 20:34 ` [PATCH 10/35] attr: rename function and struct related to checking attributes Stefan Beller
2016-11-10 20:34 ` [PATCH 11/35] attr: (re)introduce git_check_attr() and struct git_attr_check Stefan Beller
2016-11-10 20:34 ` [PATCH 12/35] attr: convert git_all_attrs() to use "struct git_attr_check" Stefan Beller
2016-11-10 20:34 ` Stefan Beller [this message]
2016-11-10 20:34 ` [PATCH 14/35] attr: retire git_check_attrs() API Stefan Beller
2016-11-10 20:34 ` [PATCH 15/35] attr: add counted string version of git_check_attr() Stefan Beller
2016-11-10 20:34 ` [PATCH 16/35] attr: expose validity check for attribute names Stefan Beller
2016-11-10 20:34 ` [PATCH 17/35] attr: support quoting pathname patterns in C style Stefan Beller
2016-11-10 20:34 ` [PATCH 18/35] attr.c: add push_stack() helper Stefan Beller
2016-11-10 20:34 ` [PATCH 19/35] attr.c: pass struct git_attr_check down the callchain Stefan Beller
2016-11-10 20:34 ` [PATCH 20/35] attr.c: rename a local variable check Stefan Beller
2016-11-10 20:34 ` [PATCH 21/35] attr.c: correct ugly hack for git_all_attrs() Stefan Beller
2016-11-10 20:34 ` [PATCH 22/35] attr.c: introduce empty_attr_check_elems() Stefan Beller
2016-11-10 20:34 ` [PATCH 23/35] attr.c: always pass check[] to collect_some_attrs() Stefan Beller
2016-11-10 20:34 ` [PATCH 24/35] attr.c: outline the future plans by heavily commenting Stefan Beller
2016-11-10 20:34 ` [PATCH 25/35] attr: make git_check_attr_counted static Stefan Beller
2016-11-10 20:34 ` [PATCH 26/35] attr: convert to new threadsafe API Stefan Beller
2016-11-10 20:34 ` [PATCH 27/35] attr: keep attr stack for each check Stefan Beller
2016-11-10 20:34 ` [PATCH 28/35] Documentation: fix a typo Stefan Beller
2016-11-10 20:34 ` [PATCH 29/35] pathspec: move long magic parsing out of prefix_pathspec Stefan Beller
2016-11-10 20:34 ` [PATCH 30/35] pathspec: move prefix check out of the inner loop Stefan Beller
2016-11-10 20:34 ` [PATCH 31/35] pathspec: allow querying for attributes Stefan Beller
2016-11-22 10:41   ` Duy Nguyen
2016-11-22 17:26     ` Stefan Beller
2016-11-23  9:38       ` Duy Nguyen
2016-11-28 18:02   ` Brandon Williams
2016-11-28 18:03   ` Brandon Williams
2016-11-28 22:11   ` Brandon Williams
2016-11-29 17:37     ` Stefan Beller
2016-11-10 20:34 ` [PATCH 32/35] pathspec: allow escaped query values Stefan Beller
2016-11-10 20:34 ` [PATCH 33/35] submodule update: add `--init-default-path` switch Stefan Beller
2016-11-10 20:34 ` [PATCH 34/35] clone: add --init-submodule=<pathspec> switch Stefan Beller
2016-11-10 20:34 ` [PATCH 35/35] completion: clone can initialize specific submodules Stefan Beller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20161110203428.30512-14-sbeller@google.com \
    --to=sbeller@google.com \
    --cc=bmwill@google.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=pclouds@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).