mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-05 18:33:28 +00:00
Merge pull request #4154 from libgit2/ethomson/namespaces
Support namespaced references again
This commit is contained in:
commit
b31b236004
@ -1433,26 +1433,25 @@ static void refdb_fs_backend__free(git_refdb_backend *_backend)
|
|||||||
git__free(backend);
|
git__free(backend);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int setup_namespace(git_buf *gitpath, git_repository *repo)
|
static char *setup_namespace(git_repository *repo, const char *in)
|
||||||
{
|
{
|
||||||
char *parts, *start, *end;
|
git_buf path = GIT_BUF_INIT;
|
||||||
|
char *parts, *start, *end, *out = NULL;
|
||||||
|
|
||||||
/* Not all repositories have a gitpath */
|
if (!in)
|
||||||
if (repo->gitdir == NULL)
|
goto done;
|
||||||
return 0;
|
|
||||||
if (repo->commondir == NULL)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* Load the path to the repo first */
|
git_buf_puts(&path, in);
|
||||||
git_buf_puts(gitpath, repo->gitdir);
|
|
||||||
|
|
||||||
/* if the repo is not namespaced, nothing else to do */
|
/* if the repo is not namespaced, nothing else to do */
|
||||||
if (repo->namespace == NULL)
|
if (repo->namespace == NULL) {
|
||||||
return 0;
|
out = git_buf_detach(&path);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
parts = end = git__strdup(repo->namespace);
|
parts = end = git__strdup(repo->namespace);
|
||||||
if (parts == NULL)
|
if (parts == NULL)
|
||||||
return -1;
|
goto done;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* From `man gitnamespaces`:
|
* From `man gitnamespaces`:
|
||||||
@ -1460,21 +1459,24 @@ static int setup_namespace(git_buf *gitpath, git_repository *repo)
|
|||||||
* of namespaces; for example, GIT_NAMESPACE=foo/bar will store
|
* of namespaces; for example, GIT_NAMESPACE=foo/bar will store
|
||||||
* refs under refs/namespaces/foo/refs/namespaces/bar/
|
* refs under refs/namespaces/foo/refs/namespaces/bar/
|
||||||
*/
|
*/
|
||||||
while ((start = git__strsep(&end, "/")) != NULL) {
|
while ((start = git__strsep(&end, "/")) != NULL)
|
||||||
git_buf_printf(gitpath, "refs/namespaces/%s/", start);
|
git_buf_printf(&path, "refs/namespaces/%s/", start);
|
||||||
}
|
|
||||||
|
|
||||||
git_buf_printf(gitpath, "refs/namespaces/%s/refs", end);
|
git_buf_printf(&path, "refs/namespaces/%s/refs", end);
|
||||||
git__free(parts);
|
git__free(parts);
|
||||||
|
|
||||||
/* Make sure that the folder with the namespace exists */
|
/* Make sure that the folder with the namespace exists */
|
||||||
if (git_futils_mkdir_relative(git_buf_cstr(gitpath), repo->commondir,
|
if (git_futils_mkdir_relative(git_buf_cstr(&path), in, 0777,
|
||||||
0777, GIT_MKDIR_PATH, NULL) < 0)
|
GIT_MKDIR_PATH, NULL) < 0)
|
||||||
return -1;
|
goto done;
|
||||||
|
|
||||||
/* Return root of the namespaced gitpath, i.e. without the trailing '/refs' */
|
/* Return root of the namespaced gitpath, i.e. without the trailing '/refs' */
|
||||||
git_buf_rtruncate_at_char(gitpath, '/');
|
git_buf_rtruncate_at_char(&path, '/');
|
||||||
return 0;
|
out = git_buf_detach(&path);
|
||||||
|
|
||||||
|
done:
|
||||||
|
git_buf_free(&path);
|
||||||
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int reflog_alloc(git_reflog **reflog, const char *name)
|
static int reflog_alloc(git_reflog **reflog, const char *name)
|
||||||
@ -1979,12 +1981,19 @@ int git_refdb_backend_fs(
|
|||||||
|
|
||||||
backend->repo = repository;
|
backend->repo = repository;
|
||||||
|
|
||||||
if (setup_namespace(&gitpath, repository) < 0)
|
if (repository->gitdir) {
|
||||||
goto fail;
|
backend->gitpath = setup_namespace(repository, repository->gitdir);
|
||||||
|
|
||||||
backend->gitpath = backend->commonpath = git_buf_detach(&gitpath);
|
if (backend->gitpath == NULL)
|
||||||
if (repository->commondir)
|
goto fail;
|
||||||
backend->commonpath = git__strdup(repository->commondir);
|
}
|
||||||
|
|
||||||
|
if (repository->commondir) {
|
||||||
|
backend->commonpath = setup_namespace(repository, repository->commondir);
|
||||||
|
|
||||||
|
if (backend->commonpath == NULL)
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
if (git_buf_joinpath(&gitpath, backend->commonpath, GIT_PACKEDREFS_FILE) < 0 ||
|
if (git_buf_joinpath(&gitpath, backend->commonpath, GIT_PACKEDREFS_FILE) < 0 ||
|
||||||
git_sortedcache_new(
|
git_sortedcache_new(
|
||||||
|
36
tests/refs/namespaces.c
Normal file
36
tests/refs/namespaces.c
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#include "clar_libgit2.h"
|
||||||
|
|
||||||
|
#include "repository.h"
|
||||||
|
|
||||||
|
static git_repository *g_repo;
|
||||||
|
|
||||||
|
void test_refs_namespaces__initialize(void)
|
||||||
|
{
|
||||||
|
g_repo = cl_git_sandbox_init("testrepo");
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_refs_namespaces__cleanup(void)
|
||||||
|
{
|
||||||
|
cl_git_sandbox_cleanup();
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_refs_namespaces__get_and_set(void)
|
||||||
|
{
|
||||||
|
cl_assert_equal_s(NULL, git_repository_get_namespace(g_repo));
|
||||||
|
|
||||||
|
cl_git_pass(git_repository_set_namespace(g_repo, "namespace"));
|
||||||
|
cl_assert_equal_s("namespace", git_repository_get_namespace(g_repo));
|
||||||
|
|
||||||
|
cl_git_pass(git_repository_set_namespace(g_repo, NULL));
|
||||||
|
cl_assert_equal_s(NULL, git_repository_get_namespace(g_repo));
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_refs_namespaces__namespace_doesnt_show_normal_refs(void)
|
||||||
|
{
|
||||||
|
static git_strarray ref_list;
|
||||||
|
|
||||||
|
cl_git_pass(git_repository_set_namespace(g_repo, "namespace"));
|
||||||
|
cl_git_pass(git_reference_list(&ref_list, g_repo));
|
||||||
|
cl_assert_equal_i(0, ref_list.count);
|
||||||
|
git_strarray_free(&ref_list);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user