mirror of
https://github.com/git/git.git
synced 2024-11-23 09:56:28 +08:00
Merge branch 'ps/environ-wo-the-repository'
Code clean-up. * ps/environ-wo-the-repository: (21 commits) environment: stop storing "core.notesRef" globally environment: stop storing "core.warnAmbiguousRefs" globally environment: stop storing "core.preferSymlinkRefs" globally environment: stop storing "core.logAllRefUpdates" globally refs: stop modifying global `log_all_ref_updates` variable branch: stop modifying `log_all_ref_updates` variable repo-settings: track defaults close to `struct repo_settings` repo-settings: split out declarations into a standalone header environment: guard state depending on a repository environment: reorder header to split out `the_repository`-free section environment: move `set_git_dir()` and related into setup layer environment: make `get_git_namespace()` self-contained environment: move object database functions into object layer config: make dependency on repo in `read_early_config()` explicit config: document `read_early_config()` and `read_very_early_config()` environment: make `get_git_work_tree()` accept a repository environment: make `get_graft_file()` accept a repository environment: make `get_index_file()` accept a repository environment: make `get_object_directory()` accept a repository environment: make `get_git_common_dir()` accept a repository ...
This commit is contained in:
commit
3eb6679959
6
alias.c
6
alias.c
@ -1,3 +1,5 @@
|
||||
#define USE_THE_REPOSITORY_VARIABLE
|
||||
|
||||
#include "git-compat-util.h"
|
||||
#include "alias.h"
|
||||
#include "config.h"
|
||||
@ -37,7 +39,7 @@ char *alias_lookup(const char *alias)
|
||||
{
|
||||
struct config_alias_data data = { alias, NULL };
|
||||
|
||||
read_early_config(config_alias_cb, &data);
|
||||
read_early_config(the_repository, config_alias_cb, &data);
|
||||
|
||||
return data.v;
|
||||
}
|
||||
@ -46,7 +48,7 @@ void list_aliases(struct string_list *list)
|
||||
{
|
||||
struct config_alias_data data = { NULL, NULL, list };
|
||||
|
||||
read_early_config(config_alias_cb, &data);
|
||||
read_early_config(the_repository, config_alias_cb, &data);
|
||||
}
|
||||
|
||||
void quote_cmdline(struct strbuf *buf, const char **argv)
|
||||
|
3
apply.c
3
apply.c
@ -30,6 +30,7 @@
|
||||
#include "path.h"
|
||||
#include "quote.h"
|
||||
#include "read-cache.h"
|
||||
#include "repository.h"
|
||||
#include "rerere.h"
|
||||
#include "apply.h"
|
||||
#include "entry.h"
|
||||
@ -4113,7 +4114,7 @@ static int read_apply_cache(struct apply_state *state)
|
||||
{
|
||||
if (state->index_file)
|
||||
return read_index_from(state->repo->index, state->index_file,
|
||||
get_git_dir());
|
||||
repo_get_git_dir(the_repository));
|
||||
else
|
||||
return repo_read_index(state->repo);
|
||||
}
|
||||
|
5
branch.c
5
branch.c
@ -601,6 +601,7 @@ void create_branch(struct repository *r,
|
||||
int forcing = 0;
|
||||
struct ref_transaction *transaction;
|
||||
struct strbuf err = STRBUF_INIT;
|
||||
int flags = 0;
|
||||
char *msg;
|
||||
|
||||
if (track == BRANCH_TRACK_OVERRIDE)
|
||||
@ -619,7 +620,7 @@ void create_branch(struct repository *r,
|
||||
goto cleanup;
|
||||
|
||||
if (reflog)
|
||||
log_all_ref_updates = LOG_REFS_NORMAL;
|
||||
flags |= REF_FORCE_CREATE_REFLOG;
|
||||
|
||||
if (forcing)
|
||||
msg = xstrfmt("branch: Reset to %s", start_name);
|
||||
@ -630,7 +631,7 @@ void create_branch(struct repository *r,
|
||||
if (!transaction ||
|
||||
ref_transaction_update(transaction, ref.buf,
|
||||
&oid, forcing ? NULL : null_oid(),
|
||||
NULL, NULL, 0, msg, &err) ||
|
||||
NULL, NULL, flags, msg, &err) ||
|
||||
ref_transaction_commit(transaction, &err))
|
||||
die("%s", err.buf);
|
||||
ref_transaction_free(transaction);
|
||||
|
13
builtin/am.c
13
builtin/am.c
@ -1544,7 +1544,8 @@ static int run_apply(const struct am_state *state, const char *index_file)
|
||||
if (index_file) {
|
||||
/* Reload index as apply_all_patches() will have modified it. */
|
||||
discard_index(the_repository->index);
|
||||
read_index_from(the_repository->index, index_file, get_git_dir());
|
||||
read_index_from(the_repository->index, index_file,
|
||||
repo_get_git_dir(the_repository));
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -1587,7 +1588,7 @@ static int fall_back_threeway(const struct am_state *state, const char *index_pa
|
||||
return error("could not build fake ancestor");
|
||||
|
||||
discard_index(the_repository->index);
|
||||
read_index_from(the_repository->index, index_path, get_git_dir());
|
||||
read_index_from(the_repository->index, index_path, repo_get_git_dir(the_repository));
|
||||
|
||||
if (write_index_as_tree(&bases[0], the_repository->index, index_path, 0, NULL))
|
||||
return error(_("Repository lacks necessary blobs to fall back on 3-way merge."));
|
||||
@ -1667,7 +1668,9 @@ static void do_commit(const struct am_state *state)
|
||||
if (!state->no_verify && run_hooks(the_repository, "pre-applypatch"))
|
||||
exit(1);
|
||||
|
||||
if (write_index_as_tree(&tree, the_repository->index, get_index_file(), 0, NULL))
|
||||
if (write_index_as_tree(&tree, the_repository->index,
|
||||
repo_get_index_file(the_repository),
|
||||
0, NULL))
|
||||
die(_("git write-tree failed to write a tree"));
|
||||
|
||||
if (!repo_get_oid_commit(the_repository, "HEAD", &parent)) {
|
||||
@ -2077,7 +2080,9 @@ static int clean_index(const struct object_id *head, const struct object_id *rem
|
||||
if (fast_forward_to(head_tree, head_tree, 1))
|
||||
return -1;
|
||||
|
||||
if (write_index_as_tree(&index, the_repository->index, get_index_file(), 0, NULL))
|
||||
if (write_index_as_tree(&index, the_repository->index,
|
||||
repo_get_index_file(the_repository),
|
||||
0, NULL))
|
||||
return -1;
|
||||
|
||||
index_tree = parse_tree_indirect(&index);
|
||||
|
@ -1081,7 +1081,7 @@ parse_done:
|
||||
path = add_prefix(prefix, argv[1]);
|
||||
argv[1] = argv[2];
|
||||
} else { /* (2a) */
|
||||
if (argc == 2 && is_a_rev(argv[1]) && !get_git_work_tree())
|
||||
if (argc == 2 && is_a_rev(argv[1]) && !repo_get_work_tree(the_repository))
|
||||
die("missing <path> to blame");
|
||||
path = add_prefix(prefix, argv[argc - 1]);
|
||||
}
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include "read-cache.h"
|
||||
#include "refs.h"
|
||||
#include "remote.h"
|
||||
#include "repo-settings.h"
|
||||
#include "resolve-undo.h"
|
||||
#include "revision.h"
|
||||
#include "setup.h"
|
||||
@ -950,11 +951,13 @@ static void update_refs_for_switch(const struct checkout_opts *opts,
|
||||
const char *old_desc, *reflog_msg;
|
||||
if (opts->new_branch) {
|
||||
if (opts->new_orphan_branch) {
|
||||
enum log_refs_config log_all_ref_updates =
|
||||
repo_settings_get_log_all_ref_updates(the_repository);
|
||||
char *refname;
|
||||
|
||||
refname = mkpathdup("refs/heads/%s", opts->new_orphan_branch);
|
||||
if (opts->new_branch_log &&
|
||||
!should_autocreate_reflog(refname)) {
|
||||
!should_autocreate_reflog(log_all_ref_updates, refname)) {
|
||||
int ret;
|
||||
struct strbuf err = STRBUF_INIT;
|
||||
|
||||
|
@ -1,7 +1,6 @@
|
||||
#include "builtin.h"
|
||||
#include "commit.h"
|
||||
#include "config.h"
|
||||
#include "environment.h"
|
||||
#include "gettext.h"
|
||||
#include "hex.h"
|
||||
#include "parse-options.h"
|
||||
@ -95,7 +94,7 @@ static int graph_verify(int argc, const char **argv, const char *prefix)
|
||||
usage_with_options(builtin_commit_graph_verify_usage, options);
|
||||
|
||||
if (!opts.obj_dir)
|
||||
opts.obj_dir = get_object_directory();
|
||||
opts.obj_dir = repo_get_object_directory(the_repository);
|
||||
if (opts.shallow)
|
||||
flags |= COMMIT_GRAPH_VERIFY_SHALLOW;
|
||||
if (opts.progress)
|
||||
@ -275,7 +274,7 @@ static int graph_write(int argc, const char **argv, const char *prefix)
|
||||
if (opts.reachable + opts.stdin_packs + opts.stdin_commits > 1)
|
||||
die(_("use at most one of --reachable, --stdin-commits, or --stdin-packs"));
|
||||
if (!opts.obj_dir)
|
||||
opts.obj_dir = get_object_directory();
|
||||
opts.obj_dir = repo_get_object_directory(the_repository);
|
||||
if (opts.append)
|
||||
flags |= COMMIT_GRAPH_WRITE_APPEND;
|
||||
if (opts.split)
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include "path.h"
|
||||
#include "preload-index.h"
|
||||
#include "read-cache.h"
|
||||
#include "repository.h"
|
||||
#include "string-list.h"
|
||||
#include "rerere.h"
|
||||
#include "unpack-trees.h"
|
||||
@ -407,7 +408,7 @@ static const char *prepare_index(const char **argv, const char *prefix,
|
||||
|
||||
discard_index(the_repository->index);
|
||||
read_index_from(the_repository->index, get_lock_file_path(&index_lock),
|
||||
get_git_dir());
|
||||
repo_get_git_dir(the_repository));
|
||||
if (cache_tree_update(the_repository->index, WRITE_TREE_SILENT) == 0) {
|
||||
if (reopen_lock_file(&index_lock) < 0)
|
||||
die(_("unable to write index file"));
|
||||
@ -472,7 +473,7 @@ static const char *prepare_index(const char **argv, const char *prefix,
|
||||
COMMIT_LOCK | SKIP_IF_UNCHANGED))
|
||||
die(_("unable to write new index file"));
|
||||
commit_style = COMMIT_AS_IS;
|
||||
ret = get_index_file();
|
||||
ret = repo_get_index_file(the_repository);
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -534,7 +535,7 @@ static const char *prepare_index(const char **argv, const char *prefix,
|
||||
|
||||
discard_index(the_repository->index);
|
||||
ret = get_lock_file_path(&false_lock);
|
||||
read_index_from(the_repository->index, ret, get_git_dir());
|
||||
read_index_from(the_repository->index, ret, repo_get_git_dir(the_repository));
|
||||
out:
|
||||
string_list_clear(&partial, 0);
|
||||
clear_pathspec(&pathspec);
|
||||
@ -1072,7 +1073,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
|
||||
*/
|
||||
discard_index(the_repository->index);
|
||||
}
|
||||
read_index_from(the_repository->index, index_file, get_git_dir());
|
||||
read_index_from(the_repository->index, index_file, repo_get_git_dir(the_repository));
|
||||
|
||||
if (cache_tree_update(the_repository->index, 0)) {
|
||||
error(_("Error building trees"));
|
||||
@ -1873,8 +1874,8 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
|
||||
|
||||
repo_rerere(the_repository, 0);
|
||||
run_auto_maintenance(quiet);
|
||||
run_commit_hook(use_editor, get_index_file(), NULL, "post-commit",
|
||||
NULL);
|
||||
run_commit_hook(use_editor, repo_get_index_file(the_repository),
|
||||
NULL, "post-commit", NULL);
|
||||
if (amend && !no_post_rewrite) {
|
||||
commit_post_rewrite(the_repository, current_head, &oid);
|
||||
}
|
||||
|
@ -807,8 +807,8 @@ static void location_options_init(struct config_location_options *opts,
|
||||
else
|
||||
opts->options.respect_includes = opts->respect_includes_opt;
|
||||
if (startup_info->have_repository) {
|
||||
opts->options.commondir = get_git_common_dir();
|
||||
opts->options.git_dir = get_git_dir();
|
||||
opts->options.commondir = repo_get_common_dir(the_repository);
|
||||
opts->options.git_dir = repo_get_git_dir(the_repository);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -7,7 +7,6 @@
|
||||
#include "builtin.h"
|
||||
#include "config.h"
|
||||
#include "dir.h"
|
||||
#include "environment.h"
|
||||
#include "gettext.h"
|
||||
#include "path.h"
|
||||
#include "repository.h"
|
||||
@ -116,7 +115,7 @@ int cmd_count_objects(int argc, const char **argv, const char *prefix)
|
||||
report_linked_checkout_garbage(the_repository);
|
||||
}
|
||||
|
||||
for_each_loose_file_in_objdir(get_object_directory(),
|
||||
for_each_loose_file_in_objdir(repo_get_object_directory(the_repository),
|
||||
count_loose, count_cruft, NULL, NULL);
|
||||
|
||||
if (verbose) {
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include "hex.h"
|
||||
#include "parse-options.h"
|
||||
#include "read-cache-ll.h"
|
||||
#include "repository.h"
|
||||
#include "sparse-index.h"
|
||||
#include "strvec.h"
|
||||
#include "strbuf.h"
|
||||
@ -214,7 +215,7 @@ static void changed_files(struct hashmap *result, const char *index_path,
|
||||
struct child_process update_index = CHILD_PROCESS_INIT;
|
||||
struct child_process diff_files = CHILD_PROCESS_INIT;
|
||||
struct strbuf buf = STRBUF_INIT;
|
||||
const char *git_dir = absolute_path(get_git_dir());
|
||||
const char *git_dir = absolute_path(repo_get_git_dir(the_repository));
|
||||
FILE *fp;
|
||||
|
||||
strvec_pushl(&update_index.args,
|
||||
@ -377,7 +378,7 @@ static int run_dir_diff(const char *extcmd, int symlinks, const char *prefix,
|
||||
struct hashmap wt_modified, tmp_modified;
|
||||
int indices_loaded = 0;
|
||||
|
||||
workdir = get_git_work_tree();
|
||||
workdir = repo_get_work_tree(the_repository);
|
||||
|
||||
/* Setup temp directories */
|
||||
tmp = getenv("TMPDIR");
|
||||
@ -737,8 +738,8 @@ int cmd_difftool(int argc, const char **argv, const char *prefix)
|
||||
|
||||
if (!no_index){
|
||||
setup_work_tree();
|
||||
setenv(GIT_DIR_ENVIRONMENT, absolute_path(get_git_dir()), 1);
|
||||
setenv(GIT_WORK_TREE_ENVIRONMENT, absolute_path(get_git_work_tree()), 1);
|
||||
setenv(GIT_DIR_ENVIRONMENT, absolute_path(repo_get_git_dir(the_repository)), 1);
|
||||
setenv(GIT_WORK_TREE_ENVIRONMENT, absolute_path(repo_get_work_tree(the_repository)), 1);
|
||||
} else if (dir_diff)
|
||||
die(_("options '%s' and '%s' cannot be used together"), "--dir-diff", "--no-index");
|
||||
|
||||
|
@ -2,7 +2,6 @@
|
||||
#include "abspath.h"
|
||||
#include "config.h"
|
||||
#include "dir.h"
|
||||
#include "environment.h"
|
||||
#include "gettext.h"
|
||||
#include "parse-options.h"
|
||||
#include "fsmonitor-ll.h"
|
||||
@ -1291,7 +1290,8 @@ static int fsmonitor_run_daemon(void)
|
||||
|
||||
/* Prepare to (recursively) watch the <worktree-root> directory. */
|
||||
strbuf_init(&state.path_worktree_watch, 0);
|
||||
strbuf_addstr(&state.path_worktree_watch, absolute_path(get_git_work_tree()));
|
||||
strbuf_addstr(&state.path_worktree_watch,
|
||||
absolute_path(repo_get_work_tree(the_repository)));
|
||||
state.nr_paths_watching = 1;
|
||||
|
||||
strbuf_init(&state.alias.alias, 0);
|
||||
@ -1311,7 +1311,8 @@ static int fsmonitor_run_daemon(void)
|
||||
strbuf_addstr(&state.path_gitdir_watch, "/.git");
|
||||
if (!is_directory(state.path_gitdir_watch.buf)) {
|
||||
strbuf_reset(&state.path_gitdir_watch);
|
||||
strbuf_addstr(&state.path_gitdir_watch, absolute_path(get_git_dir()));
|
||||
strbuf_addstr(&state.path_gitdir_watch,
|
||||
absolute_path(repo_get_git_dir(the_repository)));
|
||||
state.nr_paths_watching = 2;
|
||||
}
|
||||
|
||||
|
@ -2132,7 +2132,7 @@ static int schtasks_schedule_task(const char *exec_path, enum schedule_priority
|
||||
get_schedule_cmd(&cmd, NULL);
|
||||
|
||||
strbuf_addf(&tfilename, "%s/schedule_%s_XXXXXX",
|
||||
get_git_common_dir(), frequency);
|
||||
repo_get_common_dir(the_repository), frequency);
|
||||
tfile = xmks_tempfile(tfilename.buf);
|
||||
strbuf_release(&tfilename);
|
||||
|
||||
|
@ -231,9 +231,9 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
|
||||
set_git_work_tree(work_tree);
|
||||
else
|
||||
set_git_work_tree(git_work_tree_cfg);
|
||||
if (access(get_git_work_tree(), X_OK))
|
||||
if (access(repo_get_work_tree(the_repository), X_OK))
|
||||
die_errno (_("Cannot access work tree '%s'"),
|
||||
get_git_work_tree());
|
||||
repo_get_work_tree(the_repository));
|
||||
}
|
||||
else {
|
||||
if (real_git_dir)
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include "object-name.h"
|
||||
#include "parse-options.h"
|
||||
#include "lockfile.h"
|
||||
#include "repository.h"
|
||||
#include "run-command.h"
|
||||
#include "hook.h"
|
||||
#include "diff.h"
|
||||
@ -695,7 +696,9 @@ static int read_tree_trivial(struct object_id *common, struct object_id *head,
|
||||
|
||||
static void write_tree_trivial(struct object_id *oid)
|
||||
{
|
||||
if (write_index_as_tree(oid, the_repository->index, get_index_file(), 0, NULL))
|
||||
if (write_index_as_tree(oid, the_repository->index,
|
||||
repo_get_index_file(the_repository),
|
||||
0, NULL))
|
||||
die(_("git write-tree failed to write a tree"));
|
||||
}
|
||||
|
||||
@ -757,7 +760,7 @@ static int try_merge_strategy(const char *strategy, struct commit_list *common,
|
||||
}
|
||||
if (write_locked_index(the_repository->index, &lock,
|
||||
COMMIT_LOCK | SKIP_IF_UNCHANGED))
|
||||
die(_("unable to write %s"), get_index_file());
|
||||
die(_("unable to write %s"), repo_get_index_file(the_repository));
|
||||
return clean ? 0 : 1;
|
||||
} else {
|
||||
return try_merge_command(the_repository,
|
||||
@ -839,7 +842,7 @@ static void write_merge_heads(struct commit_list *);
|
||||
static void prepare_to_commit(struct commit_list *remoteheads)
|
||||
{
|
||||
struct strbuf msg = STRBUF_INIT;
|
||||
const char *index_file = get_index_file();
|
||||
const char *index_file = repo_get_index_file(the_repository);
|
||||
|
||||
if (!no_verify) {
|
||||
int invoked_hook;
|
||||
@ -855,7 +858,8 @@ static void prepare_to_commit(struct commit_list *remoteheads)
|
||||
if (invoked_hook)
|
||||
discard_index(the_repository->index);
|
||||
}
|
||||
read_index_from(the_repository->index, index_file, get_git_dir());
|
||||
read_index_from(the_repository->index, index_file,
|
||||
repo_get_git_dir(the_repository));
|
||||
strbuf_addbuf(&msg, &merge_msg);
|
||||
if (squash)
|
||||
BUG("the control must not reach here under --squash");
|
||||
@ -878,8 +882,8 @@ static void prepare_to_commit(struct commit_list *remoteheads)
|
||||
append_signoff(&msg, ignored_log_message_bytes(msg.buf, msg.len), 0);
|
||||
write_merge_heads(remoteheads);
|
||||
write_file_buf(git_path_merge_msg(the_repository), msg.buf, msg.len);
|
||||
if (run_commit_hook(0 < option_edit, get_index_file(), NULL,
|
||||
"prepare-commit-msg",
|
||||
if (run_commit_hook(0 < option_edit, repo_get_index_file(the_repository),
|
||||
NULL, "prepare-commit-msg",
|
||||
git_path_merge_msg(the_repository), "merge", NULL))
|
||||
abort_commit(remoteheads, NULL);
|
||||
if (0 < option_edit) {
|
||||
@ -887,7 +891,7 @@ static void prepare_to_commit(struct commit_list *remoteheads)
|
||||
abort_commit(remoteheads, NULL);
|
||||
}
|
||||
|
||||
if (!no_verify && run_commit_hook(0 < option_edit, get_index_file(),
|
||||
if (!no_verify && run_commit_hook(0 < option_edit, repo_get_index_file(the_repository),
|
||||
NULL, "commit-msg",
|
||||
git_path_merge_msg(the_repository), NULL))
|
||||
abort_commit(remoteheads, NULL);
|
||||
|
@ -1,7 +1,6 @@
|
||||
#include "builtin.h"
|
||||
#include "abspath.h"
|
||||
#include "config.h"
|
||||
#include "environment.h"
|
||||
#include "gettext.h"
|
||||
#include "parse-options.h"
|
||||
#include "midx.h"
|
||||
@ -9,6 +8,7 @@
|
||||
#include "trace2.h"
|
||||
#include "object-store-ll.h"
|
||||
#include "replace-object.h"
|
||||
#include "repository.h"
|
||||
|
||||
#define BUILTIN_MIDX_WRITE_USAGE \
|
||||
N_("git multi-pack-index [<options>] write [--preferred-pack=<pack>]" \
|
||||
@ -63,7 +63,7 @@ static int parse_object_dir(const struct option *opt, const char *arg,
|
||||
char **value = opt->value;
|
||||
free(*value);
|
||||
if (unset)
|
||||
*value = xstrdup(get_object_directory());
|
||||
*value = xstrdup(repo_get_object_directory(the_repository));
|
||||
else
|
||||
*value = real_pathdup(arg, 1);
|
||||
return 0;
|
||||
|
@ -897,6 +897,7 @@ static int merge(int argc, const char **argv, const char *prefix)
|
||||
1, PARSE_OPT_NONEG),
|
||||
OPT_END()
|
||||
};
|
||||
char *notes_ref;
|
||||
|
||||
argc = parse_options(argc, argv, prefix, options,
|
||||
git_notes_merge_usage, 0);
|
||||
@ -924,7 +925,8 @@ static int merge(int argc, const char **argv, const char *prefix)
|
||||
if (do_commit)
|
||||
return merge_commit(&o);
|
||||
|
||||
o.local_ref = default_notes_ref();
|
||||
notes_ref = default_notes_ref(the_repository);
|
||||
o.local_ref = notes_ref;
|
||||
strbuf_addstr(&remote_ref, argv[0]);
|
||||
expand_loose_notes_ref(&remote_ref);
|
||||
o.remote_ref = remote_ref.buf;
|
||||
@ -953,7 +955,7 @@ static int merge(int argc, const char **argv, const char *prefix)
|
||||
}
|
||||
|
||||
strbuf_addf(&msg, "notes: Merged notes from %s into %s",
|
||||
remote_ref.buf, default_notes_ref());
|
||||
remote_ref.buf, notes_ref);
|
||||
strbuf_add(&(o.commit_msg), msg.buf + 7, msg.len - 7); /* skip "notes: " */
|
||||
|
||||
result = notes_merge(&o, t, &result_oid);
|
||||
@ -961,7 +963,7 @@ static int merge(int argc, const char **argv, const char *prefix)
|
||||
if (result >= 0) /* Merge resulted (trivially) in result_oid */
|
||||
/* Update default notes ref with new commit */
|
||||
refs_update_ref(get_main_ref_store(the_repository), msg.buf,
|
||||
default_notes_ref(), &result_oid, NULL, 0,
|
||||
notes_ref, &result_oid, NULL, 0,
|
||||
UPDATE_REFS_DIE_ON_ERR);
|
||||
else { /* Merge has unresolved conflicts */
|
||||
struct worktree **worktrees;
|
||||
@ -973,14 +975,14 @@ static int merge(int argc, const char **argv, const char *prefix)
|
||||
/* Store ref-to-be-updated into .git/NOTES_MERGE_REF */
|
||||
worktrees = get_worktrees();
|
||||
wt = find_shared_symref(worktrees, "NOTES_MERGE_REF",
|
||||
default_notes_ref());
|
||||
notes_ref);
|
||||
if (wt)
|
||||
die(_("a notes merge into %s is already in-progress at %s"),
|
||||
default_notes_ref(), wt->path);
|
||||
notes_ref, wt->path);
|
||||
free_worktrees(worktrees);
|
||||
if (refs_update_symref(get_main_ref_store(the_repository), "NOTES_MERGE_REF", default_notes_ref(), NULL))
|
||||
if (refs_update_symref(get_main_ref_store(the_repository), "NOTES_MERGE_REF", notes_ref, NULL))
|
||||
die(_("failed to store link to current notes ref (%s)"),
|
||||
default_notes_ref());
|
||||
notes_ref);
|
||||
fprintf(stderr, _("Automatic notes merge failed. Fix conflicts in %s "
|
||||
"and commit the result with 'git notes merge --commit', "
|
||||
"or abort the merge with 'git notes merge --abort'.\n"),
|
||||
@ -988,6 +990,7 @@ static int merge(int argc, const char **argv, const char *prefix)
|
||||
}
|
||||
|
||||
free_notes(t);
|
||||
free(notes_ref);
|
||||
strbuf_release(&remote_ref);
|
||||
strbuf_release(&msg);
|
||||
return result < 0; /* return non-zero on conflicts */
|
||||
@ -1084,6 +1087,7 @@ static int prune(int argc, const char **argv, const char *prefix)
|
||||
static int get_ref(int argc, const char **argv, const char *prefix)
|
||||
{
|
||||
struct option options[] = { OPT_END() };
|
||||
char *notes_ref;
|
||||
argc = parse_options(argc, argv, prefix, options,
|
||||
git_notes_get_ref_usage, 0);
|
||||
|
||||
@ -1092,7 +1096,9 @@ static int get_ref(int argc, const char **argv, const char *prefix)
|
||||
usage_with_options(git_notes_get_ref_usage, options);
|
||||
}
|
||||
|
||||
puts(default_notes_ref());
|
||||
notes_ref = default_notes_ref(the_repository);
|
||||
puts(notes_ref);
|
||||
free(notes_ref);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -3968,7 +3968,7 @@ static int add_loose_object(const struct object_id *oid, const char *path,
|
||||
*/
|
||||
static void add_unreachable_loose_objects(void)
|
||||
{
|
||||
for_each_loose_file_in_objdir(get_object_directory(),
|
||||
for_each_loose_file_in_objdir(repo_get_object_directory(the_repository),
|
||||
add_loose_object,
|
||||
NULL, NULL, NULL);
|
||||
}
|
||||
|
@ -193,12 +193,12 @@ int cmd_prune(int argc, const char **argv, const char *prefix)
|
||||
revs.exclude_promisor_objects = 1;
|
||||
}
|
||||
|
||||
for_each_loose_file_in_objdir(get_object_directory(), prune_object,
|
||||
prune_cruft, prune_subdir, &revs);
|
||||
for_each_loose_file_in_objdir(repo_get_object_directory(the_repository),
|
||||
prune_object, prune_cruft, prune_subdir, &revs);
|
||||
|
||||
prune_packed_objects(show_only ? PRUNE_PACKED_DRY_RUN : 0);
|
||||
remove_temporary_files(get_object_directory());
|
||||
s = mkpathdup("%s/pack", get_object_directory());
|
||||
remove_temporary_files(repo_get_object_directory(the_repository));
|
||||
s = mkpathdup("%s/pack", repo_get_object_directory(the_repository));
|
||||
remove_temporary_files(s);
|
||||
free(s);
|
||||
|
||||
|
@ -1260,7 +1260,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
|
||||
if (write_midx && write_bitmaps) {
|
||||
struct strbuf path = STRBUF_INIT;
|
||||
|
||||
strbuf_addf(&path, "%s/%s_XXXXXX", get_object_directory(),
|
||||
strbuf_addf(&path, "%s/%s_XXXXXX", repo_get_object_directory(the_repository),
|
||||
"bitmap-ref-tips");
|
||||
|
||||
refs_snapshot = xmks_tempfile(path.buf);
|
||||
@ -1269,7 +1269,7 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
|
||||
strbuf_release(&path);
|
||||
}
|
||||
|
||||
packdir = mkpathdup("%s/pack", get_object_directory());
|
||||
packdir = mkpathdup("%s/pack", repo_get_object_directory(the_repository));
|
||||
packtmp_name = xstrfmt(".tmp-%d-pack", (int)getpid());
|
||||
packtmp = mkpathdup("%s/%s", packdir, packtmp_name);
|
||||
|
||||
@ -1539,7 +1539,8 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
|
||||
unsigned flags = 0;
|
||||
if (git_env_bool(GIT_TEST_MULTI_PACK_INDEX_WRITE_INCREMENTAL, 0))
|
||||
flags |= MIDX_WRITE_INCREMENTAL;
|
||||
write_midx_file(get_object_directory(), NULL, NULL, flags);
|
||||
write_midx_file(repo_get_object_directory(the_repository),
|
||||
NULL, NULL, flags);
|
||||
}
|
||||
|
||||
cleanup:
|
||||
|
@ -11,7 +11,6 @@
|
||||
#include "builtin.h"
|
||||
#include "config.h"
|
||||
#include "editor.h"
|
||||
#include "environment.h"
|
||||
#include "gettext.h"
|
||||
#include "hex.h"
|
||||
#include "refs.h"
|
||||
@ -514,7 +513,7 @@ static int create_graft(int argc, const char **argv, int force, int gentle)
|
||||
|
||||
static int convert_graft_file(int force)
|
||||
{
|
||||
const char *graft_file = get_graft_file(the_repository);
|
||||
const char *graft_file = repo_get_graft_file(the_repository);
|
||||
FILE *fp = fopen_or_warn(graft_file, "r");
|
||||
struct strbuf buf = STRBUF_INIT, err = STRBUF_INIT;
|
||||
struct strvec args = STRVEC_INIT;
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include "object-name.h"
|
||||
#include "parse-options.h"
|
||||
#include "path.h"
|
||||
#include "repository.h"
|
||||
#include "unpack-trees.h"
|
||||
#include "cache-tree.h"
|
||||
#include "setup.h"
|
||||
@ -441,7 +442,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
|
||||
else
|
||||
trace2_cmd_mode(reset_type_names[reset_type]);
|
||||
|
||||
if (reset_type != SOFT && (reset_type != MIXED || get_git_work_tree()))
|
||||
if (reset_type != SOFT && (reset_type != MIXED || repo_get_work_tree(the_repository)))
|
||||
setup_work_tree();
|
||||
|
||||
if (reset_type == MIXED && is_bare_repository())
|
||||
@ -474,7 +475,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
|
||||
goto cleanup;
|
||||
}
|
||||
the_repository->index->updated_skipworktree = 1;
|
||||
if (!no_refresh && get_git_work_tree()) {
|
||||
if (!no_refresh && repo_get_work_tree(the_repository)) {
|
||||
uint64_t t_begin, t_delta_in_ms;
|
||||
|
||||
t_begin = getnanotime();
|
||||
|
@ -19,6 +19,8 @@
|
||||
#include "path.h"
|
||||
#include "diff.h"
|
||||
#include "read-cache-ll.h"
|
||||
#include "repo-settings.h"
|
||||
#include "repository.h"
|
||||
#include "revision.h"
|
||||
#include "setup.h"
|
||||
#include "split-index.h"
|
||||
@ -898,7 +900,8 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
|
||||
}
|
||||
if (opt_with_value(arg, "--abbrev-ref", &arg)) {
|
||||
abbrev_ref = 1;
|
||||
abbrev_ref_strict = warn_ambiguous_refs;
|
||||
abbrev_ref_strict =
|
||||
repo_settings_get_warn_ambiguous_refs(the_repository);
|
||||
if (arg) {
|
||||
if (!strcmp(arg, "strict"))
|
||||
abbrev_ref_strict = 1;
|
||||
@ -966,7 +969,7 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
|
||||
continue;
|
||||
}
|
||||
if (!strcmp(arg, "--show-toplevel")) {
|
||||
const char *work_tree = get_git_work_tree();
|
||||
const char *work_tree = repo_get_work_tree(the_repository);
|
||||
if (work_tree)
|
||||
print_path(work_tree, prefix, format, DEFAULT_UNMODIFIED);
|
||||
else
|
||||
@ -991,7 +994,7 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
|
||||
const char *pfx = prefix;
|
||||
if (!is_inside_work_tree()) {
|
||||
const char *work_tree =
|
||||
get_git_work_tree();
|
||||
repo_get_work_tree(the_repository);
|
||||
if (work_tree)
|
||||
printf("%s\n", work_tree);
|
||||
continue;
|
||||
@ -1042,7 +1045,7 @@ int cmd_rev_parse(int argc, const char **argv, const char *prefix)
|
||||
continue;
|
||||
}
|
||||
if (!strcmp(arg, "--git-common-dir")) {
|
||||
print_path(get_git_common_dir(), prefix, format, DEFAULT_RELATIVE_IF_SHARED);
|
||||
print_path(repo_get_common_dir(the_repository), prefix, format, DEFAULT_RELATIVE_IF_SHARED);
|
||||
continue;
|
||||
}
|
||||
if (!strcmp(arg, "--is-inside-git-dir")) {
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include "entry.h"
|
||||
#include "preload-index.h"
|
||||
#include "read-cache.h"
|
||||
#include "repository.h"
|
||||
#include "rerere.h"
|
||||
#include "revision.h"
|
||||
#include "setup.h"
|
||||
@ -539,8 +540,8 @@ static int do_apply_stash(const char *prefix, struct stash_info *info,
|
||||
NULL, NULL, NULL))
|
||||
return error(_("could not write index"));
|
||||
|
||||
if (write_index_as_tree(&c_tree, the_repository->index, get_index_file(), 0,
|
||||
NULL))
|
||||
if (write_index_as_tree(&c_tree, the_repository->index,
|
||||
repo_get_index_file(the_repository), 0, NULL))
|
||||
return error(_("cannot apply a stash in the middle of a merge"));
|
||||
|
||||
if (index) {
|
||||
@ -565,7 +566,7 @@ static int do_apply_stash(const char *prefix, struct stash_info *info,
|
||||
discard_index(the_repository->index);
|
||||
repo_read_index(the_repository);
|
||||
if (write_index_as_tree(&index_tree, the_repository->index,
|
||||
get_index_file(), 0, NULL))
|
||||
repo_get_index_file(the_repository), 0, NULL))
|
||||
return error(_("could not save index tree"));
|
||||
|
||||
reset_head();
|
||||
@ -640,9 +641,9 @@ restore_untracked:
|
||||
cp.git_cmd = 1;
|
||||
cp.dir = prefix;
|
||||
strvec_pushf(&cp.env, GIT_WORK_TREE_ENVIRONMENT"=%s",
|
||||
absolute_path(get_git_work_tree()));
|
||||
absolute_path(repo_get_work_tree(the_repository)));
|
||||
strvec_pushf(&cp.env, GIT_DIR_ENVIRONMENT"=%s",
|
||||
absolute_path(get_git_dir()));
|
||||
absolute_path(repo_get_git_dir(the_repository)));
|
||||
strvec_push(&cp.args, "status");
|
||||
run_command(&cp);
|
||||
}
|
||||
@ -1405,8 +1406,8 @@ static int do_create_stash(const struct pathspec *ps, struct strbuf *stash_msg_b
|
||||
|
||||
strbuf_addf(&commit_tree_label, "index on %s\n", msg.buf);
|
||||
commit_list_insert(head_commit, &parents);
|
||||
if (write_index_as_tree(&info->i_tree, the_repository->index, get_index_file(), 0,
|
||||
NULL) ||
|
||||
if (write_index_as_tree(&info->i_tree, the_repository->index,
|
||||
repo_get_index_file(the_repository), 0, NULL) ||
|
||||
commit_tree(commit_tree_label.buf, commit_tree_label.len,
|
||||
&info->i_tree, parents, &info->i_commit, NULL, NULL)) {
|
||||
if (!quiet)
|
||||
@ -1904,7 +1905,7 @@ int cmd_stash(int argc, const char **argv, const char *prefix)
|
||||
prepare_repo_settings(the_repository);
|
||||
the_repository->settings.command_requires_full_index = 0;
|
||||
|
||||
index_file = get_index_file();
|
||||
index_file = repo_get_index_file(the_repository);
|
||||
strbuf_addf(&stash_index_path, "%s.stash.%" PRIuMAX, index_file,
|
||||
(uintmax_t)pid);
|
||||
|
||||
|
@ -1709,7 +1709,7 @@ static int clone_submodule(const struct module_clone_data *clone_data,
|
||||
exit(128);
|
||||
|
||||
if (!is_absolute_path(clone_data->path))
|
||||
clone_data_path = to_free = xstrfmt("%s/%s", get_git_work_tree(),
|
||||
clone_data_path = to_free = xstrfmt("%s/%s", repo_get_work_tree(the_repository),
|
||||
clone_data->path);
|
||||
|
||||
if (validate_submodule_git_dir(sm_gitdir, clone_data->name) < 0)
|
||||
|
@ -1194,7 +1194,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
|
||||
"remove or change it, if you really want to "
|
||||
"enable the untracked cache"));
|
||||
add_untracked_cache(the_repository->index);
|
||||
report(_("Untracked cache enabled for '%s'"), get_git_work_tree());
|
||||
report(_("Untracked cache enabled for '%s'"), repo_get_work_tree(the_repository));
|
||||
break;
|
||||
default:
|
||||
BUG("bad untracked_cache value: %d", untracked_cache);
|
||||
@ -1239,7 +1239,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
|
||||
if (newfd < 0) {
|
||||
if (refresh_args.flags & REFRESH_QUIET)
|
||||
exit(128);
|
||||
unable_to_lock_die(get_index_file(), lock_error);
|
||||
unable_to_lock_die(repo_get_index_file(the_repository), lock_error);
|
||||
}
|
||||
if (write_locked_index(the_repository->index, &lock_file, COMMIT_LOCK))
|
||||
die("Unable to write new index file");
|
||||
|
@ -219,7 +219,7 @@ static void prune_worktrees(void)
|
||||
}
|
||||
closedir(dir);
|
||||
|
||||
strbuf_add_absolute_path(&main_path, get_git_common_dir());
|
||||
strbuf_add_absolute_path(&main_path, repo_get_common_dir(the_repository));
|
||||
/* massage main worktree absolute path to match 'gitdir' content */
|
||||
strbuf_strip_suffix(&main_path, "/.");
|
||||
string_list_append_nodup(&kept, strbuf_detach(&main_path, NULL));
|
||||
@ -492,7 +492,7 @@ static int add_worktree(const char *path, const char *refname,
|
||||
strbuf_addf(&sb, "%s/gitdir", sb_repo.buf);
|
||||
strbuf_realpath(&realpath, sb_git.buf, 1);
|
||||
write_file(sb.buf, "%s", realpath.buf);
|
||||
strbuf_realpath(&realpath, get_git_common_dir(), 1);
|
||||
strbuf_realpath(&realpath, repo_get_common_dir(the_repository), 1);
|
||||
write_file(sb_git.buf, "gitdir: %s/worktrees/%s",
|
||||
realpath.buf, name);
|
||||
strbuf_reset(&sb);
|
||||
|
@ -6,7 +6,6 @@
|
||||
|
||||
#include "builtin.h"
|
||||
#include "config.h"
|
||||
#include "environment.h"
|
||||
#include "gettext.h"
|
||||
#include "hex.h"
|
||||
#include "tree.h"
|
||||
@ -44,7 +43,8 @@ int cmd_write_tree(int argc, const char **argv, const char *cmd_prefix)
|
||||
prepare_repo_settings(the_repository);
|
||||
the_repository->settings.command_requires_full_index = 0;
|
||||
|
||||
ret = write_index_as_tree(&oid, the_repository->index, get_index_file(),
|
||||
ret = write_index_as_tree(&oid, the_repository->index,
|
||||
repo_get_index_file(the_repository),
|
||||
flags, tree_prefix);
|
||||
switch (ret) {
|
||||
case 0:
|
||||
|
@ -75,7 +75,7 @@ static void flush_bulk_checkin_packfile(struct bulk_checkin_packfile *state)
|
||||
close(fd);
|
||||
}
|
||||
|
||||
strbuf_addf(&packname, "%s/pack/pack-%s.", get_object_directory(),
|
||||
strbuf_addf(&packname, "%s/pack/pack-%s.", repo_get_object_directory(the_repository),
|
||||
hash_to_hex(hash));
|
||||
finish_tmp_packfile(&packname, state->pack_tmp_name,
|
||||
state->written, state->nr_written,
|
||||
@ -113,7 +113,7 @@ static void flush_batch_fsync(void)
|
||||
* to ensure that the data in each new object file is durable before
|
||||
* the final name is visible.
|
||||
*/
|
||||
strbuf_addf(&temp_path, "%s/bulk_fsync_XXXXXX", get_object_directory());
|
||||
strbuf_addf(&temp_path, "%s/bulk_fsync_XXXXXX", repo_get_object_directory(the_repository));
|
||||
temp = xmks_tempfile(temp_path.buf);
|
||||
fsync_or_die(get_tempfile_fd(temp), get_tempfile_path(temp));
|
||||
delete_tempfile(&temp);
|
||||
|
@ -4,7 +4,6 @@
|
||||
#include "bundle-uri.h"
|
||||
#include "bundle.h"
|
||||
#include "copy.h"
|
||||
#include "environment.h"
|
||||
#include "gettext.h"
|
||||
#include "refs.h"
|
||||
#include "run-command.h"
|
||||
@ -14,6 +13,7 @@
|
||||
#include "fetch-pack.h"
|
||||
#include "remote.h"
|
||||
#include "trace2.h"
|
||||
#include "object-store-ll.h"
|
||||
|
||||
static struct {
|
||||
enum bundle_list_heuristic heuristic;
|
||||
|
@ -1,7 +1,6 @@
|
||||
#define USE_THE_REPOSITORY_VARIABLE
|
||||
|
||||
#include "git-compat-util.h"
|
||||
#include "environment.h"
|
||||
#include "hex.h"
|
||||
#include "lockfile.h"
|
||||
#include "tree.h"
|
||||
@ -12,6 +11,7 @@
|
||||
#include "object-store-ll.h"
|
||||
#include "read-cache-ll.h"
|
||||
#include "replace-object.h"
|
||||
#include "repository.h"
|
||||
#include "promisor-remote.h"
|
||||
#include "trace.h"
|
||||
#include "trace2.h"
|
||||
@ -725,7 +725,8 @@ int write_index_as_tree(struct object_id *oid, struct index_state *index_state,
|
||||
|
||||
hold_lock_file_for_update(&lock_file, index_path, LOCK_DIE_ON_ERROR);
|
||||
|
||||
entries = read_index_from(index_state, index_path, get_git_dir());
|
||||
entries = read_index_from(index_state, index_path,
|
||||
repo_get_git_dir(the_repository));
|
||||
if (entries < 0) {
|
||||
ret = WRITE_TREE_UNREADABLE_INDEX;
|
||||
goto out;
|
||||
|
4
commit.c
4
commit.c
@ -292,14 +292,14 @@ static int read_graft_file(struct repository *r, const char *graft_file)
|
||||
|
||||
void prepare_commit_graft(struct repository *r)
|
||||
{
|
||||
char *graft_file;
|
||||
const char *graft_file;
|
||||
|
||||
if (r->parsed_objects->commit_graft_prepared)
|
||||
return;
|
||||
if (!startup_info->have_repository)
|
||||
return;
|
||||
|
||||
graft_file = get_graft_file(r);
|
||||
graft_file = repo_get_graft_file(r);
|
||||
read_graft_file(r, graft_file);
|
||||
/* make sure shallows are read */
|
||||
is_repository_shallow(r);
|
||||
|
@ -1,3 +1,5 @@
|
||||
#define USE_THE_REPOSITORY_VARIABLE
|
||||
|
||||
#include "../git-compat-util.h"
|
||||
#include "win32.h"
|
||||
#include <aclapi.h>
|
||||
|
@ -1,3 +1,5 @@
|
||||
#define USE_THE_REPOSITORY_VARIABLE
|
||||
|
||||
#include "../../git-compat-util.h"
|
||||
#include "../../environment.h"
|
||||
|
||||
|
42
config.c
42
config.c
@ -6,6 +6,8 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#define USE_THE_REPOSITORY_VARIABLE
|
||||
|
||||
#include "git-compat-util.h"
|
||||
#include "abspath.h"
|
||||
#include "advice.h"
|
||||
@ -1445,26 +1447,6 @@ static int git_default_core_config(const char *var, const char *value,
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!strcmp(var, "core.prefersymlinkrefs")) {
|
||||
prefer_symlink_refs = git_config_bool(var, value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!strcmp(var, "core.logallrefupdates")) {
|
||||
if (value && !strcasecmp(value, "always"))
|
||||
log_all_ref_updates = LOG_REFS_ALWAYS;
|
||||
else if (git_config_bool(var, value))
|
||||
log_all_ref_updates = LOG_REFS_NORMAL;
|
||||
else
|
||||
log_all_ref_updates = LOG_REFS_NONE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!strcmp(var, "core.warnambiguousrefs")) {
|
||||
warn_ambiguous_refs = git_config_bool(var, value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!strcmp(var, "core.abbrev")) {
|
||||
if (!value)
|
||||
return config_error_nonbool(var);
|
||||
@ -1573,14 +1555,6 @@ static int git_default_core_config(const char *var, const char *value,
|
||||
return git_config_string(&check_roundtrip_encoding, var, value);
|
||||
}
|
||||
|
||||
if (!strcmp(var, "core.notesref")) {
|
||||
if (!value)
|
||||
return config_error_nonbool(var);
|
||||
free(notes_ref_name);
|
||||
notes_ref_name = xstrdup(value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!strcmp(var, "core.editor")) {
|
||||
FREE_AND_NULL(editor_program);
|
||||
return git_config_string(&editor_program, var, value);
|
||||
@ -2202,7 +2176,7 @@ static void configset_iter(struct config_set *set, config_fn_t fn, void *data)
|
||||
}
|
||||
}
|
||||
|
||||
void read_early_config(config_fn_t cb, void *data)
|
||||
void read_early_config(struct repository *repo, config_fn_t cb, void *data)
|
||||
{
|
||||
struct config_options opts = {0};
|
||||
struct strbuf commondir = STRBUF_INIT;
|
||||
@ -2210,9 +2184,9 @@ void read_early_config(config_fn_t cb, void *data)
|
||||
|
||||
opts.respect_includes = 1;
|
||||
|
||||
if (have_git_dir()) {
|
||||
opts.commondir = get_git_common_dir();
|
||||
opts.git_dir = get_git_dir();
|
||||
if (repo && repo->gitdir) {
|
||||
opts.commondir = repo_get_common_dir(repo);
|
||||
opts.git_dir = repo_get_git_dir(repo);
|
||||
/*
|
||||
* When setup_git_directory() was not yet asked to discover the
|
||||
* GIT_DIR, we ask discover_git_directory() to figure out whether there
|
||||
@ -2232,10 +2206,6 @@ void read_early_config(config_fn_t cb, void *data)
|
||||
strbuf_release(&gitdir);
|
||||
}
|
||||
|
||||
/*
|
||||
* Read config but only enumerate system and global settings.
|
||||
* Omit any repo-local, worktree-local, or command-line settings.
|
||||
*/
|
||||
void read_very_early_config(config_fn_t cb, void *data)
|
||||
{
|
||||
struct config_options opts = { 0 };
|
||||
|
13
config.h
13
config.h
@ -192,7 +192,18 @@ int git_config_from_blob_oid(config_fn_t fn, const char *name,
|
||||
void git_config_push_parameter(const char *text);
|
||||
void git_config_push_env(const char *spec);
|
||||
int git_config_from_parameters(config_fn_t fn, void *data);
|
||||
void read_early_config(config_fn_t cb, void *data);
|
||||
|
||||
/*
|
||||
* Read config when the Git directory has not yet been set up. In case
|
||||
* `the_repository` has not yet been set up, try to discover the Git
|
||||
* directory to read the configuration from.
|
||||
*/
|
||||
void read_early_config(struct repository *repo, config_fn_t cb, void *data);
|
||||
|
||||
/*
|
||||
* Read config but only enumerate system and global settings.
|
||||
* Omit any repo-local, worktree-local, or command-line settings.
|
||||
*/
|
||||
void read_very_early_config(config_fn_t cb, void *data);
|
||||
|
||||
/**
|
||||
|
3
dir.c
3
dir.c
@ -20,6 +20,7 @@
|
||||
#include "object-store-ll.h"
|
||||
#include "path.h"
|
||||
#include "refs.h"
|
||||
#include "repository.h"
|
||||
#include "wildmatch.h"
|
||||
#include "pathspec.h"
|
||||
#include "utf8.h"
|
||||
@ -2838,7 +2839,7 @@ static const char *get_ident_string(void)
|
||||
return sb.buf;
|
||||
if (uname(&uts) < 0)
|
||||
die_errno(_("failed to get kernel name and information"));
|
||||
strbuf_addf(&sb, "Location %s, system %s", get_git_work_tree(),
|
||||
strbuf_addf(&sb, "Location %s, system %s", repo_get_work_tree(the_repository),
|
||||
uts.sysname);
|
||||
return sb.buf;
|
||||
}
|
||||
|
241
environment.c
241
environment.c
@ -22,15 +22,9 @@
|
||||
#include "fmt-merge-msg.h"
|
||||
#include "commit.h"
|
||||
#include "strvec.h"
|
||||
#include "object-file.h"
|
||||
#include "object-store-ll.h"
|
||||
#include "path.h"
|
||||
#include "replace-object.h"
|
||||
#include "tmp-objdir.h"
|
||||
#include "chdir-notify.h"
|
||||
#include "setup.h"
|
||||
#include "shallow.h"
|
||||
#include "trace.h"
|
||||
#include "write-or-die.h"
|
||||
|
||||
int trust_executable_bit = 1;
|
||||
@ -40,9 +34,7 @@ int has_symlinks = 1;
|
||||
int minimum_abbrev = 4, default_abbrev = -1;
|
||||
int ignore_case;
|
||||
int assume_unchanged;
|
||||
int prefer_symlink_refs;
|
||||
int is_bare_repository_cfg = -1; /* unspecified */
|
||||
int warn_ambiguous_refs = 1;
|
||||
int warn_on_object_refname_ambiguity = 1;
|
||||
int repository_format_precious_objects;
|
||||
char *git_commit_encoding;
|
||||
@ -75,7 +67,6 @@ enum push_default_type push_default = PUSH_DEFAULT_UNSPECIFIED;
|
||||
#define OBJECT_CREATION_MODE OBJECT_CREATION_USES_HARDLINKS
|
||||
#endif
|
||||
enum object_creation_mode object_creation_mode = OBJECT_CREATION_MODE;
|
||||
char *notes_ref_name;
|
||||
int grafts_keep_true_parents;
|
||||
int core_apply_sparse_checkout;
|
||||
int core_sparse_checkout_cone;
|
||||
@ -83,7 +74,6 @@ int sparse_expect_files_outside_of_patterns;
|
||||
int merge_log_config = -1;
|
||||
int precomposed_unicode = -1; /* see probe_utf8_pathname_composition() */
|
||||
unsigned long pack_size_limit_cfg;
|
||||
enum log_refs_config log_all_ref_updates = LOG_REFS_UNSET;
|
||||
int max_allowed_tree_depth =
|
||||
#ifdef _MSC_VER
|
||||
/*
|
||||
@ -123,8 +113,6 @@ int core_preload_index = 1;
|
||||
/* This is set by setup_git_dir_gently() and/or git_default_config() */
|
||||
char *git_work_tree_cfg;
|
||||
|
||||
static char *git_namespace;
|
||||
|
||||
/*
|
||||
* Repository-local GIT_* environment variables; see environment.h for details.
|
||||
*/
|
||||
@ -147,27 +135,6 @@ const char * const local_repo_env[] = {
|
||||
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);
|
||||
}
|
||||
|
||||
const char *getenv_safe(struct strvec *argv, const char *name)
|
||||
{
|
||||
const char *value = getenv(name);
|
||||
@ -179,47 +146,10 @@ const char *getenv_safe(struct strvec *argv, const char *name)
|
||||
return argv->v[argv->nr - 1];
|
||||
}
|
||||
|
||||
void setup_git_env(const char *git_dir)
|
||||
{
|
||||
char *git_replace_ref_base;
|
||||
const char *shallow_file;
|
||||
const char *replace_ref_base;
|
||||
struct set_gitdir_args args = { NULL };
|
||||
struct strvec to_free = STRVEC_INIT;
|
||||
|
||||
args.commondir = getenv_safe(&to_free, GIT_COMMON_DIR_ENVIRONMENT);
|
||||
args.object_dir = getenv_safe(&to_free, DB_ENVIRONMENT);
|
||||
args.graft_file = getenv_safe(&to_free, GRAFT_ENVIRONMENT);
|
||||
args.index_file = getenv_safe(&to_free, INDEX_ENVIRONMENT);
|
||||
args.alternate_db = getenv_safe(&to_free, ALTERNATE_DB_ENVIRONMENT);
|
||||
if (getenv(GIT_QUARANTINE_ENVIRONMENT)) {
|
||||
args.disable_ref_updates = 1;
|
||||
}
|
||||
|
||||
repo_set_gitdir(the_repository, git_dir, &args);
|
||||
strvec_clear(&to_free);
|
||||
|
||||
if (getenv(NO_REPLACE_OBJECTS_ENVIRONMENT))
|
||||
disable_replace_refs();
|
||||
replace_ref_base = getenv(GIT_REPLACE_REF_BASE_ENVIRONMENT);
|
||||
git_replace_ref_base = xstrdup(replace_ref_base ? replace_ref_base
|
||||
: "refs/replace/");
|
||||
update_ref_namespace(NAMESPACE_REPLACE, git_replace_ref_base);
|
||||
|
||||
free(git_namespace);
|
||||
git_namespace = expand_namespace(getenv(GIT_NAMESPACE_ENVIRONMENT));
|
||||
shallow_file = getenv(GIT_SHALLOW_FILE_ENVIRONMENT);
|
||||
if (shallow_file)
|
||||
set_alternate_shallow_file(the_repository, shallow_file, 0);
|
||||
|
||||
if (git_env_bool(NO_LAZY_FETCH_ENVIRONMENT, 0))
|
||||
fetch_if_missing = 0;
|
||||
}
|
||||
|
||||
int is_bare_repository(void)
|
||||
{
|
||||
/* if core.bare is not 'false', let's see if there is a work tree */
|
||||
return is_bare_repository_cfg && !get_git_work_tree();
|
||||
return is_bare_repository_cfg && !repo_get_work_tree(the_repository);
|
||||
}
|
||||
|
||||
int have_git_dir(void)
|
||||
@ -228,25 +158,37 @@ int have_git_dir(void)
|
||||
|| the_repository->gitdir;
|
||||
}
|
||||
|
||||
const char *get_git_dir(void)
|
||||
{
|
||||
if (!the_repository->gitdir)
|
||||
BUG("git environment hasn't been setup");
|
||||
return the_repository->gitdir;
|
||||
}
|
||||
|
||||
const char *get_git_common_dir(void)
|
||||
{
|
||||
if (!the_repository->commondir)
|
||||
BUG("git environment hasn't been setup");
|
||||
return the_repository->commondir;
|
||||
}
|
||||
|
||||
const char *get_git_namespace(void)
|
||||
{
|
||||
if (!git_namespace)
|
||||
BUG("git environment hasn't been setup");
|
||||
return git_namespace;
|
||||
static const char *namespace;
|
||||
|
||||
struct strbuf buf = STRBUF_INIT;
|
||||
struct strbuf **components, **c;
|
||||
const char *raw_namespace;
|
||||
|
||||
if (namespace)
|
||||
return namespace;
|
||||
|
||||
raw_namespace = getenv(GIT_NAMESPACE_ENVIRONMENT);
|
||||
if (!raw_namespace || !*raw_namespace) {
|
||||
namespace = "";
|
||||
return namespace;
|
||||
}
|
||||
|
||||
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, '/');
|
||||
|
||||
namespace = strbuf_detach(&buf, NULL);
|
||||
|
||||
return namespace;
|
||||
}
|
||||
|
||||
const char *strip_namespace(const char *namespaced_ref)
|
||||
@ -257,129 +199,6 @@ const char *strip_namespace(const char *namespaced_ref)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int git_work_tree_initialized;
|
||||
|
||||
/*
|
||||
* Note. This works only before you used a work tree. This was added
|
||||
* primarily to support git-clone to work in a new repository it just
|
||||
* created, and is not meant to flip between different work trees.
|
||||
*/
|
||||
void set_git_work_tree(const char *new_work_tree)
|
||||
{
|
||||
if (git_work_tree_initialized) {
|
||||
struct strbuf realpath = STRBUF_INIT;
|
||||
|
||||
strbuf_realpath(&realpath, new_work_tree, 1);
|
||||
new_work_tree = realpath.buf;
|
||||
if (strcmp(new_work_tree, the_repository->worktree))
|
||||
die("internal error: work tree has already been set\n"
|
||||
"Current worktree: %s\nNew worktree: %s",
|
||||
the_repository->worktree, new_work_tree);
|
||||
strbuf_release(&realpath);
|
||||
return;
|
||||
}
|
||||
git_work_tree_initialized = 1;
|
||||
repo_set_worktree(the_repository, new_work_tree);
|
||||
}
|
||||
|
||||
const char *get_git_work_tree(void)
|
||||
{
|
||||
return the_repository->worktree;
|
||||
}
|
||||
|
||||
const char *get_object_directory(void)
|
||||
{
|
||||
if (!the_repository->objects->odb)
|
||||
BUG("git environment hasn't been setup");
|
||||
return the_repository->objects->odb->path;
|
||||
}
|
||||
|
||||
int odb_mkstemp(struct strbuf *temp_filename, const char *pattern)
|
||||
{
|
||||
int fd;
|
||||
/*
|
||||
* we let the umask do its job, don't try to be more
|
||||
* restrictive except to remove write permission.
|
||||
*/
|
||||
int mode = 0444;
|
||||
git_path_buf(temp_filename, "objects/%s", pattern);
|
||||
fd = git_mkstemp_mode(temp_filename->buf, mode);
|
||||
if (0 <= fd)
|
||||
return fd;
|
||||
|
||||
/* slow path */
|
||||
/* some mkstemp implementations erase temp_filename on failure */
|
||||
git_path_buf(temp_filename, "objects/%s", pattern);
|
||||
safe_create_leading_directories(temp_filename->buf);
|
||||
return xmkstemp_mode(temp_filename->buf, mode);
|
||||
}
|
||||
|
||||
int odb_pack_keep(const char *name)
|
||||
{
|
||||
int fd;
|
||||
|
||||
fd = open(name, O_RDWR|O_CREAT|O_EXCL, 0600);
|
||||
if (0 <= fd)
|
||||
return fd;
|
||||
|
||||
/* slow path */
|
||||
safe_create_leading_directories_const(name);
|
||||
return open(name, O_RDWR|O_CREAT|O_EXCL, 0600);
|
||||
}
|
||||
|
||||
char *get_index_file(void)
|
||||
{
|
||||
if (!the_repository->index_file)
|
||||
BUG("git environment hasn't been setup");
|
||||
return the_repository->index_file;
|
||||
}
|
||||
|
||||
char *get_graft_file(struct repository *r)
|
||||
{
|
||||
if (!r->graft_file)
|
||||
BUG("git environment hasn't been setup");
|
||||
return r->graft_file;
|
||||
}
|
||||
|
||||
static void set_git_dir_1(const char *path)
|
||||
{
|
||||
xsetenv(GIT_DIR_ENVIRONMENT, path, 1);
|
||||
setup_git_env(path);
|
||||
}
|
||||
|
||||
static void update_relative_gitdir(const char *name UNUSED,
|
||||
const char *old_cwd,
|
||||
const char *new_cwd,
|
||||
void *data UNUSED)
|
||||
{
|
||||
char *path = reparent_relative_path(old_cwd, new_cwd, get_git_dir());
|
||||
struct tmp_objdir *tmp_objdir = tmp_objdir_unapply_primary_odb();
|
||||
|
||||
trace_printf_key(&trace_setup_key,
|
||||
"setup: move $GIT_DIR to '%s'",
|
||||
path);
|
||||
set_git_dir_1(path);
|
||||
if (tmp_objdir)
|
||||
tmp_objdir_reapply_primary_odb(tmp_objdir, old_cwd, new_cwd);
|
||||
free(path);
|
||||
}
|
||||
|
||||
void set_git_dir(const char *path, int make_realpath)
|
||||
{
|
||||
struct strbuf realpath = STRBUF_INIT;
|
||||
|
||||
if (make_realpath) {
|
||||
strbuf_realpath(&realpath, path, 1);
|
||||
path = realpath.buf;
|
||||
}
|
||||
|
||||
set_git_dir_1(path);
|
||||
if (!is_absolute_path(path))
|
||||
chdir_notify_register(NULL, update_relative_gitdir, NULL);
|
||||
|
||||
strbuf_release(&realpath);
|
||||
}
|
||||
|
||||
const char *get_log_output_encoding(void)
|
||||
{
|
||||
return git_log_output_encoding ? git_log_output_encoding
|
||||
|
142
environment.h
142
environment.h
@ -1,22 +1,7 @@
|
||||
#ifndef ENVIRONMENT_H
|
||||
#define ENVIRONMENT_H
|
||||
|
||||
struct repository;
|
||||
struct strvec;
|
||||
|
||||
/*
|
||||
* The character that begins a commented line in user-editable file
|
||||
* that is subject to stripspace.
|
||||
*/
|
||||
extern const char *comment_line_str;
|
||||
extern char *comment_line_str_to_free;
|
||||
extern int auto_comment_line_char;
|
||||
|
||||
/*
|
||||
* Wrapper of getenv() that returns a strdup value. This value is kept
|
||||
* in argv to be freed later.
|
||||
*/
|
||||
const char *getenv_safe(struct strvec *argv, const char *name);
|
||||
#include "repo-settings.h"
|
||||
|
||||
/* Double-check local_repo_env below if you add to this list. */
|
||||
#define GIT_DIR_ENVIRONMENT "GIT_DIR"
|
||||
@ -87,6 +72,8 @@ const char *getenv_safe(struct strvec *argv, const char *name);
|
||||
*/
|
||||
#define GIT_IMPLICIT_WORK_TREE_ENVIRONMENT "GIT_IMPLICIT_WORK_TREE"
|
||||
|
||||
#define ALTERNATE_DB_ENVIRONMENT "GIT_ALTERNATE_OBJECT_DIRECTORIES"
|
||||
|
||||
/*
|
||||
* Repository-local GIT_* environment variables; these will be cleared
|
||||
* when git spawns a sub-process that runs inside another repository.
|
||||
@ -95,6 +82,50 @@ const char *getenv_safe(struct strvec *argv, const char *name);
|
||||
*/
|
||||
extern const char * const local_repo_env[];
|
||||
|
||||
struct strvec;
|
||||
|
||||
/*
|
||||
* Wrapper of getenv() that returns a strdup value. This value is kept
|
||||
* in argv to be freed later.
|
||||
*/
|
||||
const char *getenv_safe(struct strvec *argv, const char *name);
|
||||
|
||||
/*
|
||||
* Should we print an ellipsis after an abbreviated SHA-1 value
|
||||
* when doing diff-raw output or indicating a detached HEAD?
|
||||
*/
|
||||
int print_sha1_ellipsis(void);
|
||||
|
||||
/*
|
||||
* Returns the boolean value of $GIT_OPTIONAL_LOCKS (or the default value).
|
||||
*/
|
||||
int use_optional_locks(void);
|
||||
|
||||
const char *get_git_namespace(void);
|
||||
const char *strip_namespace(const char *namespaced_ref);
|
||||
|
||||
/*
|
||||
* TODO: All the below state either explicitly or implicitly relies on
|
||||
* `the_repository`. We should eventually get rid of these and make the
|
||||
* dependency on a repository explicit:
|
||||
*
|
||||
* - `setup_git_env()` ideally shouldn't exist as it modifies global state,
|
||||
* namely the environment. The current process shouldn't ever access that
|
||||
* state via envvars though, but should instead consult a `struct
|
||||
* repository`. When spawning new processes, we would ideally also pass a
|
||||
* `struct repository` and then set up the environment variables for the
|
||||
* child process, only.
|
||||
*
|
||||
* - `have_git_dir()` should not have to exist at all. Instead, we should
|
||||
* decide on whether or not we have a `struct repository`.
|
||||
*
|
||||
* - All the global config variables should become tied to a repository. Like
|
||||
* this, we'd correctly honor repository-local configuration and be able to
|
||||
* distinguish configuration values from different repositories.
|
||||
*
|
||||
* Please do not add new global config variables here.
|
||||
*/
|
||||
# ifdef USE_THE_REPOSITORY_VARIABLE
|
||||
void setup_git_env(const char *git_dir);
|
||||
|
||||
/*
|
||||
@ -103,21 +134,19 @@ void setup_git_env(const char *git_dir);
|
||||
*/
|
||||
int have_git_dir(void);
|
||||
|
||||
/*
|
||||
* Accessors for the core.sharedrepository config which lazy-load the value
|
||||
* from the config (if not already set). The "reset" function can be
|
||||
* used to unset "set" or cached value, meaning that the value will be loaded
|
||||
* fresh from the config file on the next call to get_shared_repository().
|
||||
*/
|
||||
void set_shared_repository(int value);
|
||||
int get_shared_repository(void);
|
||||
void reset_shared_repository(void);
|
||||
|
||||
extern int is_bare_repository_cfg;
|
||||
int is_bare_repository(void);
|
||||
extern char *git_work_tree_cfg;
|
||||
const char *get_git_dir(void);
|
||||
const char *get_git_common_dir(void);
|
||||
const char *get_object_directory(void);
|
||||
char *get_index_file(void);
|
||||
char *get_graft_file(struct repository *r);
|
||||
void set_git_dir(const char *path, int make_realpath);
|
||||
const char *get_git_namespace(void);
|
||||
const char *strip_namespace(const char *namespaced_ref);
|
||||
const char *get_git_work_tree(void);
|
||||
void set_git_work_tree(const char *tree);
|
||||
|
||||
#define ALTERNATE_DB_ENVIRONMENT "GIT_ALTERNATE_OBJECT_DIRECTORIES"
|
||||
|
||||
/* Environment bits from configuration mechanism */
|
||||
extern int trust_executable_bit;
|
||||
@ -127,8 +156,6 @@ extern int has_symlinks;
|
||||
extern int minimum_abbrev, default_abbrev;
|
||||
extern int ignore_case;
|
||||
extern int assume_unchanged;
|
||||
extern int prefer_symlink_refs;
|
||||
extern int warn_ambiguous_refs;
|
||||
extern int warn_on_object_refname_ambiguity;
|
||||
extern char *apply_default_whitespace;
|
||||
extern char *apply_default_ignorewhitespace;
|
||||
@ -143,16 +170,6 @@ extern unsigned long big_file_threshold;
|
||||
extern unsigned long pack_size_limit_cfg;
|
||||
extern int max_allowed_tree_depth;
|
||||
|
||||
/*
|
||||
* Accessors for the core.sharedrepository config which lazy-load the value
|
||||
* from the config (if not already set). The "reset" function can be
|
||||
* used to unset "set" or cached value, meaning that the value will be loaded
|
||||
* fresh from the config file on the next call to get_shared_repository().
|
||||
*/
|
||||
void set_shared_repository(int value);
|
||||
int get_shared_repository(void);
|
||||
void reset_shared_repository(void);
|
||||
|
||||
extern int core_preload_index;
|
||||
extern int precomposed_unicode;
|
||||
extern int protect_hfs;
|
||||
@ -162,25 +179,13 @@ extern int core_apply_sparse_checkout;
|
||||
extern int core_sparse_checkout_cone;
|
||||
extern int sparse_expect_files_outside_of_patterns;
|
||||
|
||||
/*
|
||||
* Returns the boolean value of $GIT_OPTIONAL_LOCKS (or the default value).
|
||||
*/
|
||||
int use_optional_locks(void);
|
||||
|
||||
enum log_refs_config {
|
||||
LOG_REFS_UNSET = -1,
|
||||
LOG_REFS_NONE = 0,
|
||||
LOG_REFS_NORMAL,
|
||||
LOG_REFS_ALWAYS
|
||||
};
|
||||
extern enum log_refs_config log_all_ref_updates;
|
||||
|
||||
enum rebase_setup_type {
|
||||
AUTOREBASE_NEVER = 0,
|
||||
AUTOREBASE_LOCAL,
|
||||
AUTOREBASE_REMOTE,
|
||||
AUTOREBASE_ALWAYS
|
||||
};
|
||||
extern enum rebase_setup_type autorebase;
|
||||
|
||||
enum push_default_type {
|
||||
PUSH_DEFAULT_NOTHING = 0,
|
||||
@ -190,38 +195,18 @@ enum push_default_type {
|
||||
PUSH_DEFAULT_CURRENT,
|
||||
PUSH_DEFAULT_UNSPECIFIED
|
||||
};
|
||||
|
||||
extern enum rebase_setup_type autorebase;
|
||||
extern enum push_default_type push_default;
|
||||
|
||||
enum object_creation_mode {
|
||||
OBJECT_CREATION_USES_HARDLINKS = 0,
|
||||
OBJECT_CREATION_USES_RENAMES = 1
|
||||
};
|
||||
|
||||
extern enum object_creation_mode object_creation_mode;
|
||||
|
||||
extern char *notes_ref_name;
|
||||
|
||||
extern int grafts_keep_true_parents;
|
||||
|
||||
extern int repository_format_precious_objects;
|
||||
|
||||
/*
|
||||
* Create a temporary file rooted in the object database directory, or
|
||||
* die on failure. The filename is taken from "pattern", which should have the
|
||||
* usual "XXXXXX" trailer, and the resulting filename is written into the
|
||||
* "template" buffer. Returns the open descriptor.
|
||||
*/
|
||||
int odb_mkstemp(struct strbuf *temp_filename, const char *pattern);
|
||||
|
||||
/*
|
||||
* Create a pack .keep file named "name" (which should generally be the output
|
||||
* of odb_pack_name). Returns a file descriptor opened for writing, or -1 on
|
||||
* error.
|
||||
*/
|
||||
int odb_pack_keep(const char *name);
|
||||
|
||||
const char *get_log_output_encoding(void);
|
||||
const char *get_commit_output_encoding(void);
|
||||
|
||||
@ -233,9 +218,12 @@ extern char *askpass_program;
|
||||
extern char *excludes_file;
|
||||
|
||||
/*
|
||||
* Should we print an ellipsis after an abbreviated SHA-1 value
|
||||
* when doing diff-raw output or indicating a detached HEAD?
|
||||
* The character that begins a commented line in user-editable file
|
||||
* that is subject to stripspace.
|
||||
*/
|
||||
int print_sha1_ellipsis(void);
|
||||
extern const char *comment_line_str;
|
||||
extern char *comment_line_str_to_free;
|
||||
extern int auto_comment_line_char;
|
||||
|
||||
#endif
|
||||
# endif /* USE_THE_REPOSITORY_VARIABLE */
|
||||
#endif /* ENVIRONMENT_H */
|
||||
|
@ -1839,7 +1839,7 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
|
||||
|
||||
string_list_append_nodup(pack_lockfiles,
|
||||
xstrfmt("%s/pack/pack-%s.keep",
|
||||
get_object_directory(),
|
||||
repo_get_object_directory(the_repository),
|
||||
packname));
|
||||
}
|
||||
string_list_clear(&packfile_uris, 0);
|
||||
|
@ -8,6 +8,7 @@
|
||||
#include "fsmonitor.h"
|
||||
#include "fsmonitor-ipc.h"
|
||||
#include "name-hash.h"
|
||||
#include "repository.h"
|
||||
#include "run-command.h"
|
||||
#include "strbuf.h"
|
||||
#include "trace2.h"
|
||||
@ -169,7 +170,7 @@ static int query_fsmonitor_hook(struct repository *r,
|
||||
strvec_pushf(&cp.args, "%d", version);
|
||||
strvec_pushf(&cp.args, "%s", last_update);
|
||||
cp.use_shell = 1;
|
||||
cp.dir = get_git_work_tree();
|
||||
cp.dir = repo_get_work_tree(the_repository);
|
||||
|
||||
trace2_region_enter("fsm_hook", "query", NULL);
|
||||
|
||||
|
2
help.c
2
help.c
@ -618,7 +618,7 @@ const char *help_unknown_cmd(const char *cmd)
|
||||
memset(&other_cmds, 0, sizeof(other_cmds));
|
||||
memset(&aliases, 0, sizeof(aliases));
|
||||
|
||||
read_early_config(git_unknown_cmd_config, NULL);
|
||||
read_early_config(the_repository, git_unknown_cmd_config, NULL);
|
||||
|
||||
/*
|
||||
* Disable autocorrection prompt in a non-interactive session
|
||||
|
@ -601,7 +601,7 @@ static void get_head(struct strbuf *hdr, char *arg UNUSED)
|
||||
|
||||
static void get_info_packs(struct strbuf *hdr, char *arg UNUSED)
|
||||
{
|
||||
size_t objdirlen = strlen(get_object_directory());
|
||||
size_t objdirlen = strlen(repo_get_object_directory(the_repository));
|
||||
struct strbuf buf = STRBUF_INIT;
|
||||
struct packed_git *p;
|
||||
size_t cnt = 0;
|
||||
|
@ -5,6 +5,9 @@
|
||||
*
|
||||
* Copyright (C) 2008 Linus Torvalds
|
||||
*/
|
||||
|
||||
#define USE_THE_REPOSITORY_VARIABLE
|
||||
|
||||
#include "git-compat-util.h"
|
||||
#include "environment.h"
|
||||
#include "gettext.h"
|
||||
|
21
notes.c
21
notes.c
@ -992,15 +992,16 @@ static int notes_display_config(const char *k, const char *v,
|
||||
return 0;
|
||||
}
|
||||
|
||||
const char *default_notes_ref(void)
|
||||
char *default_notes_ref(struct repository *repo)
|
||||
{
|
||||
const char *notes_ref = NULL;
|
||||
char *notes_ref = NULL;
|
||||
|
||||
if (!notes_ref)
|
||||
notes_ref = getenv(GIT_NOTES_REF_ENVIRONMENT);
|
||||
notes_ref = xstrdup_or_null(getenv(GIT_NOTES_REF_ENVIRONMENT));
|
||||
if (!notes_ref)
|
||||
notes_ref = notes_ref_name; /* value of core.notesRef config */
|
||||
repo_config_get_string(repo, "core.notesref", ¬es_ref);
|
||||
if (!notes_ref)
|
||||
notes_ref = GIT_NOTES_DEFAULT_REF;
|
||||
notes_ref = xstrdup(GIT_NOTES_DEFAULT_REF);
|
||||
return notes_ref;
|
||||
}
|
||||
|
||||
@ -1010,13 +1011,14 @@ void init_notes(struct notes_tree *t, const char *notes_ref,
|
||||
struct object_id oid, object_oid;
|
||||
unsigned short mode;
|
||||
struct leaf_node root_tree;
|
||||
char *to_free = NULL;
|
||||
|
||||
if (!t)
|
||||
t = &default_notes_tree;
|
||||
assert(!t->initialized);
|
||||
|
||||
if (!notes_ref)
|
||||
notes_ref = default_notes_ref();
|
||||
notes_ref = to_free = default_notes_ref(the_repository);
|
||||
update_ref_namespace(NAMESPACE_NOTES, xstrdup(notes_ref));
|
||||
|
||||
if (!combine_notes)
|
||||
@ -1033,7 +1035,7 @@ void init_notes(struct notes_tree *t, const char *notes_ref,
|
||||
|
||||
if (flags & NOTES_INIT_EMPTY ||
|
||||
repo_get_oid_treeish(the_repository, notes_ref, &object_oid))
|
||||
return;
|
||||
goto out;
|
||||
if (flags & NOTES_INIT_WRITABLE && refs_read_ref(get_main_ref_store(the_repository), notes_ref, &object_oid))
|
||||
die("Cannot use notes ref %s", notes_ref);
|
||||
if (get_tree_entry(the_repository, &object_oid, "", &oid, &mode))
|
||||
@ -1043,6 +1045,9 @@ void init_notes(struct notes_tree *t, const char *notes_ref,
|
||||
oidclr(&root_tree.key_oid, the_repository->hash_algo);
|
||||
oidcpy(&root_tree.val_oid, &oid);
|
||||
load_subtree(t, &root_tree, t->root, 0);
|
||||
|
||||
out:
|
||||
free(to_free);
|
||||
}
|
||||
|
||||
struct notes_tree **load_notes_trees(struct string_list *refs, int flags)
|
||||
@ -1105,7 +1110,7 @@ void load_display_notes(struct display_notes_opt *opt)
|
||||
|
||||
if (!opt || opt->use_default_notes > 0 ||
|
||||
(opt->use_default_notes == -1 && !opt->extra_notes_refs.nr)) {
|
||||
string_list_append(&display_notes_refs, default_notes_ref());
|
||||
string_list_append_nodup(&display_notes_refs, default_notes_ref(the_repository));
|
||||
display_ref_env = getenv(GIT_NOTES_DISPLAY_REF_ENVIRONMENT);
|
||||
if (display_ref_env) {
|
||||
string_list_add_refs_from_colon_sep(&display_notes_refs,
|
||||
|
3
notes.h
3
notes.h
@ -4,6 +4,7 @@
|
||||
#include "string-list.h"
|
||||
|
||||
struct object_id;
|
||||
struct repository;
|
||||
struct strbuf;
|
||||
|
||||
/*
|
||||
@ -70,7 +71,7 @@ extern struct notes_tree {
|
||||
* 3. The value of the core.notesRef config variable, if set
|
||||
* 4. GIT_NOTES_DEFAULT_REF (i.e. "refs/notes/commits")
|
||||
*/
|
||||
const char *default_notes_ref(void);
|
||||
char *default_notes_ref(struct repository *repo);
|
||||
|
||||
/*
|
||||
* Flags controlling behaviour of notes tree initialization
|
||||
|
@ -419,6 +419,39 @@ enum scld_error safe_create_leading_directories_const(const char *path)
|
||||
return result;
|
||||
}
|
||||
|
||||
int odb_mkstemp(struct strbuf *temp_filename, const char *pattern)
|
||||
{
|
||||
int fd;
|
||||
/*
|
||||
* we let the umask do its job, don't try to be more
|
||||
* restrictive except to remove write permission.
|
||||
*/
|
||||
int mode = 0444;
|
||||
git_path_buf(temp_filename, "objects/%s", pattern);
|
||||
fd = git_mkstemp_mode(temp_filename->buf, mode);
|
||||
if (0 <= fd)
|
||||
return fd;
|
||||
|
||||
/* slow path */
|
||||
/* some mkstemp implementations erase temp_filename on failure */
|
||||
git_path_buf(temp_filename, "objects/%s", pattern);
|
||||
safe_create_leading_directories(temp_filename->buf);
|
||||
return xmkstemp_mode(temp_filename->buf, mode);
|
||||
}
|
||||
|
||||
int odb_pack_keep(const char *name)
|
||||
{
|
||||
int fd;
|
||||
|
||||
fd = open(name, O_RDWR|O_CREAT|O_EXCL, 0600);
|
||||
if (0 <= fd)
|
||||
return fd;
|
||||
|
||||
/* slow path */
|
||||
safe_create_leading_directories_const(name);
|
||||
return open(name, O_RDWR|O_CREAT|O_EXCL, 0600);
|
||||
}
|
||||
|
||||
static void fill_loose_path(struct strbuf *buf, const struct object_id *oid)
|
||||
{
|
||||
int i;
|
||||
@ -2053,7 +2086,7 @@ static int start_loose_object_common(struct strbuf *tmp_file,
|
||||
else if (errno == EACCES)
|
||||
return error(_("insufficient permission for adding "
|
||||
"an object to repository database %s"),
|
||||
get_object_directory());
|
||||
repo_get_object_directory(the_repository));
|
||||
else
|
||||
return error_errno(
|
||||
_("unable to create temporary file"));
|
||||
@ -2228,7 +2261,7 @@ int stream_loose_object(struct input_stream *in_stream, size_t len,
|
||||
prepare_loose_object_bulk_checkin();
|
||||
|
||||
/* Since oid is not determined, save tmp file to odb path. */
|
||||
strbuf_addf(&filename, "%s/", get_object_directory());
|
||||
strbuf_addf(&filename, "%s/", repo_get_object_directory(the_repository));
|
||||
hdrlen = format_object_header(hdr, sizeof(hdr), OBJ_BLOB, len);
|
||||
|
||||
/*
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include "pretty.h"
|
||||
#include "object-store-ll.h"
|
||||
#include "read-cache-ll.h"
|
||||
#include "repo-settings.h"
|
||||
#include "repository.h"
|
||||
#include "setup.h"
|
||||
#include "midx.h"
|
||||
@ -959,7 +960,7 @@ static int get_oid_basic(struct repository *r, const char *str, int len,
|
||||
int fatal = !(flags & GET_OID_QUIETLY);
|
||||
|
||||
if (len == r->hash_algo->hexsz && !get_oid_hex(str, oid)) {
|
||||
if (warn_ambiguous_refs && warn_on_object_refname_ambiguity) {
|
||||
if (repo_settings_get_warn_ambiguous_refs(r) && warn_on_object_refname_ambiguity) {
|
||||
refs_found = repo_dwim_ref(r, str, len, &tmp_oid, &real_ref, 0);
|
||||
if (refs_found > 0) {
|
||||
warning(warn_msg, len, str);
|
||||
@ -1020,7 +1021,7 @@ static int get_oid_basic(struct repository *r, const char *str, int len,
|
||||
if (!refs_found)
|
||||
return -1;
|
||||
|
||||
if (warn_ambiguous_refs && !(flags & GET_OID_QUIETLY) &&
|
||||
if (repo_settings_get_warn_ambiguous_refs(r) && !(flags & GET_OID_QUIETLY) &&
|
||||
(refs_found > 1 ||
|
||||
!get_short_oid(r, str, len, &tmp_oid, GET_OID_QUIETLY)))
|
||||
warning(warn_msg, len, str);
|
||||
|
@ -231,6 +231,21 @@ struct raw_object_store {
|
||||
struct raw_object_store *raw_object_store_new(void);
|
||||
void raw_object_store_clear(struct raw_object_store *o);
|
||||
|
||||
/*
|
||||
* Create a temporary file rooted in the object database directory, or
|
||||
* die on failure. The filename is taken from "pattern", which should have the
|
||||
* usual "XXXXXX" trailer, and the resulting filename is written into the
|
||||
* "template" buffer. Returns the open descriptor.
|
||||
*/
|
||||
int odb_mkstemp(struct strbuf *temp_filename, const char *pattern);
|
||||
|
||||
/*
|
||||
* Create a pack .keep file named "name" (which should generally be the output
|
||||
* of odb_pack_name). Returns a file descriptor opened for writing, or -1 on
|
||||
* error.
|
||||
*/
|
||||
int odb_pack_keep(const char *name);
|
||||
|
||||
/*
|
||||
* Put in `buf` the name of the file in the local object database that
|
||||
* would be used to store a loose object with the specified oid.
|
||||
|
@ -12,6 +12,7 @@
|
||||
#include "pack-objects.h"
|
||||
#include "pack-revindex.h"
|
||||
#include "path.h"
|
||||
#include "repository.h"
|
||||
#include "strbuf.h"
|
||||
|
||||
void reset_pack_idx_option(struct pack_idx_option *opts)
|
||||
@ -473,7 +474,7 @@ char *index_pack_lockfile(int ip_out, int *is_well_formed)
|
||||
packname[len-1] = 0;
|
||||
if (skip_prefix(packname, "keep\t", &name))
|
||||
return xstrfmt("%s/pack/pack-%s.keep",
|
||||
get_object_directory(), name);
|
||||
repo_get_object_directory(the_repository), name);
|
||||
return NULL;
|
||||
}
|
||||
if (is_well_formed)
|
||||
|
@ -30,7 +30,7 @@ char *odb_pack_name(struct strbuf *buf,
|
||||
const char *ext)
|
||||
{
|
||||
strbuf_reset(buf);
|
||||
strbuf_addf(buf, "%s/pack/pack-%s.%s", get_object_directory(),
|
||||
strbuf_addf(buf, "%s/pack/pack-%s.%s", repo_get_object_directory(the_repository),
|
||||
hash_to_hex(hash), ext);
|
||||
return buf->buf;
|
||||
}
|
||||
|
7
pager.c
7
pager.c
@ -1,3 +1,5 @@
|
||||
#define USE_THE_REPOSITORY_VARIABLE
|
||||
|
||||
#include "git-compat-util.h"
|
||||
#include "config.h"
|
||||
#include "editor.h"
|
||||
@ -92,7 +94,8 @@ const char *git_pager(int stdout_is_tty)
|
||||
pager = getenv("GIT_PAGER");
|
||||
if (!pager) {
|
||||
if (!pager_program)
|
||||
read_early_config(core_pager_config, NULL);
|
||||
read_early_config(the_repository,
|
||||
core_pager_config, NULL);
|
||||
pager = pager_program;
|
||||
}
|
||||
if (!pager)
|
||||
@ -298,7 +301,7 @@ int check_pager_config(const char *cmd)
|
||||
data.want = -1;
|
||||
data.value = NULL;
|
||||
|
||||
read_early_config(pager_command_config, &data);
|
||||
read_early_config(the_repository, pager_command_config, &data);
|
||||
|
||||
if (data.value)
|
||||
pager_program = data.value;
|
||||
|
2
path.c
2
path.c
@ -2,6 +2,8 @@
|
||||
* Utilities for paths and pathnames
|
||||
*/
|
||||
|
||||
#define USE_THE_REPOSITORY_VARIABLE
|
||||
|
||||
#include "git-compat-util.h"
|
||||
#include "abspath.h"
|
||||
#include "environment.h"
|
||||
|
@ -495,9 +495,9 @@ static void init_pathspec_item(struct pathspec_item *item, unsigned flags,
|
||||
if (!have_git_dir())
|
||||
die(_("'%s' is outside the directory tree"),
|
||||
copyfrom);
|
||||
hint_path = get_git_work_tree();
|
||||
hint_path = repo_get_work_tree(the_repository);
|
||||
if (!hint_path)
|
||||
hint_path = get_git_dir();
|
||||
hint_path = repo_get_git_dir(the_repository);
|
||||
die(_("%s: '%s' is outside repository at '%s'"), elt,
|
||||
copyfrom, absolute_path(hint_path));
|
||||
}
|
||||
|
@ -1,6 +1,9 @@
|
||||
/*
|
||||
* Copyright (C) 2008 Linus Torvalds
|
||||
*/
|
||||
|
||||
#define USE_THE_REPOSITORY_VARIABLE
|
||||
|
||||
#include "git-compat-util.h"
|
||||
#include "pathspec.h"
|
||||
#include "dir.h"
|
||||
|
2
prompt.c
2
prompt.c
@ -1,3 +1,5 @@
|
||||
#define USE_THE_REPOSITORY_VARIABLE
|
||||
|
||||
#include "git-compat-util.h"
|
||||
#include "parse.h"
|
||||
#include "environment.h"
|
||||
|
@ -1,10 +1,12 @@
|
||||
#define USE_THE_REPOSITORY_VARIABLE
|
||||
|
||||
#include "git-compat-util.h"
|
||||
#include "environment.h"
|
||||
#include "gettext.h"
|
||||
#include "object-store-ll.h"
|
||||
#include "packfile.h"
|
||||
#include "progress.h"
|
||||
#include "prune-packed.h"
|
||||
#include "repository.h"
|
||||
|
||||
static struct progress *progress;
|
||||
|
||||
@ -37,7 +39,7 @@ void prune_packed_objects(int opts)
|
||||
if (opts & PRUNE_PACKED_VERBOSE)
|
||||
progress = start_delayed_progress(_("Removing duplicate objects"), 256);
|
||||
|
||||
for_each_loose_file_in_objdir(get_object_directory(),
|
||||
for_each_loose_file_in_objdir(repo_get_object_directory(the_repository),
|
||||
prune_object, NULL, prune_subdir, &opts);
|
||||
|
||||
/* Ensure we show 100% before finishing progress */
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include "path.h"
|
||||
#include "preload-index.h"
|
||||
#include "read-cache.h"
|
||||
#include "repository.h"
|
||||
#include "resolve-undo.h"
|
||||
#include "revision.h"
|
||||
#include "strbuf.h"
|
||||
@ -3238,10 +3239,11 @@ static int should_delete_shared_index(const char *shared_index_path)
|
||||
static int clean_shared_index_files(const char *current_hex)
|
||||
{
|
||||
struct dirent *de;
|
||||
DIR *dir = opendir(get_git_dir());
|
||||
DIR *dir = opendir(repo_get_git_dir(the_repository));
|
||||
|
||||
if (!dir)
|
||||
return error_errno(_("unable to open git dir: %s"), get_git_dir());
|
||||
return error_errno(_("unable to open git dir: %s"),
|
||||
repo_get_git_dir(the_repository));
|
||||
|
||||
while ((de = readdir(dir)) != NULL) {
|
||||
const char *sha1_hex;
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include "object-name.h"
|
||||
#include "object-store-ll.h"
|
||||
#include "oid-array.h"
|
||||
#include "repo-settings.h"
|
||||
#include "repository.h"
|
||||
#include "commit.h"
|
||||
#include "mailmap.h"
|
||||
@ -2180,7 +2181,7 @@ static const char *show_ref(struct refname_atom *atom, const char *refname)
|
||||
if (atom->option == R_SHORT)
|
||||
return refs_shorten_unambiguous_ref(get_main_ref_store(the_repository),
|
||||
refname,
|
||||
warn_ambiguous_refs);
|
||||
repo_settings_get_warn_ambiguous_refs(the_repository));
|
||||
else if (atom->option == R_LSTRIP)
|
||||
return lstrip_ref_components(refname, atom->lstrip);
|
||||
else if (atom->option == R_RSTRIP)
|
||||
|
9
refs.c
9
refs.c
@ -24,7 +24,7 @@
|
||||
#include "submodule.h"
|
||||
#include "worktree.h"
|
||||
#include "strvec.h"
|
||||
#include "repository.h"
|
||||
#include "repo-settings.h"
|
||||
#include "setup.h"
|
||||
#include "sigchain.h"
|
||||
#include "date.h"
|
||||
@ -730,7 +730,7 @@ int expand_ref(struct repository *repo, const char *str, int len,
|
||||
if (r) {
|
||||
if (!refs_found++)
|
||||
*ref = xstrdup(r);
|
||||
if (!warn_ambiguous_refs)
|
||||
if (!repo_settings_get_warn_ambiguous_refs(repo))
|
||||
break;
|
||||
} else if ((flag & REF_ISSYMREF) && strcmp(fullref.buf, "HEAD")) {
|
||||
warning(_("ignoring dangling symref %s"), fullref.buf);
|
||||
@ -775,7 +775,7 @@ int repo_dwim_log(struct repository *r, const char *str, int len,
|
||||
if (oid)
|
||||
oidcpy(oid, &hash);
|
||||
}
|
||||
if (!warn_ambiguous_refs)
|
||||
if (!repo_settings_get_warn_ambiguous_refs(r))
|
||||
break;
|
||||
}
|
||||
strbuf_release(&path);
|
||||
@ -958,7 +958,8 @@ static char *normalize_reflog_message(const char *msg)
|
||||
return strbuf_detach(&sb, NULL);
|
||||
}
|
||||
|
||||
int should_autocreate_reflog(const char *refname)
|
||||
int should_autocreate_reflog(enum log_refs_config log_all_ref_updates,
|
||||
const char *refname)
|
||||
{
|
||||
switch (log_all_ref_updates) {
|
||||
case LOG_REFS_ALWAYS:
|
||||
|
4
refs.h
4
refs.h
@ -3,6 +3,7 @@
|
||||
|
||||
#include "commit.h"
|
||||
#include "repository.h"
|
||||
#include "repo-settings.h"
|
||||
|
||||
struct fsck_options;
|
||||
struct object_id;
|
||||
@ -111,7 +112,8 @@ int refs_verify_refname_available(struct ref_store *refs,
|
||||
|
||||
int refs_ref_exists(struct ref_store *refs, const char *refname);
|
||||
|
||||
int should_autocreate_reflog(const char *refname);
|
||||
int should_autocreate_reflog(enum log_refs_config log_all_ref_updates,
|
||||
const char *refname);
|
||||
|
||||
int is_branch(const char *refname);
|
||||
|
||||
|
@ -1,4 +1,7 @@
|
||||
#define USE_THE_REPOSITORY_VARIABLE
|
||||
|
||||
#include "../git-compat-util.h"
|
||||
#include "../config.h"
|
||||
#include "../copy.h"
|
||||
#include "../environment.h"
|
||||
#include "../gettext.h"
|
||||
@ -6,6 +9,7 @@
|
||||
#include "../hex.h"
|
||||
#include "../fsck.h"
|
||||
#include "../refs.h"
|
||||
#include "../repo-settings.h"
|
||||
#include "refs-internal.h"
|
||||
#include "ref-cache.h"
|
||||
#include "packed-backend.h"
|
||||
@ -72,6 +76,8 @@ struct files_ref_store {
|
||||
unsigned int store_flags;
|
||||
|
||||
char *gitcommondir;
|
||||
enum log_refs_config log_all_ref_updates;
|
||||
int prefer_symlink_refs;
|
||||
|
||||
struct ref_cache *loose;
|
||||
|
||||
@ -104,6 +110,8 @@ static struct ref_store *files_ref_store_init(struct repository *repo,
|
||||
refs->gitcommondir = strbuf_detach(&sb, NULL);
|
||||
refs->packed_ref_store =
|
||||
packed_ref_store_init(repo, refs->gitcommondir, flags);
|
||||
refs->log_all_ref_updates = repo_settings_get_log_all_ref_updates(repo);
|
||||
repo_config_get_bool(repo, "core.prefersymlinkrefs", &refs->prefer_symlink_refs);
|
||||
|
||||
chdir_notify_reparent("files-backend $GIT_DIR", &refs->base.gitdir);
|
||||
chdir_notify_reparent("files-backend $GIT_COMMONDIR",
|
||||
@ -1506,6 +1514,7 @@ static int write_ref_to_lockfile(struct files_ref_store *refs,
|
||||
static int commit_ref_update(struct files_ref_store *refs,
|
||||
struct ref_lock *lock,
|
||||
const struct object_id *oid, const char *logmsg,
|
||||
int flags,
|
||||
struct strbuf *err);
|
||||
|
||||
/*
|
||||
@ -1649,7 +1658,7 @@ static int files_copy_or_rename_ref(struct ref_store *ref_store,
|
||||
oidcpy(&lock->old_oid, &orig_oid);
|
||||
|
||||
if (write_ref_to_lockfile(refs, lock, &orig_oid, 0, &err) ||
|
||||
commit_ref_update(refs, lock, &orig_oid, logmsg, &err)) {
|
||||
commit_ref_update(refs, lock, &orig_oid, logmsg, 0, &err)) {
|
||||
error("unable to write current sha1 into %s: %s", newrefname, err.buf);
|
||||
strbuf_release(&err);
|
||||
goto rollback;
|
||||
@ -1666,14 +1675,11 @@ static int files_copy_or_rename_ref(struct ref_store *ref_store,
|
||||
goto rollbacklog;
|
||||
}
|
||||
|
||||
flag = log_all_ref_updates;
|
||||
log_all_ref_updates = LOG_REFS_NONE;
|
||||
if (write_ref_to_lockfile(refs, lock, &orig_oid, 0, &err) ||
|
||||
commit_ref_update(refs, lock, &orig_oid, NULL, &err)) {
|
||||
commit_ref_update(refs, lock, &orig_oid, NULL, REF_SKIP_CREATE_REFLOG, &err)) {
|
||||
error("unable to write current sha1 into %s: %s", oldrefname, err.buf);
|
||||
strbuf_release(&err);
|
||||
}
|
||||
log_all_ref_updates = flag;
|
||||
|
||||
rollbacklog:
|
||||
if (logmoved && rename(sb_newref.buf, sb_oldref.buf))
|
||||
@ -1768,13 +1774,17 @@ static int log_ref_setup(struct files_ref_store *refs,
|
||||
const char *refname, int force_create,
|
||||
int *logfd, struct strbuf *err)
|
||||
{
|
||||
enum log_refs_config log_refs_cfg = refs->log_all_ref_updates;
|
||||
struct strbuf logfile_sb = STRBUF_INIT;
|
||||
char *logfile;
|
||||
|
||||
if (log_refs_cfg == LOG_REFS_UNSET)
|
||||
log_refs_cfg = is_bare_repository() ? LOG_REFS_NONE : LOG_REFS_NORMAL;
|
||||
|
||||
files_reflog_path(refs, &logfile_sb, refname);
|
||||
logfile = strbuf_detach(&logfile_sb, NULL);
|
||||
|
||||
if (force_create || should_autocreate_reflog(refname)) {
|
||||
if (force_create || should_autocreate_reflog(log_refs_cfg, refname)) {
|
||||
if (raceproof_create_file(logfile, open_or_create_logfile, logfd)) {
|
||||
if (errno == ENOENT)
|
||||
strbuf_addf(err, "unable to create directory for '%s': "
|
||||
@ -1863,9 +1873,6 @@ static int files_log_ref_write(struct files_ref_store *refs,
|
||||
if (flags & REF_SKIP_CREATE_REFLOG)
|
||||
return 0;
|
||||
|
||||
if (log_all_ref_updates == LOG_REFS_UNSET)
|
||||
log_all_ref_updates = is_bare_repository() ? LOG_REFS_NONE : LOG_REFS_NORMAL;
|
||||
|
||||
result = log_ref_setup(refs, refname,
|
||||
flags & REF_FORCE_CREATE_REFLOG,
|
||||
&logfd, err);
|
||||
@ -1954,6 +1961,7 @@ static int write_ref_to_lockfile(struct files_ref_store *refs,
|
||||
static int commit_ref_update(struct files_ref_store *refs,
|
||||
struct ref_lock *lock,
|
||||
const struct object_id *oid, const char *logmsg,
|
||||
int flags,
|
||||
struct strbuf *err)
|
||||
{
|
||||
files_assert_main_repository(refs, "commit_ref_update");
|
||||
@ -1961,7 +1969,7 @@ static int commit_ref_update(struct files_ref_store *refs,
|
||||
clear_loose_ref_cache(refs);
|
||||
if (files_log_ref_write(refs, lock->ref_name,
|
||||
&lock->old_oid, oid,
|
||||
logmsg, 0, err)) {
|
||||
logmsg, flags, err)) {
|
||||
char *old_msg = strbuf_detach(err, NULL);
|
||||
strbuf_addf(err, "cannot update the ref '%s': %s",
|
||||
lock->ref_name, old_msg);
|
||||
@ -1994,7 +2002,7 @@ static int commit_ref_update(struct files_ref_store *refs,
|
||||
struct strbuf log_err = STRBUF_INIT;
|
||||
if (files_log_ref_write(refs, "HEAD",
|
||||
&lock->old_oid, oid,
|
||||
logmsg, 0, &log_err)) {
|
||||
logmsg, flags, &log_err)) {
|
||||
error("%s", log_err.buf);
|
||||
strbuf_release(&log_err);
|
||||
}
|
||||
@ -3005,7 +3013,7 @@ static int files_transaction_finish(struct ref_store *ref_store,
|
||||
* We try creating a symlink, if that succeeds we continue to the
|
||||
* next update. If not, we try and create a regular symref.
|
||||
*/
|
||||
if (update->new_target && prefer_symlink_refs)
|
||||
if (update->new_target && refs->prefer_symlink_refs)
|
||||
if (!create_ref_symlink(lock, update->new_target))
|
||||
continue;
|
||||
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include "../reftable/reftable-record.h"
|
||||
#include "../reftable/reftable-error.h"
|
||||
#include "../reftable/reftable-iterator.h"
|
||||
#include "../repo-settings.h"
|
||||
#include "../setup.h"
|
||||
#include "../strmap.h"
|
||||
#include "parse.h"
|
||||
@ -51,6 +52,7 @@ struct reftable_ref_store {
|
||||
struct reftable_write_options write_options;
|
||||
|
||||
unsigned int store_flags;
|
||||
enum log_refs_config log_all_ref_updates;
|
||||
int err;
|
||||
};
|
||||
|
||||
@ -156,22 +158,23 @@ static struct reftable_stack *stack_for(struct reftable_ref_store *store,
|
||||
}
|
||||
}
|
||||
|
||||
static int should_write_log(struct ref_store *refs, const char *refname)
|
||||
static int should_write_log(struct reftable_ref_store *refs, const char *refname)
|
||||
{
|
||||
if (log_all_ref_updates == LOG_REFS_UNSET)
|
||||
log_all_ref_updates = is_bare_repository() ? LOG_REFS_NONE : LOG_REFS_NORMAL;
|
||||
enum log_refs_config log_refs_cfg = refs->log_all_ref_updates;
|
||||
if (log_refs_cfg == LOG_REFS_UNSET)
|
||||
log_refs_cfg = is_bare_repository() ? LOG_REFS_NONE : LOG_REFS_NORMAL;
|
||||
|
||||
switch (log_all_ref_updates) {
|
||||
switch (log_refs_cfg) {
|
||||
case LOG_REFS_NONE:
|
||||
return refs_reflog_exists(refs, refname);
|
||||
return refs_reflog_exists(&refs->base, refname);
|
||||
case LOG_REFS_ALWAYS:
|
||||
return 1;
|
||||
case LOG_REFS_NORMAL:
|
||||
if (should_autocreate_reflog(refname))
|
||||
if (should_autocreate_reflog(log_refs_cfg, refname))
|
||||
return 1;
|
||||
return refs_reflog_exists(refs, refname);
|
||||
return refs_reflog_exists(&refs->base, refname);
|
||||
default:
|
||||
BUG("unhandled core.logAllRefUpdates value %d", log_all_ref_updates);
|
||||
BUG("unhandled core.logAllRefUpdates value %d", log_refs_cfg);
|
||||
}
|
||||
}
|
||||
|
||||
@ -276,6 +279,7 @@ static struct ref_store *reftable_be_init(struct repository *repo,
|
||||
base_ref_store_init(&refs->base, repo, gitdir, &refs_be_reftable);
|
||||
strmap_init(&refs->worktree_stacks);
|
||||
refs->store_flags = store_flags;
|
||||
refs->log_all_ref_updates = repo_settings_get_log_all_ref_updates(repo);
|
||||
|
||||
refs->write_options.hash_id = repo->hash_algo->format_id;
|
||||
refs->write_options.default_permissions = calc_shared_perm(0666 & ~mask);
|
||||
@ -1218,7 +1222,7 @@ static int write_transaction_table(struct reftable_writer *writer, void *cb_data
|
||||
} else if (!(u->flags & REF_SKIP_CREATE_REFLOG) &&
|
||||
(u->flags & REF_HAVE_NEW) &&
|
||||
(u->flags & REF_FORCE_CREATE_REFLOG ||
|
||||
should_write_log(&arg->refs->base, u->refname))) {
|
||||
should_write_log(arg->refs, u->refname))) {
|
||||
struct reftable_log_record *log;
|
||||
int create_reflog = 1;
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
#include "git-compat-util.h"
|
||||
#include "config.h"
|
||||
#include "repo-settings.h"
|
||||
#include "repository.h"
|
||||
#include "midx.h"
|
||||
|
||||
@ -19,6 +20,7 @@ static void repo_cfg_int(struct repository *r, const char *key, int *dest,
|
||||
|
||||
void prepare_repo_settings(struct repository *r)
|
||||
{
|
||||
const struct repo_settings defaults = REPO_SETTINGS_INIT;
|
||||
int experimental;
|
||||
int value;
|
||||
const char *strval;
|
||||
@ -28,13 +30,11 @@ void prepare_repo_settings(struct repository *r)
|
||||
if (!r->gitdir)
|
||||
BUG("Cannot add settings for uninitialized repository");
|
||||
|
||||
if (r->settings.initialized++)
|
||||
if (r->settings.initialized)
|
||||
return;
|
||||
|
||||
/* Defaults */
|
||||
r->settings.index_version = -1;
|
||||
r->settings.core_untracked_cache = UNTRACKED_CACHE_KEEP;
|
||||
r->settings.fetch_negotiation_algorithm = FETCH_NEGOTIATION_CONSECUTIVE;
|
||||
memcpy(&r->settings, &defaults, sizeof(defaults));
|
||||
r->settings.initialized++;
|
||||
|
||||
/* Booleans config or default, cascades to other settings */
|
||||
repo_cfg_bool(r, "feature.manyfiles", &manyfiles, 0);
|
||||
@ -124,3 +124,28 @@ void prepare_repo_settings(struct repository *r)
|
||||
*/
|
||||
r->settings.command_requires_full_index = 1;
|
||||
}
|
||||
|
||||
enum log_refs_config repo_settings_get_log_all_ref_updates(struct repository *repo)
|
||||
{
|
||||
const char *value;
|
||||
|
||||
if (!repo_config_get_string_tmp(repo, "core.logallrefupdates", &value)) {
|
||||
if (value && !strcasecmp(value, "always"))
|
||||
return LOG_REFS_ALWAYS;
|
||||
else if (git_config_bool("core.logallrefupdates", value))
|
||||
return LOG_REFS_NORMAL;
|
||||
else
|
||||
return LOG_REFS_NONE;
|
||||
}
|
||||
|
||||
return LOG_REFS_UNSET;
|
||||
}
|
||||
|
||||
int repo_settings_get_warn_ambiguous_refs(struct repository *repo)
|
||||
{
|
||||
prepare_repo_settings(repo);
|
||||
if (repo->settings.warn_ambiguous_refs < 0)
|
||||
repo_cfg_bool(repo, "core.warnambiguousrefs",
|
||||
&repo->settings.warn_ambiguous_refs, 1);
|
||||
return repo->settings.warn_ambiguous_refs;
|
||||
}
|
||||
|
75
repo-settings.h
Normal file
75
repo-settings.h
Normal file
@ -0,0 +1,75 @@
|
||||
#ifndef REPO_SETTINGS_H
|
||||
#define REPO_SETTINGS_H
|
||||
|
||||
struct fsmonitor_settings;
|
||||
struct repository;
|
||||
|
||||
enum untracked_cache_setting {
|
||||
UNTRACKED_CACHE_KEEP,
|
||||
UNTRACKED_CACHE_REMOVE,
|
||||
UNTRACKED_CACHE_WRITE,
|
||||
};
|
||||
|
||||
enum fetch_negotiation_setting {
|
||||
FETCH_NEGOTIATION_CONSECUTIVE,
|
||||
FETCH_NEGOTIATION_SKIPPING,
|
||||
FETCH_NEGOTIATION_NOOP,
|
||||
};
|
||||
|
||||
enum log_refs_config {
|
||||
LOG_REFS_UNSET = -1,
|
||||
LOG_REFS_NONE = 0,
|
||||
LOG_REFS_NORMAL,
|
||||
LOG_REFS_ALWAYS
|
||||
};
|
||||
|
||||
struct repo_settings {
|
||||
int initialized;
|
||||
|
||||
int core_commit_graph;
|
||||
int commit_graph_generation_version;
|
||||
int commit_graph_changed_paths_version;
|
||||
int gc_write_commit_graph;
|
||||
int fetch_write_commit_graph;
|
||||
int command_requires_full_index;
|
||||
int sparse_index;
|
||||
int pack_read_reverse_index;
|
||||
int pack_use_bitmap_boundary_traversal;
|
||||
int pack_use_multi_pack_reuse;
|
||||
|
||||
/*
|
||||
* Does this repository have core.useReplaceRefs=true (on by
|
||||
* default)? This provides a repository-scoped version of this
|
||||
* config, though it could be disabled process-wide via some Git
|
||||
* builtins or the --no-replace-objects option. See
|
||||
* replace_refs_enabled() for more details.
|
||||
*/
|
||||
int read_replace_refs;
|
||||
|
||||
struct fsmonitor_settings *fsmonitor; /* lazily loaded */
|
||||
|
||||
int index_version;
|
||||
int index_skip_hash;
|
||||
enum untracked_cache_setting core_untracked_cache;
|
||||
|
||||
int pack_use_sparse;
|
||||
enum fetch_negotiation_setting fetch_negotiation_algorithm;
|
||||
|
||||
int core_multi_pack_index;
|
||||
int warn_ambiguous_refs; /* lazily loaded via accessor */
|
||||
};
|
||||
#define REPO_SETTINGS_INIT { \
|
||||
.index_version = -1, \
|
||||
.core_untracked_cache = UNTRACKED_CACHE_KEEP, \
|
||||
.fetch_negotiation_algorithm = FETCH_NEGOTIATION_CONSECUTIVE, \
|
||||
.warn_ambiguous_refs = -1, \
|
||||
}
|
||||
|
||||
void prepare_repo_settings(struct repository *r);
|
||||
|
||||
/* Read the value for "core.logAllRefUpdates". */
|
||||
enum log_refs_config repo_settings_get_log_all_ref_updates(struct repository *repo);
|
||||
/* Read the value for "core.warnAmbiguousRefs". */
|
||||
int repo_settings_get_warn_ambiguous_refs(struct repository *repo);
|
||||
|
||||
#endif /* REPO_SETTINGS_H */
|
40
repository.c
40
repository.c
@ -91,6 +91,46 @@ static void expand_base_dir(char **out, const char *in,
|
||||
*out = xstrfmt("%s/%s", base_dir, def_in);
|
||||
}
|
||||
|
||||
const char *repo_get_git_dir(struct repository *repo)
|
||||
{
|
||||
if (!repo->gitdir)
|
||||
BUG("repository hasn't been set up");
|
||||
return repo->gitdir;
|
||||
}
|
||||
|
||||
const char *repo_get_common_dir(struct repository *repo)
|
||||
{
|
||||
if (!repo->commondir)
|
||||
BUG("repository hasn't been set up");
|
||||
return repo->commondir;
|
||||
}
|
||||
|
||||
const char *repo_get_object_directory(struct repository *repo)
|
||||
{
|
||||
if (!repo->objects->odb)
|
||||
BUG("repository hasn't been set up");
|
||||
return repo->objects->odb->path;
|
||||
}
|
||||
|
||||
const char *repo_get_index_file(struct repository *repo)
|
||||
{
|
||||
if (!repo->index_file)
|
||||
BUG("repository hasn't been set up");
|
||||
return repo->index_file;
|
||||
}
|
||||
|
||||
const char *repo_get_graft_file(struct repository *repo)
|
||||
{
|
||||
if (!repo->graft_file)
|
||||
BUG("repository hasn't been set up");
|
||||
return repo->graft_file;
|
||||
}
|
||||
|
||||
const char *repo_get_work_tree(struct repository *repo)
|
||||
{
|
||||
return repo->worktree;
|
||||
}
|
||||
|
||||
static void repo_set_commondir(struct repository *repo,
|
||||
const char *commondir)
|
||||
{
|
||||
|
58
repository.h
58
repository.h
@ -2,9 +2,9 @@
|
||||
#define REPOSITORY_H
|
||||
|
||||
#include "strmap.h"
|
||||
#include "repo-settings.h"
|
||||
|
||||
struct config_set;
|
||||
struct fsmonitor_settings;
|
||||
struct git_hash_algo;
|
||||
struct index_state;
|
||||
struct lock_file;
|
||||
@ -14,59 +14,12 @@ struct submodule_cache;
|
||||
struct promisor_remote_config;
|
||||
struct remote_state;
|
||||
|
||||
enum untracked_cache_setting {
|
||||
UNTRACKED_CACHE_KEEP,
|
||||
UNTRACKED_CACHE_REMOVE,
|
||||
UNTRACKED_CACHE_WRITE,
|
||||
};
|
||||
|
||||
enum fetch_negotiation_setting {
|
||||
FETCH_NEGOTIATION_CONSECUTIVE,
|
||||
FETCH_NEGOTIATION_SKIPPING,
|
||||
FETCH_NEGOTIATION_NOOP,
|
||||
};
|
||||
|
||||
enum ref_storage_format {
|
||||
REF_STORAGE_FORMAT_UNKNOWN,
|
||||
REF_STORAGE_FORMAT_FILES,
|
||||
REF_STORAGE_FORMAT_REFTABLE,
|
||||
};
|
||||
|
||||
struct repo_settings {
|
||||
int initialized;
|
||||
|
||||
int core_commit_graph;
|
||||
int commit_graph_generation_version;
|
||||
int commit_graph_changed_paths_version;
|
||||
int gc_write_commit_graph;
|
||||
int fetch_write_commit_graph;
|
||||
int command_requires_full_index;
|
||||
int sparse_index;
|
||||
int pack_read_reverse_index;
|
||||
int pack_use_bitmap_boundary_traversal;
|
||||
int pack_use_multi_pack_reuse;
|
||||
|
||||
/*
|
||||
* Does this repository have core.useReplaceRefs=true (on by
|
||||
* default)? This provides a repository-scoped version of this
|
||||
* config, though it could be disabled process-wide via some Git
|
||||
* builtins or the --no-replace-objects option. See
|
||||
* replace_refs_enabled() for more details.
|
||||
*/
|
||||
int read_replace_refs;
|
||||
|
||||
struct fsmonitor_settings *fsmonitor; /* lazily loaded */
|
||||
|
||||
int index_version;
|
||||
int index_skip_hash;
|
||||
enum untracked_cache_setting core_untracked_cache;
|
||||
|
||||
int pack_use_sparse;
|
||||
enum fetch_negotiation_setting fetch_negotiation_algorithm;
|
||||
|
||||
int core_multi_pack_index;
|
||||
};
|
||||
|
||||
struct repo_path_cache {
|
||||
char *squash_msg;
|
||||
char *merge_msg;
|
||||
@ -206,6 +159,13 @@ struct repository {
|
||||
extern struct repository *the_repository;
|
||||
#endif
|
||||
|
||||
const char *repo_get_git_dir(struct repository *repo);
|
||||
const char *repo_get_common_dir(struct repository *repo);
|
||||
const char *repo_get_object_directory(struct repository *repo);
|
||||
const char *repo_get_index_file(struct repository *repo);
|
||||
const char *repo_get_graft_file(struct repository *repo);
|
||||
const char *repo_get_work_tree(struct repository *repo);
|
||||
|
||||
/*
|
||||
* Define a custom repository layout. Any field can be NULL, which
|
||||
* will default back to the path according to the default layout.
|
||||
@ -266,8 +226,6 @@ int repo_read_index_unmerged(struct repository *);
|
||||
*/
|
||||
void repo_update_index_if_able(struct repository *, struct lock_file *);
|
||||
|
||||
void prepare_repo_settings(struct repository *r);
|
||||
|
||||
/*
|
||||
* Return 1 if upgrade repository format to target_version succeeded,
|
||||
* 0 if no upgrade is necessary, and -1 when upgrade is not possible.
|
||||
|
@ -2,7 +2,6 @@
|
||||
|
||||
#include "git-compat-util.h"
|
||||
#include "dir.h"
|
||||
#include "environment.h"
|
||||
#include "hex.h"
|
||||
#include "repository.h"
|
||||
#include "refs.h"
|
||||
@ -342,7 +341,8 @@ static int write_pack_info_file(struct update_info_ctx *uic)
|
||||
|
||||
static int update_info_packs(int force)
|
||||
{
|
||||
char *infofile = mkpathdup("%s/info/packs", get_object_directory());
|
||||
char *infofile = mkpathdup("%s/info/packs",
|
||||
repo_get_object_directory(the_repository));
|
||||
int ret;
|
||||
|
||||
init_pack_info(infofile, force);
|
||||
|
140
setup.c
140
setup.c
@ -7,16 +7,22 @@
|
||||
#include "exec-cmd.h"
|
||||
#include "gettext.h"
|
||||
#include "hex.h"
|
||||
#include "object-file.h"
|
||||
#include "object-name.h"
|
||||
#include "refs.h"
|
||||
#include "replace-object.h"
|
||||
#include "repository.h"
|
||||
#include "config.h"
|
||||
#include "dir.h"
|
||||
#include "setup.h"
|
||||
#include "shallow.h"
|
||||
#include "string-list.h"
|
||||
#include "strvec.h"
|
||||
#include "chdir-notify.h"
|
||||
#include "path.h"
|
||||
#include "quote.h"
|
||||
#include "tmp-objdir.h"
|
||||
#include "trace.h"
|
||||
#include "trace2.h"
|
||||
#include "worktree.h"
|
||||
#include "exec-cmd.h"
|
||||
@ -51,7 +57,7 @@ static int abspath_part_inside_repo(char *path)
|
||||
size_t wtlen;
|
||||
char *path0;
|
||||
int off;
|
||||
const char *work_tree = precompose_string_if_needed(get_git_work_tree());
|
||||
const char *work_tree = precompose_string_if_needed(repo_get_work_tree(the_repository));
|
||||
struct strbuf realpath = STRBUF_INIT;
|
||||
|
||||
if (!work_tree)
|
||||
@ -147,9 +153,9 @@ char *prefix_path(const char *prefix, int len, const char *path)
|
||||
{
|
||||
char *r = prefix_path_gently(prefix, len, NULL, path);
|
||||
if (!r) {
|
||||
const char *hint_path = get_git_work_tree();
|
||||
const char *hint_path = repo_get_work_tree(the_repository);
|
||||
if (!hint_path)
|
||||
hint_path = get_git_dir();
|
||||
hint_path = repo_get_git_dir(the_repository);
|
||||
die(_("'%s' is outside repository at '%s'"), path,
|
||||
absolute_path(hint_path));
|
||||
}
|
||||
@ -468,14 +474,14 @@ int is_nonbare_repository_dir(struct strbuf *path)
|
||||
int is_inside_git_dir(void)
|
||||
{
|
||||
if (inside_git_dir < 0)
|
||||
inside_git_dir = is_inside_dir(get_git_dir());
|
||||
inside_git_dir = is_inside_dir(repo_get_git_dir(the_repository));
|
||||
return inside_git_dir;
|
||||
}
|
||||
|
||||
int is_inside_work_tree(void)
|
||||
{
|
||||
if (inside_work_tree < 0)
|
||||
inside_work_tree = is_inside_dir(get_git_work_tree());
|
||||
inside_work_tree = is_inside_dir(repo_get_work_tree(the_repository));
|
||||
return inside_work_tree;
|
||||
}
|
||||
|
||||
@ -490,7 +496,7 @@ void setup_work_tree(void)
|
||||
if (work_tree_config_is_bogus)
|
||||
die(_("unable to set up work tree using invalid config"));
|
||||
|
||||
work_tree = get_git_work_tree();
|
||||
work_tree = repo_get_work_tree(the_repository);
|
||||
if (!work_tree || chdir_notify(work_tree))
|
||||
die(_("this operation must be run in a work tree"));
|
||||
|
||||
@ -547,7 +553,7 @@ static void setup_original_cwd(void)
|
||||
* Get our worktree; we only protect the current working directory
|
||||
* if it's in the worktree.
|
||||
*/
|
||||
worktree = get_git_work_tree();
|
||||
worktree = repo_get_work_tree(the_repository);
|
||||
if (!worktree)
|
||||
goto no_prevention_needed;
|
||||
|
||||
@ -1062,9 +1068,9 @@ static const char *setup_explicit_git_dir(const char *gitdirenv,
|
||||
set_git_work_tree(".");
|
||||
|
||||
/* set_git_work_tree() must have been called by now */
|
||||
worktree = get_git_work_tree();
|
||||
worktree = repo_get_work_tree(the_repository);
|
||||
|
||||
/* both get_git_work_tree() and cwd are already normalized */
|
||||
/* both repo_get_work_tree() and cwd are already normalized */
|
||||
if (!strcmp(cwd->buf, worktree)) { /* cwd == worktree */
|
||||
set_git_dir(gitdirenv, 0);
|
||||
free(gitfile);
|
||||
@ -1613,6 +1619,106 @@ enum discovery_result discover_git_directory_reason(struct strbuf *commondir,
|
||||
return result;
|
||||
}
|
||||
|
||||
void setup_git_env(const char *git_dir)
|
||||
{
|
||||
char *git_replace_ref_base;
|
||||
const char *shallow_file;
|
||||
const char *replace_ref_base;
|
||||
struct set_gitdir_args args = { NULL };
|
||||
struct strvec to_free = STRVEC_INIT;
|
||||
|
||||
args.commondir = getenv_safe(&to_free, GIT_COMMON_DIR_ENVIRONMENT);
|
||||
args.object_dir = getenv_safe(&to_free, DB_ENVIRONMENT);
|
||||
args.graft_file = getenv_safe(&to_free, GRAFT_ENVIRONMENT);
|
||||
args.index_file = getenv_safe(&to_free, INDEX_ENVIRONMENT);
|
||||
args.alternate_db = getenv_safe(&to_free, ALTERNATE_DB_ENVIRONMENT);
|
||||
if (getenv(GIT_QUARANTINE_ENVIRONMENT)) {
|
||||
args.disable_ref_updates = 1;
|
||||
}
|
||||
|
||||
repo_set_gitdir(the_repository, git_dir, &args);
|
||||
strvec_clear(&to_free);
|
||||
|
||||
if (getenv(NO_REPLACE_OBJECTS_ENVIRONMENT))
|
||||
disable_replace_refs();
|
||||
replace_ref_base = getenv(GIT_REPLACE_REF_BASE_ENVIRONMENT);
|
||||
git_replace_ref_base = xstrdup(replace_ref_base ? replace_ref_base
|
||||
: "refs/replace/");
|
||||
update_ref_namespace(NAMESPACE_REPLACE, git_replace_ref_base);
|
||||
|
||||
shallow_file = getenv(GIT_SHALLOW_FILE_ENVIRONMENT);
|
||||
if (shallow_file)
|
||||
set_alternate_shallow_file(the_repository, shallow_file, 0);
|
||||
|
||||
if (git_env_bool(NO_LAZY_FETCH_ENVIRONMENT, 0))
|
||||
fetch_if_missing = 0;
|
||||
}
|
||||
|
||||
static void set_git_dir_1(const char *path)
|
||||
{
|
||||
xsetenv(GIT_DIR_ENVIRONMENT, path, 1);
|
||||
setup_git_env(path);
|
||||
}
|
||||
|
||||
static void update_relative_gitdir(const char *name UNUSED,
|
||||
const char *old_cwd,
|
||||
const char *new_cwd,
|
||||
void *data UNUSED)
|
||||
{
|
||||
char *path = reparent_relative_path(old_cwd, new_cwd,
|
||||
repo_get_git_dir(the_repository));
|
||||
struct tmp_objdir *tmp_objdir = tmp_objdir_unapply_primary_odb();
|
||||
|
||||
trace_printf_key(&trace_setup_key,
|
||||
"setup: move $GIT_DIR to '%s'",
|
||||
path);
|
||||
set_git_dir_1(path);
|
||||
if (tmp_objdir)
|
||||
tmp_objdir_reapply_primary_odb(tmp_objdir, old_cwd, new_cwd);
|
||||
free(path);
|
||||
}
|
||||
|
||||
void set_git_dir(const char *path, int make_realpath)
|
||||
{
|
||||
struct strbuf realpath = STRBUF_INIT;
|
||||
|
||||
if (make_realpath) {
|
||||
strbuf_realpath(&realpath, path, 1);
|
||||
path = realpath.buf;
|
||||
}
|
||||
|
||||
set_git_dir_1(path);
|
||||
if (!is_absolute_path(path))
|
||||
chdir_notify_register(NULL, update_relative_gitdir, NULL);
|
||||
|
||||
strbuf_release(&realpath);
|
||||
}
|
||||
|
||||
static int git_work_tree_initialized;
|
||||
|
||||
/*
|
||||
* Note. This works only before you used a work tree. This was added
|
||||
* primarily to support git-clone to work in a new repository it just
|
||||
* created, and is not meant to flip between different work trees.
|
||||
*/
|
||||
void set_git_work_tree(const char *new_work_tree)
|
||||
{
|
||||
if (git_work_tree_initialized) {
|
||||
struct strbuf realpath = STRBUF_INIT;
|
||||
|
||||
strbuf_realpath(&realpath, new_work_tree, 1);
|
||||
new_work_tree = realpath.buf;
|
||||
if (strcmp(new_work_tree, the_repository->worktree))
|
||||
die("internal error: work tree has already been set\n"
|
||||
"Current worktree: %s\nNew worktree: %s",
|
||||
the_repository->worktree, new_work_tree);
|
||||
strbuf_release(&realpath);
|
||||
return;
|
||||
}
|
||||
git_work_tree_initialized = 1;
|
||||
repo_set_worktree(the_repository, new_work_tree);
|
||||
}
|
||||
|
||||
const char *setup_git_directory_gently(int *nongit_ok)
|
||||
{
|
||||
static struct strbuf cwd = STRBUF_INIT;
|
||||
@ -1836,7 +1942,7 @@ void check_repository_format(struct repository_format *fmt)
|
||||
struct repository_format repo_fmt = REPOSITORY_FORMAT_INIT;
|
||||
if (!fmt)
|
||||
fmt = &repo_fmt;
|
||||
check_repository_format_gently(get_git_dir(), fmt, NULL);
|
||||
check_repository_format_gently(repo_get_git_dir(the_repository), fmt, NULL);
|
||||
startup_info->have_repository = 1;
|
||||
repo_set_hash_algo(the_repository, fmt->hash_algo);
|
||||
repo_set_compat_hash_algo(the_repository, fmt->compat_hash_algo);
|
||||
@ -2068,7 +2174,7 @@ static void copy_templates(const char *option_template)
|
||||
goto close_free_return;
|
||||
}
|
||||
|
||||
strbuf_addstr(&path, get_git_common_dir());
|
||||
strbuf_addstr(&path, repo_get_common_dir(the_repository));
|
||||
strbuf_complete(&path, '/');
|
||||
copy_templates_1(&path, &template_path, dir);
|
||||
close_free_return:
|
||||
@ -2192,7 +2298,7 @@ static int create_default_files(const char *template_path,
|
||||
char *path;
|
||||
int reinit;
|
||||
int filemode;
|
||||
const char *work_tree = get_git_work_tree();
|
||||
const char *work_tree = repo_get_work_tree(the_repository);
|
||||
|
||||
/*
|
||||
* First copy the templates -- we might have the default
|
||||
@ -2224,7 +2330,7 @@ static int create_default_files(const char *template_path,
|
||||
* shared-repository settings, we would need to fix them up.
|
||||
*/
|
||||
if (get_shared_repository()) {
|
||||
adjust_shared_perm(get_git_dir());
|
||||
adjust_shared_perm(repo_get_git_dir(the_repository));
|
||||
}
|
||||
|
||||
initialize_repository_version(fmt->hash_algo, fmt->ref_storage_format, 0);
|
||||
@ -2248,7 +2354,7 @@ static int create_default_files(const char *template_path,
|
||||
else {
|
||||
git_config_set("core.bare", "false");
|
||||
/* allow template config file to override the default */
|
||||
if (log_all_ref_updates == LOG_REFS_UNSET)
|
||||
if (repo_settings_get_log_all_ref_updates(the_repository) == LOG_REFS_UNSET)
|
||||
git_config_set("core.logallrefupdates", "true");
|
||||
if (needs_work_tree_config(original_git_dir, work_tree))
|
||||
git_config_set("core.worktree", work_tree);
|
||||
@ -2282,7 +2388,7 @@ static void create_object_directory(void)
|
||||
struct strbuf path = STRBUF_INIT;
|
||||
size_t baselen;
|
||||
|
||||
strbuf_addstr(&path, get_object_directory());
|
||||
strbuf_addstr(&path, repo_get_object_directory(the_repository));
|
||||
baselen = path.len;
|
||||
|
||||
safe_create_dir(path.buf, 1);
|
||||
@ -2434,12 +2540,12 @@ int init_db(const char *git_dir, const char *real_git_dir,
|
||||
die(_("%s already exists"), real_git_dir);
|
||||
|
||||
set_git_dir(real_git_dir, 1);
|
||||
git_dir = get_git_dir();
|
||||
git_dir = repo_get_git_dir(the_repository);
|
||||
separate_git_dir(git_dir, original_git_dir);
|
||||
}
|
||||
else {
|
||||
set_git_dir(git_dir, 1);
|
||||
git_dir = get_git_dir();
|
||||
git_dir = repo_get_git_dir(the_repository);
|
||||
}
|
||||
startup_info->have_repository = 1;
|
||||
|
||||
|
5
setup.h
5
setup.h
@ -94,6 +94,9 @@ static inline int discover_git_directory(struct strbuf *commondir,
|
||||
return 0;
|
||||
}
|
||||
|
||||
void set_git_dir(const char *path, int make_realpath);
|
||||
void set_git_work_tree(const char *tree);
|
||||
|
||||
const char *setup_git_directory_gently(int *);
|
||||
const char *setup_git_directory(void);
|
||||
char *prefix_path(const char *prefix, int len, const char *path);
|
||||
@ -176,7 +179,7 @@ int verify_repository_format(const struct repository_format *format,
|
||||
struct strbuf *err);
|
||||
|
||||
/*
|
||||
* Check the repository format version in the path found in get_git_dir(),
|
||||
* Check the repository format version in the path found in repo_get_git_dir(the_repository),
|
||||
* and die if it is a version we don't understand. Generally one would
|
||||
* set_git_dir() before calling this, and use it only for "are we in a valid
|
||||
* repo?".
|
||||
|
@ -1,3 +1,5 @@
|
||||
#define USE_THE_REPOSITORY_VARIABLE
|
||||
|
||||
#include "git-compat-util.h"
|
||||
#include "environment.h"
|
||||
#include "gettext.h"
|
||||
|
@ -1,3 +1,5 @@
|
||||
#define USE_THE_REPOSITORY_VARIABLE
|
||||
|
||||
#include "git-compat-util.h"
|
||||
#include "environment.h"
|
||||
#include "statinfo.h"
|
||||
|
@ -2464,7 +2464,7 @@ void absorb_git_dir_into_superproject(const char *path,
|
||||
} else {
|
||||
/* Is it already absorbed into the superprojects git dir? */
|
||||
char *real_sub_git_dir = real_pathdup(sub_git_dir, 1);
|
||||
char *real_common_git_dir = real_pathdup(get_git_common_dir(), 1);
|
||||
char *real_common_git_dir = real_pathdup(repo_get_common_dir(the_repository), 1);
|
||||
|
||||
if (!starts_with(real_sub_git_dir, real_common_git_dir))
|
||||
relocate_single_git_dir_into_superproject(path, super_prefix);
|
||||
|
@ -96,7 +96,8 @@ int cmd__config(int argc, const char **argv)
|
||||
struct config_set cs;
|
||||
|
||||
if (argc == 3 && !strcmp(argv[1], "read_early_config")) {
|
||||
read_early_config(early_config_cb, (void *)argv[2]);
|
||||
read_early_config(the_repository, early_config_cb,
|
||||
(void *)argv[2]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1,3 +1,5 @@
|
||||
#define USE_THE_REPOSITORY_VARIABLE
|
||||
|
||||
#include "test-tool.h"
|
||||
#include "abspath.h"
|
||||
#include "environment.h"
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include "strvec.h"
|
||||
#include "quote.h"
|
||||
#include "object-store-ll.h"
|
||||
#include "repository.h"
|
||||
|
||||
struct tmp_objdir {
|
||||
struct strbuf path;
|
||||
@ -132,7 +133,8 @@ struct tmp_objdir *tmp_objdir_create(const char *prefix)
|
||||
* can recognize any stale objdirs left behind by a crash and delete
|
||||
* them.
|
||||
*/
|
||||
strbuf_addf(&t->path, "%s/tmp_objdir-%s-XXXXXX", get_object_directory(), prefix);
|
||||
strbuf_addf(&t->path, "%s/tmp_objdir-%s-XXXXXX",
|
||||
repo_get_object_directory(the_repository), prefix);
|
||||
|
||||
if (!mkdtemp(t->path.buf)) {
|
||||
/* free, not destroy, as we never touched the filesystem */
|
||||
@ -152,7 +154,7 @@ struct tmp_objdir *tmp_objdir_create(const char *prefix)
|
||||
}
|
||||
|
||||
env_append(&t->env, ALTERNATE_DB_ENVIRONMENT,
|
||||
absolute_path(get_object_directory()));
|
||||
absolute_path(repo_get_object_directory(the_repository)));
|
||||
env_replace(&t->env, DB_ENVIRONMENT, absolute_path(t->path.buf));
|
||||
env_replace(&t->env, GIT_QUARANTINE_ENVIRONMENT,
|
||||
absolute_path(t->path.buf));
|
||||
@ -267,7 +269,7 @@ int tmp_objdir_migrate(struct tmp_objdir *t)
|
||||
}
|
||||
|
||||
strbuf_addbuf(&src, &t->path);
|
||||
strbuf_addstr(&dst, get_object_directory());
|
||||
strbuf_addstr(&dst, repo_get_object_directory(the_repository));
|
||||
|
||||
ret = migrate_paths(&src, &dst);
|
||||
|
||||
|
10
trace.c
10
trace.c
@ -21,9 +21,11 @@
|
||||
* along with this program; if not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#define USE_THE_REPOSITORY_VARIABLE
|
||||
|
||||
#include "git-compat-util.h"
|
||||
#include "abspath.h"
|
||||
#include "environment.h"
|
||||
#include "repository.h"
|
||||
#include "quote.h"
|
||||
#include "setup.h"
|
||||
#include "trace.h"
|
||||
@ -305,14 +307,14 @@ void trace_repo_setup(void)
|
||||
|
||||
cwd = xgetcwd();
|
||||
|
||||
if (!(git_work_tree = get_git_work_tree()))
|
||||
if (!(git_work_tree = repo_get_work_tree(the_repository)))
|
||||
git_work_tree = "(null)";
|
||||
|
||||
if (!startup_info->prefix)
|
||||
prefix = "(null)";
|
||||
|
||||
trace_printf_key(&trace_setup_key, "setup: git_dir: %s\n", quote_crnl(get_git_dir()));
|
||||
trace_printf_key(&trace_setup_key, "setup: git_common_dir: %s\n", quote_crnl(get_git_common_dir()));
|
||||
trace_printf_key(&trace_setup_key, "setup: git_dir: %s\n", quote_crnl(repo_get_git_dir(the_repository)));
|
||||
trace_printf_key(&trace_setup_key, "setup: git_common_dir: %s\n", quote_crnl(repo_get_common_dir(the_repository)));
|
||||
trace_printf_key(&trace_setup_key, "setup: worktree: %s\n", quote_crnl(git_work_tree));
|
||||
trace_printf_key(&trace_setup_key, "setup: cwd: %s\n", quote_crnl(cwd));
|
||||
trace_printf_key(&trace_setup_key, "setup: prefix: %s\n", quote_crnl(prefix));
|
||||
|
@ -1,3 +1,5 @@
|
||||
#define USE_THE_REPOSITORY_VARIABLE
|
||||
|
||||
#include "git-compat-util.h"
|
||||
#include "config.h"
|
||||
#include "strbuf.h"
|
||||
@ -124,7 +126,7 @@ void tr2_cfg_list_config_fl(const char *file, int line)
|
||||
struct tr2_cfg_data data = { file, line };
|
||||
|
||||
if (tr2_cfg_load_patterns() > 0)
|
||||
read_early_config(tr2_cfg_cb, &data);
|
||||
read_early_config(the_repository, tr2_cfg_cb, &data);
|
||||
}
|
||||
|
||||
void tr2_list_env_vars_fl(const char *file, int line)
|
||||
|
@ -143,7 +143,7 @@ static struct child_process *get_helper(struct transport *transport)
|
||||
|
||||
if (have_git_dir())
|
||||
strvec_pushf(&helper->env, "%s=%s",
|
||||
GIT_DIR_ENVIRONMENT, get_git_dir());
|
||||
GIT_DIR_ENVIRONMENT, repo_get_git_dir(the_repository));
|
||||
|
||||
helper->trace2_child_class = helper->args.v[0]; /* "remote-<name>" */
|
||||
|
||||
|
@ -1,6 +1,9 @@
|
||||
/*
|
||||
* Helper functions for tree diff generation
|
||||
*/
|
||||
|
||||
#define USE_THE_REPOSITORY_VARIABLE
|
||||
|
||||
#include "git-compat-util.h"
|
||||
#include "diff.h"
|
||||
#include "diffcore.h"
|
||||
|
@ -1,3 +1,5 @@
|
||||
#define USE_THE_REPOSITORY_VARIABLE
|
||||
|
||||
#include "git-compat-util.h"
|
||||
#include "config.h"
|
||||
#include "userdiff.h"
|
||||
|
12
worktree.c
12
worktree.c
@ -57,7 +57,7 @@ static void add_head_info(struct worktree *wt)
|
||||
|
||||
static int is_current_worktree(struct worktree *wt)
|
||||
{
|
||||
char *git_dir = absolute_pathdup(get_git_dir());
|
||||
char *git_dir = absolute_pathdup(repo_get_git_dir(the_repository));
|
||||
const char *wt_git_dir = get_worktree_git_dir(wt);
|
||||
int is_current = !fspathcmp(git_dir, absolute_path(wt_git_dir));
|
||||
free(git_dir);
|
||||
@ -72,7 +72,7 @@ static struct worktree *get_main_worktree(int skip_reading_head)
|
||||
struct worktree *worktree = NULL;
|
||||
struct strbuf worktree_path = STRBUF_INIT;
|
||||
|
||||
strbuf_add_real_path(&worktree_path, get_git_common_dir());
|
||||
strbuf_add_real_path(&worktree_path, repo_get_common_dir(the_repository));
|
||||
strbuf_strip_suffix(&worktree_path, "/.git");
|
||||
|
||||
CALLOC_ARRAY(worktree, 1);
|
||||
@ -143,7 +143,7 @@ static struct worktree **get_worktrees_internal(int skip_reading_head)
|
||||
|
||||
list[counter++] = get_main_worktree(skip_reading_head);
|
||||
|
||||
strbuf_addf(&path, "%s/worktrees", get_git_common_dir());
|
||||
strbuf_addf(&path, "%s/worktrees", repo_get_common_dir(the_repository));
|
||||
dir = opendir(path.buf);
|
||||
strbuf_release(&path);
|
||||
if (dir) {
|
||||
@ -171,9 +171,9 @@ struct worktree **get_worktrees(void)
|
||||
const char *get_worktree_git_dir(const struct worktree *wt)
|
||||
{
|
||||
if (!wt)
|
||||
return get_git_dir();
|
||||
return repo_get_git_dir(the_repository);
|
||||
else if (!wt->id)
|
||||
return get_git_common_dir();
|
||||
return repo_get_common_dir(the_repository);
|
||||
else
|
||||
return git_common_path("worktrees/%s", wt->id);
|
||||
}
|
||||
@ -626,7 +626,7 @@ static int is_main_worktree_path(const char *path)
|
||||
|
||||
strbuf_add_real_path(&target, path);
|
||||
strbuf_strip_suffix(&target, "/.git");
|
||||
strbuf_add_real_path(&maindir, get_git_common_dir());
|
||||
strbuf_add_real_path(&maindir, repo_get_common_dir(the_repository));
|
||||
strbuf_strip_suffix(&maindir, "/.git");
|
||||
cmp = fspathcmp(maindir.buf, target.buf);
|
||||
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include "revision.h"
|
||||
#include "diffcore.h"
|
||||
#include "quote.h"
|
||||
#include "repository.h"
|
||||
#include "run-command.h"
|
||||
#include "strvec.h"
|
||||
#include "remote.h"
|
||||
@ -152,7 +153,7 @@ void wt_status_prepare(struct repository *r, struct wt_status *s)
|
||||
"HEAD", 0, NULL, NULL);
|
||||
s->reference = "HEAD";
|
||||
s->fp = stdout;
|
||||
s->index_file = get_index_file();
|
||||
s->index_file = repo_get_index_file(the_repository);
|
||||
s->change.strdup_strings = 1;
|
||||
s->untracked.strdup_strings = 1;
|
||||
s->ignored.strdup_strings = 1;
|
||||
|
Loading…
Reference in New Issue
Block a user