setup: pass worktree to init_db()

In the preceding commits we have refactored how we discover and set up
repositories so that we cannot end up with partially-configured repos.
Instead, we apply the gitdir, worktree and repository format in a single
location, only.

Initializing a new repository has the same antipattern though: while
most of the information for the new repository is passed via parameters,
the work tree is instead propagated by configuring the repository's work
tree.

Refactor the code so that we also pass the work tree as an explicit
parameter. Like this, configuration fo the repository happens in a
single spot, too, just as with repository discovery.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Patrick Steinhardt
2026-07-07 09:21:31 +02:00
committed by Junio C Hamano
parent eba53f5f5f
commit 293b7850a7
4 changed files with 23 additions and 30 deletions

View File

@@ -1116,7 +1116,6 @@ int cmd_clone(int argc,
die_errno(_("could not create work tree dir '%s'"),
work_tree);
junk_work_tree = work_tree;
set_git_work_tree(the_repository, work_tree);
}
if (real_git_dir) {
@@ -1186,9 +1185,10 @@ int cmd_clone(int argc,
* repository, and reference backends may persist that information into
* their on-disk data structures.
*/
init_db(the_repository, git_dir, real_git_dir, option_template, GIT_HASH_UNKNOWN,
ref_storage_format, NULL,
do_not_override_repo_unix_permissions, INIT_DB_QUIET | INIT_DB_SKIP_REFDB);
init_db(the_repository, git_dir, real_git_dir, work_tree, option_template,
GIT_HASH_UNKNOWN, ref_storage_format, NULL,
do_not_override_repo_unix_permissions,
INIT_DB_QUIET | INIT_DB_SKIP_REFDB);
if (real_git_dir) {
free((char *)git_dir);

View File

@@ -231,39 +231,25 @@ int cmd_init_db(int argc,
if (!bare) {
const char *git_dir_parent = strrchr(git_dir, '/');
if (work_tree) {
set_git_work_tree(the_repository, work_tree);
} else {
char *work_tree_cfg = NULL;
if (!work_tree) {
if (git_dir_parent) {
char *rel = xstrndup(git_dir, git_dir_parent - git_dir);
work_tree_cfg = real_pathdup(rel, 1);
work_tree = real_pathdup(rel, 1);
free(rel);
} else {
work_tree = xgetcwd();
}
if (!work_tree_cfg)
work_tree_cfg = xgetcwd();
set_git_work_tree(the_repository, work_tree_cfg);
free(work_tree_cfg);
}
if (access(repo_get_work_tree(the_repository), X_OK))
die_errno (_("Cannot access work tree '%s'"),
repo_get_work_tree(the_repository));
}
else {
if (real_git_dir)
die(_("--separate-git-dir incompatible with bare repository"));
if (work_tree)
set_git_work_tree(the_repository, work_tree);
if (access(work_tree, X_OK))
die_errno (_("Cannot access work tree '%s'"), work_tree);
} else if (real_git_dir) {
die(_("--separate-git-dir incompatible with bare repository"));
}
flags |= INIT_DB_EXIST_OK;
ret = init_db(the_repository, git_dir, real_git_dir, template_dir, hash_algo,
ref_storage_format, initial_branch,
ret = init_db(the_repository, git_dir, real_git_dir, work_tree,
template_dir, hash_algo, ref_storage_format, initial_branch,
init_shared_repository, flags);
free(template_dir_to_free);

View File

@@ -2823,7 +2823,9 @@ static void repository_format_configure(struct repository_format *repo_fmt,
}
int init_db(struct repository *repo,
const char *git_dir, const char *real_git_dir,
const char *git_dir,
const char *real_git_dir,
const char *worktree,
const char *template_dir, int hash,
enum ref_storage_format ref_storage_format,
const char *initial_branch,
@@ -2852,6 +2854,9 @@ int init_db(struct repository *repo,
git_dir = repo_get_git_dir(repo);
}
if (worktree)
set_git_work_tree(repo, worktree);
/*
* Check to see if the repository version is right.
* Note that a newly created repository does not have

View File

@@ -263,7 +263,9 @@ const char *get_template_dir(const char *option_template);
#define INIT_DB_SKIP_REFDB (1 << 2)
int init_db(struct repository *repo,
const char *git_dir, const char *real_git_dir,
const char *git_dir,
const char *real_git_dir,
const char *worktree,
const char *template_dir, int hash_algo,
enum ref_storage_format ref_storage_format,
const char *initial_branch, int init_shared_repository,