invalidate_ref_cache(): take the submodule as parameter
[gitweb.git] / environment.c
index 94d58fd24413ec1d1a5769029bd5149b609f0d4e..8174b703c4a6dd62b01dabb34acc2a6492b43ba2 100644 (file)
@@ -8,6 +8,7 @@
  * are.
  */
 #include "cache.h"
+#include "refs.h"
 
 char git_default_email[MAX_GITNAME];
 char git_default_name[MAX_GITNAME];
@@ -36,6 +37,7 @@ size_t packed_git_window_size = DEFAULT_PACKED_GIT_WINDOW_SIZE;
 size_t packed_git_limit = DEFAULT_PACKED_GIT_LIMIT;
 size_t delta_base_cache_limit = 16 * 1024 * 1024;
 unsigned long big_file_threshold = 512 * 1024 * 1024;
+const char *log_pack_access;
 const char *pager_program;
 int pager_use_color = 1;
 const char *editor_program;
@@ -65,6 +67,9 @@ int core_preload_index = 0;
 char *git_work_tree_cfg;
 static char *work_tree;
 
+static const char *namespace;
+static size_t namespace_len;
+
 static const char *git_dir;
 static char *git_object_dir, *git_index_file, *git_graft_file;
 
@@ -86,12 +91,33 @@ const char * const local_repo_env[LOCAL_REPO_ENV_SIZE + 1] = {
        NULL
 };
 
+static char *expand_namespace(const char *raw_namespace)
+{
+       struct strbuf buf = STRBUF_INIT;
+       struct strbuf **components, **c;
+
+       if (!raw_namespace || !*raw_namespace)
+               return xstrdup("");
+
+       strbuf_addstr(&buf, raw_namespace);
+       components = strbuf_split(&buf, '/');
+       strbuf_reset(&buf);
+       for (c = components; *c; c++)
+               if (strcmp((*c)->buf, "/") != 0)
+                       strbuf_addf(&buf, "refs/namespaces/%s", (*c)->buf);
+       strbuf_list_free(components);
+       if (check_refname_format(buf.buf, 0))
+               die("bad git namespace path \"%s\"", raw_namespace);
+       strbuf_addch(&buf, '/');
+       return strbuf_detach(&buf, NULL);
+}
+
 static void setup_git_env(void)
 {
        git_dir = getenv(GIT_DIR_ENVIRONMENT);
        git_dir = git_dir ? xstrdup(git_dir) : NULL;
        if (!git_dir) {
-               git_dir = read_gitfile_gently(DEFAULT_GIT_DIR_ENVIRONMENT);
+               git_dir = read_gitfile(DEFAULT_GIT_DIR_ENVIRONMENT);
                git_dir = git_dir ? xstrdup(git_dir) : NULL;
        }
        if (!git_dir)
@@ -111,6 +137,8 @@ static void setup_git_env(void)
                git_graft_file = git_pathdup("info/grafts");
        if (getenv(NO_REPLACE_OBJECTS_ENVIRONMENT))
                read_replace_refs = 0;
+       namespace = expand_namespace(getenv(GIT_NAMESPACE_ENVIRONMENT));
+       namespace_len = strlen(namespace);
 }
 
 int is_bare_repository(void)
@@ -131,6 +159,20 @@ const char *get_git_dir(void)
        return git_dir;
 }
 
+const char *get_git_namespace(void)
+{
+       if (!namespace)
+               setup_git_env();
+       return namespace;
+}
+
+const char *strip_namespace(const char *namespaced_ref)
+{
+       if (prefixcmp(namespaced_ref, get_git_namespace()) != 0)
+               return NULL;
+       return namespaced_ref + namespace_len;
+}
+
 static int git_work_tree_initialized;
 
 /*