git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Jeff King <peff@peff.net>
To: git@vger.kernel.org
Subject: [PATCH 02/21] ls-refs: drop config caching
Date: Fri, 24 Feb 2023 01:37:22 -0500	[thread overview]
Message-ID: <Y/hbIj9T61+UYKF5@coredump.intra.peff.net> (raw)
In-Reply-To: <Y/habYJxDRJQg/kJ@coredump.intra.peff.net>

The code for the v2 ls-refs command has an ensure_config_read() function
that tries to read the lsrefs.unborn config only once and caches it in
some static global variables.

There's no real need for this caching. In any given process we'd only
need the value twice (once to decide whether to advertise, and once if
somebody runs the command). And since the config code already has its
own cache, each access is only incurring a hash lookup and string
comparison anyway.

Since the values we set are going to be specific to the_repository, the
globals we set are a mild anti-pattern. In practice it's not a bug (yet)
since the server-side v2 code only handles a single repository anyway.
But it doesn't hurt to take a small step in the right direction and
model a good approach.

Note that we currently set two booleans: advertise_unborn and
allow_unborn. But we can get away with a single value, since "advertise"
naturally implies "allow". That lets us just convert this to a function
with a return value.

Note that we still always read from the_repository; we'll deal with that
in a follow-on patch.

Signed-off-by: Jeff King <peff@peff.net>
---
Mostly done as prep for the next patch, but IMHO the simplification here
is nice in its own right.

 ls-refs.c | 34 ++++++++++++----------------------
 1 file changed, 12 insertions(+), 22 deletions(-)

diff --git a/ls-refs.c b/ls-refs.c
index 697d4beb8d..4863813655 100644
--- a/ls-refs.c
+++ b/ls-refs.c
@@ -8,38 +8,32 @@
 #include "config.h"
 #include "string-list.h"
 
-static int config_read;
-static int advertise_unborn;
-static int allow_unborn;
-
-static void ensure_config_read(void)
+static enum {
+	UNBORN_IGNORE = 0,
+	UNBORN_ALLOW,
+	UNBORN_ADVERTISE /* implies ALLOW */
+} unborn_config(void)
 {
 	const char *str = NULL;
 
-	if (config_read)
-		return;
-
 	if (repo_config_get_string_tmp(the_repository, "lsrefs.unborn", &str)) {
 		/*
 		 * If there is no such config, advertise and allow it by
 		 * default.
 		 */
-		advertise_unborn = 1;
-		allow_unborn = 1;
+		return UNBORN_ADVERTISE;
 	} else {
 		if (!strcmp(str, "advertise")) {
-			advertise_unborn = 1;
-			allow_unborn = 1;
+			return UNBORN_ADVERTISE;
 		} else if (!strcmp(str, "allow")) {
-			allow_unborn = 1;
+			return UNBORN_ALLOW;
 		} else if (!strcmp(str, "ignore")) {
-			/* do nothing */
+			return UNBORN_IGNORE;
 		} else {
 			die(_("invalid value for '%s': '%s'"),
 			    "lsrefs.unborn", str);
 		}
 	}
-	config_read = 1;
 }
 
 /*
@@ -159,7 +153,6 @@ int ls_refs(struct repository *r, struct packet_reader *request)
 	strbuf_init(&data.buf, 0);
 	string_list_init_dup(&data.hidden_refs);
 
-	ensure_config_read();
 	git_config(ls_refs_config, &data);
 
 	while (packet_reader_read(request) == PACKET_READ_NORMAL) {
@@ -175,7 +168,7 @@ int ls_refs(struct repository *r, struct packet_reader *request)
 				strvec_push(&data.prefixes, out);
 		}
 		else if (!strcmp("unborn", arg))
-			data.unborn = allow_unborn;
+			data.unborn = !!unborn_config();
 		else
 			die(_("unexpected line: '%s'"), arg);
 	}
@@ -206,11 +199,8 @@ int ls_refs(struct repository *r, struct packet_reader *request)
 
 int ls_refs_advertise(struct repository *r, struct strbuf *value)
 {
-	if (value) {
-		ensure_config_read();
-		if (advertise_unborn)
-			strbuf_addstr(value, "unborn");
-	}
+	if (value && unborn_config() == UNBORN_ADVERTISE)
+		strbuf_addstr(value, "unborn");
 
 	return 1;
 }
-- 
2.39.2.981.g6157336f25


  parent reply	other threads:[~2023-02-24  6:37 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-02-24  6:34 [PATCH 0/21] more -Wunused-parameter fixes Jeff King
2023-02-24  6:34 ` [PATCH 01/21] ref-filter: drop unused atom parameter from get_worktree_path() Jeff King
2023-02-24 17:53   ` Junio C Hamano
2023-02-24  6:37 ` Jeff King [this message]
2023-02-24  6:38 ` [PATCH 03/21] serve: use repository pointer to get config Jeff King
2023-02-24 17:59   ` Junio C Hamano
2023-02-24  6:38 ` [PATCH 04/21] serve: mark unused parameters in virtual functions Jeff King
2023-02-24  6:38 ` [PATCH 05/21] object-name: mark unused parameters in disambiguate callbacks Jeff King
2023-02-24  6:38 ` [PATCH 06/21] http-backend: mark argc/argv unused Jeff King
2023-02-24  6:38 ` [PATCH 07/21] http-backend: mark unused parameters in virtual functions Jeff King
2023-02-24  6:39 ` [PATCH 08/21] ref-filter: mark unused callback parameters Jeff King
2023-02-24  6:39 ` [PATCH 09/21] mark "pointless" data pointers in callbacks Jeff King
2023-02-24  6:39 ` [PATCH 10/21] run-command: mark error routine parameters as unused Jeff King
2023-02-24  6:39 ` [PATCH 11/21] mark unused parameters in signal handlers Jeff King
2023-02-24  6:39 ` [PATCH 12/21] list-objects: mark unused callback parameters Jeff King
2023-02-24  6:39 ` [PATCH 13/21] for_each_object: " Jeff King
2023-02-24  6:39 ` [PATCH 14/21] prio-queue: mark unused parameters in comparison functions Jeff King
2023-02-24  6:39 ` [PATCH 15/21] notes: mark unused callback parameters Jeff King
2023-02-24  6:39 ` [PATCH 16/21] fetch-pack: mark unused parameter in callback function Jeff King
2023-02-24  6:39 ` [PATCH 17/21] rewrite_parents(): mark unused callback parameter Jeff King
2023-02-24  6:39 ` [PATCH 18/21] for_each_commit_graft(): " Jeff King
2023-02-24  6:39 ` [PATCH 19/21] userformat_want_item(): mark unused parameter Jeff King
2023-02-24  6:39 ` [PATCH 20/21] run_processes_parallel: mark unused callback parameters Jeff King
2023-02-24  6:39 ` [PATCH 21/21] help: mark unused parameter in git_unknown_cmd_config() Jeff King

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=Y/hbIj9T61+UYKF5@coredump.intra.peff.net \
    --to=peff@peff.net \
    --cc=git@vger.kernel.org \
    /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).