]> git.ipfire.org Git - thirdparty/git.git/blobdiff - ls-refs.c
hash-ll.h: split out of hash.h to remove dependency on repository.h
[thirdparty/git.git] / ls-refs.c
index fa0d01b47c1286767068df928e83dd74c5f7b49e..f385938b64c6f9758a440195449a8fdca54ad0ef 100644 (file)
--- a/ls-refs.c
+++ b/ls-refs.c
@@ -1,4 +1,8 @@
-#include "cache.h"
+#include "git-compat-util.h"
+#include "environment.h"
+#include "gettext.h"
+#include "hash.h"
+#include "hex.h"
 #include "repository.h"
 #include "refs.h"
 #include "remote.h"
 #include "ls-refs.h"
 #include "pkt-line.h"
 #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(struct repository *r)
 {
        const char *str = NULL;
 
-       if (config_read)
-               return;
-
-       if (repo_config_get_string_tmp(the_repository, "lsrefs.unborn", &str)) {
+       if (repo_config_get_string_tmp(r, "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;
 }
 
 /*
@@ -73,6 +72,7 @@ struct ls_refs_data {
        unsigned symrefs;
        struct strvec prefixes;
        struct strbuf buf;
+       struct string_list hidden_refs;
        unsigned unborn : 1;
 };
 
@@ -84,7 +84,7 @@ static int send_ref(const char *refname, const struct object_id *oid,
 
        strbuf_reset(&data->buf);
 
-       if (ref_is_hidden(refname_nons, refname))
+       if (ref_is_hidden(refname_nons, refname, &data->hidden_refs))
                return 0;
 
        if (!ref_match(&data->prefixes, refname_nons))
@@ -137,14 +137,15 @@ static void send_possibly_unborn_head(struct ls_refs_data *data)
 }
 
 static int ls_refs_config(const char *var, const char *value,
-                         void *data UNUSED)
+                         void *cb_data)
 {
+       struct ls_refs_data *data = cb_data;
        /*
         * We only serve fetches over v2 for now, so respect only "uploadpack"
         * config. This may need to eventually be expanded to "receive", but we
         * don't yet know how that information will be passed to ls-refs.
         */
-       return parse_hide_refs_config(var, value, "uploadpack");
+       return parse_hide_refs_config(var, value, "uploadpack", &data->hidden_refs);
 }
 
 int ls_refs(struct repository *r, struct packet_reader *request)
@@ -154,9 +155,9 @@ int ls_refs(struct repository *r, struct packet_reader *request)
        memset(&data, 0, sizeof(data));
        strvec_init(&data.prefixes);
        strbuf_init(&data.buf, 0);
+       string_list_init_dup(&data.hidden_refs);
 
-       ensure_config_read();
-       git_config(ls_refs_config, NULL);
+       git_config(ls_refs_config, &data);
 
        while (packet_reader_read(request) == PACKET_READ_NORMAL) {
                const char *arg = request->line;
@@ -171,7 +172,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(r);
                else
                        die(_("unexpected line: '%s'"), arg);
        }
@@ -190,21 +191,20 @@ int ls_refs(struct repository *r, struct packet_reader *request)
        send_possibly_unborn_head(&data);
        if (!data.prefixes.nr)
                strvec_push(&data.prefixes, "");
-       for_each_fullref_in_prefixes(get_git_namespace(), data.prefixes.v,
-                                    send_ref, &data);
+       refs_for_each_fullref_in_prefixes(get_main_ref_store(r),
+                                         get_git_namespace(), data.prefixes.v,
+                                         send_ref, &data);
        packet_fflush(stdout);
        strvec_clear(&data.prefixes);
        strbuf_release(&data.buf);
+       string_list_clear(&data.hidden_refs, 0);
        return 0;
 }
 
 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(r) == UNBORN_ADVERTISE)
+               strbuf_addstr(value, "unborn");
 
        return 1;
 }