From 0f7443bdc7284ad36e5d0cd8b2526e2123b8aa4f Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Tue, 16 May 2023 06:33:41 +0000 Subject: [PATCH 01/28] init-db: document existing bug with core.bare in template config The comments in create_default_files() talks about reading config from the config file in the specified `--templates` directory, which leads to the question of whether core.bare could be set in such a config file and thus whether the code is doing the right thing. It turns out, that it doesn't; it unconditionally ignores core.bare in the config file in any --templates directory. It is not clear to me that fixing it can be done within this function; it seems to occur too late: * create_default_files() is called by init_db() * init_db() is called by both builtin/{clone.c,init-db.c} * both callers of init_db() call set_git_work_tree() before init_db() and in order to actual affect whether a repository is bear, we'd need to somewhere reset these values, not just the is_bare_repository_cfg setting. I do not want to open this can of worms at this time; I'm trying to clean up some headers, for which I need to move some functions, for which I need to clean up some globals, and that's far enough down the rabbit hole. So, simply document the issue with a careful TODO comment and a few testcases. Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- builtin/init-db.c | 29 ++++++++++++++++++++++++++++- t/t1301-shared-repo.sh | 22 ++++++++++++++++++++++ t/t5606-clone-options.sh | 10 ++++++++++ 3 files changed, 60 insertions(+), 1 deletion(-) diff --git a/builtin/init-db.c b/builtin/init-db.c index aef4036105..87a7021c3c 100644 --- a/builtin/init-db.c +++ b/builtin/init-db.c @@ -231,9 +231,36 @@ static int create_default_files(const char *template_path, * We must make sure command-line options continue to override any * values we might have just re-read from the config. */ - is_bare_repository_cfg = init_is_bare_repository || !work_tree; if (init_shared_repository != -1) set_shared_repository(init_shared_repository); + /* + * TODO: heed core.bare from config file in templates if no + * command-line override given + */ + is_bare_repository_cfg = init_is_bare_repository || !work_tree; + /* TODO (continued): + * + * Unfortunately, the line above is equivalent to + * is_bare_repository_cfg = !work_tree; + * which ignores the config entirely even if no `--[no-]bare` + * command line option was present. + * + * To see why, note that before this function, there was this call: + * init_is_bare_repository = is_bare_repository() + * expanding the right hand side: + * = is_bare_repository_cfg && !get_git_work_tree() + * = is_bare_repository_cfg && !work_tree + * note that the last simplification above is valid because nothing + * calls repo_init() or set_git_work_tree() between any of the + * relevant calls in the code, and thus the !get_git_work_tree() + * calls will return the same result each time. So, what we are + * interested in computing is the right hand side of the line of + * code just above this comment: + * init_is_bare_repository || !work_tree + * = is_bare_repository_cfg && !work_tree || !work_tree + * = !work_tree + * because "A && !B || !B == !B" for all boolean values of A & B. + */ /* * We would have created the above under user's umask -- under diff --git a/t/t1301-shared-repo.sh b/t/t1301-shared-repo.sh index ae5cd3f5a0..e5a0d65caa 100755 --- a/t/t1301-shared-repo.sh +++ b/t/t1301-shared-repo.sh @@ -52,6 +52,28 @@ test_expect_success 'shared=all' ' test 2 = $(git config core.sharedrepository) ' +test_expect_failure 'template can set core.bare' ' + test_when_finished "rm -rf subdir" && + test_when_finished "rm -rf templates" && + test_config core.bare true && + umask 0022 && + mkdir -p templates/ && + cp .git/config templates/config && + git init --template=templates subdir && + test_path_exists subdir/HEAD +' + +test_expect_success 'template can set core.bare but overridden by command line' ' + test_when_finished "rm -rf subdir" && + test_when_finished "rm -rf templates" && + test_config core.bare true && + umask 0022 && + mkdir -p templates/ && + cp .git/config templates/config && + git init --no-bare --template=templates subdir && + test_path_exists subdir/.git/HEAD +' + test_expect_success POSIXPERM 'update-server-info honors core.sharedRepository' ' : > a1 && git add a1 && diff --git a/t/t5606-clone-options.sh b/t/t5606-clone-options.sh index 27f9f77638..5890319b97 100755 --- a/t/t5606-clone-options.sh +++ b/t/t5606-clone-options.sh @@ -120,6 +120,16 @@ test_expect_success 'prefers -c config over --template config' ' ' +test_expect_failure 'prefers --template config even for core.bare' ' + + template="$TRASH_DIRECTORY/template-with-bare-config" && + mkdir "$template" && + git config --file "$template/config" core.bare true && + git clone "--template=$template" parent clone-bare-config && + test "$(git -C clone-bare-config config --local core.bare)" = "true" && + test_path_is_file clone-bare-config/HEAD +' + test_expect_success 'prefers config "clone.defaultRemoteName" over default' ' test_config_global clone.defaultRemoteName from_config && From c2f76965d0202a894c9491e0647b7834b58cd168 Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Tue, 16 May 2023 06:33:42 +0000 Subject: [PATCH 02/28] init-db: remove unnecessary global variable This commit was prompted by a desire to move the functions which builtin/init-db.c and builtin/clone.c share out of the former file and into setup.c. One issue that made it difficult was the init_is_bare_repository global variable. init_is_bare_repository's sole use in life it to cache a value in init_db(), and then be used in create_default_files(). This is a bit odd since init_db() directly calls create_default_files(), and is the only caller of that function. Convert the global to a simple function parameter instead. (Of course, this doesn't fix the fact that this value is then ignored by create_default_files(), as noted in a big TODO comment in that function, but it at least includes no behavioral change other than getting rid of a very questionable global variable.) Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- builtin/init-db.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/builtin/init-db.c b/builtin/init-db.c index 87a7021c3c..32ab0a13e0 100644 --- a/builtin/init-db.c +++ b/builtin/init-db.c @@ -31,7 +31,6 @@ #define GIT_DEFAULT_HASH_ENVIRONMENT "GIT_DEFAULT_HASH" -static int init_is_bare_repository = 0; static int init_shared_repository = -1; static void copy_templates_1(struct strbuf *path, struct strbuf *template_path, @@ -199,6 +198,7 @@ static int create_default_files(const char *template_path, const char *original_git_dir, const char *initial_branch, const struct repository_format *fmt, + int prev_bare_repository, int quiet) { struct stat st1; @@ -237,7 +237,7 @@ static int create_default_files(const char *template_path, * TODO: heed core.bare from config file in templates if no * command-line override given */ - is_bare_repository_cfg = init_is_bare_repository || !work_tree; + is_bare_repository_cfg = prev_bare_repository || !work_tree; /* TODO (continued): * * Unfortunately, the line above is equivalent to @@ -246,7 +246,7 @@ static int create_default_files(const char *template_path, * command line option was present. * * To see why, note that before this function, there was this call: - * init_is_bare_repository = is_bare_repository() + * prev_bare_repository = is_bare_repository() * expanding the right hand side: * = is_bare_repository_cfg && !get_git_work_tree() * = is_bare_repository_cfg && !work_tree @@ -256,7 +256,7 @@ static int create_default_files(const char *template_path, * calls will return the same result each time. So, what we are * interested in computing is the right hand side of the line of * code just above this comment: - * init_is_bare_repository || !work_tree + * prev_bare_repository || !work_tree * = is_bare_repository_cfg && !work_tree || !work_tree * = !work_tree * because "A && !B || !B == !B" for all boolean values of A & B. @@ -424,6 +424,7 @@ int init_db(const char *git_dir, const char *real_git_dir, int exist_ok = flags & INIT_DB_EXIST_OK; char *original_git_dir = real_pathdup(git_dir, 1); struct repository_format repo_fmt = REPOSITORY_FORMAT_INIT; + int prev_bare_repository; if (real_git_dir) { struct stat st; @@ -449,7 +450,7 @@ int init_db(const char *git_dir, const char *real_git_dir, safe_create_dir(git_dir, 0); - init_is_bare_repository = is_bare_repository(); + prev_bare_repository = is_bare_repository(); /* Check to see if the repository version is right. * Note that a newly created repository does not have @@ -462,6 +463,7 @@ int init_db(const char *git_dir, const char *real_git_dir, reinit = create_default_files(template_dir, original_git_dir, initial_branch, &repo_fmt, + prev_bare_repository, flags & INIT_DB_QUIET); if (reinit && initial_branch) warning(_("re-init: ignored --initial-branch=%s"), From fc8173505703a08bea5c648f1ab286013c3fd730 Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Tue, 16 May 2023 06:33:43 +0000 Subject: [PATCH 03/28] init-db, clone: change unnecessary global into passed parameter Much like the parent commit, this commit was prompted by a desire to move the functions which builtin/init-db.c and builtin/clone.c share out of the former file and into setup.c. A secondary issue that made it difficult was the init_shared_repository global variable; replace it with a simple parameter that is passed to the relevant functions. Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- builtin/clone.c | 3 ++- builtin/init-db.c | 9 +++++---- cache.h | 3 ++- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/builtin/clone.c b/builtin/clone.c index 15f9912b4c..cc34c194f5 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -930,6 +930,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix) int submodule_progress; int filter_submodules = 0; int hash_algo; + const int do_not_override_repo_unix_permissions = -1; struct transport_ls_refs_options transport_ls_refs_options = TRANSPORT_LS_REFS_OPTIONS_INIT; @@ -1097,7 +1098,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix) } init_db(git_dir, real_git_dir, option_template, GIT_HASH_UNKNOWN, NULL, - INIT_DB_QUIET); + do_not_override_repo_unix_permissions, INIT_DB_QUIET); if (real_git_dir) { free((char *)git_dir); diff --git a/builtin/init-db.c b/builtin/init-db.c index 32ab0a13e0..ae0122534a 100644 --- a/builtin/init-db.c +++ b/builtin/init-db.c @@ -31,8 +31,6 @@ #define GIT_DEFAULT_HASH_ENVIRONMENT "GIT_DEFAULT_HASH" -static int init_shared_repository = -1; - static void copy_templates_1(struct strbuf *path, struct strbuf *template_path, DIR *dir) { @@ -199,6 +197,7 @@ static int create_default_files(const char *template_path, const char *initial_branch, const struct repository_format *fmt, int prev_bare_repository, + int init_shared_repository, int quiet) { struct stat st1; @@ -418,7 +417,7 @@ static void validate_hash_algorithm(struct repository_format *repo_fmt, int hash int init_db(const char *git_dir, const char *real_git_dir, const char *template_dir, int hash, const char *initial_branch, - unsigned int flags) + int init_shared_repository, unsigned int flags) { int reinit; int exist_ok = flags & INIT_DB_EXIST_OK; @@ -464,6 +463,7 @@ int init_db(const char *git_dir, const char *real_git_dir, reinit = create_default_files(template_dir, original_git_dir, initial_branch, &repo_fmt, prev_bare_repository, + init_shared_repository, flags & INIT_DB_QUIET); if (reinit && initial_branch) warning(_("re-init: ignored --initial-branch=%s"), @@ -575,6 +575,7 @@ int cmd_init_db(int argc, const char **argv, const char *prefix) const char *object_format = NULL; const char *initial_branch = NULL; int hash_algo = GIT_HASH_UNKNOWN; + int init_shared_repository = -1; const struct option init_db_options[] = { OPT_STRING(0, "template", &template_dir, N_("template-directory"), N_("directory from which templates will be used")), @@ -732,5 +733,5 @@ int cmd_init_db(int argc, const char **argv, const char *prefix) flags |= INIT_DB_EXIST_OK; return init_db(git_dir, real_git_dir, template_dir, hash_algo, - initial_branch, flags); + initial_branch, init_shared_repository, flags); } diff --git a/cache.h b/cache.h index bdedb87e83..2bc1cd77d9 100644 --- a/cache.h +++ b/cache.h @@ -327,7 +327,8 @@ extern struct index_state the_index; int init_db(const char *git_dir, const char *real_git_dir, const char *template_dir, int hash_algo, - const char *initial_branch, unsigned int flags); + const char *initial_branch, int init_shared_repository, + unsigned int flags); void initialize_repository_version(int hash_algo, int reinit); /* Initialize and use the cache information */ From e8cf8ef5075d7805846f0f7159f8d072b07e588e Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Tue, 16 May 2023 06:33:44 +0000 Subject: [PATCH 04/28] setup: adopt shared init-db & clone code The functions init_db() and initialize_repository_version() were shared by builtin/init-db.c and builtin/clone.c, and declared in cache.h. Move these functions, plus their several helpers only used by these functions, to setup.[ch]. Diff best viewed with `--color-moved`. Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- Makefile | 4 +- builtin/init-db.c | 496 ---------------------------------------------- cache.h | 9 - setup.c | 492 +++++++++++++++++++++++++++++++++++++++++++++ setup.h | 9 + 5 files changed, 503 insertions(+), 507 deletions(-) diff --git a/Makefile b/Makefile index e440728c24..b09c8165d0 100644 --- a/Makefile +++ b/Makefile @@ -2742,8 +2742,8 @@ exec-cmd.sp exec-cmd.s exec-cmd.o: EXTRA_CPPFLAGS = \ '-DBINDIR="$(bindir_relative_SQ)"' \ '-DFALLBACK_RUNTIME_PREFIX="$(prefix_SQ)"' -builtin/init-db.sp builtin/init-db.s builtin/init-db.o: GIT-PREFIX -builtin/init-db.sp builtin/init-db.s builtin/init-db.o: EXTRA_CPPFLAGS = \ +setup.sp setup.s setup.o: GIT-PREFIX +setup.sp setup.s setup.o: EXTRA_CPPFLAGS = \ -DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"' config.sp config.s config.o: GIT-PREFIX diff --git a/builtin/init-db.c b/builtin/init-db.c index ae0122534a..feb019a9de 100644 --- a/builtin/init-db.c +++ b/builtin/init-db.c @@ -6,511 +6,15 @@ #include "cache.h" #include "abspath.h" #include "config.h" -#include "copy.h" #include "environment.h" #include "gettext.h" -#include "refs.h" #include "builtin.h" -#include "exec-cmd.h" #include "object-file.h" #include "parse-options.h" #include "path.h" #include "setup.h" -#include "worktree.h" #include "wrapper.h" -#ifndef DEFAULT_GIT_TEMPLATE_DIR -#define DEFAULT_GIT_TEMPLATE_DIR "/usr/share/git-core/templates" -#endif - -#ifdef NO_TRUSTABLE_FILEMODE -#define TEST_FILEMODE 0 -#else -#define TEST_FILEMODE 1 -#endif - -#define GIT_DEFAULT_HASH_ENVIRONMENT "GIT_DEFAULT_HASH" - -static void copy_templates_1(struct strbuf *path, struct strbuf *template_path, - DIR *dir) -{ - size_t path_baselen = path->len; - size_t template_baselen = template_path->len; - struct dirent *de; - - /* Note: if ".git/hooks" file exists in the repository being - * re-initialized, /etc/core-git/templates/hooks/update would - * cause "git init" to fail here. I think this is sane but - * it means that the set of templates we ship by default, along - * with the way the namespace under .git/ is organized, should - * be really carefully chosen. - */ - safe_create_dir(path->buf, 1); - while ((de = readdir(dir)) != NULL) { - struct stat st_git, st_template; - int exists = 0; - - strbuf_setlen(path, path_baselen); - strbuf_setlen(template_path, template_baselen); - - if (de->d_name[0] == '.') - continue; - strbuf_addstr(path, de->d_name); - strbuf_addstr(template_path, de->d_name); - if (lstat(path->buf, &st_git)) { - if (errno != ENOENT) - die_errno(_("cannot stat '%s'"), path->buf); - } - else - exists = 1; - - if (lstat(template_path->buf, &st_template)) - die_errno(_("cannot stat template '%s'"), template_path->buf); - - if (S_ISDIR(st_template.st_mode)) { - DIR *subdir = opendir(template_path->buf); - if (!subdir) - die_errno(_("cannot opendir '%s'"), template_path->buf); - strbuf_addch(path, '/'); - strbuf_addch(template_path, '/'); - copy_templates_1(path, template_path, subdir); - closedir(subdir); - } - else if (exists) - continue; - else if (S_ISLNK(st_template.st_mode)) { - struct strbuf lnk = STRBUF_INIT; - if (strbuf_readlink(&lnk, template_path->buf, - st_template.st_size) < 0) - die_errno(_("cannot readlink '%s'"), template_path->buf); - if (symlink(lnk.buf, path->buf)) - die_errno(_("cannot symlink '%s' '%s'"), - lnk.buf, path->buf); - strbuf_release(&lnk); - } - else if (S_ISREG(st_template.st_mode)) { - if (copy_file(path->buf, template_path->buf, st_template.st_mode)) - die_errno(_("cannot copy '%s' to '%s'"), - template_path->buf, path->buf); - } - else - error(_("ignoring template %s"), template_path->buf); - } -} - -static void copy_templates(const char *template_dir, const char *init_template_dir) -{ - struct strbuf path = STRBUF_INIT; - struct strbuf template_path = STRBUF_INIT; - size_t template_len; - struct repository_format template_format = REPOSITORY_FORMAT_INIT; - struct strbuf err = STRBUF_INIT; - DIR *dir; - char *to_free = NULL; - - if (!template_dir) - template_dir = getenv(TEMPLATE_DIR_ENVIRONMENT); - if (!template_dir) - template_dir = init_template_dir; - if (!template_dir) - template_dir = to_free = system_path(DEFAULT_GIT_TEMPLATE_DIR); - if (!template_dir[0]) { - free(to_free); - return; - } - - strbuf_addstr(&template_path, template_dir); - strbuf_complete(&template_path, '/'); - template_len = template_path.len; - - dir = opendir(template_path.buf); - if (!dir) { - warning(_("templates not found in %s"), template_dir); - goto free_return; - } - - /* Make sure that template is from the correct vintage */ - strbuf_addstr(&template_path, "config"); - read_repository_format(&template_format, template_path.buf); - strbuf_setlen(&template_path, template_len); - - /* - * No mention of version at all is OK, but anything else should be - * verified. - */ - if (template_format.version >= 0 && - verify_repository_format(&template_format, &err) < 0) { - warning(_("not copying templates from '%s': %s"), - template_dir, err.buf); - strbuf_release(&err); - goto close_free_return; - } - - strbuf_addstr(&path, get_git_common_dir()); - strbuf_complete(&path, '/'); - copy_templates_1(&path, &template_path, dir); -close_free_return: - closedir(dir); -free_return: - free(to_free); - strbuf_release(&path); - strbuf_release(&template_path); - clear_repository_format(&template_format); -} - -/* - * If the git_dir is not directly inside the working tree, then git will not - * find it by default, and we need to set the worktree explicitly. - */ -static int needs_work_tree_config(const char *git_dir, const char *work_tree) -{ - if (!strcmp(work_tree, "/") && !strcmp(git_dir, "/.git")) - return 0; - if (skip_prefix(git_dir, work_tree, &git_dir) && - !strcmp(git_dir, "/.git")) - return 0; - return 1; -} - -void initialize_repository_version(int hash_algo, int reinit) -{ - char repo_version_string[10]; - int repo_version = GIT_REPO_VERSION; - - if (hash_algo != GIT_HASH_SHA1) - repo_version = GIT_REPO_VERSION_READ; - - /* This forces creation of new config file */ - xsnprintf(repo_version_string, sizeof(repo_version_string), - "%d", repo_version); - git_config_set("core.repositoryformatversion", repo_version_string); - - if (hash_algo != GIT_HASH_SHA1) - git_config_set("extensions.objectformat", - hash_algos[hash_algo].name); - else if (reinit) - git_config_set_gently("extensions.objectformat", NULL); -} - -static int create_default_files(const char *template_path, - const char *original_git_dir, - const char *initial_branch, - const struct repository_format *fmt, - int prev_bare_repository, - int init_shared_repository, - int quiet) -{ - struct stat st1; - struct strbuf buf = STRBUF_INIT; - char *path; - char junk[2]; - int reinit; - int filemode; - struct strbuf err = STRBUF_INIT; - const char *init_template_dir = NULL; - const char *work_tree = get_git_work_tree(); - - /* - * First copy the templates -- we might have the default - * config file there, in which case we would want to read - * from it after installing. - * - * Before reading that config, we also need to clear out any cached - * values (since we've just potentially changed what's available on - * disk). - */ - git_config_get_pathname("init.templatedir", &init_template_dir); - copy_templates(template_path, init_template_dir); - free((char *)init_template_dir); - git_config_clear(); - reset_shared_repository(); - git_config(git_default_config, NULL); - - /* - * We must make sure command-line options continue to override any - * values we might have just re-read from the config. - */ - if (init_shared_repository != -1) - set_shared_repository(init_shared_repository); - /* - * TODO: heed core.bare from config file in templates if no - * command-line override given - */ - is_bare_repository_cfg = prev_bare_repository || !work_tree; - /* TODO (continued): - * - * Unfortunately, the line above is equivalent to - * is_bare_repository_cfg = !work_tree; - * which ignores the config entirely even if no `--[no-]bare` - * command line option was present. - * - * To see why, note that before this function, there was this call: - * prev_bare_repository = is_bare_repository() - * expanding the right hand side: - * = is_bare_repository_cfg && !get_git_work_tree() - * = is_bare_repository_cfg && !work_tree - * note that the last simplification above is valid because nothing - * calls repo_init() or set_git_work_tree() between any of the - * relevant calls in the code, and thus the !get_git_work_tree() - * calls will return the same result each time. So, what we are - * interested in computing is the right hand side of the line of - * code just above this comment: - * prev_bare_repository || !work_tree - * = is_bare_repository_cfg && !work_tree || !work_tree - * = !work_tree - * because "A && !B || !B == !B" for all boolean values of A & B. - */ - - /* - * We would have created the above under user's umask -- under - * shared-repository settings, we would need to fix them up. - */ - if (get_shared_repository()) { - adjust_shared_perm(get_git_dir()); - } - - /* - * We need to create a "refs" dir in any case so that older - * versions of git can tell that this is a repository. - */ - safe_create_dir(git_path("refs"), 1); - adjust_shared_perm(git_path("refs")); - - if (refs_init_db(&err)) - die("failed to set up refs db: %s", err.buf); - - /* - * Point the HEAD symref to the initial branch with if HEAD does - * not yet exist. - */ - path = git_path_buf(&buf, "HEAD"); - reinit = (!access(path, R_OK) - || readlink(path, junk, sizeof(junk)-1) != -1); - if (!reinit) { - char *ref; - - if (!initial_branch) - initial_branch = git_default_branch_name(quiet); - - ref = xstrfmt("refs/heads/%s", initial_branch); - if (check_refname_format(ref, 0) < 0) - die(_("invalid initial branch name: '%s'"), - initial_branch); - - if (create_symref("HEAD", ref, NULL) < 0) - exit(1); - free(ref); - } - - initialize_repository_version(fmt->hash_algo, 0); - - /* Check filemode trustability */ - path = git_path_buf(&buf, "config"); - filemode = TEST_FILEMODE; - if (TEST_FILEMODE && !lstat(path, &st1)) { - struct stat st2; - filemode = (!chmod(path, st1.st_mode ^ S_IXUSR) && - !lstat(path, &st2) && - st1.st_mode != st2.st_mode && - !chmod(path, st1.st_mode)); - if (filemode && !reinit && (st1.st_mode & S_IXUSR)) - filemode = 0; - } - git_config_set("core.filemode", filemode ? "true" : "false"); - - if (is_bare_repository()) - git_config_set("core.bare", "true"); - else { - git_config_set("core.bare", "false"); - /* allow template config file to override the default */ - if (log_all_ref_updates == 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); - } - - if (!reinit) { - /* Check if symlink is supported in the work tree */ - path = git_path_buf(&buf, "tXXXXXX"); - if (!close(xmkstemp(path)) && - !unlink(path) && - !symlink("testing", path) && - !lstat(path, &st1) && - S_ISLNK(st1.st_mode)) - unlink(path); /* good */ - else - git_config_set("core.symlinks", "false"); - - /* Check if the filesystem is case-insensitive */ - path = git_path_buf(&buf, "CoNfIg"); - if (!access(path, F_OK)) - git_config_set("core.ignorecase", "true"); - probe_utf8_pathname_composition(); - } - - strbuf_release(&buf); - return reinit; -} - -static void create_object_directory(void) -{ - struct strbuf path = STRBUF_INIT; - size_t baselen; - - strbuf_addstr(&path, get_object_directory()); - baselen = path.len; - - safe_create_dir(path.buf, 1); - - strbuf_setlen(&path, baselen); - strbuf_addstr(&path, "/pack"); - safe_create_dir(path.buf, 1); - - strbuf_setlen(&path, baselen); - strbuf_addstr(&path, "/info"); - safe_create_dir(path.buf, 1); - - strbuf_release(&path); -} - -static void separate_git_dir(const char *git_dir, const char *git_link) -{ - struct stat st; - - if (!stat(git_link, &st)) { - const char *src; - - if (S_ISREG(st.st_mode)) - src = read_gitfile(git_link); - else if (S_ISDIR(st.st_mode)) - src = git_link; - else - die(_("unable to handle file type %d"), (int)st.st_mode); - - if (rename(src, git_dir)) - die_errno(_("unable to move %s to %s"), src, git_dir); - repair_worktrees(NULL, NULL); - } - - write_file(git_link, "gitdir: %s", git_dir); -} - -static void validate_hash_algorithm(struct repository_format *repo_fmt, int hash) -{ - const char *env = getenv(GIT_DEFAULT_HASH_ENVIRONMENT); - /* - * If we already have an initialized repo, don't allow the user to - * specify a different algorithm, as that could cause corruption. - * Otherwise, if the user has specified one on the command line, use it. - */ - if (repo_fmt->version >= 0 && hash != GIT_HASH_UNKNOWN && hash != repo_fmt->hash_algo) - die(_("attempt to reinitialize repository with different hash")); - else if (hash != GIT_HASH_UNKNOWN) - repo_fmt->hash_algo = hash; - else if (env) { - int env_algo = hash_algo_by_name(env); - if (env_algo == GIT_HASH_UNKNOWN) - die(_("unknown hash algorithm '%s'"), env); - repo_fmt->hash_algo = env_algo; - } -} - -int init_db(const char *git_dir, const char *real_git_dir, - const char *template_dir, int hash, const char *initial_branch, - int init_shared_repository, unsigned int flags) -{ - int reinit; - int exist_ok = flags & INIT_DB_EXIST_OK; - char *original_git_dir = real_pathdup(git_dir, 1); - struct repository_format repo_fmt = REPOSITORY_FORMAT_INIT; - int prev_bare_repository; - - if (real_git_dir) { - struct stat st; - - if (!exist_ok && !stat(git_dir, &st)) - die(_("%s already exists"), git_dir); - - if (!exist_ok && !stat(real_git_dir, &st)) - die(_("%s already exists"), real_git_dir); - - set_git_dir(real_git_dir, 1); - git_dir = get_git_dir(); - separate_git_dir(git_dir, original_git_dir); - } - else { - set_git_dir(git_dir, 1); - git_dir = get_git_dir(); - } - startup_info->have_repository = 1; - - /* Ensure `core.hidedotfiles` is processed */ - git_config(platform_core_config, NULL); - - safe_create_dir(git_dir, 0); - - prev_bare_repository = is_bare_repository(); - - /* Check to see if the repository version is right. - * Note that a newly created repository does not have - * config file, so this will not fail. What we are catching - * is an attempt to reinitialize new repository with an old tool. - */ - check_repository_format(&repo_fmt); - - validate_hash_algorithm(&repo_fmt, hash); - - reinit = create_default_files(template_dir, original_git_dir, - initial_branch, &repo_fmt, - prev_bare_repository, - init_shared_repository, - flags & INIT_DB_QUIET); - if (reinit && initial_branch) - warning(_("re-init: ignored --initial-branch=%s"), - initial_branch); - - create_object_directory(); - - if (get_shared_repository()) { - char buf[10]; - /* We do not spell "group" and such, so that - * the configuration can be read by older version - * of git. Note, we use octal numbers for new share modes, - * and compatibility values for PERM_GROUP and - * PERM_EVERYBODY. - */ - if (get_shared_repository() < 0) - /* force to the mode value */ - xsnprintf(buf, sizeof(buf), "0%o", -get_shared_repository()); - else if (get_shared_repository() == PERM_GROUP) - xsnprintf(buf, sizeof(buf), "%d", OLD_PERM_GROUP); - else if (get_shared_repository() == PERM_EVERYBODY) - xsnprintf(buf, sizeof(buf), "%d", OLD_PERM_EVERYBODY); - else - BUG("invalid value for shared_repository"); - git_config_set("core.sharedrepository", buf); - git_config_set("receive.denyNonFastforwards", "true"); - } - - if (!(flags & INIT_DB_QUIET)) { - int len = strlen(git_dir); - - if (reinit) - printf(get_shared_repository() - ? _("Reinitialized existing shared Git repository in %s%s\n") - : _("Reinitialized existing Git repository in %s%s\n"), - git_dir, len && git_dir[len-1] != '/' ? "/" : ""); - else - printf(get_shared_repository() - ? _("Initialized empty shared Git repository in %s%s\n") - : _("Initialized empty Git repository in %s%s\n"), - git_dir, len && git_dir[len-1] != '/' ? "/" : ""); - } - - free(original_git_dir); - return 0; -} - static int guess_repository_type(const char *git_dir) { const char *slash; diff --git a/cache.h b/cache.h index 2bc1cd77d9..8b2eb52f04 100644 --- a/cache.h +++ b/cache.h @@ -322,15 +322,6 @@ void prefetch_cache_entries(const struct index_state *istate, extern struct index_state the_index; #endif -#define INIT_DB_QUIET 0x0001 -#define INIT_DB_EXIST_OK 0x0002 - -int init_db(const char *git_dir, const char *real_git_dir, - const char *template_dir, int hash_algo, - const char *initial_branch, int init_shared_repository, - unsigned int flags); -void initialize_repository_version(int hash_algo, int reinit); - /* Initialize and use the cache information */ struct lock_file; void preload_index(struct index_state *index, diff --git a/setup.c b/setup.c index d866395435..6e7282e680 100644 --- a/setup.c +++ b/setup.c @@ -1,8 +1,11 @@ #include "git-compat-util.h" #include "abspath.h" +#include "copy.h" #include "environment.h" +#include "exec-cmd.h" #include "gettext.h" #include "object-name.h" +#include "refs.h" #include "repository.h" #include "config.h" #include "dir.h" @@ -12,6 +15,7 @@ #include "promisor-remote.h" #include "quote.h" #include "trace2.h" +#include "worktree.h" #include "wrapper.h" static int inside_git_dir = -1; @@ -1713,3 +1717,491 @@ int daemonize(void) return 0; #endif } + +#ifdef NO_TRUSTABLE_FILEMODE +#define TEST_FILEMODE 0 +#else +#define TEST_FILEMODE 1 +#endif + +#define GIT_DEFAULT_HASH_ENVIRONMENT "GIT_DEFAULT_HASH" + +static void copy_templates_1(struct strbuf *path, struct strbuf *template_path, + DIR *dir) +{ + size_t path_baselen = path->len; + size_t template_baselen = template_path->len; + struct dirent *de; + + /* Note: if ".git/hooks" file exists in the repository being + * re-initialized, /etc/core-git/templates/hooks/update would + * cause "git init" to fail here. I think this is sane but + * it means that the set of templates we ship by default, along + * with the way the namespace under .git/ is organized, should + * be really carefully chosen. + */ + safe_create_dir(path->buf, 1); + while ((de = readdir(dir)) != NULL) { + struct stat st_git, st_template; + int exists = 0; + + strbuf_setlen(path, path_baselen); + strbuf_setlen(template_path, template_baselen); + + if (de->d_name[0] == '.') + continue; + strbuf_addstr(path, de->d_name); + strbuf_addstr(template_path, de->d_name); + if (lstat(path->buf, &st_git)) { + if (errno != ENOENT) + die_errno(_("cannot stat '%s'"), path->buf); + } + else + exists = 1; + + if (lstat(template_path->buf, &st_template)) + die_errno(_("cannot stat template '%s'"), template_path->buf); + + if (S_ISDIR(st_template.st_mode)) { + DIR *subdir = opendir(template_path->buf); + if (!subdir) + die_errno(_("cannot opendir '%s'"), template_path->buf); + strbuf_addch(path, '/'); + strbuf_addch(template_path, '/'); + copy_templates_1(path, template_path, subdir); + closedir(subdir); + } + else if (exists) + continue; + else if (S_ISLNK(st_template.st_mode)) { + struct strbuf lnk = STRBUF_INIT; + if (strbuf_readlink(&lnk, template_path->buf, + st_template.st_size) < 0) + die_errno(_("cannot readlink '%s'"), template_path->buf); + if (symlink(lnk.buf, path->buf)) + die_errno(_("cannot symlink '%s' '%s'"), + lnk.buf, path->buf); + strbuf_release(&lnk); + } + else if (S_ISREG(st_template.st_mode)) { + if (copy_file(path->buf, template_path->buf, st_template.st_mode)) + die_errno(_("cannot copy '%s' to '%s'"), + template_path->buf, path->buf); + } + else + error(_("ignoring template %s"), template_path->buf); + } +} + +static void copy_templates(const char *template_dir, const char *init_template_dir) +{ + struct strbuf path = STRBUF_INIT; + struct strbuf template_path = STRBUF_INIT; + size_t template_len; + struct repository_format template_format = REPOSITORY_FORMAT_INIT; + struct strbuf err = STRBUF_INIT; + DIR *dir; + char *to_free = NULL; + + if (!template_dir) + template_dir = getenv(TEMPLATE_DIR_ENVIRONMENT); + if (!template_dir) + template_dir = init_template_dir; + if (!template_dir) + template_dir = to_free = system_path(DEFAULT_GIT_TEMPLATE_DIR); + if (!template_dir[0]) { + free(to_free); + return; + } + + strbuf_addstr(&template_path, template_dir); + strbuf_complete(&template_path, '/'); + template_len = template_path.len; + + dir = opendir(template_path.buf); + if (!dir) { + warning(_("templates not found in %s"), template_dir); + goto free_return; + } + + /* Make sure that template is from the correct vintage */ + strbuf_addstr(&template_path, "config"); + read_repository_format(&template_format, template_path.buf); + strbuf_setlen(&template_path, template_len); + + /* + * No mention of version at all is OK, but anything else should be + * verified. + */ + if (template_format.version >= 0 && + verify_repository_format(&template_format, &err) < 0) { + warning(_("not copying templates from '%s': %s"), + template_dir, err.buf); + strbuf_release(&err); + goto close_free_return; + } + + strbuf_addstr(&path, get_git_common_dir()); + strbuf_complete(&path, '/'); + copy_templates_1(&path, &template_path, dir); +close_free_return: + closedir(dir); +free_return: + free(to_free); + strbuf_release(&path); + strbuf_release(&template_path); + clear_repository_format(&template_format); +} + +/* + * If the git_dir is not directly inside the working tree, then git will not + * find it by default, and we need to set the worktree explicitly. + */ +static int needs_work_tree_config(const char *git_dir, const char *work_tree) +{ + if (!strcmp(work_tree, "/") && !strcmp(git_dir, "/.git")) + return 0; + if (skip_prefix(git_dir, work_tree, &git_dir) && + !strcmp(git_dir, "/.git")) + return 0; + return 1; +} + +void initialize_repository_version(int hash_algo, int reinit) +{ + char repo_version_string[10]; + int repo_version = GIT_REPO_VERSION; + + if (hash_algo != GIT_HASH_SHA1) + repo_version = GIT_REPO_VERSION_READ; + + /* This forces creation of new config file */ + xsnprintf(repo_version_string, sizeof(repo_version_string), + "%d", repo_version); + git_config_set("core.repositoryformatversion", repo_version_string); + + if (hash_algo != GIT_HASH_SHA1) + git_config_set("extensions.objectformat", + hash_algos[hash_algo].name); + else if (reinit) + git_config_set_gently("extensions.objectformat", NULL); +} + +static int create_default_files(const char *template_path, + const char *original_git_dir, + const char *initial_branch, + const struct repository_format *fmt, + int prev_bare_repository, + int init_shared_repository, + int quiet) +{ + struct stat st1; + struct strbuf buf = STRBUF_INIT; + char *path; + char junk[2]; + int reinit; + int filemode; + struct strbuf err = STRBUF_INIT; + const char *init_template_dir = NULL; + const char *work_tree = get_git_work_tree(); + + /* + * First copy the templates -- we might have the default + * config file there, in which case we would want to read + * from it after installing. + * + * Before reading that config, we also need to clear out any cached + * values (since we've just potentially changed what's available on + * disk). + */ + git_config_get_pathname("init.templatedir", &init_template_dir); + copy_templates(template_path, init_template_dir); + free((char *)init_template_dir); + git_config_clear(); + reset_shared_repository(); + git_config(git_default_config, NULL); + + /* + * We must make sure command-line options continue to override any + * values we might have just re-read from the config. + */ + if (init_shared_repository != -1) + set_shared_repository(init_shared_repository); + /* + * TODO: heed core.bare from config file in templates if no + * command-line override given + */ + is_bare_repository_cfg = prev_bare_repository || !work_tree; + /* TODO (continued): + * + * Unfortunately, the line above is equivalent to + * is_bare_repository_cfg = !work_tree; + * which ignores the config entirely even if no `--[no-]bare` + * command line option was present. + * + * To see why, note that before this function, there was this call: + * prev_bare_repository = is_bare_repository() + * expanding the right hand side: + * = is_bare_repository_cfg && !get_git_work_tree() + * = is_bare_repository_cfg && !work_tree + * note that the last simplification above is valid because nothing + * calls repo_init() or set_git_work_tree() between any of the + * relevant calls in the code, and thus the !get_git_work_tree() + * calls will return the same result each time. So, what we are + * interested in computing is the right hand side of the line of + * code just above this comment: + * prev_bare_repository || !work_tree + * = is_bare_repository_cfg && !work_tree || !work_tree + * = !work_tree + * because "A && !B || !B == !B" for all boolean values of A & B. + */ + + /* + * We would have created the above under user's umask -- under + * shared-repository settings, we would need to fix them up. + */ + if (get_shared_repository()) { + adjust_shared_perm(get_git_dir()); + } + + /* + * We need to create a "refs" dir in any case so that older + * versions of git can tell that this is a repository. + */ + safe_create_dir(git_path("refs"), 1); + adjust_shared_perm(git_path("refs")); + + if (refs_init_db(&err)) + die("failed to set up refs db: %s", err.buf); + + /* + * Point the HEAD symref to the initial branch with if HEAD does + * not yet exist. + */ + path = git_path_buf(&buf, "HEAD"); + reinit = (!access(path, R_OK) + || readlink(path, junk, sizeof(junk)-1) != -1); + if (!reinit) { + char *ref; + + if (!initial_branch) + initial_branch = git_default_branch_name(quiet); + + ref = xstrfmt("refs/heads/%s", initial_branch); + if (check_refname_format(ref, 0) < 0) + die(_("invalid initial branch name: '%s'"), + initial_branch); + + if (create_symref("HEAD", ref, NULL) < 0) + exit(1); + free(ref); + } + + initialize_repository_version(fmt->hash_algo, 0); + + /* Check filemode trustability */ + path = git_path_buf(&buf, "config"); + filemode = TEST_FILEMODE; + if (TEST_FILEMODE && !lstat(path, &st1)) { + struct stat st2; + filemode = (!chmod(path, st1.st_mode ^ S_IXUSR) && + !lstat(path, &st2) && + st1.st_mode != st2.st_mode && + !chmod(path, st1.st_mode)); + if (filemode && !reinit && (st1.st_mode & S_IXUSR)) + filemode = 0; + } + git_config_set("core.filemode", filemode ? "true" : "false"); + + if (is_bare_repository()) + git_config_set("core.bare", "true"); + else { + git_config_set("core.bare", "false"); + /* allow template config file to override the default */ + if (log_all_ref_updates == 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); + } + + if (!reinit) { + /* Check if symlink is supported in the work tree */ + path = git_path_buf(&buf, "tXXXXXX"); + if (!close(xmkstemp(path)) && + !unlink(path) && + !symlink("testing", path) && + !lstat(path, &st1) && + S_ISLNK(st1.st_mode)) + unlink(path); /* good */ + else + git_config_set("core.symlinks", "false"); + + /* Check if the filesystem is case-insensitive */ + path = git_path_buf(&buf, "CoNfIg"); + if (!access(path, F_OK)) + git_config_set("core.ignorecase", "true"); + probe_utf8_pathname_composition(); + } + + strbuf_release(&buf); + return reinit; +} + +static void create_object_directory(void) +{ + struct strbuf path = STRBUF_INIT; + size_t baselen; + + strbuf_addstr(&path, get_object_directory()); + baselen = path.len; + + safe_create_dir(path.buf, 1); + + strbuf_setlen(&path, baselen); + strbuf_addstr(&path, "/pack"); + safe_create_dir(path.buf, 1); + + strbuf_setlen(&path, baselen); + strbuf_addstr(&path, "/info"); + safe_create_dir(path.buf, 1); + + strbuf_release(&path); +} + +static void separate_git_dir(const char *git_dir, const char *git_link) +{ + struct stat st; + + if (!stat(git_link, &st)) { + const char *src; + + if (S_ISREG(st.st_mode)) + src = read_gitfile(git_link); + else if (S_ISDIR(st.st_mode)) + src = git_link; + else + die(_("unable to handle file type %d"), (int)st.st_mode); + + if (rename(src, git_dir)) + die_errno(_("unable to move %s to %s"), src, git_dir); + repair_worktrees(NULL, NULL); + } + + write_file(git_link, "gitdir: %s", git_dir); +} + +static void validate_hash_algorithm(struct repository_format *repo_fmt, int hash) +{ + const char *env = getenv(GIT_DEFAULT_HASH_ENVIRONMENT); + /* + * If we already have an initialized repo, don't allow the user to + * specify a different algorithm, as that could cause corruption. + * Otherwise, if the user has specified one on the command line, use it. + */ + if (repo_fmt->version >= 0 && hash != GIT_HASH_UNKNOWN && hash != repo_fmt->hash_algo) + die(_("attempt to reinitialize repository with different hash")); + else if (hash != GIT_HASH_UNKNOWN) + repo_fmt->hash_algo = hash; + else if (env) { + int env_algo = hash_algo_by_name(env); + if (env_algo == GIT_HASH_UNKNOWN) + die(_("unknown hash algorithm '%s'"), env); + repo_fmt->hash_algo = env_algo; + } +} + +int init_db(const char *git_dir, const char *real_git_dir, + const char *template_dir, int hash, const char *initial_branch, + int init_shared_repository, unsigned int flags) +{ + int reinit; + int exist_ok = flags & INIT_DB_EXIST_OK; + char *original_git_dir = real_pathdup(git_dir, 1); + struct repository_format repo_fmt = REPOSITORY_FORMAT_INIT; + int prev_bare_repository; + + if (real_git_dir) { + struct stat st; + + if (!exist_ok && !stat(git_dir, &st)) + die(_("%s already exists"), git_dir); + + if (!exist_ok && !stat(real_git_dir, &st)) + die(_("%s already exists"), real_git_dir); + + set_git_dir(real_git_dir, 1); + git_dir = get_git_dir(); + separate_git_dir(git_dir, original_git_dir); + } + else { + set_git_dir(git_dir, 1); + git_dir = get_git_dir(); + } + startup_info->have_repository = 1; + + /* Ensure `core.hidedotfiles` is processed */ + git_config(platform_core_config, NULL); + + safe_create_dir(git_dir, 0); + + prev_bare_repository = is_bare_repository(); + + /* Check to see if the repository version is right. + * Note that a newly created repository does not have + * config file, so this will not fail. What we are catching + * is an attempt to reinitialize new repository with an old tool. + */ + check_repository_format(&repo_fmt); + + validate_hash_algorithm(&repo_fmt, hash); + + reinit = create_default_files(template_dir, original_git_dir, + initial_branch, &repo_fmt, + prev_bare_repository, + init_shared_repository, + flags & INIT_DB_QUIET); + if (reinit && initial_branch) + warning(_("re-init: ignored --initial-branch=%s"), + initial_branch); + + create_object_directory(); + + if (get_shared_repository()) { + char buf[10]; + /* We do not spell "group" and such, so that + * the configuration can be read by older version + * of git. Note, we use octal numbers for new share modes, + * and compatibility values for PERM_GROUP and + * PERM_EVERYBODY. + */ + if (get_shared_repository() < 0) + /* force to the mode value */ + xsnprintf(buf, sizeof(buf), "0%o", -get_shared_repository()); + else if (get_shared_repository() == PERM_GROUP) + xsnprintf(buf, sizeof(buf), "%d", OLD_PERM_GROUP); + else if (get_shared_repository() == PERM_EVERYBODY) + xsnprintf(buf, sizeof(buf), "%d", OLD_PERM_EVERYBODY); + else + BUG("invalid value for shared_repository"); + git_config_set("core.sharedrepository", buf); + git_config_set("receive.denyNonFastforwards", "true"); + } + + if (!(flags & INIT_DB_QUIET)) { + int len = strlen(git_dir); + + if (reinit) + printf(get_shared_repository() + ? _("Reinitialized existing shared Git repository in %s%s\n") + : _("Reinitialized existing Git repository in %s%s\n"), + git_dir, len && git_dir[len-1] != '/' ? "/" : ""); + else + printf(get_shared_repository() + ? _("Initialized empty shared Git repository in %s%s\n") + : _("Initialized empty Git repository in %s%s\n"), + git_dir, len && git_dir[len-1] != '/' ? "/" : ""); + } + + free(original_git_dir); + return 0; +} diff --git a/setup.h b/setup.h index 4c1ca9d0c9..58fd2605dd 100644 --- a/setup.h +++ b/setup.h @@ -140,6 +140,15 @@ int verify_repository_format(const struct repository_format *format, */ void check_repository_format(struct repository_format *fmt); +#define INIT_DB_QUIET 0x0001 +#define INIT_DB_EXIST_OK 0x0002 + +int init_db(const char *git_dir, const char *real_git_dir, + const char *template_dir, int hash_algo, + const char *initial_branch, int init_shared_repository, + unsigned int flags); +void initialize_repository_version(int hash_algo, int reinit); + /* * NOTE NOTE NOTE!! * From 1a40e7be6cb7dda07d23d8beb84622e63d1aa42c Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Tue, 16 May 2023 06:33:45 +0000 Subject: [PATCH 05/28] read-cache: move shared commit and ls-files code The function overlay_tree_on_index(), plus associated helper functions, were defined in builtin/ls-files.c, but also shared with builtin/commit.c. Move these shared functions to read-cache.c. Diff best viewed with `--color-moved`. Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- builtin/ls-files.c | 137 --------------------------------------------- read-cache.c | 137 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+), 137 deletions(-) diff --git a/builtin/ls-files.c b/builtin/ls-files.c index 72012c0f0f..eb7cce4e6e 100644 --- a/builtin/ls-files.c +++ b/builtin/ls-files.c @@ -543,143 +543,6 @@ static int get_common_prefix_len(const char *common_prefix) return common_prefix_len; } -static int read_one_entry_opt(struct index_state *istate, - const struct object_id *oid, - struct strbuf *base, - const char *pathname, - unsigned mode, int opt) -{ - int len; - struct cache_entry *ce; - - if (S_ISDIR(mode)) - return READ_TREE_RECURSIVE; - - len = strlen(pathname); - ce = make_empty_cache_entry(istate, base->len + len); - - ce->ce_mode = create_ce_mode(mode); - ce->ce_flags = create_ce_flags(1); - ce->ce_namelen = base->len + len; - memcpy(ce->name, base->buf, base->len); - memcpy(ce->name + base->len, pathname, len+1); - oidcpy(&ce->oid, oid); - return add_index_entry(istate, ce, opt); -} - -static int read_one_entry(const struct object_id *oid, struct strbuf *base, - const char *pathname, unsigned mode, - void *context) -{ - struct index_state *istate = context; - return read_one_entry_opt(istate, oid, base, pathname, - mode, - ADD_CACHE_OK_TO_ADD|ADD_CACHE_SKIP_DFCHECK); -} - -/* - * This is used when the caller knows there is no existing entries at - * the stage that will conflict with the entry being added. - */ -static int read_one_entry_quick(const struct object_id *oid, struct strbuf *base, - const char *pathname, unsigned mode, - void *context) -{ - struct index_state *istate = context; - return read_one_entry_opt(istate, oid, base, pathname, - mode, ADD_CACHE_JUST_APPEND); -} - -/* - * Read the tree specified with --with-tree option - * (typically, HEAD) into stage #1 and then - * squash them down to stage #0. This is used for - * --error-unmatch to list and check the path patterns - * that were given from the command line. We are not - * going to write this index out. - */ -void overlay_tree_on_index(struct index_state *istate, - const char *tree_name, const char *prefix) -{ - struct tree *tree; - struct object_id oid; - struct pathspec pathspec; - struct cache_entry *last_stage0 = NULL; - int i; - read_tree_fn_t fn = NULL; - int err; - - if (repo_get_oid(the_repository, tree_name, &oid)) - die("tree-ish %s not found.", tree_name); - tree = parse_tree_indirect(&oid); - if (!tree) - die("bad tree-ish %s", tree_name); - - /* Hoist the unmerged entries up to stage #3 to make room */ - /* TODO: audit for interaction with sparse-index. */ - ensure_full_index(istate); - for (i = 0; i < istate->cache_nr; i++) { - struct cache_entry *ce = istate->cache[i]; - if (!ce_stage(ce)) - continue; - ce->ce_flags |= CE_STAGEMASK; - } - - if (prefix) { - static const char *(matchbuf[1]); - matchbuf[0] = NULL; - parse_pathspec(&pathspec, PATHSPEC_ALL_MAGIC, - PATHSPEC_PREFER_CWD, prefix, matchbuf); - } else - memset(&pathspec, 0, sizeof(pathspec)); - - /* - * See if we have cache entry at the stage. If so, - * do it the original slow way, otherwise, append and then - * sort at the end. - */ - for (i = 0; !fn && i < istate->cache_nr; i++) { - const struct cache_entry *ce = istate->cache[i]; - if (ce_stage(ce) == 1) - fn = read_one_entry; - } - - if (!fn) - fn = read_one_entry_quick; - err = read_tree(the_repository, tree, &pathspec, fn, istate); - clear_pathspec(&pathspec); - if (err) - die("unable to read tree entries %s", tree_name); - - /* - * Sort the cache entry -- we need to nuke the cache tree, though. - */ - if (fn == read_one_entry_quick) { - cache_tree_free(&istate->cache_tree); - QSORT(istate->cache, istate->cache_nr, cmp_cache_name_compare); - } - - for (i = 0; i < istate->cache_nr; i++) { - struct cache_entry *ce = istate->cache[i]; - switch (ce_stage(ce)) { - case 0: - last_stage0 = ce; - /* fallthru */ - default: - continue; - case 1: - /* - * If there is stage #0 entry for this, we do not - * need to show it. We use CE_UPDATE bit to mark - * such an entry. - */ - if (last_stage0 && - !strcmp(last_stage0->name, ce->name)) - ce->ce_flags |= CE_UPDATE; - } - } -} - static const char * const ls_files_usage[] = { N_("git ls-files [] [...]"), NULL diff --git a/read-cache.c b/read-cache.c index f4c31a68c8..c0df4586c9 100644 --- a/read-cache.c +++ b/read-cache.c @@ -3806,3 +3806,140 @@ void prefetch_cache_entries(const struct index_state *istate, to_fetch.oid, to_fetch.nr); oid_array_clear(&to_fetch); } + +static int read_one_entry_opt(struct index_state *istate, + const struct object_id *oid, + struct strbuf *base, + const char *pathname, + unsigned mode, int opt) +{ + int len; + struct cache_entry *ce; + + if (S_ISDIR(mode)) + return READ_TREE_RECURSIVE; + + len = strlen(pathname); + ce = make_empty_cache_entry(istate, base->len + len); + + ce->ce_mode = create_ce_mode(mode); + ce->ce_flags = create_ce_flags(1); + ce->ce_namelen = base->len + len; + memcpy(ce->name, base->buf, base->len); + memcpy(ce->name + base->len, pathname, len+1); + oidcpy(&ce->oid, oid); + return add_index_entry(istate, ce, opt); +} + +static int read_one_entry(const struct object_id *oid, struct strbuf *base, + const char *pathname, unsigned mode, + void *context) +{ + struct index_state *istate = context; + return read_one_entry_opt(istate, oid, base, pathname, + mode, + ADD_CACHE_OK_TO_ADD|ADD_CACHE_SKIP_DFCHECK); +} + +/* + * This is used when the caller knows there is no existing entries at + * the stage that will conflict with the entry being added. + */ +static int read_one_entry_quick(const struct object_id *oid, struct strbuf *base, + const char *pathname, unsigned mode, + void *context) +{ + struct index_state *istate = context; + return read_one_entry_opt(istate, oid, base, pathname, + mode, ADD_CACHE_JUST_APPEND); +} + +/* + * Read the tree specified with --with-tree option + * (typically, HEAD) into stage #1 and then + * squash them down to stage #0. This is used for + * --error-unmatch to list and check the path patterns + * that were given from the command line. We are not + * going to write this index out. + */ +void overlay_tree_on_index(struct index_state *istate, + const char *tree_name, const char *prefix) +{ + struct tree *tree; + struct object_id oid; + struct pathspec pathspec; + struct cache_entry *last_stage0 = NULL; + int i; + read_tree_fn_t fn = NULL; + int err; + + if (repo_get_oid(the_repository, tree_name, &oid)) + die("tree-ish %s not found.", tree_name); + tree = parse_tree_indirect(&oid); + if (!tree) + die("bad tree-ish %s", tree_name); + + /* Hoist the unmerged entries up to stage #3 to make room */ + /* TODO: audit for interaction with sparse-index. */ + ensure_full_index(istate); + for (i = 0; i < istate->cache_nr; i++) { + struct cache_entry *ce = istate->cache[i]; + if (!ce_stage(ce)) + continue; + ce->ce_flags |= CE_STAGEMASK; + } + + if (prefix) { + static const char *(matchbuf[1]); + matchbuf[0] = NULL; + parse_pathspec(&pathspec, PATHSPEC_ALL_MAGIC, + PATHSPEC_PREFER_CWD, prefix, matchbuf); + } else + memset(&pathspec, 0, sizeof(pathspec)); + + /* + * See if we have cache entry at the stage. If so, + * do it the original slow way, otherwise, append and then + * sort at the end. + */ + for (i = 0; !fn && i < istate->cache_nr; i++) { + const struct cache_entry *ce = istate->cache[i]; + if (ce_stage(ce) == 1) + fn = read_one_entry; + } + + if (!fn) + fn = read_one_entry_quick; + err = read_tree(the_repository, tree, &pathspec, fn, istate); + clear_pathspec(&pathspec); + if (err) + die("unable to read tree entries %s", tree_name); + + /* + * Sort the cache entry -- we need to nuke the cache tree, though. + */ + if (fn == read_one_entry_quick) { + cache_tree_free(&istate->cache_tree); + QSORT(istate->cache, istate->cache_nr, cmp_cache_name_compare); + } + + for (i = 0; i < istate->cache_nr; i++) { + struct cache_entry *ce = istate->cache[i]; + switch (ce_stage(ce)) { + case 0: + last_stage0 = ce; + /* fallthru */ + default: + continue; + case 1: + /* + * If there is stage #0 entry for this, we do not + * need to show it. We use CE_UPDATE bit to mark + * such an entry. + */ + if (last_stage0 && + !strcmp(last_stage0->name, ce->name)) + ce->ce_flags |= CE_UPDATE; + } + } +} From 50c37ee839f0c6842816dec0764d0592b5d048b2 Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Tue, 16 May 2023 06:33:46 +0000 Subject: [PATCH 06/28] add: modify add_files_to_cache() to avoid globals The function add_files_to_cache() is used by all three of builtin/{add, checkout, commit}.c. That suggests this is common library code, and should be moved somewhere else, like read-cache.c. However, the function and its helpers made use of two global variables that made straight code movement difficult: * the_index * include_sparse The latter was perhaps more problematic since it was only accessible in builtin/add.c but was still affecting builtin/checkout.c and builtin/commit.c without this fact being very clear from the code. I'm not sure if the other two callers would want to add a `--sparse` flag similar to add.c to get non-default behavior, but exposing this dependence will help if we ever decide we do want to add such a flag. Modify add_files_to_cache() and its helpers to accept the necessary arguments instead of relying on globals. Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- builtin/add.c | 22 +++++++++++++++------- builtin/checkout.c | 2 +- builtin/commit.c | 3 ++- cache.h | 4 +++- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/builtin/add.c b/builtin/add.c index 76cc026a68..a526eff734 100644 --- a/builtin/add.c +++ b/builtin/add.c @@ -37,6 +37,8 @@ static int include_sparse; static const char *pathspec_from_file; struct update_callback_data { + struct index_state *index; + int include_sparse; int flags; int add_errors; }; @@ -100,7 +102,8 @@ static void update_callback(struct diff_queue_struct *q, struct diff_filepair *p = q->queue[i]; const char *path = p->one->path; - if (!include_sparse && !path_in_sparse_checkout(path, &the_index)) + if (!data->include_sparse && + !path_in_sparse_checkout(path, data->index)) continue; switch (fix_unmerged_status(p, data)) { @@ -108,7 +111,7 @@ static void update_callback(struct diff_queue_struct *q, die(_("unexpected diff status %c"), p->status); case DIFF_STATUS_MODIFIED: case DIFF_STATUS_TYPE_CHANGED: - if (add_file_to_index(&the_index, path, data->flags)) { + if (add_file_to_index(data->index, path, data->flags)) { if (!(data->flags & ADD_CACHE_IGNORE_ERRORS)) die(_("updating files failed")); data->add_errors++; @@ -118,7 +121,7 @@ static void update_callback(struct diff_queue_struct *q, if (data->flags & ADD_CACHE_IGNORE_REMOVAL) break; if (!(data->flags & ADD_CACHE_PRETEND)) - remove_file_from_index(&the_index, path); + remove_file_from_index(data->index, path); if (data->flags & (ADD_CACHE_PRETEND|ADD_CACHE_VERBOSE)) printf(_("remove '%s'\n"), path); break; @@ -126,16 +129,19 @@ static void update_callback(struct diff_queue_struct *q, } } -int add_files_to_cache(const char *prefix, - const struct pathspec *pathspec, int flags) +int add_files_to_cache(struct repository *repo, const char *prefix, + const struct pathspec *pathspec, int include_sparse, + int flags) { struct update_callback_data data; struct rev_info rev; memset(&data, 0, sizeof(data)); + data.index = repo->index; + data.include_sparse = include_sparse; data.flags = flags; - repo_init_revisions(the_repository, &rev, prefix); + repo_init_revisions(repo, &rev, prefix); setup_revisions(0, NULL, &rev, NULL); if (pathspec) copy_pathspec(&rev.prune_data, pathspec); @@ -640,7 +646,9 @@ int cmd_add(int argc, const char **argv, const char *prefix) if (add_renormalize) exit_status |= renormalize_tracked_files(&pathspec, flags); else - exit_status |= add_files_to_cache(prefix, &pathspec, flags); + exit_status |= add_files_to_cache(the_repository, prefix, + &pathspec, include_sparse, + flags); if (add_new_files) exit_status |= add_files(&dir, flags); diff --git a/builtin/checkout.c b/builtin/checkout.c index 715eeb5048..d6765c9dbd 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -861,7 +861,7 @@ static int merge_working_tree(const struct checkout_opts *opts, * entries in the index. */ - add_files_to_cache(NULL, NULL, 0); + add_files_to_cache(the_repository, NULL, NULL, 0, 0); init_merge_options(&o, the_repository); o.verbosity = 0; work = write_in_core_index_as_tree(the_repository); diff --git a/builtin/commit.c b/builtin/commit.c index 9ab57ea1aa..f3a1d3eb73 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -447,7 +447,8 @@ static const char *prepare_index(const char **argv, const char *prefix, if (all || (also && pathspec.nr)) { repo_hold_locked_index(the_repository, &index_lock, LOCK_DIE_ON_ERROR); - add_files_to_cache(also ? prefix : NULL, &pathspec, 0); + add_files_to_cache(the_repository, also ? prefix : NULL, + &pathspec, 0, 0); refresh_cache_or_die(refresh_flags); cache_tree_update(&the_index, WRITE_TREE_SILENT); if (write_locked_index(&the_index, &index_lock, 0)) diff --git a/cache.h b/cache.h index 8b2eb52f04..02d69c24cd 100644 --- a/cache.h +++ b/cache.h @@ -554,7 +554,9 @@ int cmp_cache_name_compare(const void *a_, const void *b_); * return 0 if success, 1 - if addition of a file failed and * ADD_FILES_IGNORE_ERRORS was specified in flags */ -int add_files_to_cache(const char *prefix, const struct pathspec *pathspec, int flags); +int add_files_to_cache(struct repository *repo, const char *prefix, + const struct pathspec *pathspec, int include_sparse, + int flags); /* diff.c */ extern int diff_auto_refresh_index; From 6cee5ebc7af2a05dce64d04ac2ed6aa7ed872f88 Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Tue, 16 May 2023 06:33:47 +0000 Subject: [PATCH 07/28] read-cache: move shared add/checkout/commit code The function add_files_to_cache(), plus associated helper functions, were defined in builtin/add.c, but also shared with builtin/checkout.c and builtin/commit.c. Move these shared functions to read-cache.c. Diff best viewed with `--color-moved`. Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- builtin/add.c | 100 ------------------------------------------------- read-cache.c | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 100 deletions(-) diff --git a/builtin/add.c b/builtin/add.c index a526eff734..36ddbb159b 100644 --- a/builtin/add.c +++ b/builtin/add.c @@ -36,13 +36,6 @@ static int pathspec_file_nul; static int include_sparse; static const char *pathspec_from_file; -struct update_callback_data { - struct index_state *index; - int include_sparse; - int flags; - int add_errors; -}; - static int chmod_pathspec(struct pathspec *pathspec, char flip, int show_only) { int i, ret = 0; @@ -71,99 +64,6 @@ static int chmod_pathspec(struct pathspec *pathspec, char flip, int show_only) return ret; } -static int fix_unmerged_status(struct diff_filepair *p, - struct update_callback_data *data) -{ - if (p->status != DIFF_STATUS_UNMERGED) - return p->status; - if (!(data->flags & ADD_CACHE_IGNORE_REMOVAL) && !p->two->mode) - /* - * This is not an explicit add request, and the - * path is missing from the working tree (deleted) - */ - return DIFF_STATUS_DELETED; - else - /* - * Either an explicit add request, or path exists - * in the working tree. An attempt to explicitly - * add a path that does not exist in the working tree - * will be caught as an error by the caller immediately. - */ - return DIFF_STATUS_MODIFIED; -} - -static void update_callback(struct diff_queue_struct *q, - struct diff_options *opt UNUSED, void *cbdata) -{ - int i; - struct update_callback_data *data = cbdata; - - for (i = 0; i < q->nr; i++) { - struct diff_filepair *p = q->queue[i]; - const char *path = p->one->path; - - if (!data->include_sparse && - !path_in_sparse_checkout(path, data->index)) - continue; - - switch (fix_unmerged_status(p, data)) { - default: - die(_("unexpected diff status %c"), p->status); - case DIFF_STATUS_MODIFIED: - case DIFF_STATUS_TYPE_CHANGED: - if (add_file_to_index(data->index, path, data->flags)) { - if (!(data->flags & ADD_CACHE_IGNORE_ERRORS)) - die(_("updating files failed")); - data->add_errors++; - } - break; - case DIFF_STATUS_DELETED: - if (data->flags & ADD_CACHE_IGNORE_REMOVAL) - break; - if (!(data->flags & ADD_CACHE_PRETEND)) - remove_file_from_index(data->index, path); - if (data->flags & (ADD_CACHE_PRETEND|ADD_CACHE_VERBOSE)) - printf(_("remove '%s'\n"), path); - break; - } - } -} - -int add_files_to_cache(struct repository *repo, const char *prefix, - const struct pathspec *pathspec, int include_sparse, - int flags) -{ - struct update_callback_data data; - struct rev_info rev; - - memset(&data, 0, sizeof(data)); - data.index = repo->index; - data.include_sparse = include_sparse; - data.flags = flags; - - repo_init_revisions(repo, &rev, prefix); - setup_revisions(0, NULL, &rev, NULL); - if (pathspec) - copy_pathspec(&rev.prune_data, pathspec); - rev.diffopt.output_format = DIFF_FORMAT_CALLBACK; - rev.diffopt.format_callback = update_callback; - rev.diffopt.format_callback_data = &data; - rev.diffopt.flags.override_submodule_config = 1; - rev.max_count = 0; /* do not compare unmerged paths with stage #2 */ - - /* - * Use an ODB transaction to optimize adding multiple objects. - * This function is invoked from commands other than 'add', which - * may not have their own transaction active. - */ - begin_odb_transaction(); - run_diff_files(&rev, DIFF_RACY_IS_MODIFIED); - end_odb_transaction(); - - release_revisions(&rev); - return !!data.add_errors; -} - static int renormalize_tracked_files(const struct pathspec *pathspec, int flags) { int i, retval = 0; diff --git a/read-cache.c b/read-cache.c index c0df4586c9..bfbd531ea6 100644 --- a/read-cache.c +++ b/read-cache.c @@ -5,6 +5,7 @@ */ #include "cache.h" #include "alloc.h" +#include "bulk-checkin.h" #include "config.h" #include "date.h" #include "diff.h" @@ -26,6 +27,7 @@ #include "mem-pool.h" #include "object-name.h" #include "resolve-undo.h" +#include "revision.h" #include "run-command.h" #include "strbuf.h" #include "trace2.h" @@ -3943,3 +3945,103 @@ void overlay_tree_on_index(struct index_state *istate, } } } + +struct update_callback_data { + struct index_state *index; + int include_sparse; + int flags; + int add_errors; +}; + +static int fix_unmerged_status(struct diff_filepair *p, + struct update_callback_data *data) +{ + if (p->status != DIFF_STATUS_UNMERGED) + return p->status; + if (!(data->flags & ADD_CACHE_IGNORE_REMOVAL) && !p->two->mode) + /* + * This is not an explicit add request, and the + * path is missing from the working tree (deleted) + */ + return DIFF_STATUS_DELETED; + else + /* + * Either an explicit add request, or path exists + * in the working tree. An attempt to explicitly + * add a path that does not exist in the working tree + * will be caught as an error by the caller immediately. + */ + return DIFF_STATUS_MODIFIED; +} + +static void update_callback(struct diff_queue_struct *q, + struct diff_options *opt UNUSED, void *cbdata) +{ + int i; + struct update_callback_data *data = cbdata; + + for (i = 0; i < q->nr; i++) { + struct diff_filepair *p = q->queue[i]; + const char *path = p->one->path; + + if (!data->include_sparse && + !path_in_sparse_checkout(path, data->index)) + continue; + + switch (fix_unmerged_status(p, data)) { + default: + die(_("unexpected diff status %c"), p->status); + case DIFF_STATUS_MODIFIED: + case DIFF_STATUS_TYPE_CHANGED: + if (add_file_to_index(data->index, path, data->flags)) { + if (!(data->flags & ADD_CACHE_IGNORE_ERRORS)) + die(_("updating files failed")); + data->add_errors++; + } + break; + case DIFF_STATUS_DELETED: + if (data->flags & ADD_CACHE_IGNORE_REMOVAL) + break; + if (!(data->flags & ADD_CACHE_PRETEND)) + remove_file_from_index(data->index, path); + if (data->flags & (ADD_CACHE_PRETEND|ADD_CACHE_VERBOSE)) + printf(_("remove '%s'\n"), path); + break; + } + } +} + +int add_files_to_cache(struct repository *repo, const char *prefix, + const struct pathspec *pathspec, int include_sparse, + int flags) +{ + struct update_callback_data data; + struct rev_info rev; + + memset(&data, 0, sizeof(data)); + data.index = repo->index; + data.include_sparse = include_sparse; + data.flags = flags; + + repo_init_revisions(repo, &rev, prefix); + setup_revisions(0, NULL, &rev, NULL); + if (pathspec) + copy_pathspec(&rev.prune_data, pathspec); + rev.diffopt.output_format = DIFF_FORMAT_CALLBACK; + rev.diffopt.format_callback = update_callback; + rev.diffopt.format_callback_data = &data; + rev.diffopt.flags.override_submodule_config = 1; + rev.max_count = 0; /* do not compare unmerged paths with stage #2 */ + + /* + * Use an ODB transaction to optimize adding multiple objects. + * This function is invoked from commands other than 'add', which + * may not have their own transaction active. + */ + begin_odb_transaction(); + run_diff_files(&rev, DIFF_RACY_IS_MODIFIED); + end_odb_transaction(); + + release_revisions(&rev); + return !!data.add_errors; +} From 90cbae9ce5d22df29867be9026c514b8c79e3d31 Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Tue, 16 May 2023 06:33:48 +0000 Subject: [PATCH 08/28] statinfo: move stat_{data,validity} functions from cache/read-cache These functions do not depend upon struct cache_entry or struct index_state in any way, and it seems more logical to break them out into this file, especially since statinfo.h already has the struct stat_data declaration. Diff best viewed with `--color-moved`. Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- Makefile | 1 + cache.h | 48 ------------------------ object.c | 1 + read-cache.c | 84 ----------------------------------------- refs/packed-backend.c | 1 + shallow.c | 1 + statinfo.c | 87 +++++++++++++++++++++++++++++++++++++++++++ statinfo.h | 51 +++++++++++++++++++++++++ 8 files changed, 142 insertions(+), 132 deletions(-) create mode 100644 statinfo.c diff --git a/Makefile b/Makefile index b09c8165d0..339c29849e 100644 --- a/Makefile +++ b/Makefile @@ -1142,6 +1142,7 @@ LIB_OBJS += sigchain.o LIB_OBJS += sparse-index.o LIB_OBJS += split-index.o LIB_OBJS += stable-qsort.o +LIB_OBJS += statinfo.o LIB_OBJS += strbuf.o LIB_OBJS += streaming.o LIB_OBJS += string-list.o diff --git a/cache.h b/cache.h index 02d69c24cd..891e5fec74 100644 --- a/cache.h +++ b/cache.h @@ -488,19 +488,6 @@ int has_racy_timestamp(struct index_state *istate); int ie_match_stat(struct index_state *, const struct cache_entry *, struct stat *, unsigned int); int ie_modified(struct index_state *, const struct cache_entry *, struct stat *, unsigned int); -/* - * Record to sd the data from st that we use to check whether a file - * might have changed. - */ -void fill_stat_data(struct stat_data *sd, struct stat *st); - -/* - * Return 0 if st is consistent with a file not having been changed - * since sd was filled. If there are differences, return a - * combination of MTIME_CHANGED, CTIME_CHANGED, OWNER_CHANGED, - * INODE_CHANGED, and DATA_CHANGED. - */ -int match_stat_data(const struct stat_data *sd, struct stat *st); int match_stat_data_racy(const struct index_state *istate, const struct stat_data *sd, struct stat *st); @@ -539,14 +526,6 @@ void set_alternate_index_output(const char *); extern int verify_index_checksum; extern int verify_ce_order; -#define MTIME_CHANGED 0x0001 -#define CTIME_CHANGED 0x0002 -#define OWNER_CHANGED 0x0004 -#define MODE_CHANGED 0x0008 -#define INODE_CHANGED 0x0010 -#define DATA_CHANGED 0x0020 -#define TYPE_CHANGED 0x0040 - int cmp_cache_name_compare(const void *a_, const void *b_); /* add */ @@ -579,31 +558,4 @@ int checkout_fast_forward(struct repository *r, int sane_execvp(const char *file, char *const argv[]); -/* - * A struct to encapsulate the concept of whether a file has changed - * since we last checked it. This uses criteria similar to those used - * for the index. - */ -struct stat_validity { - struct stat_data *sd; -}; - -void stat_validity_clear(struct stat_validity *sv); - -/* - * Returns 1 if the path is a regular file (or a symlink to a regular - * file) and matches the saved stat_validity, 0 otherwise. A missing - * or inaccessible file is considered a match if the struct was just - * initialized, or if the previous update found an inaccessible file. - */ -int stat_validity_check(struct stat_validity *sv, const char *path); - -/* - * Update the stat_validity from a file opened at descriptor fd. If - * the file is missing, inaccessible, or not a regular file, then - * future calls to stat_validity_check will match iff one of those - * conditions continues to be true. - */ -void stat_validity_update(struct stat_validity *sv, int fd); - #endif /* CACHE_H */ diff --git a/object.c b/object.c index 6d4ef1524d..333e736fb2 100644 --- a/object.c +++ b/object.c @@ -6,6 +6,7 @@ #include "object-file.h" #include "object-store.h" #include "blob.h" +#include "statinfo.h" #include "tree.h" #include "commit.h" #include "tag.h" diff --git a/read-cache.c b/read-cache.c index bfbd531ea6..b99dbfd16b 100644 --- a/read-cache.c +++ b/read-cache.c @@ -177,61 +177,6 @@ void rename_index_entry_at(struct index_state *istate, int nr, const char *new_n add_index_entry(istate, new_entry, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE); } -void fill_stat_data(struct stat_data *sd, struct stat *st) -{ - sd->sd_ctime.sec = (unsigned int)st->st_ctime; - sd->sd_mtime.sec = (unsigned int)st->st_mtime; - sd->sd_ctime.nsec = ST_CTIME_NSEC(*st); - sd->sd_mtime.nsec = ST_MTIME_NSEC(*st); - sd->sd_dev = st->st_dev; - sd->sd_ino = st->st_ino; - sd->sd_uid = st->st_uid; - sd->sd_gid = st->st_gid; - sd->sd_size = st->st_size; -} - -int match_stat_data(const struct stat_data *sd, struct stat *st) -{ - int changed = 0; - - if (sd->sd_mtime.sec != (unsigned int)st->st_mtime) - changed |= MTIME_CHANGED; - if (trust_ctime && check_stat && - sd->sd_ctime.sec != (unsigned int)st->st_ctime) - changed |= CTIME_CHANGED; - -#ifdef USE_NSEC - if (check_stat && sd->sd_mtime.nsec != ST_MTIME_NSEC(*st)) - changed |= MTIME_CHANGED; - if (trust_ctime && check_stat && - sd->sd_ctime.nsec != ST_CTIME_NSEC(*st)) - changed |= CTIME_CHANGED; -#endif - - if (check_stat) { - if (sd->sd_uid != (unsigned int) st->st_uid || - sd->sd_gid != (unsigned int) st->st_gid) - changed |= OWNER_CHANGED; - if (sd->sd_ino != (unsigned int) st->st_ino) - changed |= INODE_CHANGED; - } - -#ifdef USE_STDEV - /* - * st_dev breaks on network filesystems where different - * clients will have different views of what "device" - * the filesystem is on - */ - if (check_stat && sd->sd_dev != (unsigned int) st->st_dev) - changed |= INODE_CHANGED; -#endif - - if (sd->sd_size != (unsigned int) st->st_size) - changed |= DATA_CHANGED; - - return changed; -} - /* * This only updates the "non-critical" parts of the directory * cache, ie the parts that aren't tracked by GIT, and only used @@ -3536,35 +3481,6 @@ void *read_blob_data_from_index(struct index_state *istate, return data; } -void stat_validity_clear(struct stat_validity *sv) -{ - FREE_AND_NULL(sv->sd); -} - -int stat_validity_check(struct stat_validity *sv, const char *path) -{ - struct stat st; - - if (stat(path, &st) < 0) - return sv->sd == NULL; - if (!sv->sd) - return 0; - return S_ISREG(st.st_mode) && !match_stat_data(sv->sd, &st); -} - -void stat_validity_update(struct stat_validity *sv, int fd) -{ - struct stat st; - - if (fstat(fd, &st) < 0 || !S_ISREG(st.st_mode)) - stat_validity_clear(sv); - else { - if (!sv->sd) - CALLOC_ARRAY(sv->sd, 1); - fill_stat_data(sv->sd, &st); - } -} - void move_index_extensions(struct index_state *dst, struct index_state *src) { dst->untracked = src->untracked; diff --git a/refs/packed-backend.c b/refs/packed-backend.c index 291e53f5cf..f21882cc2e 100644 --- a/refs/packed-backend.c +++ b/refs/packed-backend.c @@ -10,6 +10,7 @@ #include "../iterator.h" #include "../lockfile.h" #include "../chdir-notify.h" +#include "../statinfo.h" #include "../wrapper.h" #include "../write-or-die.h" diff --git a/shallow.c b/shallow.c index 128f56179e..a2ebf0af2b 100644 --- a/shallow.c +++ b/shallow.c @@ -17,6 +17,7 @@ #include "list-objects.h" #include "commit-reach.h" #include "shallow.h" +#include "statinfo.h" #include "trace.h" #include "wrapper.h" diff --git a/statinfo.c b/statinfo.c new file mode 100644 index 0000000000..17bb8966c3 --- /dev/null +++ b/statinfo.c @@ -0,0 +1,87 @@ +#include "git-compat-util.h" +#include "environment.h" +#include "statinfo.h" + +void fill_stat_data(struct stat_data *sd, struct stat *st) +{ + sd->sd_ctime.sec = (unsigned int)st->st_ctime; + sd->sd_mtime.sec = (unsigned int)st->st_mtime; + sd->sd_ctime.nsec = ST_CTIME_NSEC(*st); + sd->sd_mtime.nsec = ST_MTIME_NSEC(*st); + sd->sd_dev = st->st_dev; + sd->sd_ino = st->st_ino; + sd->sd_uid = st->st_uid; + sd->sd_gid = st->st_gid; + sd->sd_size = st->st_size; +} + +int match_stat_data(const struct stat_data *sd, struct stat *st) +{ + int changed = 0; + + if (sd->sd_mtime.sec != (unsigned int)st->st_mtime) + changed |= MTIME_CHANGED; + if (trust_ctime && check_stat && + sd->sd_ctime.sec != (unsigned int)st->st_ctime) + changed |= CTIME_CHANGED; + +#ifdef USE_NSEC + if (check_stat && sd->sd_mtime.nsec != ST_MTIME_NSEC(*st)) + changed |= MTIME_CHANGED; + if (trust_ctime && check_stat && + sd->sd_ctime.nsec != ST_CTIME_NSEC(*st)) + changed |= CTIME_CHANGED; +#endif + + if (check_stat) { + if (sd->sd_uid != (unsigned int) st->st_uid || + sd->sd_gid != (unsigned int) st->st_gid) + changed |= OWNER_CHANGED; + if (sd->sd_ino != (unsigned int) st->st_ino) + changed |= INODE_CHANGED; + } + +#ifdef USE_STDEV + /* + * st_dev breaks on network filesystems where different + * clients will have different views of what "device" + * the filesystem is on + */ + if (check_stat && sd->sd_dev != (unsigned int) st->st_dev) + changed |= INODE_CHANGED; +#endif + + if (sd->sd_size != (unsigned int) st->st_size) + changed |= DATA_CHANGED; + + return changed; +} + +void stat_validity_clear(struct stat_validity *sv) +{ + FREE_AND_NULL(sv->sd); +} + +int stat_validity_check(struct stat_validity *sv, const char *path) +{ + struct stat st; + + if (stat(path, &st) < 0) + return sv->sd == NULL; + if (!sv->sd) + return 0; + return S_ISREG(st.st_mode) && !match_stat_data(sv->sd, &st); +} + +void stat_validity_update(struct stat_validity *sv, int fd) +{ + struct stat st; + + if (fstat(fd, &st) < 0 || !S_ISREG(st.st_mode)) + stat_validity_clear(sv); + else { + if (!sv->sd) + CALLOC_ARRAY(sv->sd, 1); + fill_stat_data(sv->sd, &st); + } +} diff --git a/statinfo.h b/statinfo.h index e49e3054ea..bb9b61bc47 100644 --- a/statinfo.h +++ b/statinfo.h @@ -1,6 +1,8 @@ #ifndef STATINFO_H #define STATINFO_H +struct index_state; + /* * The "cache_time" is just the low 32 bits of the * time. It doesn't matter if it overflows - we only @@ -21,4 +23,53 @@ struct stat_data { unsigned int sd_size; }; +/* + * A struct to encapsulate the concept of whether a file has changed + * since we last checked it. This uses criteria similar to those used + * for the index. + */ +struct stat_validity { + struct stat_data *sd; +}; + +#define MTIME_CHANGED 0x0001 +#define CTIME_CHANGED 0x0002 +#define OWNER_CHANGED 0x0004 +#define MODE_CHANGED 0x0008 +#define INODE_CHANGED 0x0010 +#define DATA_CHANGED 0x0020 +#define TYPE_CHANGED 0x0040 + +/* + * Record to sd the data from st that we use to check whether a file + * might have changed. + */ +void fill_stat_data(struct stat_data *sd, struct stat *st); + +/* + * Return 0 if st is consistent with a file not having been changed + * since sd was filled. If there are differences, return a + * combination of MTIME_CHANGED, CTIME_CHANGED, OWNER_CHANGED, + * INODE_CHANGED, and DATA_CHANGED. + */ +int match_stat_data(const struct stat_data *sd, struct stat *st); + +void stat_validity_clear(struct stat_validity *sv); + +/* + * Returns 1 if the path is a regular file (or a symlink to a regular + * file) and matches the saved stat_validity, 0 otherwise. A missing + * or inaccessible file is considered a match if the struct was just + * initialized, or if the previous update found an inaccessible file. + */ +int stat_validity_check(struct stat_validity *sv, const char *path); + +/* + * Update the stat_validity from a file opened at descriptor fd. If + * the file is missing, inaccessible, or not a regular file, then + * future calls to stat_validity_check will match iff one of those + * conditions continues to be true. + */ +void stat_validity_update(struct stat_validity *sv, int fd); + #endif From 64c8559575a2d91bad66a3c0a7067d9275dd5905 Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Tue, 16 May 2023 06:33:49 +0000 Subject: [PATCH 09/28] run-command.h: move declarations for run-command.c from cache.h Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- cache.h | 3 --- exec-cmd.c | 3 ++- run-command.c | 2 +- run-command.h | 2 ++ 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cache.h b/cache.h index 891e5fec74..d31b151506 100644 --- a/cache.h +++ b/cache.h @@ -555,7 +555,4 @@ int checkout_fast_forward(struct repository *r, const struct object_id *to, int overwrite_ignore); - -int sane_execvp(const char *file, char *const argv[]); - #endif /* CACHE_H */ diff --git a/exec-cmd.c b/exec-cmd.c index 1e34e48c0e..1d597e84ea 100644 --- a/exec-cmd.c +++ b/exec-cmd.c @@ -1,10 +1,11 @@ -#include "cache.h" +#include "git-compat-util.h" #include "abspath.h" #include "environment.h" #include "exec-cmd.h" #include "gettext.h" #include "path.h" #include "quote.h" +#include "run-command.h" #include "strvec.h" #include "trace.h" #include "trace2.h" diff --git a/run-command.c b/run-command.c index 60c9419866..1ac2848b54 100644 --- a/run-command.c +++ b/run-command.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "run-command.h" #include "environment.h" #include "exec-cmd.h" diff --git a/run-command.h b/run-command.h index 072db56a4d..9e47f91d46 100644 --- a/run-command.h +++ b/run-command.h @@ -564,4 +564,6 @@ enum start_bg_result start_bg_command(struct child_process *cmd, void *cb_data, unsigned int timeout_sec); +int sane_execvp(const char *file, char *const argv[]); + #endif From f5653856c26efb2ce722148060518817af2ab023 Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Tue, 16 May 2023 06:33:50 +0000 Subject: [PATCH 10/28] name-hash.h: move declarations for name-hash.c from cache.h Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- apply.c | 1 + builtin/mv.c | 1 + cache.h | 9 --------- dir.c | 1 + entry.c | 1 + merge-recursive.c | 1 + name-hash.c | 1 + name-hash.h | 16 ++++++++++++++++ read-cache.c | 1 + sparse-index.c | 1 + t/helper/test-lazy-init-name-hash.c | 1 + unpack-trees.c | 1 + 12 files changed, 26 insertions(+), 9 deletions(-) create mode 100644 name-hash.h diff --git a/apply.c b/apply.c index 6212ab3a1b..3da33bb88f 100644 --- a/apply.c +++ b/apply.c @@ -23,6 +23,7 @@ #include "xdiff-interface.h" #include "ll-merge.h" #include "lockfile.h" +#include "name-hash.h" #include "object-name.h" #include "object-file.h" #include "parse-options.h" diff --git a/builtin/mv.c b/builtin/mv.c index 665bd27448..e058b57465 100644 --- a/builtin/mv.c +++ b/builtin/mv.c @@ -11,6 +11,7 @@ #include "config.h" #include "environment.h" #include "gettext.h" +#include "name-hash.h" #include "object-file.h" #include "pathspec.h" #include "lockfile.h" diff --git a/cache.h b/cache.h index d31b151506..316904da39 100644 --- a/cache.h +++ b/cache.h @@ -245,12 +245,6 @@ struct index_state { void index_state_init(struct index_state *istate, struct repository *r); void release_index(struct index_state *istate); -/* Name hashing */ -int test_lazy_init_name_hash(struct index_state *istate, int try_threaded); -void add_name_hash(struct index_state *istate, struct cache_entry *ce); -void remove_name_hash(struct index_state *istate, struct cache_entry *ce); -void free_name_hash(struct index_state *istate); - /* Cache entry creation and cleanup */ /* @@ -377,9 +371,6 @@ int repo_index_has_changes(struct repository *repo, int verify_path(const char *path, unsigned mode); int strcmp_offset(const char *s1, const char *s2, size_t *first_change); -int index_dir_exists(struct index_state *istate, const char *name, int namelen); -void adjust_dirname_case(struct index_state *istate, char *name); -struct cache_entry *index_file_exists(struct index_state *istate, const char *name, int namelen, int igncase); /* * Searches for an entry defined by name and namelen in the given index. diff --git a/dir.c b/dir.c index a7469df3ac..029aab36fe 100644 --- a/dir.c +++ b/dir.c @@ -13,6 +13,7 @@ #include "dir.h" #include "environment.h" #include "gettext.h" +#include "name-hash.h" #include "object-file.h" #include "object-store.h" #include "attr.h" diff --git a/entry.c b/entry.c index 91a540bd29..7791cc999c 100644 --- a/entry.c +++ b/entry.c @@ -5,6 +5,7 @@ #include "environment.h" #include "gettext.h" #include "hex.h" +#include "name-hash.h" #include "streaming.h" #include "submodule.h" #include "symlinks.h" diff --git a/merge-recursive.c b/merge-recursive.c index 8e87b6386d..b341ba4f38 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -23,6 +23,7 @@ #include "ll-merge.h" #include "lockfile.h" #include "match-trees.h" +#include "name-hash.h" #include "object-file.h" #include "object-name.h" #include "object-store.h" diff --git a/name-hash.c b/name-hash.c index fb13716e43..52ce47ea39 100644 --- a/name-hash.c +++ b/name-hash.c @@ -8,6 +8,7 @@ #include "cache.h" #include "environment.h" #include "gettext.h" +#include "name-hash.h" #include "thread-utils.h" #include "trace.h" #include "trace2.h" diff --git a/name-hash.h b/name-hash.h new file mode 100644 index 0000000000..b1b4b0fb33 --- /dev/null +++ b/name-hash.h @@ -0,0 +1,16 @@ +#ifndef NAME_HASH_H +#define NAME_HASH_H + +struct cache_entry; +struct index_state; + +int index_dir_exists(struct index_state *istate, const char *name, int namelen); +void adjust_dirname_case(struct index_state *istate, char *name); +struct cache_entry *index_file_exists(struct index_state *istate, const char *name, int namelen, int igncase); + +int test_lazy_init_name_hash(struct index_state *istate, int try_threaded); +void add_name_hash(struct index_state *istate, struct cache_entry *ce); +void remove_name_hash(struct index_state *istate, struct cache_entry *ce); +void free_name_hash(struct index_state *istate); + +#endif /* NAME_HASH_H */ diff --git a/read-cache.c b/read-cache.c index b99dbfd16b..e1016ae031 100644 --- a/read-cache.c +++ b/read-cache.c @@ -25,6 +25,7 @@ #include "environment.h" #include "gettext.h" #include "mem-pool.h" +#include "name-hash.h" #include "object-name.h" #include "resolve-undo.h" #include "revision.h" diff --git a/sparse-index.c b/sparse-index.c index 886054729e..60451daae8 100644 --- a/sparse-index.c +++ b/sparse-index.c @@ -2,6 +2,7 @@ #include "alloc.h" #include "environment.h" #include "gettext.h" +#include "name-hash.h" #include "repository.h" #include "sparse-index.h" #include "tree.h" diff --git a/t/helper/test-lazy-init-name-hash.c b/t/helper/test-lazy-init-name-hash.c index b83a75d19f..6944b7e825 100644 --- a/t/helper/test-lazy-init-name-hash.c +++ b/t/helper/test-lazy-init-name-hash.c @@ -2,6 +2,7 @@ #include "test-tool.h" #include "cache.h" #include "environment.h" +#include "name-hash.h" #include "parse-options.h" #include "repository.h" #include "setup.h" diff --git a/unpack-trees.c b/unpack-trees.c index e8c32a40dc..078c53f7a1 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -7,6 +7,7 @@ #include "environment.h" #include "gettext.h" #include "hex.h" +#include "name-hash.h" #include "tree.h" #include "tree-walk.h" #include "cache-tree.h" From baf889c2cdc616c7eff67f49608f1d93642c13f0 Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Tue, 16 May 2023 06:33:51 +0000 Subject: [PATCH 11/28] sparse-index.h: move declarations for sparse-index.c from cache.h Note in particular that this reverses the decision made in 118a2e8bde0 ("cache: move ensure_full_index() to cache.h", 2021-04-01). Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- builtin/checkout-index.c | 1 + builtin/commit.c | 1 + builtin/difftool.c | 1 + builtin/fsck.c | 1 + builtin/ls-files.c | 1 + builtin/merge-index.c | 1 + builtin/read-tree.c | 1 + builtin/reset.c | 1 + builtin/rm.c | 1 + builtin/stash.c | 1 + builtin/submodule--helper.c | 1 + builtin/update-index.c | 1 + cache.h | 2 -- dir.c | 1 + entry.c | 1 + merge-ort.c | 1 + merge-recursive.c | 1 + resolve-undo.c | 1 + revision.c | 1 + sequencer.c | 1 + sparse-index.h | 2 ++ 21 files changed, 21 insertions(+), 2 deletions(-) diff --git a/builtin/checkout-index.c b/builtin/checkout-index.c index 9375a05539..b1cd8bef26 100644 --- a/builtin/checkout-index.c +++ b/builtin/checkout-index.c @@ -17,6 +17,7 @@ #include "entry.h" #include "parallel-checkout.h" #include "setup.h" +#include "sparse-index.h" #define CHECKOUT_ALL 4 static int nul_term_line; diff --git a/builtin/commit.c b/builtin/commit.c index f3a1d3eb73..ee296e5ec6 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -38,6 +38,7 @@ #include "gpg-interface.h" #include "column.h" #include "sequencer.h" +#include "sparse-index.h" #include "mailmap.h" #include "help.h" #include "commit-reach.h" diff --git a/builtin/difftool.c b/builtin/difftool.c index 0049342f5c..2c27a59e04 100644 --- a/builtin/difftool.c +++ b/builtin/difftool.c @@ -23,6 +23,7 @@ #include "gettext.h" #include "hex.h" #include "parse-options.h" +#include "sparse-index.h" #include "strvec.h" #include "strbuf.h" #include "lockfile.h" diff --git a/builtin/fsck.c b/builtin/fsck.c index dcc165bf0c..712e3dc68c 100644 --- a/builtin/fsck.c +++ b/builtin/fsck.c @@ -25,6 +25,7 @@ #include "replace-object.h" #include "resolve-undo.h" #include "run-command.h" +#include "sparse-index.h" #include "worktree.h" #include "pack-revindex.h" #include "pack-bitmap.h" diff --git a/builtin/ls-files.c b/builtin/ls-files.c index eb7cce4e6e..b6238966d2 100644 --- a/builtin/ls-files.c +++ b/builtin/ls-files.c @@ -23,6 +23,7 @@ #include "pathspec.h" #include "run-command.h" #include "setup.h" +#include "sparse-index.h" #include "submodule.h" #include "submodule-config.h" #include "object-store.h" diff --git a/builtin/merge-index.c b/builtin/merge-index.c index ab16e70f23..d16e8aa414 100644 --- a/builtin/merge-index.c +++ b/builtin/merge-index.c @@ -3,6 +3,7 @@ #include "hex.h" #include "repository.h" #include "run-command.h" +#include "sparse-index.h" static const char *pgm; static int one_shot, quiet; diff --git a/builtin/read-tree.c b/builtin/read-tree.c index 440f19b1b8..bd1ce1d963 100644 --- a/builtin/read-tree.c +++ b/builtin/read-tree.c @@ -22,6 +22,7 @@ #include "repository.h" #include "resolve-undo.h" #include "setup.h" +#include "sparse-index.h" #include "submodule.h" #include "submodule-config.h" diff --git a/builtin/reset.c b/builtin/reset.c index f99f32d580..3dc41ac332 100644 --- a/builtin/reset.c +++ b/builtin/reset.c @@ -29,6 +29,7 @@ #include "unpack-trees.h" #include "cache-tree.h" #include "setup.h" +#include "sparse-index.h" #include "submodule.h" #include "submodule-config.h" #include "trace.h" diff --git a/builtin/rm.c b/builtin/rm.c index b4589c824c..377a0f66ad 100644 --- a/builtin/rm.c +++ b/builtin/rm.c @@ -19,6 +19,7 @@ #include "repository.h" #include "string-list.h" #include "setup.h" +#include "sparse-index.h" #include "submodule.h" #include "pathspec.h" diff --git a/builtin/stash.c b/builtin/stash.c index a7e17ffe38..8856ac6d5c 100644 --- a/builtin/stash.c +++ b/builtin/stash.c @@ -20,6 +20,7 @@ #include "rerere.h" #include "revision.h" #include "setup.h" +#include "sparse-index.h" #include "log-tree.h" #include "diffcore.h" #include "exec-cmd.h" diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c index 6a16208e8a..fa30959535 100644 --- a/builtin/submodule--helper.c +++ b/builtin/submodule--helper.c @@ -13,6 +13,7 @@ #include "pathspec.h" #include "dir.h" #include "setup.h" +#include "sparse-index.h" #include "submodule.h" #include "submodule-config.h" #include "string-list.h" diff --git a/builtin/update-index.c b/builtin/update-index.c index 5fab9ad2ec..47dc9b626e 100644 --- a/builtin/update-index.c +++ b/builtin/update-index.c @@ -24,6 +24,7 @@ #include "dir.h" #include "repository.h" #include "setup.h" +#include "sparse-index.h" #include "split-index.h" #include "symlinks.h" #include "fsmonitor.h" diff --git a/cache.h b/cache.h index 316904da39..79daaa166b 100644 --- a/cache.h +++ b/cache.h @@ -327,8 +327,6 @@ int read_index_from(struct index_state *, const char *path, const char *gitdir); int is_index_unborn(struct index_state *); -void ensure_full_index(struct index_state *istate); - /* For use with `write_locked_index()`. */ #define COMMIT_LOCK (1 << 0) #define SKIP_IF_UNCHANGED (1 << 1) diff --git a/dir.c b/dir.c index 029aab36fe..1e84b1e1f2 100644 --- a/dir.c +++ b/dir.c @@ -25,6 +25,7 @@ #include "ewah/ewok.h" #include "fsmonitor.h" #include "setup.h" +#include "sparse-index.h" #include "submodule-config.h" #include "symlinks.h" #include "trace2.h" diff --git a/entry.c b/entry.c index 7791cc999c..53d0038674 100644 --- a/entry.c +++ b/entry.c @@ -6,6 +6,7 @@ #include "gettext.h" #include "hex.h" #include "name-hash.h" +#include "sparse-index.h" #include "streaming.h" #include "submodule.h" #include "symlinks.h" diff --git a/merge-ort.c b/merge-ort.c index a50b095c47..69e3c4a890 100644 --- a/merge-ort.c +++ b/merge-ort.c @@ -38,6 +38,7 @@ #include "oid-array.h" #include "promisor-remote.h" #include "revision.h" +#include "sparse-index.h" #include "strmap.h" #include "submodule-config.h" #include "submodule.h" diff --git a/merge-recursive.c b/merge-recursive.c index b341ba4f38..0e16e7a06d 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -29,6 +29,7 @@ #include "object-store.h" #include "repository.h" #include "revision.h" +#include "sparse-index.h" #include "string-list.h" #include "submodule-config.h" #include "submodule.h" diff --git a/resolve-undo.c b/resolve-undo.c index 70a6db526d..7ec09e89d4 100644 --- a/resolve-undo.c +++ b/resolve-undo.c @@ -2,6 +2,7 @@ #include "dir.h" #include "hash.h" #include "resolve-undo.h" +#include "sparse-index.h" #include "string-list.h" /* The only error case is to run out of memory in string-list */ diff --git a/revision.c b/revision.c index b33cc1d106..88b2f42daa 100644 --- a/revision.c +++ b/revision.c @@ -32,6 +32,7 @@ #include "packfile.h" #include "worktree.h" #include "setup.h" +#include "sparse-index.h" #include "strvec.h" #include "trace2.h" #include "commit-reach.h" diff --git a/sequencer.c b/sequencer.c index bceb6abcb6..d132cd884f 100644 --- a/sequencer.c +++ b/sequencer.c @@ -28,6 +28,7 @@ #include "merge-ort.h" #include "merge-ort-wrappers.h" #include "refs.h" +#include "sparse-index.h" #include "strvec.h" #include "quote.h" #include "trailer.h" diff --git a/sparse-index.h b/sparse-index.h index 59a92d819e..a16f3e67d7 100644 --- a/sparse-index.h +++ b/sparse-index.h @@ -37,4 +37,6 @@ struct pattern_list; */ void expand_index(struct index_state *istate, struct pattern_list *pl); +void ensure_full_index(struct index_state *istate); + #endif From fbffdfb11cba61dbce46442d0b136dcf2ddaeadc Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Tue, 16 May 2023 06:33:52 +0000 Subject: [PATCH 12/28] preload-index.h: move declarations for preload-index.c from elsewhere We already have a preload-index.c file; move the declarations for the functions in that file into a new preload-index.h. These were previously split between cache.h and repository.h. Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- add-interactive.c | 1 + builtin/add.c | 1 + builtin/am.c | 1 + builtin/checkout.c | 1 + builtin/commit.c | 1 + builtin/diff-files.c | 1 + builtin/diff-index.c | 1 + builtin/diff.c | 1 + builtin/stash.c | 1 + builtin/submodule--helper.c | 1 + cache.h | 3 --- preload-index.c | 1 + preload-index.h | 15 +++++++++++++++ read-cache.c | 1 + repository.h | 3 --- 15 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 preload-index.h diff --git a/add-interactive.c b/add-interactive.c index de877ca052..99f7dc3b0d 100644 --- a/add-interactive.c +++ b/add-interactive.c @@ -5,6 +5,7 @@ #include "diffcore.h" #include "gettext.h" #include "hex.h" +#include "preload-index.h" #include "revision.h" #include "refs.h" #include "string-list.h" diff --git a/builtin/add.c b/builtin/add.c index 36ddbb159b..8397be4f8d 100644 --- a/builtin/add.c +++ b/builtin/add.c @@ -17,6 +17,7 @@ #include "cache-tree.h" #include "run-command.h" #include "parse-options.h" +#include "preload-index.h" #include "diff.h" #include "diffcore.h" #include "revision.h" diff --git a/builtin/am.c b/builtin/am.c index 5c83f2e003..0d8f46f8d5 100644 --- a/builtin/am.c +++ b/builtin/am.c @@ -29,6 +29,7 @@ #include "unpack-trees.h" #include "branch.h" #include "object-name.h" +#include "preload-index.h" #include "sequencer.h" #include "revision.h" #include "merge-recursive.h" diff --git a/builtin/checkout.c b/builtin/checkout.c index d6765c9dbd..2d72a742d9 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -20,6 +20,7 @@ #include "object-name.h" #include "object-store.h" #include "parse-options.h" +#include "preload-index.h" #include "refs.h" #include "remote.h" #include "resolve-undo.h" diff --git a/builtin/commit.c b/builtin/commit.c index ee296e5ec6..877955e894 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -30,6 +30,7 @@ #include "utf8.h" #include "object-name.h" #include "parse-options.h" +#include "preload-index.h" #include "string-list.h" #include "rerere.h" #include "unpack-trees.h" diff --git a/builtin/diff-files.c b/builtin/diff-files.c index 360464e6ef..3ac175264d 100644 --- a/builtin/diff-files.c +++ b/builtin/diff-files.c @@ -8,6 +8,7 @@ #include "diff.h" #include "diff-merges.h" #include "commit.h" +#include "preload-index.h" #include "revision.h" #include "builtin.h" #include "submodule.h" diff --git a/builtin/diff-index.c b/builtin/diff-index.c index b9a19bb7d3..9b98db2e77 100644 --- a/builtin/diff-index.c +++ b/builtin/diff-index.c @@ -3,6 +3,7 @@ #include "diff.h" #include "diff-merges.h" #include "commit.h" +#include "preload-index.h" #include "revision.h" #include "builtin.h" #include "setup.h" diff --git a/builtin/diff.c b/builtin/diff.c index 7b64659fe7..967550739a 100644 --- a/builtin/diff.c +++ b/builtin/diff.c @@ -16,6 +16,7 @@ #include "diff.h" #include "diff-merges.h" #include "diffcore.h" +#include "preload-index.h" #include "revision.h" #include "log-tree.h" #include "builtin.h" diff --git a/builtin/stash.c b/builtin/stash.c index 8856ac6d5c..06527ee847 100644 --- a/builtin/stash.c +++ b/builtin/stash.c @@ -17,6 +17,7 @@ #include "run-command.h" #include "dir.h" #include "entry.h" +#include "preload-index.h" #include "rerere.h" #include "revision.h" #include "setup.h" diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c index fa30959535..7b201d76a8 100644 --- a/builtin/submodule--helper.c +++ b/builtin/submodule--helper.c @@ -11,6 +11,7 @@ #include "parse-options.h" #include "quote.h" #include "pathspec.h" +#include "preload-index.h" #include "dir.h" #include "setup.h" #include "sparse-index.h" diff --git a/cache.h b/cache.h index 79daaa166b..b79802a463 100644 --- a/cache.h +++ b/cache.h @@ -318,9 +318,6 @@ extern struct index_state the_index; /* Initialize and use the cache information */ struct lock_file; -void preload_index(struct index_state *index, - const struct pathspec *pathspec, - unsigned int refresh_flags); int do_read_index(struct index_state *istate, const char *path, int must_exist); /* for testting only! */ int read_index_from(struct index_state *, const char *path, diff --git a/preload-index.c b/preload-index.c index 7a26b08c21..c26739debf 100644 --- a/preload-index.c +++ b/preload-index.c @@ -8,6 +8,7 @@ #include "fsmonitor.h" #include "gettext.h" #include "config.h" +#include "preload-index.h" #include "progress.h" #include "thread-utils.h" #include "repository.h" diff --git a/preload-index.h b/preload-index.h new file mode 100644 index 0000000000..251b1ed88e --- /dev/null +++ b/preload-index.h @@ -0,0 +1,15 @@ +#ifndef PRELOAD_INDEX_H +#define PRELOAD_INDEX_H + +struct index_state; +struct pathspec; +struct repository; + +void preload_index(struct index_state *index, + const struct pathspec *pathspec, + unsigned int refresh_flags); +int repo_read_index_preload(struct repository *, + const struct pathspec *pathspec, + unsigned refresh_flags); + +#endif /* PRELOAD_INDEX_H */ diff --git a/read-cache.c b/read-cache.c index e1016ae031..3fad839fb6 100644 --- a/read-cache.c +++ b/read-cache.c @@ -27,6 +27,7 @@ #include "mem-pool.h" #include "name-hash.h" #include "object-name.h" +#include "preload-index.h" #include "resolve-undo.h" #include "revision.h" #include "run-command.h" diff --git a/repository.h b/repository.h index 74ae26635a..655a95026d 100644 --- a/repository.h +++ b/repository.h @@ -221,9 +221,6 @@ int repo_hold_locked_index(struct repository *repo, struct lock_file *lf, int flags); -int repo_read_index_preload(struct repository *, - const struct pathspec *pathspec, - unsigned refresh_flags); int repo_read_index_unmerged(struct repository *); /* * Opportunistically update the index but do not complain if we can't. From eaa966db798ca8b0313396f11fe7edfa78c2ddae Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Tue, 16 May 2023 06:33:53 +0000 Subject: [PATCH 13/28] diff.h: move declaration for global in diff.c from cache.h Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- cache.h | 3 --- diff.h | 2 ++ 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/cache.h b/cache.h index b79802a463..08f6fbd801 100644 --- a/cache.h +++ b/cache.h @@ -523,9 +523,6 @@ int add_files_to_cache(struct repository *repo, const char *prefix, const struct pathspec *pathspec, int include_sparse, int flags); -/* diff.c */ -extern int diff_auto_refresh_index; - /* ls-files */ void overlay_tree_on_index(struct index_state *istate, const char *tree_name, const char *prefix); diff --git a/diff.h b/diff.h index 6c10ce289d..5a0c91bb48 100644 --- a/diff.h +++ b/diff.h @@ -701,4 +701,6 @@ void print_stat_summary(FILE *fp, int files, int insertions, int deletions); void setup_diff_pager(struct diff_options *); +extern int diff_auto_refresh_index; + #endif /* DIFF_H */ From 750324ddb876b54f52578df26278bf99c1e51eb9 Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Tue, 16 May 2023 06:33:54 +0000 Subject: [PATCH 14/28] merge.h: move declarations for merge.c from cache.h Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- builtin/merge.c | 1 + builtin/pull.c | 1 + cache.h | 11 ----------- merge.c | 1 + merge.h | 17 +++++++++++++++++ sequencer.c | 1 + 6 files changed, 21 insertions(+), 11 deletions(-) create mode 100644 merge.h diff --git a/builtin/merge.c b/builtin/merge.c index 8da3e46abb..6e8f7b9bb5 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -37,6 +37,7 @@ #include "color.h" #include "rerere.h" #include "help.h" +#include "merge.h" #include "merge-recursive.h" #include "merge-ort-wrappers.h" #include "resolve-undo.h" diff --git a/builtin/pull.c b/builtin/pull.c index 0c7bac97b7..eb60c9d52f 100644 --- a/builtin/pull.c +++ b/builtin/pull.c @@ -12,6 +12,7 @@ #include "builtin.h" #include "gettext.h" #include "hex.h" +#include "merge.h" #include "object-name.h" #include "parse-options.h" #include "exec-cmd.h" diff --git a/cache.h b/cache.h index 08f6fbd801..5b690b80a1 100644 --- a/cache.h +++ b/cache.h @@ -527,15 +527,4 @@ int add_files_to_cache(struct repository *repo, const char *prefix, void overlay_tree_on_index(struct index_state *istate, const char *tree_name, const char *prefix); -/* merge.c */ -struct commit_list; -int try_merge_command(struct repository *r, - const char *strategy, size_t xopts_nr, - const char **xopts, struct commit_list *common, - const char *head_arg, struct commit_list *remotes); -int checkout_fast_forward(struct repository *r, - const struct object_id *from, - const struct object_id *to, - int overwrite_ignore); - #endif /* CACHE_H */ diff --git a/merge.c b/merge.c index 10aaec3a6c..fade6b203b 100644 --- a/merge.c +++ b/merge.c @@ -4,6 +4,7 @@ #include "gettext.h" #include "hex.h" #include "lockfile.h" +#include "merge.h" #include "commit.h" #include "run-command.h" #include "resolve-undo.h" diff --git a/merge.h b/merge.h new file mode 100644 index 0000000000..21ac7ef2f1 --- /dev/null +++ b/merge.h @@ -0,0 +1,17 @@ +#ifndef MERGE_H +#define MERGE_H + +struct commit_list; +struct object_id; +struct repository; + +int try_merge_command(struct repository *r, + const char *strategy, size_t xopts_nr, + const char **xopts, struct commit_list *common, + const char *head_arg, struct commit_list *remotes); +int checkout_fast_forward(struct repository *r, + const struct object_id *from, + const struct object_id *to, + int overwrite_ignore); + +#endif /* MERGE_H */ diff --git a/sequencer.c b/sequencer.c index d132cd884f..bdcf2cc6d9 100644 --- a/sequencer.c +++ b/sequencer.c @@ -25,6 +25,7 @@ #include "diff.h" #include "revision.h" #include "rerere.h" +#include "merge.h" #include "merge-ort.h" #include "merge-ort-wrappers.h" #include "refs.h" From bc47f16db2bccb0398edd93af27086f35a3cb97a Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Tue, 16 May 2023 06:33:55 +0000 Subject: [PATCH 15/28] repository.h: move declaration of the_index from cache.h the_index is a global variable defined in repository.c; as such, its declaration feels better suited living in repository.h rather than cache.h. Move it. Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- cache.h | 4 ---- repository.h | 3 +++ t/helper/test-dump-split-index.c | 1 + 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cache.h b/cache.h index 5b690b80a1..1188289774 100644 --- a/cache.h +++ b/cache.h @@ -312,10 +312,6 @@ typedef int (*must_prefetch_predicate)(const struct cache_entry *); void prefetch_cache_entries(const struct index_state *istate, must_prefetch_predicate must_prefetch); -#ifdef USE_THE_INDEX_VARIABLE -extern struct index_state the_index; -#endif - /* Initialize and use the cache information */ struct lock_file; int do_read_index(struct index_state *istate, const char *path, diff --git a/repository.h b/repository.h index 655a95026d..1cb314721c 100644 --- a/repository.h +++ b/repository.h @@ -170,6 +170,9 @@ struct repository { }; extern struct repository *the_repository; +#ifdef USE_THE_INDEX_VARIABLE +extern struct index_state the_index; +#endif /* * Define a custom repository layout. Any field can be NULL, which diff --git a/t/helper/test-dump-split-index.c b/t/helper/test-dump-split-index.c index d1badd7112..63fde9157c 100644 --- a/t/helper/test-dump-split-index.c +++ b/t/helper/test-dump-split-index.c @@ -2,6 +2,7 @@ #include "test-tool.h" #include "cache.h" #include "hex.h" +#include "repository.h" #include "setup.h" #include "split-index.h" #include "ewah/ewok.h" From 08c46a499aec5b6459fb1d55ff90403c7dc2ee5a Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Tue, 16 May 2023 06:33:56 +0000 Subject: [PATCH 16/28] read-cache*.h: move declarations for read-cache.c functions from cache.h For the functions defined in read-cache.c, move their declarations from cache.h to a new header, read-cache-ll.h. Also move some related inline functions from cache.h to read-cache.h. The purpose of the read-cache-ll.h/read-cache.h split is that about 70% of the sites don't need the inline functions and the extra headers they include. Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- add-interactive.c | 1 + add-patch.c | 1 + apply.c | 1 + attr.c | 1 + blame.c | 1 + builtin/add.c | 1 + builtin/checkout--worker.c | 1 + builtin/checkout-index.c | 1 + builtin/checkout.c | 1 + builtin/clean.c | 1 + builtin/commit.c | 1 + builtin/describe.c | 1 + builtin/diff-tree.c | 1 + builtin/diff.c | 1 + builtin/difftool.c | 1 + builtin/fsck.c | 1 + builtin/grep.c | 1 + builtin/ls-files.c | 1 + builtin/merge-index.c | 1 + builtin/mv.c | 1 + builtin/pull.c | 1 + builtin/rev-parse.c | 1 + builtin/rm.c | 1 + builtin/stash.c | 1 + builtin/submodule--helper.c | 1 + builtin/update-index.c | 1 + builtin/worktree.c | 1 + cache-tree.c | 1 + cache.h | 520 --------------------------- compat/precompose_utf8.c | 1 + compat/sha1-chunked.c | 1 + config.c | 1 + convert.c | 1 + diff-lib.c | 1 + diff.c | 1 + diffcore-break.c | 3 +- environment.h | 3 +- fsmonitor.h | 2 + git.c | 1 + hash-lookup.c | 1 + merge-ort-wrappers.c | 1 + merge-ort.c | 1 + name-hash.c | 2 + object-name.c | 1 + oidmap.h | 1 + parallel-checkout.c | 1 + pathspec.c | 1 + preload-index.c | 1 + read-cache-ll.h | 481 +++++++++++++++++++++++++ read-cache.c | 1 + read-cache.h | 45 +++ repository.c | 1 + rerere.c | 1 + resolve-undo.c | 1 + revision.c | 1 + split-index.c | 1 + submodule.c | 1 + t/helper/test-cache-tree.c | 1 + t/helper/test-dump-cache-tree.c | 1 + t/helper/test-dump-fsmonitor.c | 1 + t/helper/test-dump-split-index.c | 1 + t/helper/test-dump-untracked-cache.c | 1 + t/helper/test-fast-rebase.c | 1 + t/helper/test-fsmonitor-client.c | 1 + t/helper/test-hash-speed.c | 1 + t/helper/test-index-version.c | 1 + t/helper/test-lazy-init-name-hash.c | 1 + t/helper/test-path-utils.c | 1 + t/helper/test-read-cache.c | 1 + t/helper/test-scrap-cache-tree.c | 1 + t/helper/test-sha1.c | 1 + t/helper/test-sha256.c | 1 + t/helper/test-strcmp-offset.c | 1 + t/helper/test-write-cache.c | 1 + unpack-trees.c | 1 + unpack-trees.h | 2 +- wt-status.c | 1 + 77 files changed, 603 insertions(+), 524 deletions(-) create mode 100644 read-cache-ll.h create mode 100644 read-cache.h diff --git a/add-interactive.c b/add-interactive.c index 99f7dc3b0d..a9671e3349 100644 --- a/add-interactive.c +++ b/add-interactive.c @@ -6,6 +6,7 @@ #include "gettext.h" #include "hex.h" #include "preload-index.h" +#include "read-cache-ll.h" #include "revision.h" #include "refs.h" #include "string-list.h" diff --git a/add-patch.c b/add-patch.c index 8d770d203f..7d4d298286 100644 --- a/add-patch.c +++ b/add-patch.c @@ -6,6 +6,7 @@ #include "environment.h" #include "gettext.h" #include "object-name.h" +#include "read-cache-ll.h" #include "strbuf.h" #include "run-command.h" #include "strvec.h" diff --git a/apply.c b/apply.c index 3da33bb88f..f056c8f3bb 100644 --- a/apply.c +++ b/apply.c @@ -28,6 +28,7 @@ #include "object-file.h" #include "parse-options.h" #include "quote.h" +#include "read-cache.h" #include "rerere.h" #include "apply.h" #include "entry.h" diff --git a/attr.c b/attr.c index d45d34058d..475241c5c4 100644 --- a/attr.c +++ b/attr.c @@ -16,6 +16,7 @@ #include "gettext.h" #include "utf8.h" #include "quote.h" +#include "read-cache-ll.h" #include "revision.h" #include "object-store.h" #include "setup.h" diff --git a/blame.c b/blame.c index b830654062..a0c7b5c065 100644 --- a/blame.c +++ b/blame.c @@ -8,6 +8,7 @@ #include "diffcore.h" #include "gettext.h" #include "hex.h" +#include "read-cache.h" #include "setup.h" #include "tag.h" #include "trace2.h" diff --git a/builtin/add.c b/builtin/add.c index 8397be4f8d..9fe6b6ce29 100644 --- a/builtin/add.c +++ b/builtin/add.c @@ -20,6 +20,7 @@ #include "preload-index.h" #include "diff.h" #include "diffcore.h" +#include "read-cache.h" #include "revision.h" #include "bulk-checkin.h" #include "strvec.h" diff --git a/builtin/checkout--worker.c b/builtin/checkout--worker.c index 2120dd1d30..c655dc4b13 100644 --- a/builtin/checkout--worker.c +++ b/builtin/checkout--worker.c @@ -6,6 +6,7 @@ #include "parallel-checkout.h" #include "parse-options.h" #include "pkt-line.h" +#include "read-cache-ll.h" static void packet_to_pc_item(const char *buffer, int len, struct parallel_checkout_item *pc_item) diff --git a/builtin/checkout-index.c b/builtin/checkout-index.c index b1cd8bef26..f62f13f2b5 100644 --- a/builtin/checkout-index.c +++ b/builtin/checkout-index.c @@ -16,6 +16,7 @@ #include "parse-options.h" #include "entry.h" #include "parallel-checkout.h" +#include "read-cache-ll.h" #include "setup.h" #include "sparse-index.h" diff --git a/builtin/checkout.c b/builtin/checkout.c index 2d72a742d9..09b8415649 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -21,6 +21,7 @@ #include "object-store.h" #include "parse-options.h" #include "preload-index.h" +#include "read-cache.h" #include "refs.h" #include "remote.h" #include "resolve-undo.h" diff --git a/builtin/clean.c b/builtin/clean.c index 78852d28ce..49c7af45b0 100644 --- a/builtin/clean.c +++ b/builtin/clean.c @@ -14,6 +14,7 @@ #include "dir.h" #include "gettext.h" #include "parse-options.h" +#include "read-cache-ll.h" #include "repository.h" #include "setup.h" #include "string-list.h" diff --git a/builtin/commit.c b/builtin/commit.c index 877955e894..829daaca9d 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -31,6 +31,7 @@ #include "object-name.h" #include "parse-options.h" #include "preload-index.h" +#include "read-cache.h" #include "string-list.h" #include "rerere.h" #include "unpack-trees.h" diff --git a/builtin/describe.c b/builtin/describe.c index 55b4baaa22..f1be7c3694 100644 --- a/builtin/describe.c +++ b/builtin/describe.c @@ -13,6 +13,7 @@ #include "exec-cmd.h" #include "object-name.h" #include "parse-options.h" +#include "read-cache-ll.h" #include "revision.h" #include "diff.h" #include "hashmap.h" diff --git a/builtin/diff-tree.c b/builtin/diff-tree.c index c0540317fb..8f7dff8eb3 100644 --- a/builtin/diff-tree.c +++ b/builtin/diff-tree.c @@ -8,6 +8,7 @@ #include "log-tree.h" #include "builtin.h" #include "submodule.h" +#include "read-cache-ll.h" #include "repository.h" #include "tree.h" diff --git a/builtin/diff.c b/builtin/diff.c index 967550739a..a9ce701ff9 100644 --- a/builtin/diff.c +++ b/builtin/diff.c @@ -17,6 +17,7 @@ #include "diff-merges.h" #include "diffcore.h" #include "preload-index.h" +#include "read-cache-ll.h" #include "revision.h" #include "log-tree.h" #include "builtin.h" diff --git a/builtin/difftool.c b/builtin/difftool.c index 2c27a59e04..88809976c5 100644 --- a/builtin/difftool.c +++ b/builtin/difftool.c @@ -23,6 +23,7 @@ #include "gettext.h" #include "hex.h" #include "parse-options.h" +#include "read-cache-ll.h" #include "sparse-index.h" #include "strvec.h" #include "strbuf.h" diff --git a/builtin/fsck.c b/builtin/fsck.c index 712e3dc68c..d4e04bb36e 100644 --- a/builtin/fsck.c +++ b/builtin/fsck.c @@ -22,6 +22,7 @@ #include "object-file.h" #include "object-name.h" #include "object-store.h" +#include "read-cache-ll.h" #include "replace-object.h" #include "resolve-undo.h" #include "run-command.h" diff --git a/builtin/grep.c b/builtin/grep.c index b86c754def..0d56757589 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -31,6 +31,7 @@ #include "object-store.h" #include "packfile.h" #include "pager.h" +#include "read-cache-ll.h" #include "write-or-die.h" static const char *grep_prefix; diff --git a/builtin/ls-files.c b/builtin/ls-files.c index b6238966d2..a0bea8f06c 100644 --- a/builtin/ls-files.c +++ b/builtin/ls-files.c @@ -21,6 +21,7 @@ #include "resolve-undo.h" #include "string-list.h" #include "pathspec.h" +#include "read-cache.h" #include "run-command.h" #include "setup.h" #include "sparse-index.h" diff --git a/builtin/merge-index.c b/builtin/merge-index.c index d16e8aa414..270d5f644a 100644 --- a/builtin/merge-index.c +++ b/builtin/merge-index.c @@ -1,6 +1,7 @@ #define USE_THE_INDEX_VARIABLE #include "builtin.h" #include "hex.h" +#include "read-cache-ll.h" #include "repository.h" #include "run-command.h" #include "sparse-index.h" diff --git a/builtin/mv.c b/builtin/mv.c index e058b57465..ae462bd7d4 100644 --- a/builtin/mv.c +++ b/builtin/mv.c @@ -19,6 +19,7 @@ #include "cache-tree.h" #include "string-list.h" #include "parse-options.h" +#include "read-cache-ll.h" #include "repository.h" #include "setup.h" #include "submodule.h" diff --git a/builtin/pull.c b/builtin/pull.c index eb60c9d52f..3052244b17 100644 --- a/builtin/pull.c +++ b/builtin/pull.c @@ -20,6 +20,7 @@ #include "oid-array.h" #include "remote.h" #include "dir.h" +#include "read-cache-ll.h" #include "rebase.h" #include "refs.h" #include "refspec.h" diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c index 852e49e340..ad93e5fad8 100644 --- a/builtin/rev-parse.c +++ b/builtin/rev-parse.c @@ -18,6 +18,7 @@ #include "object-name.h" #include "parse-options.h" #include "diff.h" +#include "read-cache-ll.h" #include "revision.h" #include "setup.h" #include "split-index.h" diff --git a/builtin/rm.c b/builtin/rm.c index 377a0f66ad..463eeabcea 100644 --- a/builtin/rm.c +++ b/builtin/rm.c @@ -16,6 +16,7 @@ #include "tree-walk.h" #include "object-name.h" #include "parse-options.h" +#include "read-cache.h" #include "repository.h" #include "string-list.h" #include "setup.h" diff --git a/builtin/stash.c b/builtin/stash.c index 06527ee847..d3d5bb95e2 100644 --- a/builtin/stash.c +++ b/builtin/stash.c @@ -18,6 +18,7 @@ #include "dir.h" #include "entry.h" #include "preload-index.h" +#include "read-cache.h" #include "rerere.h" #include "revision.h" #include "setup.h" diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c index 7b201d76a8..02f295e741 100644 --- a/builtin/submodule--helper.c +++ b/builtin/submodule--helper.c @@ -13,6 +13,7 @@ #include "pathspec.h" #include "preload-index.h" #include "dir.h" +#include "read-cache.h" #include "setup.h" #include "sparse-index.h" #include "submodule.h" diff --git a/builtin/update-index.c b/builtin/update-index.c index 47dc9b626e..484a307df5 100644 --- a/builtin/update-index.c +++ b/builtin/update-index.c @@ -22,6 +22,7 @@ #include "parse-options.h" #include "pathspec.h" #include "dir.h" +#include "read-cache.h" #include "repository.h" #include "setup.h" #include "sparse-index.h" diff --git a/builtin/worktree.c b/builtin/worktree.c index 60e389aaed..efe520fe95 100644 --- a/builtin/worktree.c +++ b/builtin/worktree.c @@ -13,6 +13,7 @@ #include "parse-options.h" #include "strvec.h" #include "branch.h" +#include "read-cache-ll.h" #include "refs.h" #include "repository.h" #include "run-command.h" diff --git a/cache-tree.c b/cache-tree.c index ebfe649b33..153217b47f 100644 --- a/cache-tree.c +++ b/cache-tree.c @@ -9,6 +9,7 @@ #include "bulk-checkin.h" #include "object-file.h" #include "object-store.h" +#include "read-cache-ll.h" #include "replace-object.h" #include "promisor-remote.h" #include "sparse-index.h" diff --git a/cache.h b/cache.h index 1188289774..9b4e8d1687 100644 --- a/cache.h +++ b/cache.h @@ -2,525 +2,5 @@ #define CACHE_H #include "git-compat-util.h" -#include "strbuf.h" -#include "hashmap.h" -#include "pathspec.h" -#include "object.h" -#include "statinfo.h" - -/* - * Basic data structures for the directory cache - */ - -#define CACHE_SIGNATURE 0x44495243 /* "DIRC" */ -struct cache_header { - uint32_t hdr_signature; - uint32_t hdr_version; - uint32_t hdr_entries; -}; - -#define INDEX_FORMAT_LB 2 -#define INDEX_FORMAT_UB 4 - -struct cache_entry { - struct hashmap_entry ent; - struct stat_data ce_stat_data; - unsigned int ce_mode; - unsigned int ce_flags; - unsigned int mem_pool_allocated; - unsigned int ce_namelen; - unsigned int index; /* for link extension */ - struct object_id oid; - char name[FLEX_ARRAY]; /* more */ -}; - -#define CE_STAGEMASK (0x3000) -#define CE_EXTENDED (0x4000) -#define CE_VALID (0x8000) -#define CE_STAGESHIFT 12 - -/* - * Range 0xFFFF0FFF in ce_flags is divided into - * two parts: in-memory flags and on-disk ones. - * Flags in CE_EXTENDED_FLAGS will get saved on-disk - * if you want to save a new flag, add it in - * CE_EXTENDED_FLAGS - * - * In-memory only flags - */ -#define CE_UPDATE (1 << 16) -#define CE_REMOVE (1 << 17) -#define CE_UPTODATE (1 << 18) -#define CE_ADDED (1 << 19) - -#define CE_HASHED (1 << 20) -#define CE_FSMONITOR_VALID (1 << 21) -#define CE_WT_REMOVE (1 << 22) /* remove in work directory */ -#define CE_CONFLICTED (1 << 23) - -#define CE_UNPACKED (1 << 24) -#define CE_NEW_SKIP_WORKTREE (1 << 25) - -/* used to temporarily mark paths matched by pathspecs */ -#define CE_MATCHED (1 << 26) - -#define CE_UPDATE_IN_BASE (1 << 27) -#define CE_STRIP_NAME (1 << 28) - -/* - * Extended on-disk flags - */ -#define CE_INTENT_TO_ADD (1 << 29) -#define CE_SKIP_WORKTREE (1 << 30) -/* CE_EXTENDED2 is for future extension */ -#define CE_EXTENDED2 (1U << 31) - -#define CE_EXTENDED_FLAGS (CE_INTENT_TO_ADD | CE_SKIP_WORKTREE) - -/* - * Safeguard to avoid saving wrong flags: - * - CE_EXTENDED2 won't get saved until its semantic is known - * - Bits in 0x0000FFFF have been saved in ce_flags already - * - Bits in 0x003F0000 are currently in-memory flags - */ -#if CE_EXTENDED_FLAGS & 0x803FFFFF -#error "CE_EXTENDED_FLAGS out of range" -#endif - -/* Forward structure decls */ -struct pathspec; -struct tree; - -/* - * Copy the sha1 and stat state of a cache entry from one to - * another. But we never change the name, or the hash state! - */ -static inline void copy_cache_entry(struct cache_entry *dst, - const struct cache_entry *src) -{ - unsigned int state = dst->ce_flags & CE_HASHED; - int mem_pool_allocated = dst->mem_pool_allocated; - - /* Don't copy hash chain and name */ - memcpy(&dst->ce_stat_data, &src->ce_stat_data, - offsetof(struct cache_entry, name) - - offsetof(struct cache_entry, ce_stat_data)); - - /* Restore the hash state */ - dst->ce_flags = (dst->ce_flags & ~CE_HASHED) | state; - - /* Restore the mem_pool_allocated flag */ - dst->mem_pool_allocated = mem_pool_allocated; -} - -static inline unsigned create_ce_flags(unsigned stage) -{ - return (stage << CE_STAGESHIFT); -} - -#define ce_namelen(ce) ((ce)->ce_namelen) -#define ce_size(ce) cache_entry_size(ce_namelen(ce)) -#define ce_stage(ce) ((CE_STAGEMASK & (ce)->ce_flags) >> CE_STAGESHIFT) -#define ce_uptodate(ce) ((ce)->ce_flags & CE_UPTODATE) -#define ce_skip_worktree(ce) ((ce)->ce_flags & CE_SKIP_WORKTREE) -#define ce_mark_uptodate(ce) ((ce)->ce_flags |= CE_UPTODATE) -#define ce_intent_to_add(ce) ((ce)->ce_flags & CE_INTENT_TO_ADD) - -static inline unsigned int ce_mode_from_stat(const struct cache_entry *ce, - unsigned int mode) -{ - extern int trust_executable_bit, has_symlinks; - if (!has_symlinks && S_ISREG(mode) && - ce && S_ISLNK(ce->ce_mode)) - return ce->ce_mode; - if (!trust_executable_bit && S_ISREG(mode)) { - if (ce && S_ISREG(ce->ce_mode)) - return ce->ce_mode; - return create_ce_mode(0666); - } - return create_ce_mode(mode); -} -static inline int ce_to_dtype(const struct cache_entry *ce) -{ - unsigned ce_mode = ntohl(ce->ce_mode); - if (S_ISREG(ce_mode)) - return DT_REG; - else if (S_ISDIR(ce_mode) || S_ISGITLINK(ce_mode)) - return DT_DIR; - else if (S_ISLNK(ce_mode)) - return DT_LNK; - else - return DT_UNKNOWN; -} - -static inline int ce_path_match(struct index_state *istate, - const struct cache_entry *ce, - const struct pathspec *pathspec, - char *seen) -{ - return match_pathspec(istate, pathspec, ce->name, ce_namelen(ce), 0, seen, - S_ISDIR(ce->ce_mode) || S_ISGITLINK(ce->ce_mode)); -} - -#define cache_entry_size(len) (offsetof(struct cache_entry,name) + (len) + 1) - -#define SOMETHING_CHANGED (1 << 0) /* unclassified changes go here */ -#define CE_ENTRY_CHANGED (1 << 1) -#define CE_ENTRY_REMOVED (1 << 2) -#define CE_ENTRY_ADDED (1 << 3) -#define RESOLVE_UNDO_CHANGED (1 << 4) -#define CACHE_TREE_CHANGED (1 << 5) -#define SPLIT_INDEX_ORDERED (1 << 6) -#define UNTRACKED_CHANGED (1 << 7) -#define FSMONITOR_CHANGED (1 << 8) - -struct split_index; -struct untracked_cache; -struct progress; -struct pattern_list; - -enum sparse_index_mode { - /* - * There are no sparse directories in the index at all. - * - * Repositories that don't use cone-mode sparse-checkout will - * always have their indexes in this mode. - */ - INDEX_EXPANDED = 0, - - /* - * The index has already been collapsed to sparse directories - * whereever possible. - */ - INDEX_COLLAPSED, - - /* - * The sparse directories that exist are outside the - * sparse-checkout boundary, but it is possible that some file - * entries could collapse to sparse directory entries. - */ - INDEX_PARTIALLY_SPARSE, -}; - -struct index_state { - struct cache_entry **cache; - unsigned int version; - unsigned int cache_nr, cache_alloc, cache_changed; - struct string_list *resolve_undo; - struct cache_tree *cache_tree; - struct split_index *split_index; - struct cache_time timestamp; - unsigned name_hash_initialized : 1, - initialized : 1, - drop_cache_tree : 1, - updated_workdir : 1, - updated_skipworktree : 1, - fsmonitor_has_run_once : 1; - enum sparse_index_mode sparse_index; - struct hashmap name_hash; - struct hashmap dir_hash; - struct object_id oid; - struct untracked_cache *untracked; - char *fsmonitor_last_update; - struct ewah_bitmap *fsmonitor_dirty; - struct mem_pool *ce_mem_pool; - struct progress *progress; - struct repository *repo; - struct pattern_list *sparse_checkout_patterns; -}; - -/** - * A "struct index_state istate" must be initialized with - * INDEX_STATE_INIT or the corresponding index_state_init(). - * - * If the variable won't be used again, use release_index() to free() - * its resources. If it needs to be used again use discard_index(), - * which does the same thing, but will use use index_state_init() at - * the end. The discard_index() will use its own "istate->repo" as the - * "r" argument to index_state_init() in that case. - */ -#define INDEX_STATE_INIT(r) { \ - .repo = (r), \ -} -void index_state_init(struct index_state *istate, struct repository *r); -void release_index(struct index_state *istate); - -/* Cache entry creation and cleanup */ - -/* - * Create cache_entry intended for use in the specified index. Caller - * is responsible for discarding the cache_entry with - * `discard_cache_entry`. - */ -struct cache_entry *make_cache_entry(struct index_state *istate, - unsigned int mode, - const struct object_id *oid, - const char *path, - int stage, - unsigned int refresh_options); - -struct cache_entry *make_empty_cache_entry(struct index_state *istate, - size_t name_len); - -/* - * Create a cache_entry that is not intended to be added to an index. If - * `ce_mem_pool` is not NULL, the entry is allocated within the given memory - * pool. Caller is responsible for discarding "loose" entries with - * `discard_cache_entry()` and the memory pool with - * `mem_pool_discard(ce_mem_pool, should_validate_cache_entries())`. - */ -struct cache_entry *make_transient_cache_entry(unsigned int mode, - const struct object_id *oid, - const char *path, - int stage, - struct mem_pool *ce_mem_pool); - -struct cache_entry *make_empty_transient_cache_entry(size_t len, - struct mem_pool *ce_mem_pool); - -/* - * Discard cache entry. - */ -void discard_cache_entry(struct cache_entry *ce); - -/* - * Check configuration if we should perform extra validation on cache - * entries. - */ -int should_validate_cache_entries(void); - -/* - * Duplicate a cache_entry. Allocate memory for the new entry from a - * memory_pool. Takes into account cache_entry fields that are meant - * for managing the underlying memory allocation of the cache_entry. - */ -struct cache_entry *dup_cache_entry(const struct cache_entry *ce, struct index_state *istate); - -/* - * Validate the cache entries in the index. This is an internal - * consistency check that the cache_entry structs are allocated from - * the expected memory pool. - */ -void validate_cache_entries(const struct index_state *istate); - -/* - * Bulk prefetch all missing cache entries that are not GITLINKs and that match - * the given predicate. This function should only be called if - * repo_has_promisor_remote() returns true. - */ -typedef int (*must_prefetch_predicate)(const struct cache_entry *); -void prefetch_cache_entries(const struct index_state *istate, - must_prefetch_predicate must_prefetch); - -/* Initialize and use the cache information */ -struct lock_file; -int do_read_index(struct index_state *istate, const char *path, - int must_exist); /* for testting only! */ -int read_index_from(struct index_state *, const char *path, - const char *gitdir); -int is_index_unborn(struct index_state *); - -/* For use with `write_locked_index()`. */ -#define COMMIT_LOCK (1 << 0) -#define SKIP_IF_UNCHANGED (1 << 1) - -/* - * Write the index while holding an already-taken lock. Close the lock, - * and if `COMMIT_LOCK` is given, commit it. - * - * Unless a split index is in use, write the index into the lockfile. - * - * With a split index, write the shared index to a temporary file, - * adjust its permissions and rename it into place, then write the - * split index to the lockfile. If the temporary file for the shared - * index cannot be created, fall back to the behavior described in - * the previous paragraph. - * - * With `COMMIT_LOCK`, the lock is always committed or rolled back. - * Without it, the lock is closed, but neither committed nor rolled - * back. - * - * If `SKIP_IF_UNCHANGED` is given and the index is unchanged, nothing - * is written (and the lock is rolled back if `COMMIT_LOCK` is given). - */ -int write_locked_index(struct index_state *, struct lock_file *lock, unsigned flags); - -void discard_index(struct index_state *); -void move_index_extensions(struct index_state *dst, struct index_state *src); -int unmerged_index(const struct index_state *); - -/** - * Returns 1 if istate differs from tree, 0 otherwise. If tree is NULL, - * compares istate to HEAD. If tree is NULL and on an unborn branch, - * returns 1 if there are entries in istate, 0 otherwise. If an strbuf is - * provided, the space-separated list of files that differ will be appended - * to it. - */ -int repo_index_has_changes(struct repository *repo, - struct tree *tree, - struct strbuf *sb); - -int verify_path(const char *path, unsigned mode); -int strcmp_offset(const char *s1, const char *s2, size_t *first_change); - -/* - * Searches for an entry defined by name and namelen in the given index. - * If the return value is positive (including 0) it is the position of an - * exact match. If the return value is negative, the negated value minus 1 - * is the position where the entry would be inserted. - * Example: The current index consists of these files and its stages: - * - * b#0, d#0, f#1, f#3 - * - * index_name_pos(&index, "a", 1) -> -1 - * index_name_pos(&index, "b", 1) -> 0 - * index_name_pos(&index, "c", 1) -> -2 - * index_name_pos(&index, "d", 1) -> 1 - * index_name_pos(&index, "e", 1) -> -3 - * index_name_pos(&index, "f", 1) -> -3 - * index_name_pos(&index, "g", 1) -> -5 - */ -int index_name_pos(struct index_state *, const char *name, int namelen); - -/* - * Like index_name_pos, returns the position of an entry of the given name in - * the index if one exists, otherwise returns a negative value where the negated - * value minus 1 is the position where the index entry would be inserted. Unlike - * index_name_pos, however, a sparse index is not expanded to find an entry - * inside a sparse directory. - */ -int index_name_pos_sparse(struct index_state *, const char *name, int namelen); - -/* - * Determines whether an entry with the given name exists within the - * given index. The return value is 1 if an exact match is found, otherwise - * it is 0. Note that, unlike index_name_pos, this function does not expand - * the index if it is sparse. If an item exists within the full index but it - * is contained within a sparse directory (and not in the sparse index), 0 is - * returned. - */ -int index_entry_exists(struct index_state *, const char *name, int namelen); - -/* - * Some functions return the negative complement of an insert position when a - * precise match was not found but a position was found where the entry would - * need to be inserted. This helper protects that logic from any integer - * underflow. - */ -static inline int index_pos_to_insert_pos(uintmax_t pos) -{ - if (pos > INT_MAX) - die("overflow: -1 - %"PRIuMAX, pos); - return -1 - (int)pos; -} - -#define ADD_CACHE_OK_TO_ADD 1 /* Ok to add */ -#define ADD_CACHE_OK_TO_REPLACE 2 /* Ok to replace file/directory */ -#define ADD_CACHE_SKIP_DFCHECK 4 /* Ok to skip DF conflict checks */ -#define ADD_CACHE_JUST_APPEND 8 /* Append only */ -#define ADD_CACHE_NEW_ONLY 16 /* Do not replace existing ones */ -#define ADD_CACHE_KEEP_CACHE_TREE 32 /* Do not invalidate cache-tree */ -#define ADD_CACHE_RENORMALIZE 64 /* Pass along HASH_RENORMALIZE */ -int add_index_entry(struct index_state *, struct cache_entry *ce, int option); -void rename_index_entry_at(struct index_state *, int pos, const char *new_name); - -/* Remove entry, return true if there are more entries to go. */ -int remove_index_entry_at(struct index_state *, int pos); - -void remove_marked_cache_entries(struct index_state *istate, int invalidate); -int remove_file_from_index(struct index_state *, const char *path); -#define ADD_CACHE_VERBOSE 1 -#define ADD_CACHE_PRETEND 2 -#define ADD_CACHE_IGNORE_ERRORS 4 -#define ADD_CACHE_IGNORE_REMOVAL 8 -#define ADD_CACHE_INTENT 16 -/* - * These two are used to add the contents of the file at path - * to the index, marking the working tree up-to-date by storing - * the cached stat info in the resulting cache entry. A caller - * that has already run lstat(2) on the path can call - * add_to_index(), and all others can call add_file_to_index(); - * the latter will do necessary lstat(2) internally before - * calling the former. - */ -int add_to_index(struct index_state *, const char *path, struct stat *, int flags); -int add_file_to_index(struct index_state *, const char *path, int flags); - -int chmod_index_entry(struct index_state *, struct cache_entry *ce, char flip); -int ce_same_name(const struct cache_entry *a, const struct cache_entry *b); -void set_object_name_for_intent_to_add_entry(struct cache_entry *ce); -int index_name_is_other(struct index_state *, const char *, int); -void *read_blob_data_from_index(struct index_state *, const char *, unsigned long *); - -/* do stat comparison even if CE_VALID is true */ -#define CE_MATCH_IGNORE_VALID 01 -/* do not check the contents but report dirty on racily-clean entries */ -#define CE_MATCH_RACY_IS_DIRTY 02 -/* do stat comparison even if CE_SKIP_WORKTREE is true */ -#define CE_MATCH_IGNORE_SKIP_WORKTREE 04 -/* ignore non-existent files during stat update */ -#define CE_MATCH_IGNORE_MISSING 0x08 -/* enable stat refresh */ -#define CE_MATCH_REFRESH 0x10 -/* don't refresh_fsmonitor state or do stat comparison even if CE_FSMONITOR_VALID is true */ -#define CE_MATCH_IGNORE_FSMONITOR 0X20 -int is_racy_timestamp(const struct index_state *istate, - const struct cache_entry *ce); -int has_racy_timestamp(struct index_state *istate); -int ie_match_stat(struct index_state *, const struct cache_entry *, struct stat *, unsigned int); -int ie_modified(struct index_state *, const struct cache_entry *, struct stat *, unsigned int); - -int match_stat_data_racy(const struct index_state *istate, - const struct stat_data *sd, struct stat *st); - -void fill_stat_cache_info(struct index_state *istate, struct cache_entry *ce, struct stat *st); - -#define REFRESH_REALLY (1 << 0) /* ignore_valid */ -#define REFRESH_UNMERGED (1 << 1) /* allow unmerged */ -#define REFRESH_QUIET (1 << 2) /* be quiet about it */ -#define REFRESH_IGNORE_MISSING (1 << 3) /* ignore non-existent */ -#define REFRESH_IGNORE_SUBMODULES (1 << 4) /* ignore submodules */ -#define REFRESH_IN_PORCELAIN (1 << 5) /* user friendly output, not "needs update" */ -#define REFRESH_PROGRESS (1 << 6) /* show progress bar if stderr is tty */ -#define REFRESH_IGNORE_SKIP_WORKTREE (1 << 7) /* ignore skip_worktree entries */ -int refresh_index(struct index_state *, unsigned int flags, const struct pathspec *pathspec, char *seen, const char *header_msg); -/* - * Refresh the index and write it to disk. - * - * 'refresh_flags' is passed directly to 'refresh_index()', while - * 'COMMIT_LOCK | write_flags' is passed to 'write_locked_index()', so - * the lockfile is always either committed or rolled back. - * - * If 'gentle' is passed, errors locking the index are ignored. - * - * Return 1 if refreshing the index returns an error, -1 if writing - * the index to disk fails, 0 on success. - * - * Note that if refreshing the index returns an error, we still write - * out the index (unless locking fails). - */ -int repo_refresh_and_write_index(struct repository*, unsigned int refresh_flags, unsigned int write_flags, int gentle, const struct pathspec *, char *seen, const char *header_msg); - -struct cache_entry *refresh_cache_entry(struct index_state *, struct cache_entry *, unsigned int); - -void set_alternate_index_output(const char *); - -extern int verify_index_checksum; -extern int verify_ce_order; - -int cmp_cache_name_compare(const void *a_, const void *b_); - -/* add */ -/* - * return 0 if success, 1 - if addition of a file failed and - * ADD_FILES_IGNORE_ERRORS was specified in flags - */ -int add_files_to_cache(struct repository *repo, const char *prefix, - const struct pathspec *pathspec, int include_sparse, - int flags); - -/* ls-files */ -void overlay_tree_on_index(struct index_state *istate, - const char *tree_name, const char *prefix); #endif /* CACHE_H */ diff --git a/compat/precompose_utf8.c b/compat/precompose_utf8.c index a4d11376ba..fb08475bc6 100644 --- a/compat/precompose_utf8.c +++ b/compat/precompose_utf8.c @@ -10,6 +10,7 @@ #include "environment.h" #include "gettext.h" #include "path.h" +#include "strbuf.h" #include "utf8.h" #include "precompose_utf8.h" diff --git a/compat/sha1-chunked.c b/compat/sha1-chunked.c index 6adfcfd540..56729d92dc 100644 --- a/compat/sha1-chunked.c +++ b/compat/sha1-chunked.c @@ -1,4 +1,5 @@ #include "cache.h" +#include "hash-ll.h" int git_SHA1_Update_Chunked(platform_SHA_CTX *c, const void *data, size_t len) { diff --git a/config.c b/config.c index f5bdac0aee..b92b75c5d0 100644 --- a/config.c +++ b/config.c @@ -33,6 +33,7 @@ #include "replace-object.h" #include "refs.h" #include "setup.h" +#include "strvec.h" #include "trace2.h" #include "worktree.h" #include "ws.h" diff --git a/convert.c b/convert.c index 9ee79fe469..b421065f21 100644 --- a/convert.c +++ b/convert.c @@ -9,6 +9,7 @@ #include "attr.h" #include "run-command.h" #include "quote.h" +#include "read-cache-ll.h" #include "sigchain.h" #include "pkt-line.h" #include "sub-process.h" diff --git a/diff-lib.c b/diff-lib.c index 60e979dc1b..36cd66ea23 100644 --- a/diff-lib.c +++ b/diff-lib.c @@ -9,6 +9,7 @@ #include "gettext.h" #include "hex.h" #include "object-name.h" +#include "read-cache.h" #include "revision.h" #include "cache-tree.h" #include "unpack-trees.h" diff --git a/diff.c b/diff.c index c106f8a4ff..a72811ee5d 100644 --- a/diff.c +++ b/diff.c @@ -39,6 +39,7 @@ #include "dir.h" #include "object-file.h" #include "object-name.h" +#include "read-cache-ll.h" #include "setup.h" #include "strmap.h" #include "ws.h" diff --git a/diffcore-break.c b/diffcore-break.c index 5462420bbb..4909dc088e 100644 --- a/diffcore-break.c +++ b/diffcore-break.c @@ -1,9 +1,10 @@ /* * Copyright (C) 2005 Junio C Hamano */ -#include "cache.h" +#include "git-compat-util.h" #include "diff.h" #include "diffcore.h" +#include "object.h" #include "promisor-remote.h" static int should_break(struct repository *r, diff --git a/environment.h b/environment.h index e666807926..611aa0ffed 100644 --- a/environment.h +++ b/environment.h @@ -1,9 +1,8 @@ #ifndef ENVIRONMENT_H #define ENVIRONMENT_H -#include "strvec.h" - struct repository; +struct strvec; /* * The character that begins a commented line in user-editable file diff --git a/fsmonitor.h b/fsmonitor.h index c67e0ebc09..8b7a521552 100644 --- a/fsmonitor.h +++ b/fsmonitor.h @@ -4,6 +4,8 @@ #include "cache.h" #include "dir.h" #include "fsmonitor-settings.h" +#include "object.h" +#include "read-cache-ll.h" #include "trace.h" extern struct trace_key trace_fsmonitor; diff --git a/git.c b/git.c index 2f42da20f4..eb69f4f997 100644 --- a/git.c +++ b/git.c @@ -5,6 +5,7 @@ #include "gettext.h" #include "help.h" #include "pager.h" +#include "read-cache-ll.h" #include "run-command.h" #include "alias.h" #include "replace-object.h" diff --git a/hash-lookup.c b/hash-lookup.c index bb54dfde9c..8fec8939fd 100644 --- a/hash-lookup.c +++ b/hash-lookup.c @@ -1,6 +1,7 @@ #include "cache.h" #include "hash.h" #include "hash-lookup.h" +#include "read-cache-ll.h" static uint32_t take2(const struct object_id *oid, size_t ofs) { diff --git a/merge-ort-wrappers.c b/merge-ort-wrappers.c index a550753300..a0bedcb63b 100644 --- a/merge-ort-wrappers.c +++ b/merge-ort-wrappers.c @@ -3,6 +3,7 @@ #include "hash.h" #include "merge-ort.h" #include "merge-ort-wrappers.h" +#include "read-cache-ll.h" #include "tree.h" #include "commit.h" diff --git a/merge-ort.c b/merge-ort.c index 69e3c4a890..17167f56dc 100644 --- a/merge-ort.c +++ b/merge-ort.c @@ -37,6 +37,7 @@ #include "object-store.h" #include "oid-array.h" #include "promisor-remote.h" +#include "read-cache-ll.h" #include "revision.h" #include "sparse-index.h" #include "strmap.h" diff --git a/name-hash.c b/name-hash.c index 52ce47ea39..f2f3564cb2 100644 --- a/name-hash.c +++ b/name-hash.c @@ -9,6 +9,8 @@ #include "environment.h" #include "gettext.h" #include "name-hash.h" +#include "object.h" +#include "read-cache-ll.h" #include "thread-utils.h" #include "trace.h" #include "trace2.h" diff --git a/object-name.c b/object-name.c index 6fc3fa595b..1eefeef746 100644 --- a/object-name.c +++ b/object-name.c @@ -18,6 +18,7 @@ #include "packfile.h" #include "pretty.h" #include "object-store.h" +#include "read-cache-ll.h" #include "repository.h" #include "setup.h" #include "submodule.h" diff --git a/oidmap.h b/oidmap.h index c1642927fa..05c673eb7c 100644 --- a/oidmap.h +++ b/oidmap.h @@ -1,6 +1,7 @@ #ifndef OIDMAP_H #define OIDMAP_H +#include "hash-ll.h" #include "hashmap.h" /* diff --git a/parallel-checkout.c b/parallel-checkout.c index 69d569f352..2b1439c0c5 100644 --- a/parallel-checkout.c +++ b/parallel-checkout.c @@ -8,6 +8,7 @@ #include "parallel-checkout.h" #include "pkt-line.h" #include "progress.h" +#include "read-cache-ll.h" #include "run-command.h" #include "sigchain.h" #include "streaming.h" diff --git a/pathspec.c b/pathspec.c index 5049dbb528..f52ce60e41 100644 --- a/pathspec.c +++ b/pathspec.c @@ -6,6 +6,7 @@ #include "gettext.h" #include "pathspec.h" #include "attr.h" +#include "read-cache.h" #include "repository.h" #include "setup.h" #include "strvec.h" diff --git a/preload-index.c b/preload-index.c index c26739debf..d037a951ef 100644 --- a/preload-index.c +++ b/preload-index.c @@ -10,6 +10,7 @@ #include "config.h" #include "preload-index.h" #include "progress.h" +#include "read-cache.h" #include "thread-utils.h" #include "repository.h" #include "symlinks.h" diff --git a/read-cache-ll.h b/read-cache-ll.h new file mode 100644 index 0000000000..9a1a7edc5a --- /dev/null +++ b/read-cache-ll.h @@ -0,0 +1,481 @@ +#ifndef READ_CACHE_LL_H +#define READ_CACHE_LL_H + +#include "hash-ll.h" +#include "hashmap.h" +#include "statinfo.h" + +/* + * Basic data structures for the directory cache + */ + +#define CACHE_SIGNATURE 0x44495243 /* "DIRC" */ +struct cache_header { + uint32_t hdr_signature; + uint32_t hdr_version; + uint32_t hdr_entries; +}; + +#define INDEX_FORMAT_LB 2 +#define INDEX_FORMAT_UB 4 + +struct cache_entry { + struct hashmap_entry ent; + struct stat_data ce_stat_data; + unsigned int ce_mode; + unsigned int ce_flags; + unsigned int mem_pool_allocated; + unsigned int ce_namelen; + unsigned int index; /* for link extension */ + struct object_id oid; + char name[FLEX_ARRAY]; /* more */ +}; + +#define CE_STAGEMASK (0x3000) +#define CE_EXTENDED (0x4000) +#define CE_VALID (0x8000) +#define CE_STAGESHIFT 12 + +/* + * Range 0xFFFF0FFF in ce_flags is divided into + * two parts: in-memory flags and on-disk ones. + * Flags in CE_EXTENDED_FLAGS will get saved on-disk + * if you want to save a new flag, add it in + * CE_EXTENDED_FLAGS + * + * In-memory only flags + */ +#define CE_UPDATE (1 << 16) +#define CE_REMOVE (1 << 17) +#define CE_UPTODATE (1 << 18) +#define CE_ADDED (1 << 19) + +#define CE_HASHED (1 << 20) +#define CE_FSMONITOR_VALID (1 << 21) +#define CE_WT_REMOVE (1 << 22) /* remove in work directory */ +#define CE_CONFLICTED (1 << 23) + +#define CE_UNPACKED (1 << 24) +#define CE_NEW_SKIP_WORKTREE (1 << 25) + +/* used to temporarily mark paths matched by pathspecs */ +#define CE_MATCHED (1 << 26) + +#define CE_UPDATE_IN_BASE (1 << 27) +#define CE_STRIP_NAME (1 << 28) + +/* + * Extended on-disk flags + */ +#define CE_INTENT_TO_ADD (1 << 29) +#define CE_SKIP_WORKTREE (1 << 30) +/* CE_EXTENDED2 is for future extension */ +#define CE_EXTENDED2 (1U << 31) + +#define CE_EXTENDED_FLAGS (CE_INTENT_TO_ADD | CE_SKIP_WORKTREE) + +/* + * Safeguard to avoid saving wrong flags: + * - CE_EXTENDED2 won't get saved until its semantic is known + * - Bits in 0x0000FFFF have been saved in ce_flags already + * - Bits in 0x003F0000 are currently in-memory flags + */ +#if CE_EXTENDED_FLAGS & 0x803FFFFF +#error "CE_EXTENDED_FLAGS out of range" +#endif + +/* Forward structure decls */ +struct pathspec; +struct tree; + +/* + * Copy the sha1 and stat state of a cache entry from one to + * another. But we never change the name, or the hash state! + */ +static inline void copy_cache_entry(struct cache_entry *dst, + const struct cache_entry *src) +{ + unsigned int state = dst->ce_flags & CE_HASHED; + int mem_pool_allocated = dst->mem_pool_allocated; + + /* Don't copy hash chain and name */ + memcpy(&dst->ce_stat_data, &src->ce_stat_data, + offsetof(struct cache_entry, name) - + offsetof(struct cache_entry, ce_stat_data)); + + /* Restore the hash state */ + dst->ce_flags = (dst->ce_flags & ~CE_HASHED) | state; + + /* Restore the mem_pool_allocated flag */ + dst->mem_pool_allocated = mem_pool_allocated; +} + +static inline unsigned create_ce_flags(unsigned stage) +{ + return (stage << CE_STAGESHIFT); +} + +#define ce_namelen(ce) ((ce)->ce_namelen) +#define ce_size(ce) cache_entry_size(ce_namelen(ce)) +#define ce_stage(ce) ((CE_STAGEMASK & (ce)->ce_flags) >> CE_STAGESHIFT) +#define ce_uptodate(ce) ((ce)->ce_flags & CE_UPTODATE) +#define ce_skip_worktree(ce) ((ce)->ce_flags & CE_SKIP_WORKTREE) +#define ce_mark_uptodate(ce) ((ce)->ce_flags |= CE_UPTODATE) +#define ce_intent_to_add(ce) ((ce)->ce_flags & CE_INTENT_TO_ADD) + +#define cache_entry_size(len) (offsetof(struct cache_entry,name) + (len) + 1) + +#define SOMETHING_CHANGED (1 << 0) /* unclassified changes go here */ +#define CE_ENTRY_CHANGED (1 << 1) +#define CE_ENTRY_REMOVED (1 << 2) +#define CE_ENTRY_ADDED (1 << 3) +#define RESOLVE_UNDO_CHANGED (1 << 4) +#define CACHE_TREE_CHANGED (1 << 5) +#define SPLIT_INDEX_ORDERED (1 << 6) +#define UNTRACKED_CHANGED (1 << 7) +#define FSMONITOR_CHANGED (1 << 8) + +struct split_index; +struct untracked_cache; +struct progress; +struct pattern_list; + +enum sparse_index_mode { + /* + * There are no sparse directories in the index at all. + * + * Repositories that don't use cone-mode sparse-checkout will + * always have their indexes in this mode. + */ + INDEX_EXPANDED = 0, + + /* + * The index has already been collapsed to sparse directories + * whereever possible. + */ + INDEX_COLLAPSED, + + /* + * The sparse directories that exist are outside the + * sparse-checkout boundary, but it is possible that some file + * entries could collapse to sparse directory entries. + */ + INDEX_PARTIALLY_SPARSE, +}; + +struct index_state { + struct cache_entry **cache; + unsigned int version; + unsigned int cache_nr, cache_alloc, cache_changed; + struct string_list *resolve_undo; + struct cache_tree *cache_tree; + struct split_index *split_index; + struct cache_time timestamp; + unsigned name_hash_initialized : 1, + initialized : 1, + drop_cache_tree : 1, + updated_workdir : 1, + updated_skipworktree : 1, + fsmonitor_has_run_once : 1; + enum sparse_index_mode sparse_index; + struct hashmap name_hash; + struct hashmap dir_hash; + struct object_id oid; + struct untracked_cache *untracked; + char *fsmonitor_last_update; + struct ewah_bitmap *fsmonitor_dirty; + struct mem_pool *ce_mem_pool; + struct progress *progress; + struct repository *repo; + struct pattern_list *sparse_checkout_patterns; +}; + +/** + * A "struct index_state istate" must be initialized with + * INDEX_STATE_INIT or the corresponding index_state_init(). + * + * If the variable won't be used again, use release_index() to free() + * its resources. If it needs to be used again use discard_index(), + * which does the same thing, but will use use index_state_init() at + * the end. The discard_index() will use its own "istate->repo" as the + * "r" argument to index_state_init() in that case. + */ +#define INDEX_STATE_INIT(r) { \ + .repo = (r), \ +} +void index_state_init(struct index_state *istate, struct repository *r); +void release_index(struct index_state *istate); + +/* Cache entry creation and cleanup */ + +/* + * Create cache_entry intended for use in the specified index. Caller + * is responsible for discarding the cache_entry with + * `discard_cache_entry`. + */ +struct cache_entry *make_cache_entry(struct index_state *istate, + unsigned int mode, + const struct object_id *oid, + const char *path, + int stage, + unsigned int refresh_options); + +struct cache_entry *make_empty_cache_entry(struct index_state *istate, + size_t name_len); + +/* + * Create a cache_entry that is not intended to be added to an index. If + * `ce_mem_pool` is not NULL, the entry is allocated within the given memory + * pool. Caller is responsible for discarding "loose" entries with + * `discard_cache_entry()` and the memory pool with + * `mem_pool_discard(ce_mem_pool, should_validate_cache_entries())`. + */ +struct cache_entry *make_transient_cache_entry(unsigned int mode, + const struct object_id *oid, + const char *path, + int stage, + struct mem_pool *ce_mem_pool); + +struct cache_entry *make_empty_transient_cache_entry(size_t len, + struct mem_pool *ce_mem_pool); + +/* + * Discard cache entry. + */ +void discard_cache_entry(struct cache_entry *ce); + +/* + * Check configuration if we should perform extra validation on cache + * entries. + */ +int should_validate_cache_entries(void); + +/* + * Duplicate a cache_entry. Allocate memory for the new entry from a + * memory_pool. Takes into account cache_entry fields that are meant + * for managing the underlying memory allocation of the cache_entry. + */ +struct cache_entry *dup_cache_entry(const struct cache_entry *ce, struct index_state *istate); + +/* + * Validate the cache entries in the index. This is an internal + * consistency check that the cache_entry structs are allocated from + * the expected memory pool. + */ +void validate_cache_entries(const struct index_state *istate); + +/* + * Bulk prefetch all missing cache entries that are not GITLINKs and that match + * the given predicate. This function should only be called if + * repo_has_promisor_remote() returns true. + */ +typedef int (*must_prefetch_predicate)(const struct cache_entry *); +void prefetch_cache_entries(const struct index_state *istate, + must_prefetch_predicate must_prefetch); + +/* Initialize and use the cache information */ +struct lock_file; +int do_read_index(struct index_state *istate, const char *path, + int must_exist); /* for testting only! */ +int read_index_from(struct index_state *, const char *path, + const char *gitdir); +int is_index_unborn(struct index_state *); + +/* For use with `write_locked_index()`. */ +#define COMMIT_LOCK (1 << 0) +#define SKIP_IF_UNCHANGED (1 << 1) + +/* + * Write the index while holding an already-taken lock. Close the lock, + * and if `COMMIT_LOCK` is given, commit it. + * + * Unless a split index is in use, write the index into the lockfile. + * + * With a split index, write the shared index to a temporary file, + * adjust its permissions and rename it into place, then write the + * split index to the lockfile. If the temporary file for the shared + * index cannot be created, fall back to the behavior described in + * the previous paragraph. + * + * With `COMMIT_LOCK`, the lock is always committed or rolled back. + * Without it, the lock is closed, but neither committed nor rolled + * back. + * + * If `SKIP_IF_UNCHANGED` is given and the index is unchanged, nothing + * is written (and the lock is rolled back if `COMMIT_LOCK` is given). + */ +int write_locked_index(struct index_state *, struct lock_file *lock, unsigned flags); + +void discard_index(struct index_state *); +void move_index_extensions(struct index_state *dst, struct index_state *src); +int unmerged_index(const struct index_state *); + +/** + * Returns 1 if istate differs from tree, 0 otherwise. If tree is NULL, + * compares istate to HEAD. If tree is NULL and on an unborn branch, + * returns 1 if there are entries in istate, 0 otherwise. If an strbuf is + * provided, the space-separated list of files that differ will be appended + * to it. + */ +int repo_index_has_changes(struct repository *repo, + struct tree *tree, + struct strbuf *sb); + +int verify_path(const char *path, unsigned mode); +int strcmp_offset(const char *s1, const char *s2, size_t *first_change); + +/* + * Searches for an entry defined by name and namelen in the given index. + * If the return value is positive (including 0) it is the position of an + * exact match. If the return value is negative, the negated value minus 1 + * is the position where the entry would be inserted. + * Example: The current index consists of these files and its stages: + * + * b#0, d#0, f#1, f#3 + * + * index_name_pos(&index, "a", 1) -> -1 + * index_name_pos(&index, "b", 1) -> 0 + * index_name_pos(&index, "c", 1) -> -2 + * index_name_pos(&index, "d", 1) -> 1 + * index_name_pos(&index, "e", 1) -> -3 + * index_name_pos(&index, "f", 1) -> -3 + * index_name_pos(&index, "g", 1) -> -5 + */ +int index_name_pos(struct index_state *, const char *name, int namelen); + +/* + * Like index_name_pos, returns the position of an entry of the given name in + * the index if one exists, otherwise returns a negative value where the negated + * value minus 1 is the position where the index entry would be inserted. Unlike + * index_name_pos, however, a sparse index is not expanded to find an entry + * inside a sparse directory. + */ +int index_name_pos_sparse(struct index_state *, const char *name, int namelen); + +/* + * Determines whether an entry with the given name exists within the + * given index. The return value is 1 if an exact match is found, otherwise + * it is 0. Note that, unlike index_name_pos, this function does not expand + * the index if it is sparse. If an item exists within the full index but it + * is contained within a sparse directory (and not in the sparse index), 0 is + * returned. + */ +int index_entry_exists(struct index_state *, const char *name, int namelen); + +/* + * Some functions return the negative complement of an insert position when a + * precise match was not found but a position was found where the entry would + * need to be inserted. This helper protects that logic from any integer + * underflow. + */ +static inline int index_pos_to_insert_pos(uintmax_t pos) +{ + if (pos > INT_MAX) + die("overflow: -1 - %"PRIuMAX, pos); + return -1 - (int)pos; +} + +#define ADD_CACHE_OK_TO_ADD 1 /* Ok to add */ +#define ADD_CACHE_OK_TO_REPLACE 2 /* Ok to replace file/directory */ +#define ADD_CACHE_SKIP_DFCHECK 4 /* Ok to skip DF conflict checks */ +#define ADD_CACHE_JUST_APPEND 8 /* Append only */ +#define ADD_CACHE_NEW_ONLY 16 /* Do not replace existing ones */ +#define ADD_CACHE_KEEP_CACHE_TREE 32 /* Do not invalidate cache-tree */ +#define ADD_CACHE_RENORMALIZE 64 /* Pass along HASH_RENORMALIZE */ +int add_index_entry(struct index_state *, struct cache_entry *ce, int option); +void rename_index_entry_at(struct index_state *, int pos, const char *new_name); + +/* Remove entry, return true if there are more entries to go. */ +int remove_index_entry_at(struct index_state *, int pos); + +void remove_marked_cache_entries(struct index_state *istate, int invalidate); +int remove_file_from_index(struct index_state *, const char *path); +#define ADD_CACHE_VERBOSE 1 +#define ADD_CACHE_PRETEND 2 +#define ADD_CACHE_IGNORE_ERRORS 4 +#define ADD_CACHE_IGNORE_REMOVAL 8 +#define ADD_CACHE_INTENT 16 +/* + * These two are used to add the contents of the file at path + * to the index, marking the working tree up-to-date by storing + * the cached stat info in the resulting cache entry. A caller + * that has already run lstat(2) on the path can call + * add_to_index(), and all others can call add_file_to_index(); + * the latter will do necessary lstat(2) internally before + * calling the former. + */ +int add_to_index(struct index_state *, const char *path, struct stat *, int flags); +int add_file_to_index(struct index_state *, const char *path, int flags); + +int chmod_index_entry(struct index_state *, struct cache_entry *ce, char flip); +int ce_same_name(const struct cache_entry *a, const struct cache_entry *b); +void set_object_name_for_intent_to_add_entry(struct cache_entry *ce); +int index_name_is_other(struct index_state *, const char *, int); +void *read_blob_data_from_index(struct index_state *, const char *, unsigned long *); + +/* do stat comparison even if CE_VALID is true */ +#define CE_MATCH_IGNORE_VALID 01 +/* do not check the contents but report dirty on racily-clean entries */ +#define CE_MATCH_RACY_IS_DIRTY 02 +/* do stat comparison even if CE_SKIP_WORKTREE is true */ +#define CE_MATCH_IGNORE_SKIP_WORKTREE 04 +/* ignore non-existent files during stat update */ +#define CE_MATCH_IGNORE_MISSING 0x08 +/* enable stat refresh */ +#define CE_MATCH_REFRESH 0x10 +/* don't refresh_fsmonitor state or do stat comparison even if CE_FSMONITOR_VALID is true */ +#define CE_MATCH_IGNORE_FSMONITOR 0X20 +int is_racy_timestamp(const struct index_state *istate, + const struct cache_entry *ce); +int has_racy_timestamp(struct index_state *istate); +int ie_match_stat(struct index_state *, const struct cache_entry *, struct stat *, unsigned int); +int ie_modified(struct index_state *, const struct cache_entry *, struct stat *, unsigned int); + +int match_stat_data_racy(const struct index_state *istate, + const struct stat_data *sd, struct stat *st); + +void fill_stat_cache_info(struct index_state *istate, struct cache_entry *ce, struct stat *st); + +#define REFRESH_REALLY (1 << 0) /* ignore_valid */ +#define REFRESH_UNMERGED (1 << 1) /* allow unmerged */ +#define REFRESH_QUIET (1 << 2) /* be quiet about it */ +#define REFRESH_IGNORE_MISSING (1 << 3) /* ignore non-existent */ +#define REFRESH_IGNORE_SUBMODULES (1 << 4) /* ignore submodules */ +#define REFRESH_IN_PORCELAIN (1 << 5) /* user friendly output, not "needs update" */ +#define REFRESH_PROGRESS (1 << 6) /* show progress bar if stderr is tty */ +#define REFRESH_IGNORE_SKIP_WORKTREE (1 << 7) /* ignore skip_worktree entries */ +int refresh_index(struct index_state *, unsigned int flags, const struct pathspec *pathspec, char *seen, const char *header_msg); +/* + * Refresh the index and write it to disk. + * + * 'refresh_flags' is passed directly to 'refresh_index()', while + * 'COMMIT_LOCK | write_flags' is passed to 'write_locked_index()', so + * the lockfile is always either committed or rolled back. + * + * If 'gentle' is passed, errors locking the index are ignored. + * + * Return 1 if refreshing the index returns an error, -1 if writing + * the index to disk fails, 0 on success. + * + * Note that if refreshing the index returns an error, we still write + * out the index (unless locking fails). + */ +int repo_refresh_and_write_index(struct repository*, unsigned int refresh_flags, unsigned int write_flags, int gentle, const struct pathspec *, char *seen, const char *header_msg); + +struct cache_entry *refresh_cache_entry(struct index_state *, struct cache_entry *, unsigned int); + +void set_alternate_index_output(const char *); + +extern int verify_index_checksum; +extern int verify_ce_order; + +int cmp_cache_name_compare(const void *a_, const void *b_); + +int add_files_to_cache(struct repository *repo, const char *prefix, + const struct pathspec *pathspec, int include_sparse, + int flags); + +void overlay_tree_on_index(struct index_state *istate, + const char *tree_name, const char *prefix); + +#endif /* READ_CACHE_LL_H */ diff --git a/read-cache.c b/read-cache.c index 3fad839fb6..42f27b0664 100644 --- a/read-cache.c +++ b/read-cache.c @@ -28,6 +28,7 @@ #include "name-hash.h" #include "object-name.h" #include "preload-index.h" +#include "read-cache.h" #include "resolve-undo.h" #include "revision.h" #include "run-command.h" diff --git a/read-cache.h b/read-cache.h new file mode 100644 index 0000000000..043da1f1aa --- /dev/null +++ b/read-cache.h @@ -0,0 +1,45 @@ +#ifndef READ_CACHE_H +#define READ_CACHE_H + +#include "read-cache-ll.h" +#include "object.h" +#include "pathspec.h" + +static inline unsigned int ce_mode_from_stat(const struct cache_entry *ce, + unsigned int mode) +{ + extern int trust_executable_bit, has_symlinks; + if (!has_symlinks && S_ISREG(mode) && + ce && S_ISLNK(ce->ce_mode)) + return ce->ce_mode; + if (!trust_executable_bit && S_ISREG(mode)) { + if (ce && S_ISREG(ce->ce_mode)) + return ce->ce_mode; + return create_ce_mode(0666); + } + return create_ce_mode(mode); +} + +static inline int ce_to_dtype(const struct cache_entry *ce) +{ + unsigned ce_mode = ntohl(ce->ce_mode); + if (S_ISREG(ce_mode)) + return DT_REG; + else if (S_ISDIR(ce_mode) || S_ISGITLINK(ce_mode)) + return DT_DIR; + else if (S_ISLNK(ce_mode)) + return DT_LNK; + else + return DT_UNKNOWN; +} + +static inline int ce_path_match(struct index_state *istate, + const struct cache_entry *ce, + const struct pathspec *pathspec, + char *seen) +{ + return match_pathspec(istate, pathspec, ce->name, ce_namelen(ce), 0, seen, + S_ISDIR(ce->ce_mode) || S_ISGITLINK(ce->ce_mode)); +} + +#endif /* READ_CACHE_H */ diff --git a/repository.c b/repository.c index 104960f8f5..3d799150b4 100644 --- a/repository.c +++ b/repository.c @@ -10,6 +10,7 @@ #include "config.h" #include "object.h" #include "lockfile.h" +#include "read-cache-ll.h" #include "remote.h" #include "setup.h" #include "submodule-config.h" diff --git a/rerere.c b/rerere.c index e968d413d6..3bc9aedc28 100644 --- a/rerere.c +++ b/rerere.c @@ -7,6 +7,7 @@ #include "hex.h" #include "lockfile.h" #include "string-list.h" +#include "read-cache-ll.h" #include "rerere.h" #include "xdiff-interface.h" #include "dir.h" diff --git a/resolve-undo.c b/resolve-undo.c index 7ec09e89d4..5959887784 100644 --- a/resolve-undo.c +++ b/resolve-undo.c @@ -1,6 +1,7 @@ #include "cache.h" #include "dir.h" #include "hash.h" +#include "read-cache.h" #include "resolve-undo.h" #include "sparse-index.h" #include "string-list.h" diff --git a/revision.c b/revision.c index 88b2f42daa..8d37ec9f49 100644 --- a/revision.c +++ b/revision.c @@ -31,6 +31,7 @@ #include "bisect.h" #include "packfile.h" #include "worktree.h" +#include "read-cache.h" #include "setup.h" #include "sparse-index.h" #include "strvec.h" diff --git a/split-index.c b/split-index.c index 40e54760b3..0a8d3903d6 100644 --- a/split-index.c +++ b/split-index.c @@ -3,6 +3,7 @@ #include "gettext.h" #include "hash.h" #include "mem-pool.h" +#include "read-cache-ll.h" #include "split-index.h" #include "strbuf.h" #include "ewah/ewok.h" diff --git a/submodule.c b/submodule.c index 2e78f51349..e09722d6be 100644 --- a/submodule.c +++ b/submodule.c @@ -28,6 +28,7 @@ #include "object-name.h" #include "object-store.h" #include "commit-reach.h" +#include "read-cache-ll.h" #include "setup.h" #include "shallow.h" #include "trace2.h" diff --git a/t/helper/test-cache-tree.c b/t/helper/test-cache-tree.c index 9507b356e2..9d64422b3c 100644 --- a/t/helper/test-cache-tree.c +++ b/t/helper/test-cache-tree.c @@ -6,6 +6,7 @@ #include "tree.h" #include "cache-tree.h" #include "parse-options.h" +#include "read-cache-ll.h" #include "repository.h" #include "setup.h" diff --git a/t/helper/test-dump-cache-tree.c b/t/helper/test-dump-cache-tree.c index f22f7bd84a..78aa11bb19 100644 --- a/t/helper/test-dump-cache-tree.c +++ b/t/helper/test-dump-cache-tree.c @@ -5,6 +5,7 @@ #include "hex.h" #include "tree.h" #include "cache-tree.h" +#include "read-cache-ll.h" #include "repository.h" #include "setup.h" diff --git a/t/helper/test-dump-fsmonitor.c b/t/helper/test-dump-fsmonitor.c index 9a098a25cb..e4357d65ec 100644 --- a/t/helper/test-dump-fsmonitor.c +++ b/t/helper/test-dump-fsmonitor.c @@ -1,5 +1,6 @@ #include "test-tool.h" #include "cache.h" +#include "read-cache-ll.h" #include "repository.h" #include "setup.h" diff --git a/t/helper/test-dump-split-index.c b/t/helper/test-dump-split-index.c index 63fde9157c..59a24a842b 100644 --- a/t/helper/test-dump-split-index.c +++ b/t/helper/test-dump-split-index.c @@ -2,6 +2,7 @@ #include "test-tool.h" #include "cache.h" #include "hex.h" +#include "read-cache-ll.h" #include "repository.h" #include "setup.h" #include "split-index.h" diff --git a/t/helper/test-dump-untracked-cache.c b/t/helper/test-dump-untracked-cache.c index df70be549f..a1cbafd64f 100644 --- a/t/helper/test-dump-untracked-cache.c +++ b/t/helper/test-dump-untracked-cache.c @@ -3,6 +3,7 @@ #include "cache.h" #include "dir.h" #include "hex.h" +#include "read-cache-ll.h" #include "repository.h" #include "setup.h" diff --git a/t/helper/test-fast-rebase.c b/t/helper/test-fast-rebase.c index d1d63feaa9..cbcf2419f9 100644 --- a/t/helper/test-fast-rebase.c +++ b/t/helper/test-fast-rebase.c @@ -21,6 +21,7 @@ #include "lockfile.h" #include "merge-ort.h" #include "object-name.h" +#include "read-cache-ll.h" #include "refs.h" #include "revision.h" #include "sequencer.h" diff --git a/t/helper/test-fsmonitor-client.c b/t/helper/test-fsmonitor-client.c index 9f18c685b7..386f4cdaee 100644 --- a/t/helper/test-fsmonitor-client.c +++ b/t/helper/test-fsmonitor-client.c @@ -7,6 +7,7 @@ #include "cache.h" #include "parse-options.h" #include "fsmonitor-ipc.h" +#include "read-cache-ll.h" #include "repository.h" #include "setup.h" #include "thread-utils.h" diff --git a/t/helper/test-hash-speed.c b/t/helper/test-hash-speed.c index f40d9ad0c2..c1e82d5d02 100644 --- a/t/helper/test-hash-speed.c +++ b/t/helper/test-hash-speed.c @@ -1,5 +1,6 @@ #include "test-tool.h" #include "cache.h" +#include "hash-ll.h" #define NUM_SECONDS 3 diff --git a/t/helper/test-index-version.c b/t/helper/test-index-version.c index a06c45c1f8..b3cbaf6d2a 100644 --- a/t/helper/test-index-version.c +++ b/t/helper/test-index-version.c @@ -1,5 +1,6 @@ #include "test-tool.h" #include "cache.h" +#include "read-cache-ll.h" int cmd__index_version(int argc UNUSED, const char **argv UNUSED) { diff --git a/t/helper/test-lazy-init-name-hash.c b/t/helper/test-lazy-init-name-hash.c index 6944b7e825..8eb327b3b9 100644 --- a/t/helper/test-lazy-init-name-hash.c +++ b/t/helper/test-lazy-init-name-hash.c @@ -4,6 +4,7 @@ #include "environment.h" #include "name-hash.h" #include "parse-options.h" +#include "read-cache-ll.h" #include "repository.h" #include "setup.h" #include "trace.h" diff --git a/t/helper/test-path-utils.c b/t/helper/test-path-utils.c index 2ef53d5f7a..90e4d29a06 100644 --- a/t/helper/test-path-utils.c +++ b/t/helper/test-path-utils.c @@ -3,6 +3,7 @@ #include "abspath.h" #include "environment.h" #include "path.h" +#include "read-cache-ll.h" #include "setup.h" #include "string-list.h" #include "trace.h" diff --git a/t/helper/test-read-cache.c b/t/helper/test-read-cache.c index c1ae276395..0d548814e0 100644 --- a/t/helper/test-read-cache.c +++ b/t/helper/test-read-cache.c @@ -2,6 +2,7 @@ #include "test-tool.h" #include "cache.h" #include "config.h" +#include "read-cache-ll.h" #include "repository.h" #include "setup.h" #include "wrapper.h" diff --git a/t/helper/test-scrap-cache-tree.c b/t/helper/test-scrap-cache-tree.c index 6e17f50d22..7b7e238404 100644 --- a/t/helper/test-scrap-cache-tree.c +++ b/t/helper/test-scrap-cache-tree.c @@ -2,6 +2,7 @@ #include "test-tool.h" #include "cache.h" #include "lockfile.h" +#include "read-cache-ll.h" #include "repository.h" #include "setup.h" #include "tree.h" diff --git a/t/helper/test-sha1.c b/t/helper/test-sha1.c index 71fe5c6145..dc6fb17f2a 100644 --- a/t/helper/test-sha1.c +++ b/t/helper/test-sha1.c @@ -1,5 +1,6 @@ #include "test-tool.h" #include "cache.h" +#include "hash-ll.h" int cmd__sha1(int ac, const char **av) { diff --git a/t/helper/test-sha256.c b/t/helper/test-sha256.c index 0ac6a99d5f..f50f64f1f2 100644 --- a/t/helper/test-sha256.c +++ b/t/helper/test-sha256.c @@ -1,5 +1,6 @@ #include "test-tool.h" #include "cache.h" +#include "hash-ll.h" int cmd__sha256(int ac, const char **av) { diff --git a/t/helper/test-strcmp-offset.c b/t/helper/test-strcmp-offset.c index 96b9a5b529..d3f39207f1 100644 --- a/t/helper/test-strcmp-offset.c +++ b/t/helper/test-strcmp-offset.c @@ -1,5 +1,6 @@ #include "test-tool.h" #include "cache.h" +#include "read-cache-ll.h" int cmd__strcmp_offset(int argc UNUSED, const char **argv) { diff --git a/t/helper/test-write-cache.c b/t/helper/test-write-cache.c index eace08072d..d27125eeac 100644 --- a/t/helper/test-write-cache.c +++ b/t/helper/test-write-cache.c @@ -2,6 +2,7 @@ #include "test-tool.h" #include "cache.h" #include "lockfile.h" +#include "read-cache-ll.h" #include "repository.h" #include "setup.h" diff --git a/unpack-trees.c b/unpack-trees.c index 078c53f7a1..fdcc46e474 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -15,6 +15,7 @@ #include "progress.h" #include "refs.h" #include "attr.h" +#include "read-cache.h" #include "split-index.h" #include "sparse-index.h" #include "submodule.h" diff --git a/unpack-trees.h b/unpack-trees.h index 30622aeebf..9b827c307f 100644 --- a/unpack-trees.h +++ b/unpack-trees.h @@ -1,8 +1,8 @@ #ifndef UNPACK_TREES_H #define UNPACK_TREES_H -#include "cache.h" #include "convert.h" +#include "read-cache-ll.h" #include "strvec.h" #include "string-list.h" #include "tree-walk.h" diff --git a/wt-status.c b/wt-status.c index 068b76ef6d..847b63c906 100644 --- a/wt-status.c +++ b/wt-status.c @@ -18,6 +18,7 @@ #include "refs.h" #include "submodule.h" #include "column.h" +#include "read-cache.h" #include "setup.h" #include "strbuf.h" #include "trace.h" From bc5c5ec0446895f5c4139cd470066beb3c4ac6d5 Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Tue, 16 May 2023 06:33:57 +0000 Subject: [PATCH 17/28] cache.h: remove this no-longer-used header Since this header showed up in some places besides just #include statements, update/clean-up/remove those other places as well. Note that compat/fsmonitor/fsm-path-utils-darwin.c previously got away with violating the rule that all files must start with an include of git-compat-util.h (or a short-list of alternate headers that happen to include it first). This change exposed the violation and caused it to stop building correctly; fix it by having it include git-compat-util.h first, as per policy. Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- Documentation/CodingGuidelines | 2 +- Documentation/MyFirstObjectWalk.txt | 2 +- Documentation/user-manual.txt | 18 ++++++++---------- Makefile | 2 +- add-interactive.c | 2 +- add-patch.c | 2 +- apply.c | 2 +- attr.c | 2 +- blame.c | 2 +- builtin.h | 1 - builtin/add.c | 3 +-- builtin/am.c | 3 +-- builtin/apply.c | 1 - builtin/archive.c | 1 - builtin/bisect.c | 1 - builtin/branch.c | 3 +-- builtin/bundle.c | 1 - builtin/cat-file.c | 3 +-- builtin/check-attr.c | 1 - builtin/check-ignore.c | 1 - builtin/check-ref-format.c | 3 +-- builtin/clean.c | 1 - builtin/column.c | 1 - builtin/commit-tree.c | 3 +-- builtin/commit.c | 3 +-- builtin/count-objects.c | 3 +-- builtin/describe.c | 3 +-- builtin/diff-files.c | 3 +-- builtin/diff-index.c | 3 +-- builtin/diff-tree.c | 3 +-- builtin/diff.c | 3 +-- builtin/difftool.c | 3 +-- builtin/fast-export.c | 1 - builtin/fast-import.c | 1 - builtin/fetch.c | 3 +-- builtin/for-each-ref.c | 1 - builtin/for-each-repo.c | 3 +-- builtin/fsck.c | 1 - builtin/get-tar-commit-id.c | 3 +-- builtin/grep.c | 3 +-- builtin/help.c | 3 +-- builtin/hook.c | 1 - builtin/init-db.c | 3 +-- builtin/interpret-trailers.c | 1 - builtin/ls-files.c | 3 +-- builtin/ls-remote.c | 1 - builtin/ls-tree.c | 3 +-- builtin/mailinfo.c | 3 +-- builtin/mailsplit.c | 1 - builtin/merge-base.c | 1 - builtin/merge-file.c | 1 - builtin/merge-recursive.c | 1 - builtin/merge.c | 3 +-- builtin/multi-pack-index.c | 1 - builtin/notes.c | 3 +-- builtin/patch-id.c | 1 - builtin/prune.c | 3 +-- builtin/pull.c | 3 +-- builtin/push.c | 3 +-- builtin/range-diff.c | 1 - builtin/read-tree.c | 3 +-- builtin/replace.c | 3 +-- builtin/rerere.c | 1 - builtin/rev-list.c | 3 +-- builtin/rev-parse.c | 3 +-- builtin/shortlog.c | 1 - builtin/show-branch.c | 3 +-- builtin/show-index.c | 1 - builtin/show-ref.c | 1 - builtin/sparse-checkout.c | 1 - builtin/stripspace.c | 1 - builtin/submodule--helper.c | 1 - builtin/symbolic-ref.c | 1 - builtin/tag.c | 3 +-- builtin/unpack-objects.c | 1 - builtin/update-index.c | 3 +-- builtin/update-ref.c | 3 +-- builtin/update-server-info.c | 3 +-- builtin/upload-archive.c | 1 - builtin/upload-pack.c | 1 - builtin/verify-commit.c | 3 +-- builtin/verify-pack.c | 1 - builtin/verify-tag.c | 3 +-- builtin/worktree.c | 3 +-- builtin/write-tree.c | 1 - cache-tree.c | 2 +- cache.h | 6 ------ compat/fsmonitor/fsm-health-win32.c | 2 +- compat/fsmonitor/fsm-listen-win32.c | 2 +- compat/fsmonitor/fsm-path-utils-darwin.c | 1 + compat/fsmonitor/fsm-path-utils-win32.c | 2 +- compat/fsmonitor/fsm-settings-win32.c | 2 +- compat/mingw.c | 1 - compat/precompose_utf8.c | 2 +- compat/sha1-chunked.c | 2 +- compat/simple-ipc/ipc-win32.c | 2 +- compat/win32/trace2_win32_process_info.c | 2 +- contrib/buildsystems/CMakeLists.txt | 2 +- convert.c | 2 +- diff-lib.c | 2 +- diff.c | 2 +- entry.c | 2 +- environment.c | 2 +- fsmonitor-ipc.c | 2 +- fsmonitor.c | 2 +- fsmonitor.h | 1 - hash-lookup.c | 2 +- merge-ort-wrappers.c | 2 +- merge-ort.c | 2 +- merge-recursive.c | 2 +- merge.c | 2 +- name-hash.c | 2 +- object-name.c | 2 +- object.c | 2 +- parallel-checkout.c | 2 +- pathspec.c | 2 +- preload-index.c | 2 +- read-cache.c | 2 +- refs/files-backend.c | 2 +- refs/packed-backend.c | 2 +- repository.c | 2 +- rerere.c | 2 +- resolve-undo.c | 2 +- revision.c | 2 +- run-command.h | 2 +- sequencer.c | 2 +- shallow.c | 2 +- sparse-index.c | 2 +- split-index.c | 2 +- strbuf.h | 4 ---- submodule.c | 2 +- t/helper/test-cache-tree.c | 1 - t/helper/test-dump-cache-tree.c | 1 - t/helper/test-dump-fsmonitor.c | 1 - t/helper/test-dump-split-index.c | 1 - t/helper/test-dump-untracked-cache.c | 1 - t/helper/test-fast-rebase.c | 1 - t/helper/test-fsmonitor-client.c | 1 - t/helper/test-hash-speed.c | 1 - t/helper/test-index-version.c | 1 - t/helper/test-lazy-init-name-hash.c | 1 - t/helper/test-path-utils.c | 1 - t/helper/test-read-cache.c | 1 - t/helper/test-scrap-cache-tree.c | 1 - t/helper/test-sha1.c | 1 - t/helper/test-sha256.c | 1 - t/helper/test-strcmp-offset.c | 1 - t/helper/test-write-cache.c | 1 - unpack-trees.c | 2 +- wt-status.c | 2 +- 150 files changed, 100 insertions(+), 206 deletions(-) delete mode 100644 cache.h diff --git a/Documentation/CodingGuidelines b/Documentation/CodingGuidelines index 003393ed16..2b472df29d 100644 --- a/Documentation/CodingGuidelines +++ b/Documentation/CodingGuidelines @@ -444,7 +444,7 @@ For C programs: - The first #include in C files, except in platform specific compat/ implementations and sha1dc/, must be either "git-compat-util.h" or one of the approved headers that includes it first for you. (The - approved headers currently include "cache.h", "builtin.h", + approved headers currently include "builtin.h", "t/helper/test-tool.h", "xdiff/xinclude.h", or "reftable/system.h"). You do not have to include more than one of these. diff --git a/Documentation/MyFirstObjectWalk.txt b/Documentation/MyFirstObjectWalk.txt index eee513e86f..200e628e30 100644 --- a/Documentation/MyFirstObjectWalk.txt +++ b/Documentation/MyFirstObjectWalk.txt @@ -124,7 +124,7 @@ parameters provided by the user over the CLI. `nr` represents the number of `rev_cmdline_entry` present in the array. -`alloc` is used by the `ALLOC_GROW` macro. Check `cache.h` - this variable is +`alloc` is used by the `ALLOC_GROW` macro. Check `alloc.h` - this variable is used to track the allocated size of the list. Per entry, we find: diff --git a/Documentation/user-manual.txt b/Documentation/user-manual.txt index aa385137ad..4281396093 100644 --- a/Documentation/user-manual.txt +++ b/Documentation/user-manual.txt @@ -4129,13 +4129,11 @@ Note that terminology has changed since that revision. For example, the README in that revision uses the word "changeset" to describe what we now call a <>. -Also, we do not call it "cache" any more, but rather "index"; however, the -file is still called `cache.h`. Remark: Not much reason to change it now, -especially since there is no good single name for it anyway, because it is -basically _the_ header file which is included by _all_ of Git's C sources. +Also, we do not call it "cache" any more, but rather "index"; however, +the file is still called `read-cache.h`. If you grasp the ideas in that initial commit, you should check out a -more recent version and skim `cache.h`, `object.h` and `commit.h`. +more recent version and skim `read-cache-ll.h`, `object.h` and `commit.h`. In the early days, Git (in the tradition of UNIX) was a bunch of programs which were extremely simple, and which you used in scripts, piping the @@ -4146,11 +4144,11 @@ many of these parts have become builtins, and some of the core has been and to avoid code duplication. By now, you know what the index is (and find the corresponding data -structures in `cache.h`), and that there are just a couple of object types -(blobs, trees, commits and tags) which inherit their common structure from -`struct object`, which is their first member (and thus, you can cast e.g. -`(struct object *)commit` to achieve the _same_ as `&commit->object`, i.e. -get at the object name and flags). +structures in `read-cache-ll.h`), and that there are just a couple of +object types (blobs, trees, commits and tags) which inherit their +common structure from `struct object`, which is their first member +(and thus, you can cast e.g. `(struct object *)commit` to achieve the +_same_ as `&commit->object`, i.e. get at the object name and flags). Now is a good point to take a break to let this information sink in. diff --git a/Makefile b/Makefile index 339c29849e..e62db9460d 100644 --- a/Makefile +++ b/Makefile @@ -1952,7 +1952,7 @@ endif BASIC_CFLAGS += \ -DSHA1DC_NO_STANDARD_INCLUDES \ -DSHA1DC_INIT_SAFE_HASH_DEFAULT=0 \ - -DSHA1DC_CUSTOM_INCLUDE_SHA1_C="\"cache.h\"" \ + -DSHA1DC_CUSTOM_INCLUDE_SHA1_C="\"git-compat-util.h\"" \ -DSHA1DC_CUSTOM_INCLUDE_UBC_CHECK_C="\"git-compat-util.h\"" endif endif diff --git a/add-interactive.c b/add-interactive.c index a9671e3349..40f88c0205 100644 --- a/add-interactive.c +++ b/add-interactive.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "add-interactive.h" #include "color.h" #include "config.h" diff --git a/add-patch.c b/add-patch.c index 7d4d298286..875b96e227 100644 --- a/add-patch.c +++ b/add-patch.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "add-interactive.h" #include "advice.h" #include "alloc.h" diff --git a/apply.c b/apply.c index f056c8f3bb..e44a5dd7c5 100644 --- a/apply.c +++ b/apply.c @@ -7,7 +7,7 @@ * */ -#include "cache.h" +#include "git-compat-util.h" #include "abspath.h" #include "alloc.h" #include "base85.h" diff --git a/attr.c b/attr.c index 475241c5c4..b659f415d8 100644 --- a/attr.c +++ b/attr.c @@ -6,7 +6,7 @@ * an insanely large number of attributes. */ -#include "cache.h" +#include "git-compat-util.h" #include "alloc.h" #include "config.h" #include "environment.h" diff --git a/blame.c b/blame.c index a0c7b5c065..ab3c6108cc 100644 --- a/blame.c +++ b/blame.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "refs.h" #include "object-store.h" #include "cache-tree.h" diff --git a/builtin.h b/builtin.h index cb0db67681..3e6c22eef6 100644 --- a/builtin.h +++ b/builtin.h @@ -3,7 +3,6 @@ #include "git-compat-util.h" #include "strbuf.h" -#include "cache.h" #include "commit.h" /* diff --git a/builtin/add.c b/builtin/add.c index 9fe6b6ce29..50792c0d49 100644 --- a/builtin/add.c +++ b/builtin/add.c @@ -4,10 +4,9 @@ * Copyright (C) 2006 Linus Torvalds */ #define USE_THE_INDEX_VARIABLE -#include "cache.h" +#include "builtin.h" #include "advice.h" #include "config.h" -#include "builtin.h" #include "lockfile.h" #include "editor.h" #include "dir.h" diff --git a/builtin/am.c b/builtin/am.c index 0d8f46f8d5..2f0f233791 100644 --- a/builtin/am.c +++ b/builtin/am.c @@ -4,11 +4,10 @@ * Based on git-am.sh by Junio C Hamano. */ #define USE_THE_INDEX_VARIABLE -#include "cache.h" +#include "builtin.h" #include "abspath.h" #include "advice.h" #include "config.h" -#include "builtin.h" #include "editor.h" #include "environment.h" #include "exec-cmd.h" diff --git a/builtin/apply.c b/builtin/apply.c index e3ff02a09e..c18b7ea5d3 100644 --- a/builtin/apply.c +++ b/builtin/apply.c @@ -1,4 +1,3 @@ -#include "cache.h" #include "builtin.h" #include "gettext.h" #include "parse-options.h" diff --git a/builtin/archive.c b/builtin/archive.c index b0eaa3c14a..90761fdfee 100644 --- a/builtin/archive.c +++ b/builtin/archive.c @@ -2,7 +2,6 @@ * Copyright (c) 2006 Franck Bui-Huu * Copyright (c) 2006 Rene Scharfe */ -#include "cache.h" #include "builtin.h" #include "archive.h" #include "gettext.h" diff --git a/builtin/bisect.c b/builtin/bisect.c index 4812450c39..bce0ee6268 100644 --- a/builtin/bisect.c +++ b/builtin/bisect.c @@ -1,5 +1,4 @@ #include "builtin.h" -#include "cache.h" #include "copy.h" #include "environment.h" #include "gettext.h" diff --git a/builtin/branch.c b/builtin/branch.c index e6c2655af6..c480fa2121 100644 --- a/builtin/branch.c +++ b/builtin/branch.c @@ -5,14 +5,13 @@ * Based on git-branch.sh by Junio C Hamano. */ -#include "cache.h" +#include "builtin.h" #include "config.h" #include "color.h" #include "editor.h" #include "environment.h" #include "refs.h" #include "commit.h" -#include "builtin.h" #include "gettext.h" #include "object-name.h" #include "remote.h" diff --git a/builtin/bundle.c b/builtin/bundle.c index 44113389d7..3f63631c03 100644 --- a/builtin/bundle.c +++ b/builtin/bundle.c @@ -6,7 +6,6 @@ #include "parse-options.h" #include "pkt-line.h" #include "repository.h" -#include "cache.h" #include "bundle.h" /* diff --git a/builtin/cat-file.c b/builtin/cat-file.c index 0bafc14e6c..9646e7209c 100644 --- a/builtin/cat-file.c +++ b/builtin/cat-file.c @@ -4,11 +4,10 @@ * Copyright (C) Linus Torvalds, 2005 */ #define USE_THE_INDEX_VARIABLE -#include "cache.h" +#include "builtin.h" #include "alloc.h" #include "config.h" #include "convert.h" -#include "builtin.h" #include "diff.h" #include "environment.h" #include "gettext.h" diff --git a/builtin/check-attr.c b/builtin/check-attr.c index e27b86d150..b22ff748c3 100644 --- a/builtin/check-attr.c +++ b/builtin/check-attr.c @@ -1,6 +1,5 @@ #define USE_THE_INDEX_VARIABLE #include "builtin.h" -#include "cache.h" #include "config.h" #include "attr.h" #include "environment.h" diff --git a/builtin/check-ignore.c b/builtin/check-ignore.c index e4b78782a3..906cd96753 100644 --- a/builtin/check-ignore.c +++ b/builtin/check-ignore.c @@ -1,6 +1,5 @@ #define USE_THE_INDEX_VARIABLE #include "builtin.h" -#include "cache.h" #include "config.h" #include "dir.h" #include "gettext.h" diff --git a/builtin/check-ref-format.c b/builtin/check-ref-format.c index 57f0505070..5eb6bdc3f6 100644 --- a/builtin/check-ref-format.c +++ b/builtin/check-ref-format.c @@ -2,9 +2,8 @@ * GIT - The information manager from hell */ -#include "cache.h" -#include "refs.h" #include "builtin.h" +#include "refs.h" #include "setup.h" #include "strbuf.h" diff --git a/builtin/clean.c b/builtin/clean.c index 49c7af45b0..66b4479356 100644 --- a/builtin/clean.c +++ b/builtin/clean.c @@ -9,7 +9,6 @@ #define USE_THE_INDEX_VARIABLE #include "builtin.h" #include "abspath.h" -#include "cache.h" #include "config.h" #include "dir.h" #include "gettext.h" diff --git a/builtin/column.c b/builtin/column.c index de623a16c2..ce13ff0baa 100644 --- a/builtin/column.c +++ b/builtin/column.c @@ -1,5 +1,4 @@ #include "builtin.h" -#include "cache.h" #include "config.h" #include "gettext.h" #include "strbuf.h" diff --git a/builtin/commit-tree.c b/builtin/commit-tree.c index d1d251c3de..d2121f30d4 100644 --- a/builtin/commit-tree.c +++ b/builtin/commit-tree.c @@ -3,7 +3,7 @@ * * Copyright (C) Linus Torvalds, 2005 */ -#include "cache.h" +#include "builtin.h" #include "config.h" #include "gettext.h" #include "hex.h" @@ -12,7 +12,6 @@ #include "repository.h" #include "commit.h" #include "tree.h" -#include "builtin.h" #include "utf8.h" #include "gpg-interface.h" #include "parse-options.h" diff --git a/builtin/commit.c b/builtin/commit.c index 829daaca9d..acf21789a0 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -6,7 +6,7 @@ */ #define USE_THE_INDEX_VARIABLE -#include "cache.h" +#include "builtin.h" #include "advice.h" #include "config.h" #include "lockfile.h" @@ -15,7 +15,6 @@ #include "dir.h" #include "editor.h" #include "environment.h" -#include "builtin.h" #include "diff.h" #include "diffcore.h" #include "commit.h" diff --git a/builtin/count-objects.c b/builtin/count-objects.c index f3d8f1bcbb..b9e6b55a9a 100644 --- a/builtin/count-objects.c +++ b/builtin/count-objects.c @@ -4,13 +4,12 @@ * Copyright (c) 2006 Junio C Hamano */ -#include "cache.h" +#include "builtin.h" #include "config.h" #include "dir.h" #include "environment.h" #include "gettext.h" #include "repository.h" -#include "builtin.h" #include "parse-options.h" #include "quote.h" #include "packfile.h" diff --git a/builtin/describe.c b/builtin/describe.c index f1be7c3694..508e8df00e 100644 --- a/builtin/describe.c +++ b/builtin/describe.c @@ -1,5 +1,5 @@ #define USE_THE_INDEX_VARIABLE -#include "cache.h" +#include "builtin.h" #include "config.h" #include "environment.h" #include "gettext.h" @@ -9,7 +9,6 @@ #include "tag.h" #include "blob.h" #include "refs.h" -#include "builtin.h" #include "exec-cmd.h" #include "object-name.h" #include "parse-options.h" diff --git a/builtin/diff-files.c b/builtin/diff-files.c index 3ac175264d..a4a2ab76c7 100644 --- a/builtin/diff-files.c +++ b/builtin/diff-files.c @@ -3,14 +3,13 @@ * * Copyright (C) Linus Torvalds, 2005 */ -#include "cache.h" +#include "builtin.h" #include "config.h" #include "diff.h" #include "diff-merges.h" #include "commit.h" #include "preload-index.h" #include "revision.h" -#include "builtin.h" #include "submodule.h" static const char diff_files_usage[] = diff --git a/builtin/diff-index.c b/builtin/diff-index.c index 9b98db2e77..1ab8f8b6dc 100644 --- a/builtin/diff-index.c +++ b/builtin/diff-index.c @@ -1,11 +1,10 @@ -#include "cache.h" +#include "builtin.h" #include "config.h" #include "diff.h" #include "diff-merges.h" #include "commit.h" #include "preload-index.h" #include "revision.h" -#include "builtin.h" #include "setup.h" #include "submodule.h" diff --git a/builtin/diff-tree.c b/builtin/diff-tree.c index 8f7dff8eb3..f3a458bb87 100644 --- a/builtin/diff-tree.c +++ b/builtin/diff-tree.c @@ -1,12 +1,11 @@ #define USE_THE_INDEX_VARIABLE -#include "cache.h" +#include "builtin.h" #include "config.h" #include "diff.h" #include "commit.h" #include "gettext.h" #include "hex.h" #include "log-tree.h" -#include "builtin.h" #include "submodule.h" #include "read-cache-ll.h" #include "repository.h" diff --git a/builtin/diff.c b/builtin/diff.c index a9ce701ff9..b19530c996 100644 --- a/builtin/diff.c +++ b/builtin/diff.c @@ -4,7 +4,7 @@ * Copyright (c) 2006 Junio C Hamano */ #define USE_THE_INDEX_VARIABLE -#include "cache.h" +#include "builtin.h" #include "config.h" #include "ewah/ewok.h" #include "lockfile.h" @@ -20,7 +20,6 @@ #include "read-cache-ll.h" #include "revision.h" #include "log-tree.h" -#include "builtin.h" #include "setup.h" #include "submodule.h" #include "oid-array.h" diff --git a/builtin/difftool.c b/builtin/difftool.c index 88809976c5..4a22de3edd 100644 --- a/builtin/difftool.c +++ b/builtin/difftool.c @@ -12,11 +12,10 @@ * Copyright (C) 2016 Johannes Schindelin */ #define USE_THE_INDEX_VARIABLE -#include "cache.h" +#include "builtin.h" #include "abspath.h" #include "config.h" #include "copy.h" -#include "builtin.h" #include "run-command.h" #include "environment.h" #include "exec-cmd.h" diff --git a/builtin/fast-export.c b/builtin/fast-export.c index 9a95f6a1a8..5f3ffd6912 100644 --- a/builtin/fast-export.c +++ b/builtin/fast-export.c @@ -4,7 +4,6 @@ * Copyright (C) 2007 Johannes E. Schindelin */ #include "builtin.h" -#include "cache.h" #include "config.h" #include "gettext.h" #include "hex.h" diff --git a/builtin/fast-import.c b/builtin/fast-import.c index bbd9b2b3e7..67a2260a5e 100644 --- a/builtin/fast-import.c +++ b/builtin/fast-import.c @@ -1,6 +1,5 @@ #include "builtin.h" #include "abspath.h" -#include "cache.h" #include "environment.h" #include "gettext.h" #include "hex.h" diff --git a/builtin/fetch.c b/builtin/fetch.c index e3871048cf..2c6f4d3dff 100644 --- a/builtin/fetch.c +++ b/builtin/fetch.c @@ -1,7 +1,7 @@ /* * "git fetch" */ -#include "cache.h" +#include "builtin.h" #include "advice.h" #include "config.h" #include "gettext.h" @@ -15,7 +15,6 @@ #include "oidset.h" #include "oid-array.h" #include "commit.h" -#include "builtin.h" #include "string-list.h" #include "remote.h" #include "transport.h" diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c index 695fc8f4a5..d0d6ab0fd3 100644 --- a/builtin/for-each-ref.c +++ b/builtin/for-each-ref.c @@ -1,5 +1,4 @@ #include "builtin.h" -#include "cache.h" #include "config.h" #include "gettext.h" #include "refs.h" diff --git a/builtin/for-each-repo.c b/builtin/for-each-repo.c index 37daf7bec1..28186b30f5 100644 --- a/builtin/for-each-repo.c +++ b/builtin/for-each-repo.c @@ -1,6 +1,5 @@ -#include "cache.h" -#include "config.h" #include "builtin.h" +#include "config.h" #include "gettext.h" #include "parse-options.h" #include "path.h" diff --git a/builtin/fsck.c b/builtin/fsck.c index d4e04bb36e..3e169f413d 100644 --- a/builtin/fsck.c +++ b/builtin/fsck.c @@ -1,5 +1,4 @@ #include "builtin.h" -#include "cache.h" #include "gettext.h" #include "hex.h" #include "repository.h" diff --git a/builtin/get-tar-commit-id.c b/builtin/get-tar-commit-id.c index 564cfcac4f..9303e386cc 100644 --- a/builtin/get-tar-commit-id.c +++ b/builtin/get-tar-commit-id.c @@ -1,10 +1,9 @@ /* * Copyright (c) 2005, 2006 Rene Scharfe */ -#include "cache.h" +#include "builtin.h" #include "commit.h" #include "tar.h" -#include "builtin.h" #include "quote.h" #include "wrapper.h" diff --git a/builtin/grep.c b/builtin/grep.c index 0d56757589..7638d77900 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -3,7 +3,7 @@ * * Copyright (c) 2006 Junio C Hamano */ -#include "cache.h" +#include "builtin.h" #include "alloc.h" #include "gettext.h" #include "hex.h" @@ -14,7 +14,6 @@ #include "commit.h" #include "tag.h" #include "tree-walk.h" -#include "builtin.h" #include "parse-options.h" #include "string-list.h" #include "run-command.h" diff --git a/builtin/help.c b/builtin/help.c index d3cf4af3f6..e93533fb09 100644 --- a/builtin/help.c +++ b/builtin/help.c @@ -1,9 +1,8 @@ /* * Builtin help command */ -#include "cache.h" -#include "config.h" #include "builtin.h" +#include "config.h" #include "exec-cmd.h" #include "gettext.h" #include "pager.h" diff --git a/builtin/hook.c b/builtin/hook.c index 88051795c7..09b51a6487 100644 --- a/builtin/hook.c +++ b/builtin/hook.c @@ -1,4 +1,3 @@ -#include "cache.h" #include "builtin.h" #include "config.h" #include "gettext.h" diff --git a/builtin/init-db.c b/builtin/init-db.c index feb019a9de..680ef7e183 100644 --- a/builtin/init-db.c +++ b/builtin/init-db.c @@ -3,12 +3,11 @@ * * Copyright (C) Linus Torvalds, 2005 */ -#include "cache.h" +#include "builtin.h" #include "abspath.h" #include "config.h" #include "environment.h" #include "gettext.h" -#include "builtin.h" #include "object-file.h" #include "parse-options.h" #include "path.h" diff --git a/builtin/interpret-trailers.c b/builtin/interpret-trailers.c index 107ac28f0e..c5e8345265 100644 --- a/builtin/interpret-trailers.c +++ b/builtin/interpret-trailers.c @@ -5,7 +5,6 @@ * */ -#include "cache.h" #include "builtin.h" #include "gettext.h" #include "parse-options.h" diff --git a/builtin/ls-files.c b/builtin/ls-files.c index a0bea8f06c..3e314980fe 100644 --- a/builtin/ls-files.c +++ b/builtin/ls-files.c @@ -5,13 +5,12 @@ * * Copyright (C) Linus Torvalds, 2005 */ -#include "cache.h" +#include "builtin.h" #include "repository.h" #include "config.h" #include "convert.h" #include "quote.h" #include "dir.h" -#include "builtin.h" #include "gettext.h" #include "object-name.h" #include "strbuf.h" diff --git a/builtin/ls-remote.c b/builtin/ls-remote.c index cb6cb77e08..a0aadc9b8f 100644 --- a/builtin/ls-remote.c +++ b/builtin/ls-remote.c @@ -1,5 +1,4 @@ #include "builtin.h" -#include "cache.h" #include "gettext.h" #include "hex.h" #include "transport.h" diff --git a/builtin/ls-tree.c b/builtin/ls-tree.c index 077977a461..f4331c640f 100644 --- a/builtin/ls-tree.c +++ b/builtin/ls-tree.c @@ -3,7 +3,7 @@ * * Copyright (C) Linus Torvalds, 2005 */ -#include "cache.h" +#include "builtin.h" #include "config.h" #include "gettext.h" #include "hex.h" @@ -13,7 +13,6 @@ #include "tree.h" #include "commit.h" #include "quote.h" -#include "builtin.h" #include "parse-options.h" #include "pathspec.h" diff --git a/builtin/mailinfo.c b/builtin/mailinfo.c index a032a1c388..53b55dd71c 100644 --- a/builtin/mailinfo.c +++ b/builtin/mailinfo.c @@ -2,9 +2,8 @@ * Another stupid program, this one parsing the headers of an * email to figure out authorship and subject */ -#include "cache.h" -#include "abspath.h" #include "builtin.h" +#include "abspath.h" #include "environment.h" #include "gettext.h" #include "utf8.h" diff --git a/builtin/mailsplit.c b/builtin/mailsplit.c index 0b6193a091..3af9ddb8ae 100644 --- a/builtin/mailsplit.c +++ b/builtin/mailsplit.c @@ -4,7 +4,6 @@ * It just splits a mbox into a list of files: "0001" "0002" .. * so you can process them further from there. */ -#include "cache.h" #include "builtin.h" #include "gettext.h" #include "string-list.h" diff --git a/builtin/merge-base.c b/builtin/merge-base.c index 854019a32d..e68b7fe45d 100644 --- a/builtin/merge-base.c +++ b/builtin/merge-base.c @@ -1,5 +1,4 @@ #include "builtin.h" -#include "cache.h" #include "config.h" #include "commit.h" #include "gettext.h" diff --git a/builtin/merge-file.c b/builtin/merge-file.c index 781818d08f..d7eb4c6540 100644 --- a/builtin/merge-file.c +++ b/builtin/merge-file.c @@ -1,6 +1,5 @@ #include "builtin.h" #include "abspath.h" -#include "cache.h" #include "config.h" #include "gettext.h" #include "setup.h" diff --git a/builtin/merge-recursive.c b/builtin/merge-recursive.c index b9e980384a..3366699657 100644 --- a/builtin/merge-recursive.c +++ b/builtin/merge-recursive.c @@ -1,4 +1,3 @@ -#include "cache.h" #include "builtin.h" #include "advice.h" #include "commit.h" diff --git a/builtin/merge.c b/builtin/merge.c index 6e8f7b9bb5..d7ac108ce9 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -7,7 +7,7 @@ */ #define USE_THE_INDEX_VARIABLE -#include "cache.h" +#include "builtin.h" #include "abspath.h" #include "advice.h" #include "alloc.h" @@ -18,7 +18,6 @@ #include "hex.h" #include "object-name.h" #include "parse-options.h" -#include "builtin.h" #include "lockfile.h" #include "run-command.h" #include "hook.h" diff --git a/builtin/multi-pack-index.c b/builtin/multi-pack-index.c index 1b5083f8b2..5bb71bce08 100644 --- a/builtin/multi-pack-index.c +++ b/builtin/multi-pack-index.c @@ -1,6 +1,5 @@ #include "builtin.h" #include "abspath.h" -#include "cache.h" #include "config.h" #include "environment.h" #include "gettext.h" diff --git a/builtin/notes.c b/builtin/notes.c index d5788352b6..efdf245148 100644 --- a/builtin/notes.c +++ b/builtin/notes.c @@ -7,9 +7,8 @@ * and builtin/tag.c by Kristian Høgsberg and Carlos Rica. */ -#include "cache.h" -#include "config.h" #include "builtin.h" +#include "config.h" #include "editor.h" #include "gettext.h" #include "hex.h" diff --git a/builtin/patch-id.c b/builtin/patch-id.c index 9d5585d3a7..27952f1a6f 100644 --- a/builtin/patch-id.c +++ b/builtin/patch-id.c @@ -1,4 +1,3 @@ -#include "cache.h" #include "builtin.h" #include "config.h" #include "diff.h" diff --git a/builtin/prune.c b/builtin/prune.c index 5dc9b20720..b3658b5b51 100644 --- a/builtin/prune.c +++ b/builtin/prune.c @@ -1,11 +1,10 @@ -#include "cache.h" +#include "builtin.h" #include "commit.h" #include "diff.h" #include "environment.h" #include "gettext.h" #include "hex.h" #include "revision.h" -#include "builtin.h" #include "reachable.h" #include "parse-options.h" #include "progress.h" diff --git a/builtin/pull.c b/builtin/pull.c index 3052244b17..d434495091 100644 --- a/builtin/pull.c +++ b/builtin/pull.c @@ -6,10 +6,9 @@ * Fetch one or more remote refs and merge it/them into the current HEAD. */ #define USE_THE_INDEX_VARIABLE -#include "cache.h" +#include "builtin.h" #include "advice.h" #include "config.h" -#include "builtin.h" #include "gettext.h" #include "hex.h" #include "merge.h" diff --git a/builtin/push.c b/builtin/push.c index dbdf609daf..6f8a8dc711 100644 --- a/builtin/push.c +++ b/builtin/push.c @@ -1,7 +1,7 @@ /* * "git push" */ -#include "cache.h" +#include "builtin.h" #include "advice.h" #include "branch.h" #include "config.h" @@ -10,7 +10,6 @@ #include "refs.h" #include "refspec.h" #include "run-command.h" -#include "builtin.h" #include "remote.h" #include "transport.h" #include "parse-options.h" diff --git a/builtin/range-diff.c b/builtin/range-diff.c index 04339a92ea..8610390d7c 100644 --- a/builtin/range-diff.c +++ b/builtin/range-diff.c @@ -1,4 +1,3 @@ -#include "cache.h" #include "builtin.h" #include "gettext.h" #include "object-name.h" diff --git a/builtin/read-tree.c b/builtin/read-tree.c index bd1ce1d963..63c92936fa 100644 --- a/builtin/read-tree.c +++ b/builtin/read-tree.c @@ -5,7 +5,7 @@ */ #define USE_THE_INDEX_VARIABLE -#include "cache.h" +#include "builtin.h" #include "config.h" #include "gettext.h" #include "hex.h" @@ -17,7 +17,6 @@ #include "cache-tree.h" #include "unpack-trees.h" #include "dir.h" -#include "builtin.h" #include "parse-options.h" #include "repository.h" #include "resolve-undo.h" diff --git a/builtin/replace.c b/builtin/replace.c index 981f189443..e0fbdc98ed 100644 --- a/builtin/replace.c +++ b/builtin/replace.c @@ -8,9 +8,8 @@ * git-tag.sh and mktag.c by Linus Torvalds. */ -#include "cache.h" -#include "config.h" #include "builtin.h" +#include "config.h" #include "editor.h" #include "environment.h" #include "gettext.h" diff --git a/builtin/rerere.c b/builtin/rerere.c index d4bd52797f..0458db9cad 100644 --- a/builtin/rerere.c +++ b/builtin/rerere.c @@ -1,5 +1,4 @@ #include "builtin.h" -#include "cache.h" #include "config.h" #include "dir.h" #include "gettext.h" diff --git a/builtin/rev-list.c b/builtin/rev-list.c index 6dc8be492a..8029f3de53 100644 --- a/builtin/rev-list.c +++ b/builtin/rev-list.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "builtin.h" #include "config.h" #include "commit.h" #include "diff.h" @@ -15,7 +15,6 @@ #include "object-store.h" #include "pack.h" #include "pack-bitmap.h" -#include "builtin.h" #include "log-tree.h" #include "graph.h" #include "bisect.h" diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c index ad93e5fad8..8d8c870421 100644 --- a/builtin/rev-parse.c +++ b/builtin/rev-parse.c @@ -4,7 +4,7 @@ * Copyright (C) Linus Torvalds, 2005 */ #define USE_THE_INDEX_VARIABLE -#include "cache.h" +#include "builtin.h" #include "abspath.h" #include "alloc.h" #include "config.h" @@ -14,7 +14,6 @@ #include "hex.h" #include "refs.h" #include "quote.h" -#include "builtin.h" #include "object-name.h" #include "parse-options.h" #include "diff.h" diff --git a/builtin/shortlog.c b/builtin/shortlog.c index 46f4e0832a..99be9dc417 100644 --- a/builtin/shortlog.c +++ b/builtin/shortlog.c @@ -1,5 +1,4 @@ #include "builtin.h" -#include "cache.h" #include "config.h" #include "commit.h" #include "diff.h" diff --git a/builtin/show-branch.c b/builtin/show-branch.c index 7ef4a642c1..cd215f89af 100644 --- a/builtin/show-branch.c +++ b/builtin/show-branch.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "builtin.h" #include "config.h" #include "environment.h" #include "gettext.h" @@ -6,7 +6,6 @@ #include "hex.h" #include "pretty.h" #include "refs.h" -#include "builtin.h" #include "color.h" #include "strvec.h" #include "object-name.h" diff --git a/builtin/show-index.c b/builtin/show-index.c index d839e55335..540dc3dad1 100644 --- a/builtin/show-index.c +++ b/builtin/show-index.c @@ -1,5 +1,4 @@ #include "builtin.h" -#include "cache.h" #include "gettext.h" #include "hash.h" #include "hex.h" diff --git a/builtin/show-ref.c b/builtin/show-ref.c index a2243b4219..e07e9ca862 100644 --- a/builtin/show-ref.c +++ b/builtin/show-ref.c @@ -1,5 +1,4 @@ #include "builtin.h" -#include "cache.h" #include "config.h" #include "gettext.h" #include "hex.h" diff --git a/builtin/sparse-checkout.c b/builtin/sparse-checkout.c index 40d420f06c..5c8ffb1f75 100644 --- a/builtin/sparse-checkout.c +++ b/builtin/sparse-checkout.c @@ -1,5 +1,4 @@ #include "builtin.h" -#include "cache.h" #include "config.h" #include "dir.h" #include "environment.h" diff --git a/builtin/stripspace.c b/builtin/stripspace.c index 9451eb69ff..397d7fe2dc 100644 --- a/builtin/stripspace.c +++ b/builtin/stripspace.c @@ -1,5 +1,4 @@ #include "builtin.h" -#include "cache.h" #include "config.h" #include "gettext.h" #include "parse-options.h" diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c index 02f295e741..12ba2ae45d 100644 --- a/builtin/submodule--helper.c +++ b/builtin/submodule--helper.c @@ -6,7 +6,6 @@ #include "gettext.h" #include "hex.h" #include "repository.h" -#include "cache.h" #include "config.h" #include "parse-options.h" #include "quote.h" diff --git a/builtin/symbolic-ref.c b/builtin/symbolic-ref.c index 10198a74fa..a61fa3c0f8 100644 --- a/builtin/symbolic-ref.c +++ b/builtin/symbolic-ref.c @@ -1,6 +1,5 @@ #include "builtin.h" #include "config.h" -#include "cache.h" #include "gettext.h" #include "refs.h" #include "parse-options.h" diff --git a/builtin/tag.c b/builtin/tag.c index 49b64c7a28..26691e7e52 100644 --- a/builtin/tag.c +++ b/builtin/tag.c @@ -6,10 +6,9 @@ * Based on git-tag.sh and mktag.c by Linus Torvalds. */ -#include "cache.h" +#include "builtin.h" #include "advice.h" #include "config.h" -#include "builtin.h" #include "editor.h" #include "environment.h" #include "gettext.h" diff --git a/builtin/unpack-objects.c b/builtin/unpack-objects.c index 2c52c3a741..85baf6a131 100644 --- a/builtin/unpack-objects.c +++ b/builtin/unpack-objects.c @@ -1,5 +1,4 @@ #include "builtin.h" -#include "cache.h" #include "bulk-checkin.h" #include "config.h" #include "environment.h" diff --git a/builtin/update-index.c b/builtin/update-index.c index 484a307df5..aee3cb8cbd 100644 --- a/builtin/update-index.c +++ b/builtin/update-index.c @@ -4,7 +4,7 @@ * Copyright (C) Linus Torvalds, 2005 */ #define USE_THE_INDEX_VARIABLE -#include "cache.h" +#include "builtin.h" #include "bulk-checkin.h" #include "config.h" #include "environment.h" @@ -15,7 +15,6 @@ #include "quote.h" #include "cache-tree.h" #include "tree-walk.h" -#include "builtin.h" #include "object-file.h" #include "refs.h" #include "resolve-undo.h" diff --git a/builtin/update-ref.c b/builtin/update-ref.c index 0c59b1c9ef..242102273e 100644 --- a/builtin/update-ref.c +++ b/builtin/update-ref.c @@ -1,9 +1,8 @@ -#include "cache.h" +#include "builtin.h" #include "config.h" #include "gettext.h" #include "hash.h" #include "refs.h" -#include "builtin.h" #include "object-name.h" #include "parse-options.h" #include "quote.h" diff --git a/builtin/update-server-info.c b/builtin/update-server-info.c index 19dce3c065..1dc3971ede 100644 --- a/builtin/update-server-info.c +++ b/builtin/update-server-info.c @@ -1,6 +1,5 @@ -#include "cache.h" -#include "config.h" #include "builtin.h" +#include "config.h" #include "gettext.h" #include "parse-options.h" #include "server-info.h" diff --git a/builtin/upload-archive.c b/builtin/upload-archive.c index 44ad400e18..d4c7f162ff 100644 --- a/builtin/upload-archive.c +++ b/builtin/upload-archive.c @@ -1,7 +1,6 @@ /* * Copyright (c) 2006 Franck Bui-Huu */ -#include "cache.h" #include "builtin.h" #include "archive.h" #include "pkt-line.h" diff --git a/builtin/upload-pack.c b/builtin/upload-pack.c index beb9dd0861..ba5103a933 100644 --- a/builtin/upload-pack.c +++ b/builtin/upload-pack.c @@ -1,4 +1,3 @@ -#include "cache.h" #include "builtin.h" #include "exec-cmd.h" #include "gettext.h" diff --git a/builtin/verify-commit.c b/builtin/verify-commit.c index 5d99b82a64..aa34fb896a 100644 --- a/builtin/verify-commit.c +++ b/builtin/verify-commit.c @@ -5,9 +5,8 @@ * * Based on git-verify-tag */ -#include "cache.h" -#include "config.h" #include "builtin.h" +#include "config.h" #include "gettext.h" #include "object-name.h" #include "object-store.h" diff --git a/builtin/verify-pack.c b/builtin/verify-pack.c index 190fd69540..aba92cf8af 100644 --- a/builtin/verify-pack.c +++ b/builtin/verify-pack.c @@ -1,5 +1,4 @@ #include "builtin.h" -#include "cache.h" #include "config.h" #include "gettext.h" #include "run-command.h" diff --git a/builtin/verify-tag.c b/builtin/verify-tag.c index c6019a0ad8..d8753270eb 100644 --- a/builtin/verify-tag.c +++ b/builtin/verify-tag.c @@ -5,9 +5,8 @@ * * Based on git-verify-tag.sh */ -#include "cache.h" -#include "config.h" #include "builtin.h" +#include "config.h" #include "gettext.h" #include "tag.h" #include "run-command.h" diff --git a/builtin/worktree.c b/builtin/worktree.c index efe520fe95..2d83ea4bf2 100644 --- a/builtin/worktree.c +++ b/builtin/worktree.c @@ -1,9 +1,8 @@ -#include "cache.h" +#include "builtin.h" #include "abspath.h" #include "checkout.h" #include "config.h" #include "copy.h" -#include "builtin.h" #include "dir.h" #include "environment.h" #include "gettext.h" diff --git a/builtin/write-tree.c b/builtin/write-tree.c index 84b83318c9..66e83d0ecb 100644 --- a/builtin/write-tree.c +++ b/builtin/write-tree.c @@ -5,7 +5,6 @@ */ #define USE_THE_INDEX_VARIABLE #include "builtin.h" -#include "cache.h" #include "config.h" #include "environment.h" #include "gettext.h" diff --git a/cache-tree.c b/cache-tree.c index 153217b47f..077932c2db 100644 --- a/cache-tree.c +++ b/cache-tree.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "alloc.h" #include "environment.h" #include "hex.h" diff --git a/cache.h b/cache.h deleted file mode 100644 index 9b4e8d1687..0000000000 --- a/cache.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef CACHE_H -#define CACHE_H - -#include "git-compat-util.h" - -#endif /* CACHE_H */ diff --git a/compat/fsmonitor/fsm-health-win32.c b/compat/fsmonitor/fsm-health-win32.c index fe11bdd9ce..6c81d7ee5c 100644 --- a/compat/fsmonitor/fsm-health-win32.c +++ b/compat/fsmonitor/fsm-health-win32.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "config.h" #include "fsmonitor.h" #include "fsm-health.h" diff --git a/compat/fsmonitor/fsm-listen-win32.c b/compat/fsmonitor/fsm-listen-win32.c index 677b1bbdec..3c0df5cff8 100644 --- a/compat/fsmonitor/fsm-listen-win32.c +++ b/compat/fsmonitor/fsm-listen-win32.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "config.h" #include "fsmonitor.h" #include "fsm-listen.h" diff --git a/compat/fsmonitor/fsm-path-utils-darwin.c b/compat/fsmonitor/fsm-path-utils-darwin.c index 45eb4a9b9e..ef0142e0fb 100644 --- a/compat/fsmonitor/fsm-path-utils-darwin.c +++ b/compat/fsmonitor/fsm-path-utils-darwin.c @@ -1,3 +1,4 @@ +#include "git-compat-util.h" #include "fsmonitor.h" #include "fsmonitor-path-utils.h" #include "gettext.h" diff --git a/compat/fsmonitor/fsm-path-utils-win32.c b/compat/fsmonitor/fsm-path-utils-win32.c index 4024baafb9..27bb694518 100644 --- a/compat/fsmonitor/fsm-path-utils-win32.c +++ b/compat/fsmonitor/fsm-path-utils-win32.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "fsmonitor.h" #include "fsmonitor-path-utils.h" #include "gettext.h" diff --git a/compat/fsmonitor/fsm-settings-win32.c b/compat/fsmonitor/fsm-settings-win32.c index a8af31b71d..3728897864 100644 --- a/compat/fsmonitor/fsm-settings-win32.c +++ b/compat/fsmonitor/fsm-settings-win32.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "config.h" #include "repository.h" #include "fsmonitor.h" diff --git a/compat/mingw.c b/compat/mingw.c index d06cdc6254..559abb1c61 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -6,7 +6,6 @@ #include #include "../strbuf.h" #include "../run-command.h" -#include "../cache.h" #include "../abspath.h" #include "../alloc.h" #include "win32/lazyload.h" diff --git a/compat/precompose_utf8.c b/compat/precompose_utf8.c index fb08475bc6..0bd5c24250 100644 --- a/compat/precompose_utf8.c +++ b/compat/precompose_utf8.c @@ -5,7 +5,7 @@ #define PRECOMPOSE_UNICODE_C -#include "cache.h" +#include "git-compat-util.h" #include "config.h" #include "environment.h" #include "gettext.h" diff --git a/compat/sha1-chunked.c b/compat/sha1-chunked.c index 56729d92dc..a4a6f930d7 100644 --- a/compat/sha1-chunked.c +++ b/compat/sha1-chunked.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "hash-ll.h" int git_SHA1_Update_Chunked(platform_SHA_CTX *c, const void *data, size_t len) diff --git a/compat/simple-ipc/ipc-win32.c b/compat/simple-ipc/ipc-win32.c index 6adce3c650..8bfe51248e 100644 --- a/compat/simple-ipc/ipc-win32.c +++ b/compat/simple-ipc/ipc-win32.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "abspath.h" #include "gettext.h" #include "simple-ipc.h" diff --git a/compat/win32/trace2_win32_process_info.c b/compat/win32/trace2_win32_process_info.c index a4e33768f4..a2b1506f9c 100644 --- a/compat/win32/trace2_win32_process_info.c +++ b/compat/win32/trace2_win32_process_info.c @@ -1,4 +1,4 @@ -#include "../../cache.h" +#include "../../git-compat-util.h" #include "../../json-writer.h" #include "../../repository.h" #include "../../trace2.h" diff --git a/contrib/buildsystems/CMakeLists.txt b/contrib/buildsystems/CMakeLists.txt index 2f6e0197ff..4faa419cc3 100644 --- a/contrib/buildsystems/CMakeLists.txt +++ b/contrib/buildsystems/CMakeLists.txt @@ -227,7 +227,7 @@ add_compile_definitions(GIT_HOST_CPU="${CMAKE_SYSTEM_PROCESSOR}") add_compile_definitions(SHA256_BLK INTERNAL_QSORT RUNTIME_PREFIX) add_compile_definitions(NO_OPENSSL SHA1_DC SHA1DC_NO_STANDARD_INCLUDES SHA1DC_INIT_SAFE_HASH_DEFAULT=0 - SHA1DC_CUSTOM_INCLUDE_SHA1_C="cache.h" + SHA1DC_CUSTOM_INCLUDE_SHA1_C="git-compat-util.h" SHA1DC_CUSTOM_INCLUDE_UBC_CHECK_C="git-compat-util.h" ) list(APPEND compat_SOURCES sha1dc_git.c sha1dc/sha1.c sha1dc/ubc_check.c block-sha1/sha1.c sha256/block/sha256.c compat/qsort_s.c) diff --git a/convert.c b/convert.c index b421065f21..89aeb9e72b 100644 --- a/convert.c +++ b/convert.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "advice.h" #include "config.h" #include "convert.h" diff --git a/diff-lib.c b/diff-lib.c index 36cd66ea23..f3aa7f93c7 100644 --- a/diff-lib.c +++ b/diff-lib.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2005 Junio C Hamano */ -#include "cache.h" +#include "git-compat-util.h" #include "quote.h" #include "commit.h" #include "diff.h" diff --git a/diff.c b/diff.c index a72811ee5d..7fb9abe891 100644 --- a/diff.c +++ b/diff.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2005 Junio C Hamano */ -#include "cache.h" +#include "git-compat-util.h" #include "abspath.h" #include "alloc.h" #include "base85.h" diff --git a/entry.c b/entry.c index 53d0038674..041f5cf212 100644 --- a/entry.c +++ b/entry.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "blob.h" #include "object-store.h" #include "dir.h" diff --git a/environment.c b/environment.c index 6bd001efbd..4ecad41bb9 100644 --- a/environment.c +++ b/environment.c @@ -109,7 +109,7 @@ char *git_work_tree_cfg; static char *git_namespace; /* - * Repository-local GIT_* environment variables; see cache.h for details. + * Repository-local GIT_* environment variables; see environment.h for details. */ const char * const local_repo_env[] = { ALTERNATE_DB_ENVIRONMENT, diff --git a/fsmonitor-ipc.c b/fsmonitor-ipc.c index 6a6a89764a..6ace978a1b 100644 --- a/fsmonitor-ipc.c +++ b/fsmonitor-ipc.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "fsmonitor.h" #include "gettext.h" #include "simple-ipc.h" diff --git a/fsmonitor.c b/fsmonitor.c index 28c083d4d8..f670c50937 100644 --- a/fsmonitor.c +++ b/fsmonitor.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "config.h" #include "dir.h" #include "environment.h" diff --git a/fsmonitor.h b/fsmonitor.h index 8b7a521552..7702301d21 100644 --- a/fsmonitor.h +++ b/fsmonitor.h @@ -1,7 +1,6 @@ #ifndef FSMONITOR_H #define FSMONITOR_H -#include "cache.h" #include "dir.h" #include "fsmonitor-settings.h" #include "object.h" diff --git a/hash-lookup.c b/hash-lookup.c index 8fec8939fd..9f0f95e2b9 100644 --- a/hash-lookup.c +++ b/hash-lookup.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "hash.h" #include "hash-lookup.h" #include "read-cache-ll.h" diff --git a/merge-ort-wrappers.c b/merge-ort-wrappers.c index a0bedcb63b..4acedf3c33 100644 --- a/merge-ort-wrappers.c +++ b/merge-ort-wrappers.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "gettext.h" #include "hash.h" #include "merge-ort.h" diff --git a/merge-ort.c b/merge-ort.c index 17167f56dc..12d0181f4a 100644 --- a/merge-ort.c +++ b/merge-ort.c @@ -14,7 +14,7 @@ * "cale", "peedy", or "ins" instead of "ort"?) */ -#include "cache.h" +#include "git-compat-util.h" #include "merge-ort.h" #include "alloc.h" diff --git a/merge-recursive.c b/merge-recursive.c index 0e16e7a06d..4bef9b62fa 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -3,7 +3,7 @@ * Fredrik Kuivinen. * The thieves were Alex Riesen and Johannes Schindelin, in June/July 2006 */ -#include "cache.h" +#include "git-compat-util.h" #include "merge-recursive.h" #include "advice.h" diff --git a/merge.c b/merge.c index fade6b203b..83bcba6943 100644 --- a/merge.c +++ b/merge.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "diff.h" #include "diffcore.h" #include "gettext.h" diff --git a/name-hash.c b/name-hash.c index f2f3564cb2..251f036eef 100644 --- a/name-hash.c +++ b/name-hash.c @@ -5,7 +5,7 @@ * * Copyright (C) 2008 Linus Torvalds */ -#include "cache.h" +#include "git-compat-util.h" #include "environment.h" #include "gettext.h" #include "name-hash.h" diff --git a/object-name.c b/object-name.c index 1eefeef746..45f4d51305 100644 --- a/object-name.c +++ b/object-name.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "object-name.h" #include "advice.h" #include "config.h" diff --git a/object.c b/object.c index 333e736fb2..60f954194f 100644 --- a/object.c +++ b/object.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "gettext.h" #include "hex.h" #include "object.h" diff --git a/parallel-checkout.c b/parallel-checkout.c index 2b1439c0c5..602fbf19d3 100644 --- a/parallel-checkout.c +++ b/parallel-checkout.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "alloc.h" #include "config.h" #include "entry.h" diff --git a/pathspec.c b/pathspec.c index f52ce60e41..8932b05a26 100644 --- a/pathspec.c +++ b/pathspec.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "abspath.h" #include "config.h" #include "dir.h" diff --git a/preload-index.c b/preload-index.c index d037a951ef..e44530c80c 100644 --- a/preload-index.c +++ b/preload-index.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2008 Linus Torvalds */ -#include "cache.h" +#include "git-compat-util.h" #include "pathspec.h" #include "dir.h" #include "environment.h" diff --git a/read-cache.c b/read-cache.c index 42f27b0664..edab96765d 100644 --- a/read-cache.c +++ b/read-cache.c @@ -3,7 +3,7 @@ * * Copyright (C) Linus Torvalds, 2005 */ -#include "cache.h" +#include "git-compat-util.h" #include "alloc.h" #include "bulk-checkin.h" #include "config.h" diff --git a/refs/files-backend.c b/refs/files-backend.c index 9a8333c0d0..9223c7f5f4 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -1,4 +1,4 @@ -#include "../cache.h" +#include "../git-compat-util.h" #include "../config.h" #include "../copy.h" #include "../environment.h" diff --git a/refs/packed-backend.c b/refs/packed-backend.c index f21882cc2e..27bd6339ff 100644 --- a/refs/packed-backend.c +++ b/refs/packed-backend.c @@ -1,4 +1,4 @@ -#include "../cache.h" +#include "../git-compat-util.h" #include "../alloc.h" #include "../config.h" #include "../gettext.h" diff --git a/repository.c b/repository.c index 3d799150b4..2616aabde5 100644 --- a/repository.c +++ b/repository.c @@ -3,7 +3,7 @@ * declaration matches the definition in this file. */ #define USE_THE_INDEX_VARIABLE -#include "cache.h" +#include "git-compat-util.h" #include "abspath.h" #include "repository.h" #include "object-store.h" diff --git a/rerere.c b/rerere.c index 3bc9aedc28..2fb93a5112 100644 --- a/rerere.c +++ b/rerere.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "abspath.h" #include "alloc.h" #include "config.h" diff --git a/resolve-undo.c b/resolve-undo.c index 5959887784..7817f5d6db 100644 --- a/resolve-undo.c +++ b/resolve-undo.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "dir.h" #include "hash.h" #include "read-cache.h" diff --git a/revision.c b/revision.c index 8d37ec9f49..66a1fece0d 100644 --- a/revision.c +++ b/revision.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "alloc.h" #include "config.h" #include "environment.h" diff --git a/run-command.h b/run-command.h index 9e47f91d46..1f22cc3827 100644 --- a/run-command.h +++ b/run-command.h @@ -503,7 +503,7 @@ void run_processes_parallel(const struct run_process_parallel_opts *opts); * exception of GIT_CONFIG_PARAMETERS and GIT_CONFIG_COUNT (which cause the * corresponding environment variables to be unset in the subprocess) and adds * an environment variable pointing to new_git_dir. See local_repo_env in - * cache.h for more information. + * environment.h for more information. */ void prepare_other_repo_env(struct strvec *env, const char *new_git_dir); diff --git a/sequencer.c b/sequencer.c index bdcf2cc6d9..efad20b753 100644 --- a/sequencer.c +++ b/sequencer.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "abspath.h" #include "advice.h" #include "alloc.h" diff --git a/shallow.c b/shallow.c index a2ebf0af2b..f1c93e7464 100644 --- a/shallow.c +++ b/shallow.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "alloc.h" #include "hex.h" #include "repository.h" diff --git a/sparse-index.c b/sparse-index.c index 60451daae8..2c47954d93 100644 --- a/sparse-index.c +++ b/sparse-index.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "alloc.h" #include "environment.h" #include "gettext.h" diff --git a/split-index.c b/split-index.c index 0a8d3903d6..0ee3865a55 100644 --- a/split-index.c +++ b/split-index.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "alloc.h" #include "gettext.h" #include "hash.h" diff --git a/strbuf.h b/strbuf.h index 3dfeadb44c..e8dfab6ecd 100644 --- a/strbuf.h +++ b/strbuf.h @@ -72,10 +72,6 @@ struct strbuf { extern char strbuf_slopbuf[]; #define STRBUF_INIT { .buf = strbuf_slopbuf } -/* - * Predeclare this here, since cache.h includes this file before it defines the - * struct. - */ struct object_id; /** diff --git a/submodule.c b/submodule.c index e09722d6be..20aa8ed0fb 100644 --- a/submodule.c +++ b/submodule.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "abspath.h" #include "alloc.h" #include "repository.h" diff --git a/t/helper/test-cache-tree.c b/t/helper/test-cache-tree.c index 9d64422b3c..e7236392c8 100644 --- a/t/helper/test-cache-tree.c +++ b/t/helper/test-cache-tree.c @@ -1,6 +1,5 @@ #define USE_THE_INDEX_VARIABLE #include "test-tool.h" -#include "cache.h" #include "gettext.h" #include "hex.h" #include "tree.h" diff --git a/t/helper/test-dump-cache-tree.c b/t/helper/test-dump-cache-tree.c index 78aa11bb19..c38f546e4f 100644 --- a/t/helper/test-dump-cache-tree.c +++ b/t/helper/test-dump-cache-tree.c @@ -1,6 +1,5 @@ #define USE_THE_INDEX_VARIABLE #include "test-tool.h" -#include "cache.h" #include "hash.h" #include "hex.h" #include "tree.h" diff --git a/t/helper/test-dump-fsmonitor.c b/t/helper/test-dump-fsmonitor.c index e4357d65ec..4f215fea02 100644 --- a/t/helper/test-dump-fsmonitor.c +++ b/t/helper/test-dump-fsmonitor.c @@ -1,5 +1,4 @@ #include "test-tool.h" -#include "cache.h" #include "read-cache-ll.h" #include "repository.h" #include "setup.h" diff --git a/t/helper/test-dump-split-index.c b/t/helper/test-dump-split-index.c index 59a24a842b..5cf0b26dca 100644 --- a/t/helper/test-dump-split-index.c +++ b/t/helper/test-dump-split-index.c @@ -1,6 +1,5 @@ #define USE_THE_INDEX_VARIABLE #include "test-tool.h" -#include "cache.h" #include "hex.h" #include "read-cache-ll.h" #include "repository.h" diff --git a/t/helper/test-dump-untracked-cache.c b/t/helper/test-dump-untracked-cache.c index a1cbafd64f..b4af9712fe 100644 --- a/t/helper/test-dump-untracked-cache.c +++ b/t/helper/test-dump-untracked-cache.c @@ -1,6 +1,5 @@ #define USE_THE_INDEX_VARIABLE #include "test-tool.h" -#include "cache.h" #include "dir.h" #include "hex.h" #include "read-cache-ll.h" diff --git a/t/helper/test-fast-rebase.c b/t/helper/test-fast-rebase.c index cbcf2419f9..62c5b5d704 100644 --- a/t/helper/test-fast-rebase.c +++ b/t/helper/test-fast-rebase.c @@ -12,7 +12,6 @@ #define USE_THE_INDEX_VARIABLE #include "test-tool.h" -#include "cache.h" #include "cache-tree.h" #include "commit.h" #include "environment.h" diff --git a/t/helper/test-fsmonitor-client.c b/t/helper/test-fsmonitor-client.c index 386f4cdaee..58d1dc5fc8 100644 --- a/t/helper/test-fsmonitor-client.c +++ b/t/helper/test-fsmonitor-client.c @@ -4,7 +4,6 @@ */ #include "test-tool.h" -#include "cache.h" #include "parse-options.h" #include "fsmonitor-ipc.h" #include "read-cache-ll.h" diff --git a/t/helper/test-hash-speed.c b/t/helper/test-hash-speed.c index c1e82d5d02..b235da594f 100644 --- a/t/helper/test-hash-speed.c +++ b/t/helper/test-hash-speed.c @@ -1,5 +1,4 @@ #include "test-tool.h" -#include "cache.h" #include "hash-ll.h" #define NUM_SECONDS 3 diff --git a/t/helper/test-index-version.c b/t/helper/test-index-version.c index b3cbaf6d2a..f3c2dbe0a2 100644 --- a/t/helper/test-index-version.c +++ b/t/helper/test-index-version.c @@ -1,5 +1,4 @@ #include "test-tool.h" -#include "cache.h" #include "read-cache-ll.h" int cmd__index_version(int argc UNUSED, const char **argv UNUSED) diff --git a/t/helper/test-lazy-init-name-hash.c b/t/helper/test-lazy-init-name-hash.c index 8eb327b3b9..187a115d57 100644 --- a/t/helper/test-lazy-init-name-hash.c +++ b/t/helper/test-lazy-init-name-hash.c @@ -1,6 +1,5 @@ #define USE_THE_INDEX_VARIABLE #include "test-tool.h" -#include "cache.h" #include "environment.h" #include "name-hash.h" #include "parse-options.h" diff --git a/t/helper/test-path-utils.c b/t/helper/test-path-utils.c index 90e4d29a06..70396fa384 100644 --- a/t/helper/test-path-utils.c +++ b/t/helper/test-path-utils.c @@ -1,5 +1,4 @@ #include "test-tool.h" -#include "cache.h" #include "abspath.h" #include "environment.h" #include "path.h" diff --git a/t/helper/test-read-cache.c b/t/helper/test-read-cache.c index 0d548814e0..56c2d25f35 100644 --- a/t/helper/test-read-cache.c +++ b/t/helper/test-read-cache.c @@ -1,6 +1,5 @@ #define USE_THE_INDEX_VARIABLE #include "test-tool.h" -#include "cache.h" #include "config.h" #include "read-cache-ll.h" #include "repository.h" diff --git a/t/helper/test-scrap-cache-tree.c b/t/helper/test-scrap-cache-tree.c index 7b7e238404..0a816a96e2 100644 --- a/t/helper/test-scrap-cache-tree.c +++ b/t/helper/test-scrap-cache-tree.c @@ -1,6 +1,5 @@ #define USE_THE_INDEX_VARIABLE #include "test-tool.h" -#include "cache.h" #include "lockfile.h" #include "read-cache-ll.h" #include "repository.h" diff --git a/t/helper/test-sha1.c b/t/helper/test-sha1.c index dc6fb17f2a..dcb7f6c003 100644 --- a/t/helper/test-sha1.c +++ b/t/helper/test-sha1.c @@ -1,5 +1,4 @@ #include "test-tool.h" -#include "cache.h" #include "hash-ll.h" int cmd__sha1(int ac, const char **av) diff --git a/t/helper/test-sha256.c b/t/helper/test-sha256.c index f50f64f1f2..08cf149001 100644 --- a/t/helper/test-sha256.c +++ b/t/helper/test-sha256.c @@ -1,5 +1,4 @@ #include "test-tool.h" -#include "cache.h" #include "hash-ll.h" int cmd__sha256(int ac, const char **av) diff --git a/t/helper/test-strcmp-offset.c b/t/helper/test-strcmp-offset.c index d3f39207f1..d8473cf2fc 100644 --- a/t/helper/test-strcmp-offset.c +++ b/t/helper/test-strcmp-offset.c @@ -1,5 +1,4 @@ #include "test-tool.h" -#include "cache.h" #include "read-cache-ll.h" int cmd__strcmp_offset(int argc UNUSED, const char **argv) diff --git a/t/helper/test-write-cache.c b/t/helper/test-write-cache.c index d27125eeac..f084034d38 100644 --- a/t/helper/test-write-cache.c +++ b/t/helper/test-write-cache.c @@ -1,6 +1,5 @@ #define USE_THE_INDEX_VARIABLE #include "test-tool.h" -#include "cache.h" #include "lockfile.h" #include "read-cache-ll.h" #include "repository.h" diff --git a/unpack-trees.c b/unpack-trees.c index fdcc46e474..4b620df303 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "advice.h" #include "strvec.h" #include "repository.h" diff --git a/wt-status.c b/wt-status.c index 847b63c906..6ee8567ac2 100644 --- a/wt-status.c +++ b/wt-status.c @@ -1,4 +1,4 @@ -#include "cache.h" +#include "git-compat-util.h" #include "advice.h" #include "wt-status.h" #include "object.h" From 0fd2e21571ac3a26e898fa6ce130894fd408080e Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Tue, 16 May 2023 06:33:58 +0000 Subject: [PATCH 18/28] log-tree: replace include of revision.h with simple forward declaration Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- builtin/diff-tree.c | 1 + log-tree.c | 1 + log-tree.h | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/builtin/diff-tree.c b/builtin/diff-tree.c index f3a458bb87..d62caa6c8b 100644 --- a/builtin/diff-tree.c +++ b/builtin/diff-tree.c @@ -9,6 +9,7 @@ #include "submodule.h" #include "read-cache-ll.h" #include "repository.h" +#include "revision.h" #include "tree.h" static struct rev_info log_tree_opt; diff --git a/log-tree.c b/log-tree.c index f4b22a60cc..07d0b47b16 100644 --- a/log-tree.c +++ b/log-tree.c @@ -16,6 +16,7 @@ #include "reflog-walk.h" #include "refs.h" #include "replace-object.h" +#include "revision.h" #include "string-list.h" #include "color.h" #include "gpg-interface.h" diff --git a/log-tree.h b/log-tree.h index e7e4641cf8..bdb6432815 100644 --- a/log-tree.h +++ b/log-tree.h @@ -1,7 +1,7 @@ #ifndef LOG_TREE_H #define LOG_TREE_H -#include "revision.h" +struct rev_info; struct log_info { struct commit *commit, *parent; From c339932bd858e84490c8690d393307a58764d6ed Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Tue, 16 May 2023 06:33:59 +0000 Subject: [PATCH 19/28] repository: remove unnecessary include of path.h This also made it clear that several .c files that depended upon path.h were missing a #include for it; add the missing includes while at it. Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- apply.c | 1 + archive.c | 1 + attr.c | 1 + bisect.c | 1 + blame.c | 1 + branch.c | 1 + builtin/add.c | 1 + builtin/am.c | 1 + builtin/bisect.c | 1 + builtin/branch.c | 1 + builtin/checkout.c | 1 + builtin/clean.c | 1 + builtin/clone.c | 1 + builtin/commit.c | 1 + builtin/count-objects.c | 1 + builtin/fast-import.c | 1 + builtin/fetch.c | 1 + builtin/fsck.c | 1 + builtin/gc.c | 1 + builtin/grep.c | 1 + builtin/ls-files.c | 1 + builtin/ls-tree.c | 1 + builtin/merge.c | 1 + builtin/notes.c | 1 + builtin/prune.c | 1 + builtin/pull.c | 1 + builtin/rebase.c | 1 + builtin/receive-pack.c | 1 + builtin/remote.c | 1 + builtin/repack.c | 1 + builtin/replace.c | 1 + builtin/reset.c | 1 + builtin/rev-parse.c | 1 + builtin/submodule--helper.c | 1 + builtin/tag.c | 1 + builtin/upload-archive.c | 1 + builtin/upload-pack.c | 1 + builtin/worktree.c | 1 + commit-graph.c | 1 + compat/fsmonitor/fsm-ipc-darwin.c | 1 + config.c | 1 + connect.c | 1 + dir.c | 1 + environment.c | 1 + fetch-pack.c | 1 + fsck.c | 1 + http-backend.c | 1 + merge-ort.c | 1 + merge-recursive.c | 1 + notes-merge.c | 1 + object-file.c | 1 + pack-bitmap-write.c | 1 + pack-write.c | 1 + read-cache.c | 1 + refs.c | 1 + refs/files-backend.c | 1 + remote.c | 1 + repository.c | 1 + repository.h | 2 -- rerere.c | 1 + sequencer.c | 1 + server-info.c | 1 + setup.c | 1 + shallow.c | 1 + strbuf.c | 1 + submodule-config.c | 1 + submodule.c | 1 + t/helper/test-ref-store.c | 1 + tmp-objdir.c | 1 + worktree.c | 1 + wt-status.c | 1 + 71 files changed, 70 insertions(+), 2 deletions(-) diff --git a/apply.c b/apply.c index e44a5dd7c5..be58dc08d2 100644 --- a/apply.c +++ b/apply.c @@ -27,6 +27,7 @@ #include "object-name.h" #include "object-file.h" #include "parse-options.h" +#include "path.h" #include "quote.h" #include "read-cache.h" #include "rerere.h" diff --git a/archive.c b/archive.c index 2ea9cbef92..2ad5f44201 100644 --- a/archive.c +++ b/archive.c @@ -6,6 +6,7 @@ #include "environment.h" #include "gettext.h" #include "hex.h" +#include "path.h" #include "pretty.h" #include "setup.h" #include "refs.h" diff --git a/attr.c b/attr.c index b659f415d8..2514c8a002 100644 --- a/attr.c +++ b/attr.c @@ -14,6 +14,7 @@ #include "attr.h" #include "dir.h" #include "gettext.h" +#include "path.h" #include "utf8.h" #include "quote.h" #include "read-cache-ll.h" diff --git a/bisect.c b/bisect.c index 8d5f8e5885..9f7cf0be07 100644 --- a/bisect.c +++ b/bisect.c @@ -19,6 +19,7 @@ #include "commit-reach.h" #include "object-name.h" #include "object-store.h" +#include "path.h" #include "dir.h" static struct oid_array good_revs; diff --git a/blame.c b/blame.c index ab3c6108cc..2e25a7254c 100644 --- a/blame.c +++ b/blame.c @@ -8,6 +8,7 @@ #include "diffcore.h" #include "gettext.h" #include "hex.h" +#include "path.h" #include "read-cache.h" #include "setup.h" #include "tag.h" diff --git a/branch.c b/branch.c index ba3914adf5..20073284c8 100644 --- a/branch.c +++ b/branch.c @@ -6,6 +6,7 @@ #include "gettext.h" #include "hex.h" #include "object-name.h" +#include "path.h" #include "refs.h" #include "refspec.h" #include "remote.h" diff --git a/builtin/add.c b/builtin/add.c index 50792c0d49..4318311448 100644 --- a/builtin/add.c +++ b/builtin/add.c @@ -16,6 +16,7 @@ #include "cache-tree.h" #include "run-command.h" #include "parse-options.h" +#include "path.h" #include "preload-index.h" #include "diff.h" #include "diffcore.h" diff --git a/builtin/am.c b/builtin/am.c index 2f0f233791..a78daa6971 100644 --- a/builtin/am.c +++ b/builtin/am.c @@ -41,6 +41,7 @@ #include "string-list.h" #include "packfile.h" #include "pager.h" +#include "path.h" #include "repository.h" #include "pretty.h" #include "wrapper.h" diff --git a/builtin/bisect.c b/builtin/bisect.c index bce0ee6268..6478df3489 100644 --- a/builtin/bisect.c +++ b/builtin/bisect.c @@ -11,6 +11,7 @@ #include "strvec.h" #include "run-command.h" #include "oid-array.h" +#include "path.h" #include "prompt.h" #include "quote.h" #include "revision.h" diff --git a/builtin/branch.c b/builtin/branch.c index c480fa2121..20fea4576a 100644 --- a/builtin/branch.c +++ b/builtin/branch.c @@ -18,6 +18,7 @@ #include "parse-options.h" #include "branch.h" #include "diff.h" +#include "path.h" #include "revision.h" #include "string-list.h" #include "column.h" diff --git a/builtin/checkout.c b/builtin/checkout.c index 09b8415649..716dcd4cae 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -20,6 +20,7 @@ #include "object-name.h" #include "object-store.h" #include "parse-options.h" +#include "path.h" #include "preload-index.h" #include "read-cache.h" #include "refs.h" diff --git a/builtin/clean.c b/builtin/clean.c index 66b4479356..1bb6b7965c 100644 --- a/builtin/clean.c +++ b/builtin/clean.c @@ -13,6 +13,7 @@ #include "dir.h" #include "gettext.h" #include "parse-options.h" +#include "path.h" #include "read-cache-ll.h" #include "repository.h" #include "setup.h" diff --git a/builtin/clone.c b/builtin/clone.c index cc34c194f5..6c5cb33f6a 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -39,6 +39,7 @@ #include "setup.h" #include "connected.h" #include "packfile.h" +#include "path.h" #include "pkt-line.h" #include "list-objects-filter-options.h" #include "hook.h" diff --git a/builtin/commit.c b/builtin/commit.c index acf21789a0..288314fe60 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -29,6 +29,7 @@ #include "utf8.h" #include "object-name.h" #include "parse-options.h" +#include "path.h" #include "preload-index.h" #include "read-cache.h" #include "string-list.h" diff --git a/builtin/count-objects.c b/builtin/count-objects.c index b9e6b55a9a..c9f82d0bce 100644 --- a/builtin/count-objects.c +++ b/builtin/count-objects.c @@ -9,6 +9,7 @@ #include "dir.h" #include "environment.h" #include "gettext.h" +#include "path.h" #include "repository.h" #include "parse-options.h" #include "quote.h" diff --git a/builtin/fast-import.c b/builtin/fast-import.c index 67a2260a5e..5698b92ae7 100644 --- a/builtin/fast-import.c +++ b/builtin/fast-import.c @@ -12,6 +12,7 @@ #include "commit.h" #include "delta.h" #include "pack.h" +#include "path.h" #include "refs.h" #include "csum-file.h" #include "quote.h" diff --git a/builtin/fetch.c b/builtin/fetch.c index 2c6f4d3dff..d51b28fe2e 100644 --- a/builtin/fetch.c +++ b/builtin/fetch.c @@ -28,6 +28,7 @@ #include "utf8.h" #include "packfile.h" #include "pager.h" +#include "path.h" #include "pkt-line.h" #include "list-objects-filter-options.h" #include "commit-reach.h" diff --git a/builtin/fsck.c b/builtin/fsck.c index 3e169f413d..88c466c048 100644 --- a/builtin/fsck.c +++ b/builtin/fsck.c @@ -21,6 +21,7 @@ #include "object-file.h" #include "object-name.h" #include "object-store.h" +#include "path.h" #include "read-cache-ll.h" #include "replace-object.h" #include "resolve-undo.h" diff --git a/builtin/gc.c b/builtin/gc.c index f3942188a6..aeceed4117 100644 --- a/builtin/gc.c +++ b/builtin/gc.c @@ -30,6 +30,7 @@ #include "object-store.h" #include "pack.h" #include "pack-objects.h" +#include "path.h" #include "blob.h" #include "tree.h" #include "promisor-remote.h" diff --git a/builtin/grep.c b/builtin/grep.c index 7638d77900..6bc8abcd3e 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -30,6 +30,7 @@ #include "object-store.h" #include "packfile.h" #include "pager.h" +#include "path.h" #include "read-cache-ll.h" #include "write-or-die.h" diff --git a/builtin/ls-files.c b/builtin/ls-files.c index 3e314980fe..c1ff79c559 100644 --- a/builtin/ls-files.c +++ b/builtin/ls-files.c @@ -19,6 +19,7 @@ #include "parse-options.h" #include "resolve-undo.h" #include "string-list.h" +#include "path.h" #include "pathspec.h" #include "read-cache.h" #include "run-command.h" diff --git a/builtin/ls-tree.c b/builtin/ls-tree.c index f4331c640f..c06858de4b 100644 --- a/builtin/ls-tree.c +++ b/builtin/ls-tree.c @@ -12,6 +12,7 @@ #include "blob.h" #include "tree.h" #include "commit.h" +#include "path.h" #include "quote.h" #include "parse-options.h" #include "pathspec.h" diff --git a/builtin/merge.c b/builtin/merge.c index d7ac108ce9..420e81008e 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -27,6 +27,7 @@ #include "refspec.h" #include "commit.h" #include "diffcore.h" +#include "path.h" #include "revision.h" #include "unpack-trees.h" #include "cache-tree.h" diff --git a/builtin/notes.c b/builtin/notes.c index efdf245148..0a870d9083 100644 --- a/builtin/notes.c +++ b/builtin/notes.c @@ -15,6 +15,7 @@ #include "notes.h" #include "object-name.h" #include "object-store.h" +#include "path.h" #include "repository.h" #include "blob.h" #include "pretty.h" diff --git a/builtin/prune.c b/builtin/prune.c index b3658b5b51..a46c5aa2b5 100644 --- a/builtin/prune.c +++ b/builtin/prune.c @@ -7,6 +7,7 @@ #include "revision.h" #include "reachable.h" #include "parse-options.h" +#include "path.h" #include "progress.h" #include "prune-packed.h" #include "replace-object.h" diff --git a/builtin/pull.c b/builtin/pull.c index d434495091..b9e5c64ee8 100644 --- a/builtin/pull.c +++ b/builtin/pull.c @@ -19,6 +19,7 @@ #include "oid-array.h" #include "remote.h" #include "dir.h" +#include "path.h" #include "read-cache-ll.h" #include "rebase.h" #include "refs.h" diff --git a/builtin/rebase.c b/builtin/rebase.c index ace1d5e8d1..91849f920f 100644 --- a/builtin/rebase.c +++ b/builtin/rebase.c @@ -24,6 +24,7 @@ #include "object-file.h" #include "object-name.h" #include "parse-options.h" +#include "path.h" #include "commit.h" #include "diff.h" #include "wt-status.h" diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c index 1a31a58367..d1718a3ac9 100644 --- a/builtin/receive-pack.c +++ b/builtin/receive-pack.c @@ -31,6 +31,7 @@ #include "packfile.h" #include "object-name.h" #include "object-store.h" +#include "path.h" #include "protocol.h" #include "commit-reach.h" #include "server-info.h" diff --git a/builtin/remote.c b/builtin/remote.c index 1e0b137d97..3794f13330 100644 --- a/builtin/remote.c +++ b/builtin/remote.c @@ -2,6 +2,7 @@ #include "config.h" #include "gettext.h" #include "parse-options.h" +#include "path.h" #include "transport.h" #include "remote.h" #include "string-list.h" diff --git a/builtin/repack.c b/builtin/repack.c index 0541c3ce15..fe8d5810d4 100644 --- a/builtin/repack.c +++ b/builtin/repack.c @@ -6,6 +6,7 @@ #include "gettext.h" #include "hex.h" #include "parse-options.h" +#include "path.h" #include "run-command.h" #include "server-info.h" #include "sigchain.h" diff --git a/builtin/replace.c b/builtin/replace.c index e0fbdc98ed..6b266a66d3 100644 --- a/builtin/replace.c +++ b/builtin/replace.c @@ -16,6 +16,7 @@ #include "hex.h" #include "refs.h" #include "parse-options.h" +#include "path.h" #include "run-command.h" #include "object-file.h" #include "object-name.h" diff --git a/builtin/reset.c b/builtin/reset.c index 3dc41ac332..f947c449d1 100644 --- a/builtin/reset.c +++ b/builtin/reset.c @@ -26,6 +26,7 @@ #include "branch.h" #include "object-name.h" #include "parse-options.h" +#include "path.h" #include "unpack-trees.h" #include "cache-tree.h" #include "setup.h" diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c index 8d8c870421..6eb5965bee 100644 --- a/builtin/rev-parse.c +++ b/builtin/rev-parse.c @@ -16,6 +16,7 @@ #include "quote.h" #include "object-name.h" #include "parse-options.h" +#include "path.h" #include "diff.h" #include "read-cache-ll.h" #include "revision.h" diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c index 12ba2ae45d..5fddfb158d 100644 --- a/builtin/submodule--helper.c +++ b/builtin/submodule--helper.c @@ -9,6 +9,7 @@ #include "config.h" #include "parse-options.h" #include "quote.h" +#include "path.h" #include "pathspec.h" #include "preload-index.h" #include "dir.h" diff --git a/builtin/tag.c b/builtin/tag.c index 26691e7e52..26122dd103 100644 --- a/builtin/tag.c +++ b/builtin/tag.c @@ -16,6 +16,7 @@ #include "refs.h" #include "object-name.h" #include "object-store.h" +#include "path.h" #include "tag.h" #include "run-command.h" #include "parse-options.h" diff --git a/builtin/upload-archive.c b/builtin/upload-archive.c index d4c7f162ff..1b09e5e1aa 100644 --- a/builtin/upload-archive.c +++ b/builtin/upload-archive.c @@ -3,6 +3,7 @@ */ #include "builtin.h" #include "archive.h" +#include "path.h" #include "pkt-line.h" #include "sideband.h" #include "repository.h" diff --git a/builtin/upload-pack.c b/builtin/upload-pack.c index ba5103a933..b02d479248 100644 --- a/builtin/upload-pack.c +++ b/builtin/upload-pack.c @@ -3,6 +3,7 @@ #include "gettext.h" #include "pkt-line.h" #include "parse-options.h" +#include "path.h" #include "protocol.h" #include "replace-object.h" #include "upload-pack.h" diff --git a/builtin/worktree.c b/builtin/worktree.c index 2d83ea4bf2..1a25980eb5 100644 --- a/builtin/worktree.c +++ b/builtin/worktree.c @@ -10,6 +10,7 @@ #include "object-file.h" #include "object-name.h" #include "parse-options.h" +#include "path.h" #include "strvec.h" #include "branch.h" #include "read-cache-ll.h" diff --git a/commit-graph.c b/commit-graph.c index 843bdb458d..25cbd66c33 100644 --- a/commit-graph.c +++ b/commit-graph.c @@ -14,6 +14,7 @@ #include "object-file.h" #include "object-store.h" #include "oid-array.h" +#include "path.h" #include "alloc.h" #include "hashmap.h" #include "replace-object.h" diff --git a/compat/fsmonitor/fsm-ipc-darwin.c b/compat/fsmonitor/fsm-ipc-darwin.c index 793073aaa7..964bc074db 100644 --- a/compat/fsmonitor/fsm-ipc-darwin.c +++ b/compat/fsmonitor/fsm-ipc-darwin.c @@ -2,6 +2,7 @@ #include "config.h" #include "gettext.h" #include "hex.h" +#include "path.h" #include "repository.h" #include "strbuf.h" #include "fsmonitor.h" diff --git a/config.c b/config.c index b92b75c5d0..8afa266054 100644 --- a/config.c +++ b/config.c @@ -27,6 +27,7 @@ #include "object-name.h" #include "object-store.h" #include "pager.h" +#include "path.h" #include "utf8.h" #include "dir.h" #include "color.h" diff --git a/connect.c b/connect.c index 3a0186280c..37674f7112 100644 --- a/connect.c +++ b/connect.c @@ -12,6 +12,7 @@ #include "url.h" #include "string-list.h" #include "oid-array.h" +#include "path.h" #include "transport.h" #include "trace2.h" #include "strbuf.h" diff --git a/dir.c b/dir.c index 1e84b1e1f2..3cf3d428c7 100644 --- a/dir.c +++ b/dir.c @@ -16,6 +16,7 @@ #include "name-hash.h" #include "object-file.h" #include "object-store.h" +#include "path.h" #include "attr.h" #include "refs.h" #include "wildmatch.h" diff --git a/environment.c b/environment.c index 4ecad41bb9..5c494777a6 100644 --- a/environment.c +++ b/environment.c @@ -21,6 +21,7 @@ #include "strvec.h" #include "object-file.h" #include "object-store.h" +#include "path.h" #include "replace-object.h" #include "tmp-objdir.h" #include "chdir-notify.h" diff --git a/fetch-pack.c b/fetch-pack.c index 0f71054fba..207548b3e5 100644 --- a/fetch-pack.c +++ b/fetch-pack.c @@ -25,6 +25,7 @@ #include "oidset.h" #include "packfile.h" #include "object-store.h" +#include "path.h" #include "connected.h" #include "fetch-negotiator.h" #include "fsck.h" diff --git a/fsck.c b/fsck.c index 3261ef9ec2..04e729953b 100644 --- a/fsck.c +++ b/fsck.c @@ -3,6 +3,7 @@ #include "date.h" #include "hex.h" #include "object-store.h" +#include "path.h" #include "repository.h" #include "object.h" #include "attr.h" diff --git a/http-backend.c b/http-backend.c index ac146d85c5..ddb9549ecb 100644 --- a/http-backend.c +++ b/http-backend.c @@ -4,6 +4,7 @@ #include "environment.h" #include "git-zlib.h" #include "hex.h" +#include "path.h" #include "repository.h" #include "refs.h" #include "pkt-line.h" diff --git a/merge-ort.c b/merge-ort.c index 12d0181f4a..587eea9801 100644 --- a/merge-ort.c +++ b/merge-ort.c @@ -36,6 +36,7 @@ #include "object-name.h" #include "object-store.h" #include "oid-array.h" +#include "path.h" #include "promisor-remote.h" #include "read-cache-ll.h" #include "revision.h" diff --git a/merge-recursive.c b/merge-recursive.c index 4bef9b62fa..527dbbd010 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -27,6 +27,7 @@ #include "object-file.h" #include "object-name.h" #include "object-store.h" +#include "path.h" #include "repository.h" #include "revision.h" #include "sparse-index.h" diff --git a/notes-merge.c b/notes-merge.c index 233e49e319..4b328d852c 100644 --- a/notes-merge.c +++ b/notes-merge.c @@ -6,6 +6,7 @@ #include "object-file.h" #include "object-name.h" #include "object-store.h" +#include "path.h" #include "repository.h" #include "diff.h" #include "diffcore.h" diff --git a/object-file.c b/object-file.c index 7c1af5c8db..8d87720dd5 100644 --- a/object-file.c +++ b/object-file.c @@ -39,6 +39,7 @@ #include "object-file.h" #include "object-store.h" #include "oidtree.h" +#include "path.h" #include "promisor-remote.h" #include "setup.h" #include "submodule.h" diff --git a/pack-bitmap-write.c b/pack-bitmap-write.c index cdffe2ce47..623ee2a819 100644 --- a/pack-bitmap-write.c +++ b/pack-bitmap-write.c @@ -15,6 +15,7 @@ #include "pack-bitmap.h" #include "hash-lookup.h" #include "pack-objects.h" +#include "path.h" #include "commit-reach.h" #include "prio-queue.h" #include "trace2.h" diff --git a/pack-write.c b/pack-write.c index 3b3ce89de6..45681e2d7d 100644 --- a/pack-write.c +++ b/pack-write.c @@ -10,6 +10,7 @@ #include "oidmap.h" #include "pack-objects.h" #include "pack-revindex.h" +#include "path.h" #include "wrapper.h" void reset_pack_idx_option(struct pack_idx_option *opts) diff --git a/read-cache.c b/read-cache.c index edab96765d..86ada403a8 100644 --- a/read-cache.c +++ b/read-cache.c @@ -27,6 +27,7 @@ #include "mem-pool.h" #include "name-hash.h" #include "object-name.h" +#include "path.h" #include "preload-index.h" #include "read-cache.h" #include "resolve-undo.h" diff --git a/refs.c b/refs.c index 881a0da65c..6d657e3bb4 100644 --- a/refs.c +++ b/refs.c @@ -19,6 +19,7 @@ #include "object-name.h" #include "object-store.h" #include "object.h" +#include "path.h" #include "tag.h" #include "submodule.h" #include "worktree.h" diff --git a/refs/files-backend.c b/refs/files-backend.c index 9223c7f5f4..09b4954f21 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -15,6 +15,7 @@ #include "../lockfile.h" #include "../object.h" #include "../object-file.h" +#include "../path.h" #include "../dir.h" #include "../chdir-notify.h" #include "../setup.h" diff --git a/remote.c b/remote.c index 0764fca0db..8550056db4 100644 --- a/remote.c +++ b/remote.c @@ -11,6 +11,7 @@ #include "refspec.h" #include "object-name.h" #include "object-store.h" +#include "path.h" #include "commit.h" #include "diff.h" #include "revision.h" diff --git a/repository.c b/repository.c index 2616aabde5..4d68537407 100644 --- a/repository.c +++ b/repository.c @@ -10,6 +10,7 @@ #include "config.h" #include "object.h" #include "lockfile.h" +#include "path.h" #include "read-cache-ll.h" #include "remote.h" #include "setup.h" diff --git a/repository.h b/repository.h index 1cb314721c..0f430b1bc2 100644 --- a/repository.h +++ b/repository.h @@ -1,8 +1,6 @@ #ifndef REPOSITORY_H #define REPOSITORY_H -#include "path.h" - struct config_set; struct fsmonitor_settings; struct git_hash_algo; diff --git a/rerere.c b/rerere.c index 2fb93a5112..35b9785d57 100644 --- a/rerere.c +++ b/rerere.c @@ -14,6 +14,7 @@ #include "resolve-undo.h" #include "ll-merge.h" #include "attr.h" +#include "path.h" #include "pathspec.h" #include "object-file.h" #include "object-store.h" diff --git a/sequencer.c b/sequencer.c index efad20b753..282a6cff1b 100644 --- a/sequencer.c +++ b/sequencer.c @@ -23,6 +23,7 @@ #include "utf8.h" #include "cache-tree.h" #include "diff.h" +#include "path.h" #include "revision.h" #include "rerere.h" #include "merge.h" diff --git a/server-info.c b/server-info.c index 55aa04f00a..85d17bbb15 100644 --- a/server-info.c +++ b/server-info.c @@ -9,6 +9,7 @@ #include "commit.h" #include "tag.h" #include "packfile.h" +#include "path.h" #include "object-file.h" #include "object-store.h" #include "server-info.h" diff --git a/setup.c b/setup.c index 6e7282e680..ef55ad7cda 100644 --- a/setup.c +++ b/setup.c @@ -12,6 +12,7 @@ #include "setup.h" #include "string-list.h" #include "chdir-notify.h" +#include "path.h" #include "promisor-remote.h" #include "quote.h" #include "trace2.h" diff --git a/shallow.c b/shallow.c index f1c93e7464..45343e6a78 100644 --- a/shallow.c +++ b/shallow.c @@ -11,6 +11,7 @@ #include "remote.h" #include "refs.h" #include "oid-array.h" +#include "path.h" #include "diff.h" #include "revision.h" #include "commit-slab.h" diff --git a/strbuf.c b/strbuf.c index 08eec8f1d8..d070e007f8 100644 --- a/strbuf.c +++ b/strbuf.c @@ -6,6 +6,7 @@ #include "hex.h" #include "object-name.h" #include "refs.h" +#include "path.h" #include "repository.h" #include "string-list.h" #include "utf8.h" diff --git a/submodule-config.c b/submodule-config.c index 7eb7a0d88d..6786bcee52 100644 --- a/submodule-config.c +++ b/submodule-config.c @@ -4,6 +4,7 @@ #include "environment.h" #include "gettext.h" #include "hex.h" +#include "path.h" #include "repository.h" #include "config.h" #include "submodule-config.h" diff --git a/submodule.c b/submodule.c index 20aa8ed0fb..245300596f 100644 --- a/submodule.c +++ b/submodule.c @@ -20,6 +20,7 @@ #include "strvec.h" #include "blob.h" #include "thread-utils.h" +#include "path.h" #include "quote.h" #include "remote.h" #include "worktree.h" diff --git a/t/helper/test-ref-store.c b/t/helper/test-ref-store.c index a6977b5e83..15fa3f880c 100644 --- a/t/helper/test-ref-store.c +++ b/t/helper/test-ref-store.c @@ -4,6 +4,7 @@ #include "setup.h" #include "worktree.h" #include "object-store.h" +#include "path.h" #include "repository.h" #include "revision.h" diff --git a/tmp-objdir.c b/tmp-objdir.c index c33a554f92..db1f7038da 100644 --- a/tmp-objdir.c +++ b/tmp-objdir.c @@ -5,6 +5,7 @@ #include "dir.h" #include "environment.h" #include "object-file.h" +#include "path.h" #include "sigchain.h" #include "string-list.h" #include "strbuf.h" diff --git a/worktree.c b/worktree.c index c448fecd4b..b4b01340a0 100644 --- a/worktree.c +++ b/worktree.c @@ -3,6 +3,7 @@ #include "alloc.h" #include "environment.h" #include "gettext.h" +#include "path.h" #include "repository.h" #include "refs.h" #include "setup.h" diff --git a/wt-status.c b/wt-status.c index 6ee8567ac2..7ada6b305f 100644 --- a/wt-status.c +++ b/wt-status.c @@ -9,6 +9,7 @@ #include "gettext.h" #include "hex.h" #include "object-name.h" +#include "path.h" #include "revision.h" #include "diffcore.h" #include "quote.h" From df6e8744966bfa66ff289f58372bb060fdc6a124 Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Tue, 16 May 2023 06:34:00 +0000 Subject: [PATCH 20/28] diff.h: remove unnecessary include of oidset.h This also made it clear that several .c files depended upon various things that oidset included, but had omitted the direct #include for those headers. Add those now. Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- add-interactive.c | 2 ++ add-patch.c | 1 + blame.h | 1 + builtin/add.c | 1 + builtin/diff-files.c | 1 + builtin/diff-index.c | 1 + builtin/merge-ours.c | 1 + builtin/patch-id.c | 1 + builtin/range-diff.c | 1 + builtin/reflog.c | 1 + builtin/reset.c | 1 + builtin/rev-parse.c | 1 + builtin/revert.c | 1 + builtin/shortlog.c | 1 + builtin/stash.c | 1 + diff-lib.c | 2 ++ diff.h | 4 +++- diffcore-break.c | 1 + diffcore-pickaxe.c | 1 + line-log.c | 1 + merge.c | 2 ++ patch-ids.c | 1 + pretty.c | 1 + range-diff.c | 1 + reflog-walk.c | 1 + t/helper/test-fast-rebase.c | 1 + t/helper/test-revision-walking.c | 1 + transport-helper.c | 1 + tree-diff.c | 1 + wt-status.c | 1 + 30 files changed, 35 insertions(+), 1 deletion(-) diff --git a/add-interactive.c b/add-interactive.c index 40f88c0205..add9a1ad43 100644 --- a/add-interactive.c +++ b/add-interactive.c @@ -4,9 +4,11 @@ #include "config.h" #include "diffcore.h" #include "gettext.h" +#include "hash.h" #include "hex.h" #include "preload-index.h" #include "read-cache-ll.h" +#include "repository.h" #include "revision.h" #include "refs.h" #include "string-list.h" diff --git a/add-patch.c b/add-patch.c index 875b96e227..53e3248295 100644 --- a/add-patch.c +++ b/add-patch.c @@ -7,6 +7,7 @@ #include "gettext.h" #include "object-name.h" #include "read-cache-ll.h" +#include "repository.h" #include "strbuf.h" #include "run-command.h" #include "strvec.h" diff --git a/blame.h b/blame.h index b60d1d81e3..31ddc85f19 100644 --- a/blame.h +++ b/blame.h @@ -2,6 +2,7 @@ #define BLAME_H #include "commit.h" +#include "oidset.h" #include "xdiff-interface.h" #include "revision.h" #include "prio-queue.h" diff --git a/builtin/add.c b/builtin/add.c index 4318311448..e3ca3e4edb 100644 --- a/builtin/add.c +++ b/builtin/add.c @@ -21,6 +21,7 @@ #include "diff.h" #include "diffcore.h" #include "read-cache.h" +#include "repository.h" #include "revision.h" #include "bulk-checkin.h" #include "strvec.h" diff --git a/builtin/diff-files.c b/builtin/diff-files.c index a4a2ab76c7..50330b8dd2 100644 --- a/builtin/diff-files.c +++ b/builtin/diff-files.c @@ -9,6 +9,7 @@ #include "diff-merges.h" #include "commit.h" #include "preload-index.h" +#include "repository.h" #include "revision.h" #include "submodule.h" diff --git a/builtin/diff-index.c b/builtin/diff-index.c index 1ab8f8b6dc..a8b2c0a4b9 100644 --- a/builtin/diff-index.c +++ b/builtin/diff-index.c @@ -4,6 +4,7 @@ #include "diff-merges.h" #include "commit.h" #include "preload-index.h" +#include "repository.h" #include "revision.h" #include "setup.h" #include "submodule.h" diff --git a/builtin/merge-ours.c b/builtin/merge-ours.c index c2e519301e..932924e5d0 100644 --- a/builtin/merge-ours.c +++ b/builtin/merge-ours.c @@ -10,6 +10,7 @@ #include "git-compat-util.h" #include "builtin.h" #include "diff.h" +#include "repository.h" static const char builtin_merge_ours_usage[] = "git merge-ours ... -- HEAD ..."; diff --git a/builtin/patch-id.c b/builtin/patch-id.c index 27952f1a6f..b7118b290b 100644 --- a/builtin/patch-id.c +++ b/builtin/patch-id.c @@ -2,6 +2,7 @@ #include "config.h" #include "diff.h" #include "gettext.h" +#include "hash.h" #include "hex.h" #include "parse-options.h" diff --git a/builtin/range-diff.c b/builtin/range-diff.c index 8610390d7c..e455a4795c 100644 --- a/builtin/range-diff.c +++ b/builtin/range-diff.c @@ -4,6 +4,7 @@ #include "parse-options.h" #include "range-diff.h" #include "config.h" +#include "repository.h" #include "revision.h" static const char * const builtin_range_diff_usage[] = { diff --git a/builtin/reflog.c b/builtin/reflog.c index a1fa0c855f..fc21774880 100644 --- a/builtin/reflog.c +++ b/builtin/reflog.c @@ -1,6 +1,7 @@ #include "builtin.h" #include "config.h" #include "gettext.h" +#include "repository.h" #include "revision.h" #include "reachable.h" #include "worktree.h" diff --git a/builtin/reset.c b/builtin/reset.c index f947c449d1..dad2117c97 100644 --- a/builtin/reset.c +++ b/builtin/reset.c @@ -13,6 +13,7 @@ #include "config.h" #include "environment.h" #include "gettext.h" +#include "hash.h" #include "hex.h" #include "lockfile.h" #include "tag.h" diff --git a/builtin/rev-parse.c b/builtin/rev-parse.c index 6eb5965bee..4a219ea93b 100644 --- a/builtin/rev-parse.c +++ b/builtin/rev-parse.c @@ -11,6 +11,7 @@ #include "commit.h" #include "environment.h" #include "gettext.h" +#include "hash.h" #include "hex.h" #include "refs.h" #include "quote.h" diff --git a/builtin/revert.c b/builtin/revert.c index 0240ec8593..f6f07d9b53 100644 --- a/builtin/revert.c +++ b/builtin/revert.c @@ -5,6 +5,7 @@ #include "parse-options.h" #include "diff.h" #include "gettext.h" +#include "repository.h" #include "revision.h" #include "rerere.h" #include "dir.h" diff --git a/builtin/shortlog.c b/builtin/shortlog.c index 99be9dc417..1307ed2b88 100644 --- a/builtin/shortlog.c +++ b/builtin/shortlog.c @@ -5,6 +5,7 @@ #include "environment.h" #include "gettext.h" #include "string-list.h" +#include "repository.h" #include "revision.h" #include "utf8.h" #include "mailmap.h" diff --git a/builtin/stash.c b/builtin/stash.c index d3d5bb95e2..84e83e0627 100644 --- a/builtin/stash.c +++ b/builtin/stash.c @@ -4,6 +4,7 @@ #include "config.h" #include "environment.h" #include "gettext.h" +#include "hash.h" #include "hex.h" #include "object-name.h" #include "parse-options.h" diff --git a/diff-lib.c b/diff-lib.c index f3aa7f93c7..cad18099ab 100644 --- a/diff-lib.c +++ b/diff-lib.c @@ -7,6 +7,7 @@ #include "diff.h" #include "diffcore.h" #include "gettext.h" +#include "hash.h" #include "hex.h" #include "object-name.h" #include "read-cache.h" @@ -14,6 +15,7 @@ #include "cache-tree.h" #include "unpack-trees.h" #include "refs.h" +#include "repository.h" #include "submodule.h" #include "symlinks.h" #include "trace.h" diff --git a/diff.h b/diff.h index 5a0c91bb48..2102df329a 100644 --- a/diff.h +++ b/diff.h @@ -4,10 +4,12 @@ #ifndef DIFF_H #define DIFF_H +#include "hash-ll.h" #include "pathspec.h" -#include "oidset.h" #include "strbuf.h" +struct oidset; + /** * The diff API is for programs that compare two sets of files (e.g. two trees, * one tree and the index) and present the found difference in various ways. diff --git a/diffcore-break.c b/diffcore-break.c index 4909dc088e..f57ece2757 100644 --- a/diffcore-break.c +++ b/diffcore-break.c @@ -4,6 +4,7 @@ #include "git-compat-util.h" #include "diff.h" #include "diffcore.h" +#include "hash.h" #include "object.h" #include "promisor-remote.h" diff --git a/diffcore-pickaxe.c b/diffcore-pickaxe.c index 13c98a7b5e..b195fa4eb3 100644 --- a/diffcore-pickaxe.c +++ b/diffcore-pickaxe.c @@ -7,6 +7,7 @@ #include "diffcore.h" #include "xdiff-interface.h" #include "kwset.h" +#include "oidset.h" #include "pretty.h" #include "quote.h" diff --git a/line-log.c b/line-log.c index 6a7ac312a4..2eff914bf3 100644 --- a/line-log.c +++ b/line-log.c @@ -8,6 +8,7 @@ #include "diff.h" #include "commit.h" #include "decorate.h" +#include "repository.h" #include "revision.h" #include "xdiff-interface.h" #include "strbuf.h" diff --git a/merge.c b/merge.c index 83bcba6943..b60925459c 100644 --- a/merge.c +++ b/merge.c @@ -2,10 +2,12 @@ #include "diff.h" #include "diffcore.h" #include "gettext.h" +#include "hash.h" #include "hex.h" #include "lockfile.h" #include "merge.h" #include "commit.h" +#include "repository.h" #include "run-command.h" #include "resolve-undo.h" #include "tree.h" diff --git a/patch-ids.c b/patch-ids.c index 19af7bee98..c3e1a0dd21 100644 --- a/patch-ids.c +++ b/patch-ids.c @@ -1,6 +1,7 @@ #include "git-compat-util.h" #include "diff.h" #include "commit.h" +#include "hash.h" #include "hash-lookup.h" #include "hex.h" #include "patch-ids.h" diff --git a/pretty.c b/pretty.c index 0bb938021b..2cf2cbbd03 100644 --- a/pretty.c +++ b/pretty.c @@ -4,6 +4,7 @@ #include "commit.h" #include "environment.h" #include "gettext.h" +#include "hash.h" #include "hex.h" #include "utf8.h" #include "diff.h" diff --git a/range-diff.c b/range-diff.c index 6a704e6f47..2e86063491 100644 --- a/range-diff.c +++ b/range-diff.c @@ -13,6 +13,7 @@ #include "commit.h" #include "pager.h" #include "pretty.h" +#include "repository.h" #include "userdiff.h" #include "apply.h" #include "revision.h" diff --git a/reflog-walk.c b/reflog-walk.c index 4ba1a10c82..d337e64431 100644 --- a/reflog-walk.c +++ b/reflog-walk.c @@ -3,6 +3,7 @@ #include "commit.h" #include "refs.h" #include "diff.h" +#include "repository.h" #include "revision.h" #include "string-list.h" #include "reflog-walk.h" diff --git a/t/helper/test-fast-rebase.c b/t/helper/test-fast-rebase.c index 62c5b5d704..cac20a72b3 100644 --- a/t/helper/test-fast-rebase.c +++ b/t/helper/test-fast-rebase.c @@ -16,6 +16,7 @@ #include "commit.h" #include "environment.h" #include "gettext.h" +#include "hash.h" #include "hex.h" #include "lockfile.h" #include "merge-ort.h" diff --git a/t/helper/test-revision-walking.c b/t/helper/test-revision-walking.c index 0c62b9de18..f346951bc2 100644 --- a/t/helper/test-revision-walking.c +++ b/t/helper/test-revision-walking.c @@ -11,6 +11,7 @@ #include "test-tool.h" #include "commit.h" #include "diff.h" +#include "repository.h" #include "revision.h" #include "setup.h" diff --git a/transport-helper.c b/transport-helper.c index 6b816940dc..5c0bc6a896 100644 --- a/transport-helper.c +++ b/transport-helper.c @@ -8,6 +8,7 @@ #include "gettext.h" #include "hex.h" #include "object-name.h" +#include "repository.h" #include "revision.h" #include "remote.h" #include "string-list.h" diff --git a/tree-diff.c b/tree-diff.c index 20bb15f38d..966946848a 100644 --- a/tree-diff.c +++ b/tree-diff.c @@ -4,6 +4,7 @@ #include "git-compat-util.h" #include "diff.h" #include "diffcore.h" +#include "hash.h" #include "tree.h" #include "tree-walk.h" diff --git a/wt-status.c b/wt-status.c index 7ada6b305f..bcd0ef8044 100644 --- a/wt-status.c +++ b/wt-status.c @@ -7,6 +7,7 @@ #include "diff.h" #include "environment.h" #include "gettext.h" +#include "hash.h" #include "hex.h" #include "object-name.h" #include "path.h" From 768122900f7af84c2536fd9cb9d205f8ad774322 Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Tue, 16 May 2023 06:34:01 +0000 Subject: [PATCH 21/28] list-objects-filter-options.h: remove unneccessary include Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- list-objects-filter-options.h | 1 - 1 file changed, 1 deletion(-) diff --git a/list-objects-filter-options.h b/list-objects-filter-options.h index f620612586..55fab8563d 100644 --- a/list-objects-filter-options.h +++ b/list-objects-filter-options.h @@ -3,7 +3,6 @@ #include "gettext.h" #include "object.h" -#include "string-list.h" #include "strbuf.h" struct option; From 88e4e18325d6ddc3d21ffd9eda8259566443a7f7 Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Tue, 16 May 2023 06:34:02 +0000 Subject: [PATCH 22/28] builtin.h: remove unneccessary includes This also made it clear that a few .c files under builtin/ were depending upon some headers but had forgotten to #include them. Add the missing direct includes while at it. Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- builtin.h | 2 -- builtin/check-mailmap.c | 1 + builtin/commit-graph.c | 1 + builtin/config.c | 1 + builtin/credential-cache.c | 1 + builtin/for-each-ref.c | 1 + builtin/init-db.c | 1 + builtin/verify-pack.c | 1 + 8 files changed, 7 insertions(+), 2 deletions(-) diff --git a/builtin.h b/builtin.h index 3e6c22eef6..d560baa661 100644 --- a/builtin.h +++ b/builtin.h @@ -2,8 +2,6 @@ #define BUILTIN_H #include "git-compat-util.h" -#include "strbuf.h" -#include "commit.h" /* * builtin API diff --git a/builtin/check-mailmap.c b/builtin/check-mailmap.c index 002d2941e9..b8a05b8e07 100644 --- a/builtin/check-mailmap.c +++ b/builtin/check-mailmap.c @@ -4,6 +4,7 @@ #include "ident.h" #include "mailmap.h" #include "parse-options.h" +#include "strbuf.h" #include "string-list.h" #include "write-or-die.h" diff --git a/builtin/commit-graph.c b/builtin/commit-graph.c index a3d00fa232..96a8a67732 100644 --- a/builtin/commit-graph.c +++ b/builtin/commit-graph.c @@ -1,4 +1,5 @@ #include "builtin.h" +#include "commit.h" #include "config.h" #include "dir.h" #include "environment.h" diff --git a/builtin/config.c b/builtin/config.c index d40fddb042..6599f88b24 100644 --- a/builtin/config.c +++ b/builtin/config.c @@ -13,6 +13,7 @@ #include "path.h" #include "quote.h" #include "setup.h" +#include "strbuf.h" #include "worktree.h" #include "wrapper.h" diff --git a/builtin/credential-cache.c b/builtin/credential-cache.c index 0ffacfdd83..ff3a47badb 100644 --- a/builtin/credential-cache.c +++ b/builtin/credential-cache.c @@ -2,6 +2,7 @@ #include "gettext.h" #include "parse-options.h" #include "path.h" +#include "strbuf.h" #include "wrapper.h" #include "write-or-die.h" diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c index d0d6ab0fd3..15409337f8 100644 --- a/builtin/for-each-ref.c +++ b/builtin/for-each-ref.c @@ -5,6 +5,7 @@ #include "object.h" #include "parse-options.h" #include "ref-filter.h" +#include "strbuf.h" #include "strvec.h" #include "commit-reach.h" diff --git a/builtin/init-db.c b/builtin/init-db.c index 680ef7e183..0d8bd4d721 100644 --- a/builtin/init-db.c +++ b/builtin/init-db.c @@ -12,6 +12,7 @@ #include "parse-options.h" #include "path.h" #include "setup.h" +#include "strbuf.h" #include "wrapper.h" static int guess_repository_type(const char *git_dir) diff --git a/builtin/verify-pack.c b/builtin/verify-pack.c index aba92cf8af..011dddd2dc 100644 --- a/builtin/verify-pack.c +++ b/builtin/verify-pack.c @@ -3,6 +3,7 @@ #include "gettext.h" #include "run-command.h" #include "parse-options.h" +#include "strbuf.h" #define VERIFY_PACK_VERBOSE 01 #define VERIFY_PACK_STAT_ONLY 02 From dd77d587954bd798d0ea6b26f0815ed2d78d47b9 Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Tue, 16 May 2023 06:34:03 +0000 Subject: [PATCH 23/28] git-compat-util.h: remove unneccessary include of wildmatch.h The include of wildmatch.h in git-compat-util.h was added in cebcab189aa (Makefile: add USE_WILDMATCH to use wildmatch as fnmatch, 2013-01-01) as a way to be able to compile-time force any calls to fnmatch() to instead invoke wildmatch(). The defines and inline function were removed in 70a8fc999d9 (stop using fnmatch (either native or compat), 2014-02-15), and this include in git-compat-util.h has been unnecessary ever since. Remove the include from git-compat-util.h, but add it to the .c files that had omitted the direct #include they needed. Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- apply.c | 1 + builtin/describe.c | 1 + builtin/ls-remote.c | 1 + builtin/name-rev.c | 1 + builtin/reflog.c | 1 + builtin/replace.c | 1 + builtin/show-branch.c | 1 + config.c | 1 + diffcore-order.c | 1 + fmt-merge-msg.c | 1 + git-compat-util.h | 2 -- log-tree.c | 1 + pathspec.c | 1 + refs.c | 1 + revision.c | 1 + t/helper/test-wildmatch.c | 1 + trace2/tr2_cfg.c | 1 + 17 files changed, 16 insertions(+), 2 deletions(-) diff --git a/apply.c b/apply.c index be58dc08d2..801f2bcc99 100644 --- a/apply.c +++ b/apply.c @@ -35,6 +35,7 @@ #include "entry.h" #include "setup.h" #include "symlinks.h" +#include "wildmatch.h" #include "ws.h" #include "wrapper.h" diff --git a/builtin/describe.c b/builtin/describe.c index 508e8df00e..eb19ab0bbb 100644 --- a/builtin/describe.c +++ b/builtin/describe.c @@ -22,6 +22,7 @@ #include "object-store.h" #include "list-objects.h" #include "commit-slab.h" +#include "wildmatch.h" #define MAX_TAGS (FLAG_BITS - 1) diff --git a/builtin/ls-remote.c b/builtin/ls-remote.c index a0aadc9b8f..fc76575430 100644 --- a/builtin/ls-remote.c +++ b/builtin/ls-remote.c @@ -7,6 +7,7 @@ #include "remote.h" #include "refs.h" #include "parse-options.h" +#include "wildmatch.h" static const char * const ls_remote_usage[] = { N_("git ls-remote [--heads] [--tags] [--refs] [--upload-pack=]\n" diff --git a/builtin/name-rev.c b/builtin/name-rev.c index 4d15a23fc4..c3b722b36f 100644 --- a/builtin/name-rev.c +++ b/builtin/name-rev.c @@ -15,6 +15,7 @@ #include "hash-lookup.h" #include "commit-slab.h" #include "commit-graph.h" +#include "wildmatch.h" /* * One day. See the 'name a rev shortly after epoch' test in t6120 when diff --git a/builtin/reflog.c b/builtin/reflog.c index fc21774880..79b4ff04aa 100644 --- a/builtin/reflog.c +++ b/builtin/reflog.c @@ -4,6 +4,7 @@ #include "repository.h" #include "revision.h" #include "reachable.h" +#include "wildmatch.h" #include "worktree.h" #include "reflog.h" #include "parse-options.h" diff --git a/builtin/replace.c b/builtin/replace.c index 6b266a66d3..a2f57a56b3 100644 --- a/builtin/replace.c +++ b/builtin/replace.c @@ -24,6 +24,7 @@ #include "replace-object.h" #include "repository.h" #include "tag.h" +#include "wildmatch.h" static const char * const git_replace_usage[] = { N_("git replace [-f] "), diff --git a/builtin/show-branch.c b/builtin/show-branch.c index cd215f89af..a203f13cb0 100644 --- a/builtin/show-branch.c +++ b/builtin/show-branch.c @@ -14,6 +14,7 @@ #include "dir.h" #include "commit-slab.h" #include "date.h" +#include "wildmatch.h" static const char* show_branch_usage[] = { N_("git show-branch [-a | --all] [-r | --remotes] [--topo-order | --date-order]\n" diff --git a/config.c b/config.c index 8afa266054..27ae207280 100644 --- a/config.c +++ b/config.c @@ -36,6 +36,7 @@ #include "setup.h" #include "strvec.h" #include "trace2.h" +#include "wildmatch.h" #include "worktree.h" #include "ws.h" #include "wrapper.h" diff --git a/diffcore-order.c b/diffcore-order.c index 57ccab2846..e7d20ebd2d 100644 --- a/diffcore-order.c +++ b/diffcore-order.c @@ -5,6 +5,7 @@ #include "gettext.h" #include "diff.h" #include "diffcore.h" +#include "wildmatch.h" static char **order; static int order_cnt; diff --git a/fmt-merge-msg.c b/fmt-merge-msg.c index 5af0d4715b..f096b1ef54 100644 --- a/fmt-merge-msg.c +++ b/fmt-merge-msg.c @@ -15,6 +15,7 @@ #include "fmt-merge-msg.h" #include "commit-reach.h" #include "gpg-interface.h" +#include "wildmatch.h" static int use_branch_desc; static int suppress_dest_pattern_seen; diff --git a/git-compat-util.h b/git-compat-util.h index 5b2b99c17c..1889da7986 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -625,8 +625,6 @@ static inline int git_has_dir_sep(const char *path) #include "compat/bswap.h" -#include "wildmatch.h" - struct strbuf; /* General helper functions */ diff --git a/log-tree.c b/log-tree.c index 07d0b47b16..60b61597c4 100644 --- a/log-tree.c +++ b/log-tree.c @@ -26,6 +26,7 @@ #include "range-diff.h" #include "strmap.h" #include "tree.h" +#include "wildmatch.h" #include "write-or-die.h" static struct decoration name_decoration = { "object names" }; diff --git a/pathspec.c b/pathspec.c index 8932b05a26..3a3a5724c4 100644 --- a/pathspec.c +++ b/pathspec.c @@ -12,6 +12,7 @@ #include "strvec.h" #include "symlinks.h" #include "quote.h" +#include "wildmatch.h" /* * Finds which of the given pathspecs match items in the index. diff --git a/refs.c b/refs.c index 6d657e3bb4..8b192e4cb4 100644 --- a/refs.c +++ b/refs.c @@ -29,6 +29,7 @@ #include "sigchain.h" #include "date.h" #include "commit.h" +#include "wildmatch.h" #include "wrapper.h" /* diff --git a/revision.c b/revision.c index 66a1fece0d..d4b4b34fd8 100644 --- a/revision.c +++ b/revision.c @@ -46,6 +46,7 @@ #include "list-objects-filter-options.h" #include "resolve-undo.h" #include "parse-options.h" +#include "wildmatch.h" volatile show_early_output_fn_t show_early_output; diff --git a/t/helper/test-wildmatch.c b/t/helper/test-wildmatch.c index a95bb4da9b..b4ff5f986a 100644 --- a/t/helper/test-wildmatch.c +++ b/t/helper/test-wildmatch.c @@ -1,4 +1,5 @@ #include "test-tool.h" +#include "wildmatch.h" int cmd__wildmatch(int argc, const char **argv) { diff --git a/trace2/tr2_cfg.c b/trace2/tr2_cfg.c index 78cfc15d52..db817a80c5 100644 --- a/trace2/tr2_cfg.c +++ b/trace2/tr2_cfg.c @@ -4,6 +4,7 @@ #include "trace2.h" #include "trace2/tr2_cfg.h" #include "trace2/tr2_sysenv.h" +#include "wildmatch.h" static struct strbuf **tr2_cfg_patterns; static int tr2_cfg_count_patterns; From 6723899932eb5b6436e9bac65ffc9b6e644c7fee Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Tue, 16 May 2023 06:34:04 +0000 Subject: [PATCH 24/28] merge-ll: rename from ll-merge A long term (but rather minor) pet-peeve of mine was the name ll-merge.[ch]. I thought it made it harder to realize what stuff was related to merging when I was working on the merge machinery and trying to improve it. Further, back in d1cbe1e6d8a ("hash-ll.h: split out of hash.h to remove dependency on repository.h", 2023-04-22), we have split the portions of hash.h that do not depend upon repository.h into a "hash-ll.h" (due to the recommendation to use "ll" for "low-level" in its name[1], but which I used as a suffix precisely because of my distaste for "ll-merge"). When we discussed adding additional "*-ll.h" files, a request was made that we use "ll" consistently as either a prefix or a suffix. Since it is already in use as both a prefix and a suffix, the only way to do so is to rename some files. Besides my distaste for the ll-merge.[ch] name, let me also note that the files ll-fsmonitor.h, ll-hash.h, ll-merge.h, ll-object-store.h, ll-read-cache.h would have essentially nothing to do with each other and make no sense to group. But giving them the common "ll-" prefix would group them. Using "-ll" as a suffix thus seems just much more logical to me. Rename ll-merge.[ch] to merge-ll.[ch] to achieve this consistency, and to ensure we get a more logical grouping of files. [1] https://lore.kernel.org/git/kl6lsfcu1g8w.fsf@chooglen-macbookpro.roam.corp.google.com/ Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- Documentation/technical/api-merge.txt | 4 ++-- Makefile | 2 +- apply.c | 2 +- builtin/checkout.c | 2 +- convert.c | 2 +- diff.c | 2 +- merge-blobs.c | 2 +- ll-merge.c => merge-ll.c | 2 +- ll-merge.h => merge-ll.h | 0 merge-ort.c | 2 +- merge-recursive.c | 2 +- notes-merge.c | 2 +- rerere.c | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) rename ll-merge.c => merge-ll.c (99%) rename ll-merge.h => merge-ll.h (100%) diff --git a/Documentation/technical/api-merge.txt b/Documentation/technical/api-merge.txt index 487d4d83ff..c2ba01828c 100644 --- a/Documentation/technical/api-merge.txt +++ b/Documentation/technical/api-merge.txt @@ -28,9 +28,9 @@ and `diff.c` for examples. * `struct ll_merge_options` -Check ll-merge.h for details. +Check merge-ll.h for details. Low-level (single file) merge ----------------------------- -Check ll-merge.h for details. +Check merge-ll.h for details. diff --git a/Makefile b/Makefile index e62db9460d..fb541dedc9 100644 --- a/Makefile +++ b/Makefile @@ -1051,7 +1051,6 @@ LIB_OBJS += linear-assignment.o LIB_OBJS += list-objects-filter-options.o LIB_OBJS += list-objects-filter.o LIB_OBJS += list-objects.o -LIB_OBJS += ll-merge.o LIB_OBJS += lockfile.o LIB_OBJS += log-tree.o LIB_OBJS += ls-refs.o @@ -1060,6 +1059,7 @@ LIB_OBJS += mailmap.o LIB_OBJS += match-trees.o LIB_OBJS += mem-pool.o LIB_OBJS += merge-blobs.o +LIB_OBJS += merge-ll.o LIB_OBJS += merge-ort.o LIB_OBJS += merge-ort-wrappers.o LIB_OBJS += merge-recursive.o diff --git a/apply.c b/apply.c index 801f2bcc99..2f66f93fec 100644 --- a/apply.c +++ b/apply.c @@ -21,7 +21,7 @@ #include "gettext.h" #include "hex.h" #include "xdiff-interface.h" -#include "ll-merge.h" +#include "merge-ll.h" #include "lockfile.h" #include "name-hash.h" #include "object-name.h" diff --git a/builtin/checkout.c b/builtin/checkout.c index 716dcd4cae..11e2359c54 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -13,7 +13,7 @@ #include "gettext.h" #include "hex.h" #include "hook.h" -#include "ll-merge.h" +#include "merge-ll.h" #include "lockfile.h" #include "mem-pool.h" #include "merge-recursive.h" diff --git a/convert.c b/convert.c index 89aeb9e72b..572d7123a9 100644 --- a/convert.c +++ b/convert.c @@ -15,7 +15,7 @@ #include "sub-process.h" #include "trace.h" #include "utf8.h" -#include "ll-merge.h" +#include "merge-ll.h" #include "wrapper.h" /* diff --git a/diff.c b/diff.c index 7fb9abe891..d02fbf507e 100644 --- a/diff.c +++ b/diff.c @@ -26,7 +26,7 @@ #include "submodule.h" #include "hashmap.h" #include "mem-pool.h" -#include "ll-merge.h" +#include "merge-ll.h" #include "string-list.h" #include "strvec.h" #include "graph.h" diff --git a/merge-blobs.c b/merge-blobs.c index 5632ff6abb..40c48e3eba 100644 --- a/merge-blobs.c +++ b/merge-blobs.c @@ -1,7 +1,7 @@ #include "git-compat-util.h" #include "run-command.h" #include "xdiff-interface.h" -#include "ll-merge.h" +#include "merge-ll.h" #include "blob.h" #include "merge-blobs.h" #include "object-store.h" diff --git a/ll-merge.c b/merge-ll.c similarity index 99% rename from ll-merge.c rename to merge-ll.c index 07ec16e8e5..740b8c6bfd 100644 --- a/ll-merge.c +++ b/merge-ll.c @@ -10,7 +10,7 @@ #include "attr.h" #include "xdiff-interface.h" #include "run-command.h" -#include "ll-merge.h" +#include "merge-ll.h" #include "quote.h" #include "strbuf.h" #include "wrapper.h" diff --git a/ll-merge.h b/merge-ll.h similarity index 100% rename from ll-merge.h rename to merge-ll.h diff --git a/merge-ort.c b/merge-ort.c index 587eea9801..d88178dddf 100644 --- a/merge-ort.c +++ b/merge-ort.c @@ -30,7 +30,7 @@ #include "gettext.h" #include "hex.h" #include "entry.h" -#include "ll-merge.h" +#include "merge-ll.h" #include "match-trees.h" #include "mem-pool.h" #include "object-name.h" diff --git a/merge-recursive.c b/merge-recursive.c index 527dbbd010..35e1e7e1be 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -20,7 +20,7 @@ #include "environment.h" #include "gettext.h" #include "hex.h" -#include "ll-merge.h" +#include "merge-ll.h" #include "lockfile.h" #include "match-trees.h" #include "name-hash.h" diff --git a/notes-merge.c b/notes-merge.c index 4b328d852c..4be11a0155 100644 --- a/notes-merge.c +++ b/notes-merge.c @@ -12,7 +12,7 @@ #include "diffcore.h" #include "hex.h" #include "xdiff-interface.h" -#include "ll-merge.h" +#include "merge-ll.h" #include "dir.h" #include "notes.h" #include "notes-merge.h" diff --git a/rerere.c b/rerere.c index 35b9785d57..3584fecb07 100644 --- a/rerere.c +++ b/rerere.c @@ -12,7 +12,7 @@ #include "xdiff-interface.h" #include "dir.h" #include "resolve-undo.h" -#include "ll-merge.h" +#include "merge-ll.h" #include "attr.h" #include "path.h" #include "pathspec.h" From 8043418b77a0942cd3291f2bca56a0263b6d9967 Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Tue, 16 May 2023 06:34:05 +0000 Subject: [PATCH 25/28] khash: name the structs that khash declares khash.h lets you instantiate custom hash types that map between two types. These are defined as a struct, as you might expect, and khash typedef's that to kh_foo_t. But it declares the struct anonymously, which doesn't give a name to the struct type itself; there is no "struct kh_foo". This has two small downsides: - when using khash, we declare "kh_foo_t *the_foo". This is unlike our usual naming style, which is "struct kh_foo *the_foo". - you can't forward-declare a typedef of an unnamed struct type in C. So we might do something like this in a header file: struct kh_foo; struct bar { struct kh_foo *the_foo; }; to avoid having to include the header that defines the real kh_foo. But that doesn't work with the typedef'd name. Without the "struct" keyword, the compiler doesn't know we mean that kh_foo is a type. So let's always give khash structs the name that matches our conventions ("struct kh_foo" to match "kh_foo_t"). We'll keep doing the typedef to retain compatibility with existing callers. Co-authored-by: Jeff King Signed-off-by: Jeff King Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- khash.h | 2 +- object-store.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/khash.h b/khash.h index 56241e6a5c..a0a08dad8b 100644 --- a/khash.h +++ b/khash.h @@ -62,7 +62,7 @@ static inline khint_t __ac_X31_hash_string(const char *s) static const double __ac_HASH_UPPER = 0.77; #define __KHASH_TYPE(name, khkey_t, khval_t) \ - typedef struct { \ + typedef struct kh_##name { \ khint_t n_buckets, size, n_occupied, upper_bound; \ khint32_t *flags; \ khkey_t *keys; \ diff --git a/object-store.h b/object-store.h index 12415e5ea7..05803a03e9 100644 --- a/object-store.h +++ b/object-store.h @@ -164,7 +164,7 @@ struct raw_object_store { */ struct object_directory *odb; struct object_directory **odb_tail; - kh_odb_path_map_t *odb_by_path; + struct kh_odb_path_map *odb_by_path; int loaded_alternates; From a034e9106ff1a4cb6fcb6f2ea3a1a47b4d2ba173 Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Tue, 16 May 2023 06:34:06 +0000 Subject: [PATCH 26/28] object-store-ll.h: split this header out of object-store.h The vast majority of files including object-store.h did not need dir.h nor khash.h. Split the header into two files, and let most just depend upon object-store-ll.h, while letting the two callers that need it depend on the full object-store.h. After this patch: $ git grep -h include..object-store | sort | uniq -c 2 #include "object-store.h" 129 #include "object-store-ll.h" Diff best viewed with `--color-moved`. Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- apply.c | 2 +- archive-tar.c | 2 +- archive-zip.c | 2 +- archive.c | 2 +- attr.c | 2 +- bisect.c | 2 +- blame.c | 2 +- builtin/blame.c | 2 +- builtin/cat-file.c | 2 +- builtin/checkout.c | 2 +- builtin/clone.c | 2 +- builtin/commit-graph.c | 2 +- builtin/commit-tree.c | 2 +- builtin/count-objects.c | 2 +- builtin/describe.c | 2 +- builtin/difftool.c | 2 +- builtin/fast-export.c | 2 +- builtin/fast-import.c | 2 +- builtin/fetch.c | 2 +- builtin/fsck.c | 2 +- builtin/gc.c | 2 +- builtin/grep.c | 2 +- builtin/hash-object.c | 3 +- builtin/index-pack.c | 3 +- builtin/log.c | 2 +- builtin/ls-tree.c | 2 +- builtin/merge-tree.c | 2 +- builtin/mktag.c | 3 +- builtin/mktree.c | 3 +- builtin/multi-pack-index.c | 3 +- builtin/notes.c | 2 +- builtin/pack-objects.c | 2 +- builtin/pack-redundant.c | 2 +- builtin/prune.c | 3 +- builtin/receive-pack.c | 2 +- builtin/remote.c | 2 +- builtin/repack.c | 2 +- builtin/replace.c | 2 +- builtin/rev-list.c | 2 +- builtin/show-ref.c | 2 +- builtin/submodule--helper.c | 2 +- builtin/tag.c | 2 +- builtin/unpack-file.c | 2 +- builtin/unpack-objects.c | 2 +- builtin/verify-commit.c | 2 +- bulk-checkin.c | 2 +- bundle-uri.c | 2 +- bundle.c | 2 +- cache-tree.c | 2 +- combine-diff.c | 2 +- commit-graph.c | 2 +- commit-graph.h | 2 +- commit.c | 2 +- config.c | 2 +- connected.c | 2 +- convert.c | 2 +- diagnose.c | 2 +- diff.c | 2 +- diffcore-rename.c | 2 +- dir.c | 2 +- entry.c | 2 +- environment.c | 2 +- fetch-pack.c | 2 +- fmt-merge-msg.c | 2 +- fsck.c | 3 +- grep.c | 2 +- http-backend.c | 2 +- http-push.c | 2 +- http-walker.c | 2 +- http.c | 2 +- list-objects-filter.c | 2 +- list-objects.c | 2 +- log-tree.c | 2 +- mailmap.c | 2 +- match-trees.c | 3 +- merge-blobs.c | 2 +- merge-ort.c | 2 +- merge-recursive.c | 2 +- midx.c | 2 +- notes-cache.c | 3 +- notes-merge.c | 2 +- notes.c | 2 +- object-name.c | 2 +- object-store-ll.h | 533 ++++++++++++++++++++++++++++++++++ object-store.h | 528 +-------------------------------- oss-fuzz/fuzz-pack-idx.c | 2 +- pack-bitmap-write.c | 2 +- pack-bitmap.c | 2 +- pack-check.c | 2 +- pack-mtimes.c | 3 +- pack-objects.h | 2 +- pack-revindex.c | 3 +- pack-write.c | 1 + packfile.c | 2 +- path.c | 2 +- promisor-remote.c | 2 +- protocol-caps.c | 2 +- prune-packed.c | 2 +- reachable.c | 2 +- read-cache.c | 2 +- ref-filter.c | 2 +- reflog.c | 2 +- refs.c | 2 +- remote.c | 2 +- replace-object.c | 2 +- replace-object.h | 2 +- repository.c | 2 +- rerere.c | 2 +- revision.c | 2 +- send-pack.c | 2 +- sequencer.c | 2 +- server-info.c | 2 +- shallow.c | 2 +- streaming.c | 2 +- submodule-config.c | 2 +- submodule.c | 2 +- t/helper/test-pack-mtimes.c | 2 +- t/helper/test-partial-clone.c | 2 +- t/helper/test-read-graph.c | 2 +- t/helper/test-read-midx.c | 2 +- t/helper/test-ref-store.c | 3 +- t/helper/test-repository.c | 2 +- tag.c | 2 +- tmp-objdir.c | 2 +- transport.c | 2 +- tree-walk.c | 2 +- tree.c | 2 +- unpack-trees.c | 2 +- upload-pack.c | 2 +- walker.c | 3 +- xdiff-interface.c | 3 +- 131 files changed, 677 insertions(+), 655 deletions(-) create mode 100644 object-store-ll.h diff --git a/apply.c b/apply.c index 2f66f93fec..8bd0109fcc 100644 --- a/apply.c +++ b/apply.c @@ -12,7 +12,7 @@ #include "alloc.h" #include "base85.h" #include "config.h" -#include "object-store.h" +#include "object-store-ll.h" #include "blob.h" #include "delta.h" #include "diff.h" diff --git a/archive-tar.c b/archive-tar.c index 4cd81d8161..fc06ff4c5d 100644 --- a/archive-tar.c +++ b/archive-tar.c @@ -9,7 +9,7 @@ #include "hex.h" #include "tar.h" #include "archive.h" -#include "object-store.h" +#include "object-store-ll.h" #include "streaming.h" #include "run-command.h" #include "write-or-die.h" diff --git a/archive-zip.c b/archive-zip.c index d0d065a312..b438264096 100644 --- a/archive-zip.c +++ b/archive-zip.c @@ -9,7 +9,7 @@ #include "hex.h" #include "streaming.h" #include "utf8.h" -#include "object-store.h" +#include "object-store-ll.h" #include "userdiff.h" #include "write-or-die.h" #include "xdiff-interface.h" diff --git a/archive.c b/archive.c index 2ad5f44201..1817cca9f4 100644 --- a/archive.c +++ b/archive.c @@ -10,7 +10,7 @@ #include "pretty.h" #include "setup.h" #include "refs.h" -#include "object-store.h" +#include "object-store-ll.h" #include "commit.h" #include "tree.h" #include "tree-walk.h" diff --git a/attr.c b/attr.c index 2514c8a002..7d39ac4a29 100644 --- a/attr.c +++ b/attr.c @@ -19,7 +19,7 @@ #include "quote.h" #include "read-cache-ll.h" #include "revision.h" -#include "object-store.h" +#include "object-store-ll.h" #include "setup.h" #include "thread-utils.h" #include "tree-walk.h" diff --git a/bisect.c b/bisect.c index 9f7cf0be07..1be8e0a271 100644 --- a/bisect.c +++ b/bisect.c @@ -18,7 +18,7 @@ #include "commit-slab.h" #include "commit-reach.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "path.h" #include "dir.h" diff --git a/blame.c b/blame.c index 2e25a7254c..d12bd9f97b 100644 --- a/blame.c +++ b/blame.c @@ -1,6 +1,6 @@ #include "git-compat-util.h" #include "refs.h" -#include "object-store.h" +#include "object-store-ll.h" #include "cache-tree.h" #include "mergesort.h" #include "convert.h" diff --git a/builtin/blame.c b/builtin/blame.c index 2df6039a6e..e811e7fbfb 100644 --- a/builtin/blame.c +++ b/builtin/blame.c @@ -29,7 +29,7 @@ #include "dir.h" #include "progress.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "pager.h" #include "blame.h" #include "refs.h" diff --git a/builtin/cat-file.c b/builtin/cat-file.c index 9646e7209c..48ccca95a1 100644 --- a/builtin/cat-file.c +++ b/builtin/cat-file.c @@ -21,7 +21,7 @@ #include "packfile.h" #include "object-file.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "replace-object.h" #include "promisor-remote.h" #include "mailmap.h" diff --git a/builtin/checkout.c b/builtin/checkout.c index 11e2359c54..fd6ee8c272 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -18,7 +18,7 @@ #include "mem-pool.h" #include "merge-recursive.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "parse-options.h" #include "path.h" #include "preload-index.h" diff --git a/builtin/clone.c b/builtin/clone.c index 6c5cb33f6a..687a686269 100644 --- a/builtin/clone.c +++ b/builtin/clone.c @@ -23,7 +23,7 @@ #include "refs.h" #include "refspec.h" #include "object-file.h" -#include "object-store.h" +#include "object-store-ll.h" #include "tree.h" #include "tree-walk.h" #include "unpack-trees.h" diff --git a/builtin/commit-graph.c b/builtin/commit-graph.c index 96a8a67732..48fa9f20c9 100644 --- a/builtin/commit-graph.c +++ b/builtin/commit-graph.c @@ -9,7 +9,7 @@ #include "parse-options.h" #include "repository.h" #include "commit-graph.h" -#include "object-store.h" +#include "object-store-ll.h" #include "progress.h" #include "replace-object.h" #include "tag.h" diff --git a/builtin/commit-tree.c b/builtin/commit-tree.c index d2121f30d4..02625e7176 100644 --- a/builtin/commit-tree.c +++ b/builtin/commit-tree.c @@ -8,7 +8,7 @@ #include "gettext.h" #include "hex.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "repository.h" #include "commit.h" #include "tree.h" diff --git a/builtin/count-objects.c b/builtin/count-objects.c index c9f82d0bce..97cdfb0ac5 100644 --- a/builtin/count-objects.c +++ b/builtin/count-objects.c @@ -14,7 +14,7 @@ #include "parse-options.h" #include "quote.h" #include "packfile.h" -#include "object-store.h" +#include "object-store-ll.h" static unsigned long garbage; static off_t size_garbage; diff --git a/builtin/describe.c b/builtin/describe.c index eb19ab0bbb..7ce23e1b8e 100644 --- a/builtin/describe.c +++ b/builtin/describe.c @@ -19,7 +19,7 @@ #include "setup.h" #include "strvec.h" #include "run-command.h" -#include "object-store.h" +#include "object-store-ll.h" #include "list-objects.h" #include "commit-slab.h" #include "wildmatch.h" diff --git a/builtin/difftool.c b/builtin/difftool.c index 4a22de3edd..e2c9ab7d5d 100644 --- a/builtin/difftool.c +++ b/builtin/difftool.c @@ -28,7 +28,7 @@ #include "strbuf.h" #include "lockfile.h" #include "object-file.h" -#include "object-store.h" +#include "object-store-ll.h" #include "dir.h" #include "entry.h" #include "setup.h" diff --git a/builtin/fast-export.c b/builtin/fast-export.c index 5f3ffd6912..56dc69fac1 100644 --- a/builtin/fast-export.c +++ b/builtin/fast-export.c @@ -10,7 +10,7 @@ #include "refs.h" #include "refspec.h" #include "object-file.h" -#include "object-store.h" +#include "object-store-ll.h" #include "commit.h" #include "object.h" #include "tag.h" diff --git a/builtin/fast-import.c b/builtin/fast-import.c index 5698b92ae7..2ee19c7373 100644 --- a/builtin/fast-import.c +++ b/builtin/fast-import.c @@ -21,7 +21,7 @@ #include "packfile.h" #include "object-file.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "mem-pool.h" #include "commit-reach.h" #include "khash.h" diff --git a/builtin/fetch.c b/builtin/fetch.c index d51b28fe2e..951a23d733 100644 --- a/builtin/fetch.c +++ b/builtin/fetch.c @@ -11,7 +11,7 @@ #include "refs.h" #include "refspec.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "oidset.h" #include "oid-array.h" #include "commit.h" diff --git a/builtin/fsck.c b/builtin/fsck.c index 88c466c048..b81f1a2010 100644 --- a/builtin/fsck.c +++ b/builtin/fsck.c @@ -20,7 +20,7 @@ #include "packfile.h" #include "object-file.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "path.h" #include "read-cache-ll.h" #include "replace-object.h" diff --git a/builtin/gc.c b/builtin/gc.c index aeceed4117..91eec7703a 100644 --- a/builtin/gc.c +++ b/builtin/gc.c @@ -27,7 +27,7 @@ #include "commit-graph.h" #include "packfile.h" #include "object-file.h" -#include "object-store.h" +#include "object-store-ll.h" #include "pack.h" #include "pack-objects.h" #include "path.h" diff --git a/builtin/grep.c b/builtin/grep.c index 6bc8abcd3e..72e70b3a48 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -27,7 +27,7 @@ #include "submodule-config.h" #include "object-file.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "packfile.h" #include "pager.h" #include "path.h" diff --git a/builtin/hash-object.c b/builtin/hash-object.c index a380121166..5ffec99dce 100644 --- a/builtin/hash-object.c +++ b/builtin/hash-object.c @@ -10,12 +10,13 @@ #include "gettext.h" #include "hex.h" #include "object-file.h" -#include "object-store.h" +#include "object-store-ll.h" #include "blob.h" #include "quote.h" #include "parse-options.h" #include "exec-cmd.h" #include "setup.h" +#include "strbuf.h" #include "write-or-die.h" /* diff --git a/builtin/index-pack.c b/builtin/index-pack.c index bb67e16655..820860265d 100644 --- a/builtin/index-pack.c +++ b/builtin/index-pack.c @@ -14,12 +14,13 @@ #include "progress.h" #include "fsck.h" #include "exec-cmd.h" +#include "strbuf.h" #include "streaming.h" #include "thread-utils.h" #include "packfile.h" #include "pack-revindex.h" #include "object-file.h" -#include "object-store.h" +#include "object-store-ll.h" #include "oid-array.h" #include "replace-object.h" #include "promisor-remote.h" diff --git a/builtin/log.c b/builtin/log.c index c85f13a5d5..89442dceda 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -14,7 +14,7 @@ #include "refs.h" #include "object-file.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "pager.h" #include "color.h" #include "commit.h" diff --git a/builtin/ls-tree.c b/builtin/ls-tree.c index c06858de4b..4e17f13648 100644 --- a/builtin/ls-tree.c +++ b/builtin/ls-tree.c @@ -8,7 +8,7 @@ #include "gettext.h" #include "hex.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "blob.h" #include "tree.h" #include "commit.h" diff --git a/builtin/merge-tree.c b/builtin/merge-tree.c index 4325897a80..6f7db436d2 100644 --- a/builtin/merge-tree.c +++ b/builtin/merge-tree.c @@ -9,7 +9,7 @@ #include "commit-reach.h" #include "merge-ort.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "parse-options.h" #include "repository.h" #include "blob.h" diff --git a/builtin/mktag.c b/builtin/mktag.c index 44fa56eff3..43e2766db4 100644 --- a/builtin/mktag.c +++ b/builtin/mktag.c @@ -2,10 +2,11 @@ #include "gettext.h" #include "hex.h" #include "parse-options.h" +#include "strbuf.h" #include "tag.h" #include "replace-object.h" #include "object-file.h" -#include "object-store.h" +#include "object-store-ll.h" #include "fsck.h" #include "config.h" diff --git a/builtin/mktree.c b/builtin/mktree.c index 09a7bd5c5c..0eea810c7e 100644 --- a/builtin/mktree.c +++ b/builtin/mktree.c @@ -8,9 +8,10 @@ #include "gettext.h" #include "hex.h" #include "quote.h" +#include "strbuf.h" #include "tree.h" #include "parse-options.h" -#include "object-store.h" +#include "object-store-ll.h" static struct treeent { unsigned mode; diff --git a/builtin/multi-pack-index.c b/builtin/multi-pack-index.c index 5bb71bce08..a31dde1db9 100644 --- a/builtin/multi-pack-index.c +++ b/builtin/multi-pack-index.c @@ -5,8 +5,9 @@ #include "gettext.h" #include "parse-options.h" #include "midx.h" +#include "strbuf.h" #include "trace2.h" -#include "object-store.h" +#include "object-store-ll.h" #define BUILTIN_MIDX_WRITE_USAGE \ N_("git multi-pack-index [] write [--preferred-pack=]" \ diff --git a/builtin/notes.c b/builtin/notes.c index 0a870d9083..0a19796f73 100644 --- a/builtin/notes.c +++ b/builtin/notes.c @@ -14,7 +14,7 @@ #include "hex.h" #include "notes.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "path.h" #include "repository.h" #include "blob.h" diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c index 9cfc8801f9..af9352b228 100644 --- a/builtin/pack-objects.c +++ b/builtin/pack-objects.c @@ -34,7 +34,7 @@ #include "list.h" #include "packfile.h" #include "object-file.h" -#include "object-store.h" +#include "object-store-ll.h" #include "replace-object.h" #include "dir.h" #include "midx.h" diff --git a/builtin/pack-redundant.c b/builtin/pack-redundant.c index 43e9d12dfd..4c735ba069 100644 --- a/builtin/pack-redundant.c +++ b/builtin/pack-redundant.c @@ -11,7 +11,7 @@ #include "hex.h" #include "repository.h" #include "packfile.h" -#include "object-store.h" +#include "object-store-ll.h" #define BLKSIZE 512 diff --git a/builtin/prune.c b/builtin/prune.c index a46c5aa2b5..cfb863ae84 100644 --- a/builtin/prune.c +++ b/builtin/prune.c @@ -1,6 +1,7 @@ #include "builtin.h" #include "commit.h" #include "diff.h" +#include "dir.h" #include "environment.h" #include "gettext.h" #include "hex.h" @@ -13,7 +14,7 @@ #include "replace-object.h" #include "object-file.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "shallow.h" static const char * const prune_usage[] = { diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c index d1718a3ac9..91caaf8706 100644 --- a/builtin/receive-pack.c +++ b/builtin/receive-pack.c @@ -30,7 +30,7 @@ #include "oidset.h" #include "packfile.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "path.h" #include "protocol.h" #include "commit-reach.h" diff --git a/builtin/remote.c b/builtin/remote.c index 3794f13330..7d96687ec7 100644 --- a/builtin/remote.c +++ b/builtin/remote.c @@ -11,7 +11,7 @@ #include "rebase.h" #include "refs.h" #include "refspec.h" -#include "object-store.h" +#include "object-store-ll.h" #include "strvec.h" #include "commit-reach.h" #include "progress.h" diff --git a/builtin/repack.c b/builtin/repack.c index fe8d5810d4..6c896c9c80 100644 --- a/builtin/repack.c +++ b/builtin/repack.c @@ -16,7 +16,7 @@ #include "midx.h" #include "packfile.h" #include "prune-packed.h" -#include "object-store.h" +#include "object-store-ll.h" #include "promisor-remote.h" #include "shallow.h" #include "pack.h" diff --git a/builtin/replace.c b/builtin/replace.c index a2f57a56b3..20c67a5889 100644 --- a/builtin/replace.c +++ b/builtin/replace.c @@ -20,7 +20,7 @@ #include "run-command.h" #include "object-file.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "replace-object.h" #include "repository.h" #include "tag.h" diff --git a/builtin/rev-list.c b/builtin/rev-list.c index 8029f3de53..ff715d6918 100644 --- a/builtin/rev-list.c +++ b/builtin/rev-list.c @@ -12,7 +12,7 @@ #include "object.h" #include "object-name.h" #include "object-file.h" -#include "object-store.h" +#include "object-store-ll.h" #include "pack.h" #include "pack-bitmap.h" #include "log-tree.h" diff --git a/builtin/show-ref.c b/builtin/show-ref.c index e07e9ca862..5110814f79 100644 --- a/builtin/show-ref.c +++ b/builtin/show-ref.c @@ -4,7 +4,7 @@ #include "hex.h" #include "refs.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "object.h" #include "tag.h" #include "string-list.h" diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c index 5fddfb158d..6321d7e9c9 100644 --- a/builtin/submodule--helper.c +++ b/builtin/submodule--helper.c @@ -29,7 +29,7 @@ #include "diff.h" #include "object-file.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "advice.h" #include "branch.h" #include "list-objects-filter-options.h" diff --git a/builtin/tag.c b/builtin/tag.c index 26122dd103..e63bee8eab 100644 --- a/builtin/tag.c +++ b/builtin/tag.c @@ -15,7 +15,7 @@ #include "hex.h" #include "refs.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "path.h" #include "tag.h" #include "run-command.h" diff --git a/builtin/unpack-file.c b/builtin/unpack-file.c index b35a4b9dfe..6842a6c499 100644 --- a/builtin/unpack-file.c +++ b/builtin/unpack-file.c @@ -2,7 +2,7 @@ #include "config.h" #include "hex.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "wrapper.h" static char *create_temp_file(struct object_id *oid) diff --git a/builtin/unpack-objects.c b/builtin/unpack-objects.c index 85baf6a131..b4b46ae729 100644 --- a/builtin/unpack-objects.c +++ b/builtin/unpack-objects.c @@ -5,7 +5,7 @@ #include "gettext.h" #include "git-zlib.h" #include "hex.h" -#include "object-store.h" +#include "object-store-ll.h" #include "object.h" #include "delta.h" #include "pack.h" diff --git a/builtin/verify-commit.c b/builtin/verify-commit.c index aa34fb896a..9680b58701 100644 --- a/builtin/verify-commit.c +++ b/builtin/verify-commit.c @@ -9,7 +9,7 @@ #include "config.h" #include "gettext.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "repository.h" #include "commit.h" #include "run-command.h" diff --git a/bulk-checkin.c b/bulk-checkin.c index d843279715..e2f71db0f6 100644 --- a/bulk-checkin.c +++ b/bulk-checkin.c @@ -16,7 +16,7 @@ #include "tmp-objdir.h" #include "packfile.h" #include "object-file.h" -#include "object-store.h" +#include "object-store-ll.h" #include "wrapper.h" static int odb_transaction_nesting; diff --git a/bundle-uri.c b/bundle-uri.c index 2a2db1a1d3..a97dcbdb86 100644 --- a/bundle-uri.c +++ b/bundle-uri.c @@ -4,7 +4,7 @@ #include "copy.h" #include "environment.h" #include "gettext.h" -#include "object-store.h" +#include "object-store-ll.h" #include "refs.h" #include "run-command.h" #include "hashmap.h" diff --git a/bundle.c b/bundle.c index a5505368de..8d5936c421 100644 --- a/bundle.c +++ b/bundle.c @@ -4,7 +4,7 @@ #include "environment.h" #include "gettext.h" #include "hex.h" -#include "object-store.h" +#include "object-store-ll.h" #include "repository.h" #include "object.h" #include "commit.h" diff --git a/cache-tree.c b/cache-tree.c index 077932c2db..84d7491420 100644 --- a/cache-tree.c +++ b/cache-tree.c @@ -8,7 +8,7 @@ #include "cache-tree.h" #include "bulk-checkin.h" #include "object-file.h" -#include "object-store.h" +#include "object-store-ll.h" #include "read-cache-ll.h" #include "replace-object.h" #include "promisor-remote.h" diff --git a/combine-diff.c b/combine-diff.c index 1e3cd7fb17..11e9d7494a 100644 --- a/combine-diff.c +++ b/combine-diff.c @@ -1,5 +1,5 @@ #include "git-compat-util.h" -#include "object-store.h" +#include "object-store-ll.h" #include "commit.h" #include "convert.h" #include "blob.h" diff --git a/commit-graph.c b/commit-graph.c index 25cbd66c33..9e989f4349 100644 --- a/commit-graph.c +++ b/commit-graph.c @@ -12,7 +12,7 @@ #include "hash-lookup.h" #include "commit-graph.h" #include "object-file.h" -#include "object-store.h" +#include "object-store-ll.h" #include "oid-array.h" #include "path.h" #include "alloc.h" diff --git a/commit-graph.h b/commit-graph.h index 83aaa1dbb9..5e534f0fcc 100644 --- a/commit-graph.h +++ b/commit-graph.h @@ -1,7 +1,7 @@ #ifndef COMMIT_GRAPH_H #define COMMIT_GRAPH_H -#include "object-store.h" +#include "object-store-ll.h" #include "oidset.h" #define GIT_TEST_COMMIT_GRAPH "GIT_TEST_COMMIT_GRAPH" diff --git a/commit.c b/commit.c index 0fb9316931..6507791061 100644 --- a/commit.c +++ b/commit.c @@ -7,7 +7,7 @@ #include "hex.h" #include "repository.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "pkt-line.h" #include "utf8.h" #include "diff.h" diff --git a/config.c b/config.c index 27ae207280..50f4b409aa 100644 --- a/config.c +++ b/config.c @@ -25,7 +25,7 @@ #include "hashmap.h" #include "string-list.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "pager.h" #include "path.h" #include "utf8.h" diff --git a/connected.c b/connected.c index d672521da4..8f89376dbc 100644 --- a/connected.c +++ b/connected.c @@ -1,7 +1,7 @@ #include "git-compat-util.h" #include "gettext.h" #include "hex.h" -#include "object-store.h" +#include "object-store-ll.h" #include "run-command.h" #include "sigchain.h" #include "connected.h" diff --git a/convert.c b/convert.c index 572d7123a9..3d8325d49e 100644 --- a/convert.c +++ b/convert.c @@ -5,7 +5,7 @@ #include "copy.h" #include "gettext.h" #include "hex.h" -#include "object-store.h" +#include "object-store-ll.h" #include "attr.h" #include "run-command.h" #include "quote.h" diff --git a/diagnose.c b/diagnose.c index c8c7ebcfa3..8430064000 100644 --- a/diagnose.c +++ b/diagnose.c @@ -7,7 +7,7 @@ #include "gettext.h" #include "hex.h" #include "strvec.h" -#include "object-store.h" +#include "object-store-ll.h" #include "packfile.h" #include "parse-options.h" #include "write-or-die.h" diff --git a/diff.c b/diff.c index d02fbf507e..6fb2946a64 100644 --- a/diff.c +++ b/diff.c @@ -20,7 +20,7 @@ #include "attr.h" #include "run-command.h" #include "utf8.h" -#include "object-store.h" +#include "object-store-ll.h" #include "userdiff.h" #include "submodule-config.h" #include "submodule.h" diff --git a/diffcore-rename.c b/diffcore-rename.c index 8e2e7a3ad7..926b554bd5 100644 --- a/diffcore-rename.c +++ b/diffcore-rename.c @@ -6,7 +6,7 @@ #include "alloc.h" #include "diff.h" #include "diffcore.h" -#include "object-store.h" +#include "object-store-ll.h" #include "hashmap.h" #include "mem-pool.h" #include "oid-array.h" diff --git a/dir.c b/dir.c index 3cf3d428c7..fada2713b9 100644 --- a/dir.c +++ b/dir.c @@ -15,7 +15,7 @@ #include "gettext.h" #include "name-hash.h" #include "object-file.h" -#include "object-store.h" +#include "object-store-ll.h" #include "path.h" #include "attr.h" #include "refs.h" diff --git a/entry.c b/entry.c index 041f5cf212..f9a7c726a4 100644 --- a/entry.c +++ b/entry.c @@ -1,6 +1,6 @@ #include "git-compat-util.h" #include "blob.h" -#include "object-store.h" +#include "object-store-ll.h" #include "dir.h" #include "environment.h" #include "gettext.h" diff --git a/environment.c b/environment.c index 5c494777a6..821d458c92 100644 --- a/environment.c +++ b/environment.c @@ -20,7 +20,7 @@ #include "commit.h" #include "strvec.h" #include "object-file.h" -#include "object-store.h" +#include "object-store-ll.h" #include "path.h" #include "replace-object.h" #include "tmp-objdir.h" diff --git a/fetch-pack.c b/fetch-pack.c index 207548b3e5..a432eacab9 100644 --- a/fetch-pack.c +++ b/fetch-pack.c @@ -24,7 +24,7 @@ #include "oid-array.h" #include "oidset.h" #include "packfile.h" -#include "object-store.h" +#include "object-store-ll.h" #include "path.h" #include "connected.h" #include "fetch-negotiator.h" diff --git a/fmt-merge-msg.c b/fmt-merge-msg.c index f096b1ef54..4da6c7a8bd 100644 --- a/fmt-merge-msg.c +++ b/fmt-merge-msg.c @@ -4,7 +4,7 @@ #include "environment.h" #include "refs.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "diff.h" #include "diff-merges.h" #include "hex.h" diff --git a/fsck.c b/fsck.c index 04e729953b..a219d6f2c0 100644 --- a/fsck.c +++ b/fsck.c @@ -1,8 +1,9 @@ #include "git-compat-util.h" #include "alloc.h" #include "date.h" +#include "dir.h" #include "hex.h" -#include "object-store.h" +#include "object-store-ll.h" #include "path.h" #include "repository.h" #include "object.h" diff --git a/grep.c b/grep.c index f00986c451..ebcd647478 100644 --- a/grep.c +++ b/grep.c @@ -3,7 +3,7 @@ #include "gettext.h" #include "grep.h" #include "hex.h" -#include "object-store.h" +#include "object-store-ll.h" #include "pretty.h" #include "userdiff.h" #include "xdiff-interface.h" diff --git a/http-backend.c b/http-backend.c index ddb9549ecb..e1969c05dc 100644 --- a/http-backend.c +++ b/http-backend.c @@ -16,7 +16,7 @@ #include "url.h" #include "strvec.h" #include "packfile.h" -#include "object-store.h" +#include "object-store-ll.h" #include "protocol.h" #include "date.h" #include "wrapper.h" diff --git a/http-push.c b/http-push.c index 29cf9db34e..9ab2383d2b 100644 --- a/http-push.c +++ b/http-push.c @@ -18,7 +18,7 @@ #include "tree.h" #include "tree-walk.h" #include "packfile.h" -#include "object-store.h" +#include "object-store-ll.h" #include "commit-reach.h" #ifdef EXPAT_NEEDS_XMLPARSE_H diff --git a/http-walker.c b/http-walker.c index bba306b2d5..78d99f7c4b 100644 --- a/http-walker.c +++ b/http-walker.c @@ -7,7 +7,7 @@ #include "list.h" #include "transport.h" #include "packfile.h" -#include "object-store.h" +#include "object-store-ll.h" struct alt_base { char *base; diff --git a/http.c b/http.c index bb58bb3e6a..25e4c8a1ae 100644 --- a/http.c +++ b/http.c @@ -18,7 +18,7 @@ #include "protocol.h" #include "string-list.h" #include "object-file.h" -#include "object-store.h" +#include "object-store-ll.h" static struct trace_key trace_curl = TRACE_KEY_INIT(CURL); static int trace_curl_data = 1; diff --git a/list-objects-filter.c b/list-objects-filter.c index 5d270ce598..e075a66c99 100644 --- a/list-objects-filter.c +++ b/list-objects-filter.c @@ -16,7 +16,7 @@ #include "oidmap.h" #include "oidset.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" /* Remember to update object flag allocation in object.h */ /* diff --git a/list-objects.c b/list-objects.c index eecca721ac..672a4cd529 100644 --- a/list-objects.c +++ b/list-objects.c @@ -12,7 +12,7 @@ #include "list-objects-filter.h" #include "list-objects-filter-options.h" #include "packfile.h" -#include "object-store.h" +#include "object-store-ll.h" #include "trace.h" struct traversal_context { diff --git a/log-tree.c b/log-tree.c index 60b61597c4..f807e286c8 100644 --- a/log-tree.c +++ b/log-tree.c @@ -5,7 +5,7 @@ #include "environment.h" #include "hex.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "repository.h" #include "tmp-objdir.h" #include "commit.h" diff --git a/mailmap.c b/mailmap.c index 5dc5223c43..3d6a5e9400 100644 --- a/mailmap.c +++ b/mailmap.c @@ -3,7 +3,7 @@ #include "string-list.h" #include "mailmap.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "setup.h" const char *git_mailmap_file; diff --git a/match-trees.c b/match-trees.c index 6bc8eb7647..0885ac681c 100644 --- a/match-trees.c +++ b/match-trees.c @@ -1,9 +1,10 @@ #include "git-compat-util.h" #include "hex.h" #include "match-trees.h" +#include "strbuf.h" #include "tree.h" #include "tree-walk.h" -#include "object-store.h" +#include "object-store-ll.h" static int score_missing(unsigned mode) { diff --git a/merge-blobs.c b/merge-blobs.c index 40c48e3eba..9293cbf75c 100644 --- a/merge-blobs.c +++ b/merge-blobs.c @@ -4,7 +4,7 @@ #include "merge-ll.h" #include "blob.h" #include "merge-blobs.h" -#include "object-store.h" +#include "object-store-ll.h" static int fill_mmfile_blob(mmfile_t *f, struct blob *obj) { diff --git a/merge-ort.c b/merge-ort.c index d88178dddf..8631c99700 100644 --- a/merge-ort.c +++ b/merge-ort.c @@ -34,7 +34,7 @@ #include "match-trees.h" #include "mem-pool.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "oid-array.h" #include "path.h" #include "promisor-remote.h" diff --git a/merge-recursive.c b/merge-recursive.c index 35e1e7e1be..43f6b2d036 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -26,7 +26,7 @@ #include "name-hash.h" #include "object-file.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "path.h" #include "repository.h" #include "revision.h" diff --git a/midx.c b/midx.c index b500174d1f..db459e448b 100644 --- a/midx.c +++ b/midx.c @@ -9,7 +9,7 @@ #include "lockfile.h" #include "packfile.h" #include "object-file.h" -#include "object-store.h" +#include "object-store-ll.h" #include "hash-lookup.h" #include "midx.h" #include "progress.h" diff --git a/notes-cache.c b/notes-cache.c index 14288caf98..0e1d5b1ac7 100644 --- a/notes-cache.c +++ b/notes-cache.c @@ -1,10 +1,11 @@ #include "git-compat-util.h" #include "notes-cache.h" -#include "object-store.h" +#include "object-store-ll.h" #include "pretty.h" #include "repository.h" #include "commit.h" #include "refs.h" +#include "strbuf.h" static int notes_cache_match_validity(struct repository *r, const char *ref, diff --git a/notes-merge.c b/notes-merge.c index 4be11a0155..071947894e 100644 --- a/notes-merge.c +++ b/notes-merge.c @@ -5,7 +5,7 @@ #include "refs.h" #include "object-file.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "path.h" #include "repository.h" #include "diff.h" diff --git a/notes.c b/notes.c index f51a2d3630..503dbc4be1 100644 --- a/notes.c +++ b/notes.c @@ -4,7 +4,7 @@ #include "hex.h" #include "notes.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "blob.h" #include "tree.h" #include "utf8.h" diff --git a/object-name.c b/object-name.c index 45f4d51305..7e96c97051 100644 --- a/object-name.c +++ b/object-name.c @@ -17,7 +17,7 @@ #include "oidtree.h" #include "packfile.h" #include "pretty.h" -#include "object-store.h" +#include "object-store-ll.h" #include "read-cache-ll.h" #include "repository.h" #include "setup.h" diff --git a/object-store-ll.h b/object-store-ll.h new file mode 100644 index 0000000000..e8f22cdb1b --- /dev/null +++ b/object-store-ll.h @@ -0,0 +1,533 @@ +#ifndef OBJECT_STORE_LL_H +#define OBJECT_STORE_LL_H + +#include "hashmap.h" +#include "object.h" +#include "list.h" +#include "thread-utils.h" +#include "oidset.h" + +struct oidmap; +struct oidtree; +struct strbuf; + +struct object_directory { + struct object_directory *next; + + /* + * Used to store the results of readdir(3) calls when we are OK + * sacrificing accuracy due to races for speed. That includes + * object existence with OBJECT_INFO_QUICK, as well as + * our search for unique abbreviated hashes. Don't use it for tasks + * requiring greater accuracy! + * + * Be sure to call odb_load_loose_cache() before using. + */ + uint32_t loose_objects_subdir_seen[8]; /* 256 bits */ + struct oidtree *loose_objects_cache; + + /* + * This is a temporary object store created by the tmp_objdir + * facility. Disable ref updates since the objects in the store + * might be discarded on rollback. + */ + int disable_ref_updates; + + /* + * This object store is ephemeral, so there is no need to fsync. + */ + int will_destroy; + + /* + * Path to the alternative object store. If this is a relative path, + * it is relative to the current working directory. + */ + char *path; +}; + +struct input_stream { + const void *(*read)(struct input_stream *, unsigned long *len); + void *data; + int is_finished; +}; + +void prepare_alt_odb(struct repository *r); +int has_alt_odb(struct repository *r); +char *compute_alternate_path(const char *path, struct strbuf *err); +struct object_directory *find_odb(struct repository *r, const char *obj_dir); +typedef int alt_odb_fn(struct object_directory *, void *); +int foreach_alt_odb(alt_odb_fn, void*); +typedef void alternate_ref_fn(const struct object_id *oid, void *); +void for_each_alternate_ref(alternate_ref_fn, void *); + +/* + * Add the directory to the on-disk alternates file; the new entry will also + * take effect in the current process. + */ +void add_to_alternates_file(const char *dir); + +/* + * Add the directory to the in-memory list of alternates (along with any + * recursive alternates it points to), but do not modify the on-disk alternates + * file. + */ +void add_to_alternates_memory(const char *dir); + +/* + * Replace the current writable object directory with the specified temporary + * object directory; returns the former primary object directory. + */ +struct object_directory *set_temporary_primary_odb(const char *dir, int will_destroy); + +/* + * Restore a previous ODB replaced by set_temporary_main_odb. + */ +void restore_primary_odb(struct object_directory *restore_odb, const char *old_path); + +/* + * Populate and return the loose object cache array corresponding to the + * given object ID. + */ +struct oidtree *odb_loose_cache(struct object_directory *odb, + const struct object_id *oid); + +/* Empty the loose object cache for the specified object directory. */ +void odb_clear_loose_cache(struct object_directory *odb); + +/* Clear and free the specified object directory */ +void free_object_directory(struct object_directory *odb); + +struct packed_git { + struct hashmap_entry packmap_ent; + struct packed_git *next; + struct list_head mru; + struct pack_window *windows; + off_t pack_size; + const void *index_data; + size_t index_size; + uint32_t num_objects; + uint32_t crc_offset; + struct oidset bad_objects; + int index_version; + time_t mtime; + int pack_fd; + int index; /* for builtin/pack-objects.c */ + unsigned pack_local:1, + pack_keep:1, + pack_keep_in_core:1, + freshened:1, + do_not_close:1, + pack_promisor:1, + multi_pack_index:1, + is_cruft:1; + unsigned char hash[GIT_MAX_RAWSZ]; + struct revindex_entry *revindex; + const uint32_t *revindex_data; + const uint32_t *revindex_map; + size_t revindex_size; + /* + * mtimes_map points at the beginning of the memory mapped region of + * this pack's corresponding .mtimes file, and mtimes_size is the size + * of that .mtimes file + */ + const uint32_t *mtimes_map; + size_t mtimes_size; + /* something like ".git/objects/pack/xxxxx.pack" */ + char pack_name[FLEX_ARRAY]; /* more */ +}; + +struct multi_pack_index; + +static inline int pack_map_entry_cmp(const void *cmp_data UNUSED, + const struct hashmap_entry *entry, + const struct hashmap_entry *entry2, + const void *keydata) +{ + const char *key = keydata; + const struct packed_git *pg1, *pg2; + + pg1 = container_of(entry, const struct packed_git, packmap_ent); + pg2 = container_of(entry2, const struct packed_git, packmap_ent); + + return strcmp(pg1->pack_name, key ? key : pg2->pack_name); +} + +struct raw_object_store { + /* + * Set of all object directories; the main directory is first (and + * cannot be NULL after initialization). Subsequent directories are + * alternates. + */ + struct object_directory *odb; + struct object_directory **odb_tail; + struct kh_odb_path_map *odb_by_path; + + int loaded_alternates; + + /* + * A list of alternate object directories loaded from the environment; + * this should not generally need to be accessed directly, but will + * populate the "odb" list when prepare_alt_odb() is run. + */ + char *alternate_db; + + /* + * Objects that should be substituted by other objects + * (see git-replace(1)). + */ + struct oidmap *replace_map; + unsigned replace_map_initialized : 1; + pthread_mutex_t replace_mutex; /* protect object replace functions */ + + struct commit_graph *commit_graph; + unsigned commit_graph_attempted : 1; /* if loading has been attempted */ + + /* + * private data + * + * should only be accessed directly by packfile.c and midx.c + */ + struct multi_pack_index *multi_pack_index; + + /* + * private data + * + * should only be accessed directly by packfile.c + */ + + struct packed_git *packed_git; + /* A most-recently-used ordered version of the packed_git list. */ + struct list_head packed_git_mru; + + struct { + struct packed_git **packs; + unsigned flags; + } kept_pack_cache; + + /* + * A map of packfiles to packed_git structs for tracking which + * packs have been loaded already. + */ + struct hashmap pack_map; + + /* + * A fast, rough count of the number of objects in the repository. + * These two fields are not meant for direct access. Use + * repo_approximate_object_count() instead. + */ + unsigned long approximate_object_count; + unsigned approximate_object_count_valid : 1; + + /* + * Whether packed_git has already been populated with this repository's + * packs. + */ + unsigned packed_git_initialized : 1; +}; + +struct raw_object_store *raw_object_store_new(void); +void raw_object_store_clear(struct raw_object_store *o); + +/* + * 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. + */ +const char *loose_object_path(struct repository *r, struct strbuf *buf, + const struct object_id *oid); + +void *map_loose_object(struct repository *r, const struct object_id *oid, + unsigned long *size); + +void *repo_read_object_file(struct repository *r, + const struct object_id *oid, + enum object_type *type, + unsigned long *size); + +/* Read and unpack an object file into memory, write memory to an object file */ +int oid_object_info(struct repository *r, const struct object_id *, unsigned long *); + +void hash_object_file(const struct git_hash_algo *algo, const void *buf, + unsigned long len, enum object_type type, + struct object_id *oid); + +int write_object_file_flags(const void *buf, unsigned long len, + enum object_type type, struct object_id *oid, + unsigned flags); +static inline int write_object_file(const void *buf, unsigned long len, + enum object_type type, struct object_id *oid) +{ + return write_object_file_flags(buf, len, type, oid, 0); +} + +int write_object_file_literally(const void *buf, unsigned long len, + const char *type, struct object_id *oid, + unsigned flags); +int stream_loose_object(struct input_stream *in_stream, size_t len, + struct object_id *oid); + +/* + * Add an object file to the in-memory object store, without writing it + * to disk. + * + * Callers are responsible for calling write_object_file to record the + * object in persistent storage before writing any other new objects + * that reference it. + */ +int pretend_object_file(void *, unsigned long, enum object_type, + struct object_id *oid); + +int force_object_loose(const struct object_id *oid, time_t mtime); + +struct object_info { + /* Request */ + enum object_type *typep; + unsigned long *sizep; + off_t *disk_sizep; + struct object_id *delta_base_oid; + struct strbuf *type_name; + void **contentp; + + /* Response */ + enum { + OI_CACHED, + OI_LOOSE, + OI_PACKED, + OI_DBCACHED + } whence; + union { + /* + * struct { + * ... Nothing to expose in this case + * } cached; + * struct { + * ... Nothing to expose in this case + * } loose; + */ + struct { + struct packed_git *pack; + off_t offset; + unsigned int is_delta; + } packed; + } u; +}; + +/* + * Initializer for a "struct object_info" that wants no items. You may + * also memset() the memory to all-zeroes. + */ +#define OBJECT_INFO_INIT { 0 } + +/* Invoke lookup_replace_object() on the given hash */ +#define OBJECT_INFO_LOOKUP_REPLACE 1 +/* Allow reading from a loose object file of unknown/bogus type */ +#define OBJECT_INFO_ALLOW_UNKNOWN_TYPE 2 +/* Do not retry packed storage after checking packed and loose storage */ +#define OBJECT_INFO_QUICK 8 +/* + * Do not attempt to fetch the object if missing (even if fetch_is_missing is + * nonzero). + */ +#define OBJECT_INFO_SKIP_FETCH_OBJECT 16 +/* + * This is meant for bulk prefetching of missing blobs in a partial + * clone. Implies OBJECT_INFO_SKIP_FETCH_OBJECT and OBJECT_INFO_QUICK + */ +#define OBJECT_INFO_FOR_PREFETCH (OBJECT_INFO_SKIP_FETCH_OBJECT | OBJECT_INFO_QUICK) + +/* Die if object corruption (not just an object being missing) was detected. */ +#define OBJECT_INFO_DIE_IF_CORRUPT 32 + +int oid_object_info_extended(struct repository *r, + const struct object_id *, + struct object_info *, unsigned flags); + +/* + * Open the loose object at path, check its hash, and return the contents, + * use the "oi" argument to assert things about the object, or e.g. populate its + * type, and size. If the object is a blob, then "contents" may return NULL, + * to allow streaming of large blobs. + * + * Returns 0 on success, negative on error (details may be written to stderr). + */ +int read_loose_object(const char *path, + const struct object_id *expected_oid, + struct object_id *real_oid, + void **contents, + struct object_info *oi); + +/* Retry packed storage after checking packed and loose storage */ +#define HAS_OBJECT_RECHECK_PACKED 1 + +/* + * Returns 1 if the object exists. This function will not lazily fetch objects + * in a partial clone. + */ +int has_object(struct repository *r, const struct object_id *oid, + unsigned flags); + +/* + * These macros and functions are deprecated. If checking existence for an + * object that is likely to be missing and/or whose absence is relatively + * inconsequential (or is consequential but the caller is prepared to handle + * it), use has_object(), which has better defaults (no lazy fetch in a partial + * clone and no rechecking of packed storage). In the unlikely event that a + * caller needs to assert existence of an object that it fully expects to + * exist, and wants to trigger a lazy fetch in a partial clone, use + * oid_object_info_extended() with a NULL struct object_info. + * + * These functions can be removed once all callers have migrated to + * has_object() and/or oid_object_info_extended(). + */ +int repo_has_object_file(struct repository *r, const struct object_id *oid); +int repo_has_object_file_with_flags(struct repository *r, + const struct object_id *oid, int flags); + +/* + * Return true iff an alternate object database has a loose object + * with the specified name. This function does not respect replace + * references. + */ +int has_loose_object_nonlocal(const struct object_id *); + +int has_loose_object(const struct object_id *); + +/** + * format_object_header() is a thin wrapper around s xsnprintf() that + * writes the initial " " part of the loose object + * header. It returns the size that snprintf() returns + 1. + */ +int format_object_header(char *str, size_t size, enum object_type type, + size_t objsize); + +void assert_oid_type(const struct object_id *oid, enum object_type expect); + +/* + * Enabling the object read lock allows multiple threads to safely call the + * following functions in parallel: repo_read_object_file(), + * read_object_with_reference(), oid_object_info() and oid_object_info_extended(). + * + * obj_read_lock() and obj_read_unlock() may also be used to protect other + * section which cannot execute in parallel with object reading. Since the used + * lock is a recursive mutex, these sections can even contain calls to object + * reading functions. However, beware that in these cases zlib inflation won't + * be performed in parallel, losing performance. + * + * TODO: oid_object_info_extended()'s call stack has a recursive behavior. If + * any of its callees end up calling it, this recursive call won't benefit from + * parallel inflation. + */ +void enable_obj_read_lock(void); +void disable_obj_read_lock(void); + +extern int obj_read_use_lock; +extern pthread_mutex_t obj_read_mutex; + +static inline void obj_read_lock(void) +{ + if(obj_read_use_lock) + pthread_mutex_lock(&obj_read_mutex); +} + +static inline void obj_read_unlock(void) +{ + if(obj_read_use_lock) + pthread_mutex_unlock(&obj_read_mutex); +} + +/* + * Iterate over the files in the loose-object parts of the object + * directory "path", triggering the following callbacks: + * + * - loose_object is called for each loose object we find. + * + * - loose_cruft is called for any files that do not appear to be + * loose objects. Note that we only look in the loose object + * directories "objects/[0-9a-f]{2}/", so we will not report + * "objects/foobar" as cruft. + * + * - loose_subdir is called for each top-level hashed subdirectory + * of the object directory (e.g., "$OBJDIR/f0"). It is called + * after the objects in the directory are processed. + * + * Any callback that is NULL will be ignored. Callbacks returning non-zero + * will end the iteration. + * + * In the "buf" variant, "path" is a strbuf which will also be used as a + * scratch buffer, but restored to its original contents before + * the function returns. + */ +typedef int each_loose_object_fn(const struct object_id *oid, + const char *path, + void *data); +typedef int each_loose_cruft_fn(const char *basename, + const char *path, + void *data); +typedef int each_loose_subdir_fn(unsigned int nr, + const char *path, + void *data); +int for_each_file_in_obj_subdir(unsigned int subdir_nr, + struct strbuf *path, + each_loose_object_fn obj_cb, + each_loose_cruft_fn cruft_cb, + each_loose_subdir_fn subdir_cb, + void *data); +int for_each_loose_file_in_objdir(const char *path, + each_loose_object_fn obj_cb, + each_loose_cruft_fn cruft_cb, + each_loose_subdir_fn subdir_cb, + void *data); +int for_each_loose_file_in_objdir_buf(struct strbuf *path, + each_loose_object_fn obj_cb, + each_loose_cruft_fn cruft_cb, + each_loose_subdir_fn subdir_cb, + void *data); + +/* Flags for for_each_*_object() below. */ +enum for_each_object_flags { + /* Iterate only over local objects, not alternates. */ + FOR_EACH_OBJECT_LOCAL_ONLY = (1<<0), + + /* Only iterate over packs obtained from the promisor remote. */ + FOR_EACH_OBJECT_PROMISOR_ONLY = (1<<1), + + /* + * Visit objects within a pack in packfile order rather than .idx order + */ + FOR_EACH_OBJECT_PACK_ORDER = (1<<2), + + /* Only iterate over packs that are not marked as kept in-core. */ + FOR_EACH_OBJECT_SKIP_IN_CORE_KEPT_PACKS = (1<<3), + + /* Only iterate over packs that do not have .keep files. */ + FOR_EACH_OBJECT_SKIP_ON_DISK_KEPT_PACKS = (1<<4), +}; + +/* + * Iterate over all accessible loose objects without respect to + * reachability. By default, this includes both local and alternate objects. + * The order in which objects are visited is unspecified. + * + * Any flags specific to packs are ignored. + */ +int for_each_loose_object(each_loose_object_fn, void *, + enum for_each_object_flags flags); + +/* + * Iterate over all accessible packed objects without respect to reachability. + * By default, this includes both local and alternate packs. + * + * Note that some objects may appear twice if they are found in multiple packs. + * Each pack is visited in an unspecified order. By default, objects within a + * pack are visited in pack-idx order (i.e., sorted by oid). + */ +typedef int each_packed_object_fn(const struct object_id *oid, + struct packed_git *pack, + uint32_t pos, + void *data); +int for_each_object_in_pack(struct packed_git *p, + each_packed_object_fn, void *data, + enum for_each_object_flags flags); +int for_each_packed_object(each_packed_object_fn, void *, + enum for_each_object_flags flags); + +#endif /* OBJECT_STORE_LL_H */ diff --git a/object-store.h b/object-store.h index 05803a03e9..1b3e3d7d01 100644 --- a/object-store.h +++ b/object-store.h @@ -1,537 +1,11 @@ #ifndef OBJECT_STORE_H #define OBJECT_STORE_H -#include "object.h" -#include "list.h" -#include "thread-utils.h" #include "khash.h" #include "dir.h" -#include "oidset.h" - -struct oidmap; -struct oidtree; -struct strbuf; - -struct object_directory { - struct object_directory *next; - - /* - * Used to store the results of readdir(3) calls when we are OK - * sacrificing accuracy due to races for speed. That includes - * object existence with OBJECT_INFO_QUICK, as well as - * our search for unique abbreviated hashes. Don't use it for tasks - * requiring greater accuracy! - * - * Be sure to call odb_load_loose_cache() before using. - */ - uint32_t loose_objects_subdir_seen[8]; /* 256 bits */ - struct oidtree *loose_objects_cache; - - /* - * This is a temporary object store created by the tmp_objdir - * facility. Disable ref updates since the objects in the store - * might be discarded on rollback. - */ - int disable_ref_updates; - - /* - * This object store is ephemeral, so there is no need to fsync. - */ - int will_destroy; - - /* - * Path to the alternative object store. If this is a relative path, - * it is relative to the current working directory. - */ - char *path; -}; - -struct input_stream { - const void *(*read)(struct input_stream *, unsigned long *len); - void *data; - int is_finished; -}; +#include "object-store-ll.h" KHASH_INIT(odb_path_map, const char * /* key: odb_path */, struct object_directory *, 1, fspathhash, fspatheq) -void prepare_alt_odb(struct repository *r); -int has_alt_odb(struct repository *r); -char *compute_alternate_path(const char *path, struct strbuf *err); -struct object_directory *find_odb(struct repository *r, const char *obj_dir); -typedef int alt_odb_fn(struct object_directory *, void *); -int foreach_alt_odb(alt_odb_fn, void*); -typedef void alternate_ref_fn(const struct object_id *oid, void *); -void for_each_alternate_ref(alternate_ref_fn, void *); - -/* - * Add the directory to the on-disk alternates file; the new entry will also - * take effect in the current process. - */ -void add_to_alternates_file(const char *dir); - -/* - * Add the directory to the in-memory list of alternates (along with any - * recursive alternates it points to), but do not modify the on-disk alternates - * file. - */ -void add_to_alternates_memory(const char *dir); - -/* - * Replace the current writable object directory with the specified temporary - * object directory; returns the former primary object directory. - */ -struct object_directory *set_temporary_primary_odb(const char *dir, int will_destroy); - -/* - * Restore a previous ODB replaced by set_temporary_main_odb. - */ -void restore_primary_odb(struct object_directory *restore_odb, const char *old_path); - -/* - * Populate and return the loose object cache array corresponding to the - * given object ID. - */ -struct oidtree *odb_loose_cache(struct object_directory *odb, - const struct object_id *oid); - -/* Empty the loose object cache for the specified object directory. */ -void odb_clear_loose_cache(struct object_directory *odb); - -/* Clear and free the specified object directory */ -void free_object_directory(struct object_directory *odb); - -struct packed_git { - struct hashmap_entry packmap_ent; - struct packed_git *next; - struct list_head mru; - struct pack_window *windows; - off_t pack_size; - const void *index_data; - size_t index_size; - uint32_t num_objects; - uint32_t crc_offset; - struct oidset bad_objects; - int index_version; - time_t mtime; - int pack_fd; - int index; /* for builtin/pack-objects.c */ - unsigned pack_local:1, - pack_keep:1, - pack_keep_in_core:1, - freshened:1, - do_not_close:1, - pack_promisor:1, - multi_pack_index:1, - is_cruft:1; - unsigned char hash[GIT_MAX_RAWSZ]; - struct revindex_entry *revindex; - const uint32_t *revindex_data; - const uint32_t *revindex_map; - size_t revindex_size; - /* - * mtimes_map points at the beginning of the memory mapped region of - * this pack's corresponding .mtimes file, and mtimes_size is the size - * of that .mtimes file - */ - const uint32_t *mtimes_map; - size_t mtimes_size; - /* something like ".git/objects/pack/xxxxx.pack" */ - char pack_name[FLEX_ARRAY]; /* more */ -}; - -struct multi_pack_index; - -static inline int pack_map_entry_cmp(const void *cmp_data UNUSED, - const struct hashmap_entry *entry, - const struct hashmap_entry *entry2, - const void *keydata) -{ - const char *key = keydata; - const struct packed_git *pg1, *pg2; - - pg1 = container_of(entry, const struct packed_git, packmap_ent); - pg2 = container_of(entry2, const struct packed_git, packmap_ent); - - return strcmp(pg1->pack_name, key ? key : pg2->pack_name); -} - -struct raw_object_store { - /* - * Set of all object directories; the main directory is first (and - * cannot be NULL after initialization). Subsequent directories are - * alternates. - */ - struct object_directory *odb; - struct object_directory **odb_tail; - struct kh_odb_path_map *odb_by_path; - - int loaded_alternates; - - /* - * A list of alternate object directories loaded from the environment; - * this should not generally need to be accessed directly, but will - * populate the "odb" list when prepare_alt_odb() is run. - */ - char *alternate_db; - - /* - * Objects that should be substituted by other objects - * (see git-replace(1)). - */ - struct oidmap *replace_map; - unsigned replace_map_initialized : 1; - pthread_mutex_t replace_mutex; /* protect object replace functions */ - - struct commit_graph *commit_graph; - unsigned commit_graph_attempted : 1; /* if loading has been attempted */ - - /* - * private data - * - * should only be accessed directly by packfile.c and midx.c - */ - struct multi_pack_index *multi_pack_index; - - /* - * private data - * - * should only be accessed directly by packfile.c - */ - - struct packed_git *packed_git; - /* A most-recently-used ordered version of the packed_git list. */ - struct list_head packed_git_mru; - - struct { - struct packed_git **packs; - unsigned flags; - } kept_pack_cache; - - /* - * A map of packfiles to packed_git structs for tracking which - * packs have been loaded already. - */ - struct hashmap pack_map; - - /* - * A fast, rough count of the number of objects in the repository. - * These two fields are not meant for direct access. Use - * repo_approximate_object_count() instead. - */ - unsigned long approximate_object_count; - unsigned approximate_object_count_valid : 1; - - /* - * Whether packed_git has already been populated with this repository's - * packs. - */ - unsigned packed_git_initialized : 1; -}; - -struct raw_object_store *raw_object_store_new(void); -void raw_object_store_clear(struct raw_object_store *o); - -/* - * 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. - */ -const char *loose_object_path(struct repository *r, struct strbuf *buf, - const struct object_id *oid); - -void *map_loose_object(struct repository *r, const struct object_id *oid, - unsigned long *size); - -void *repo_read_object_file(struct repository *r, - const struct object_id *oid, - enum object_type *type, - unsigned long *size); - -/* Read and unpack an object file into memory, write memory to an object file */ -int oid_object_info(struct repository *r, const struct object_id *, unsigned long *); - -void hash_object_file(const struct git_hash_algo *algo, const void *buf, - unsigned long len, enum object_type type, - struct object_id *oid); - -int write_object_file_flags(const void *buf, unsigned long len, - enum object_type type, struct object_id *oid, - unsigned flags); -static inline int write_object_file(const void *buf, unsigned long len, - enum object_type type, struct object_id *oid) -{ - return write_object_file_flags(buf, len, type, oid, 0); -} - -int write_object_file_literally(const void *buf, unsigned long len, - const char *type, struct object_id *oid, - unsigned flags); -int stream_loose_object(struct input_stream *in_stream, size_t len, - struct object_id *oid); - -/* - * Add an object file to the in-memory object store, without writing it - * to disk. - * - * Callers are responsible for calling write_object_file to record the - * object in persistent storage before writing any other new objects - * that reference it. - */ -int pretend_object_file(void *, unsigned long, enum object_type, - struct object_id *oid); - -int force_object_loose(const struct object_id *oid, time_t mtime); - -struct object_info { - /* Request */ - enum object_type *typep; - unsigned long *sizep; - off_t *disk_sizep; - struct object_id *delta_base_oid; - struct strbuf *type_name; - void **contentp; - - /* Response */ - enum { - OI_CACHED, - OI_LOOSE, - OI_PACKED, - OI_DBCACHED - } whence; - union { - /* - * struct { - * ... Nothing to expose in this case - * } cached; - * struct { - * ... Nothing to expose in this case - * } loose; - */ - struct { - struct packed_git *pack; - off_t offset; - unsigned int is_delta; - } packed; - } u; -}; - -/* - * Initializer for a "struct object_info" that wants no items. You may - * also memset() the memory to all-zeroes. - */ -#define OBJECT_INFO_INIT { 0 } - -/* Invoke lookup_replace_object() on the given hash */ -#define OBJECT_INFO_LOOKUP_REPLACE 1 -/* Allow reading from a loose object file of unknown/bogus type */ -#define OBJECT_INFO_ALLOW_UNKNOWN_TYPE 2 -/* Do not retry packed storage after checking packed and loose storage */ -#define OBJECT_INFO_QUICK 8 -/* - * Do not attempt to fetch the object if missing (even if fetch_is_missing is - * nonzero). - */ -#define OBJECT_INFO_SKIP_FETCH_OBJECT 16 -/* - * This is meant for bulk prefetching of missing blobs in a partial - * clone. Implies OBJECT_INFO_SKIP_FETCH_OBJECT and OBJECT_INFO_QUICK - */ -#define OBJECT_INFO_FOR_PREFETCH (OBJECT_INFO_SKIP_FETCH_OBJECT | OBJECT_INFO_QUICK) - -/* Die if object corruption (not just an object being missing) was detected. */ -#define OBJECT_INFO_DIE_IF_CORRUPT 32 - -int oid_object_info_extended(struct repository *r, - const struct object_id *, - struct object_info *, unsigned flags); - -/* - * Open the loose object at path, check its hash, and return the contents, - * use the "oi" argument to assert things about the object, or e.g. populate its - * type, and size. If the object is a blob, then "contents" may return NULL, - * to allow streaming of large blobs. - * - * Returns 0 on success, negative on error (details may be written to stderr). - */ -int read_loose_object(const char *path, - const struct object_id *expected_oid, - struct object_id *real_oid, - void **contents, - struct object_info *oi); - -/* Retry packed storage after checking packed and loose storage */ -#define HAS_OBJECT_RECHECK_PACKED 1 - -/* - * Returns 1 if the object exists. This function will not lazily fetch objects - * in a partial clone. - */ -int has_object(struct repository *r, const struct object_id *oid, - unsigned flags); - -/* - * These macros and functions are deprecated. If checking existence for an - * object that is likely to be missing and/or whose absence is relatively - * inconsequential (or is consequential but the caller is prepared to handle - * it), use has_object(), which has better defaults (no lazy fetch in a partial - * clone and no rechecking of packed storage). In the unlikely event that a - * caller needs to assert existence of an object that it fully expects to - * exist, and wants to trigger a lazy fetch in a partial clone, use - * oid_object_info_extended() with a NULL struct object_info. - * - * These functions can be removed once all callers have migrated to - * has_object() and/or oid_object_info_extended(). - */ -int repo_has_object_file(struct repository *r, const struct object_id *oid); -int repo_has_object_file_with_flags(struct repository *r, - const struct object_id *oid, int flags); - -/* - * Return true iff an alternate object database has a loose object - * with the specified name. This function does not respect replace - * references. - */ -int has_loose_object_nonlocal(const struct object_id *); - -int has_loose_object(const struct object_id *); - -/** - * format_object_header() is a thin wrapper around s xsnprintf() that - * writes the initial " " part of the loose object - * header. It returns the size that snprintf() returns + 1. - */ -int format_object_header(char *str, size_t size, enum object_type type, - size_t objsize); - -void assert_oid_type(const struct object_id *oid, enum object_type expect); - -/* - * Enabling the object read lock allows multiple threads to safely call the - * following functions in parallel: repo_read_object_file(), - * read_object_with_reference(), oid_object_info() and oid_object_info_extended(). - * - * obj_read_lock() and obj_read_unlock() may also be used to protect other - * section which cannot execute in parallel with object reading. Since the used - * lock is a recursive mutex, these sections can even contain calls to object - * reading functions. However, beware that in these cases zlib inflation won't - * be performed in parallel, losing performance. - * - * TODO: oid_object_info_extended()'s call stack has a recursive behavior. If - * any of its callees end up calling it, this recursive call won't benefit from - * parallel inflation. - */ -void enable_obj_read_lock(void); -void disable_obj_read_lock(void); - -extern int obj_read_use_lock; -extern pthread_mutex_t obj_read_mutex; - -static inline void obj_read_lock(void) -{ - if(obj_read_use_lock) - pthread_mutex_lock(&obj_read_mutex); -} - -static inline void obj_read_unlock(void) -{ - if(obj_read_use_lock) - pthread_mutex_unlock(&obj_read_mutex); -} - -/* - * Iterate over the files in the loose-object parts of the object - * directory "path", triggering the following callbacks: - * - * - loose_object is called for each loose object we find. - * - * - loose_cruft is called for any files that do not appear to be - * loose objects. Note that we only look in the loose object - * directories "objects/[0-9a-f]{2}/", so we will not report - * "objects/foobar" as cruft. - * - * - loose_subdir is called for each top-level hashed subdirectory - * of the object directory (e.g., "$OBJDIR/f0"). It is called - * after the objects in the directory are processed. - * - * Any callback that is NULL will be ignored. Callbacks returning non-zero - * will end the iteration. - * - * In the "buf" variant, "path" is a strbuf which will also be used as a - * scratch buffer, but restored to its original contents before - * the function returns. - */ -typedef int each_loose_object_fn(const struct object_id *oid, - const char *path, - void *data); -typedef int each_loose_cruft_fn(const char *basename, - const char *path, - void *data); -typedef int each_loose_subdir_fn(unsigned int nr, - const char *path, - void *data); -int for_each_file_in_obj_subdir(unsigned int subdir_nr, - struct strbuf *path, - each_loose_object_fn obj_cb, - each_loose_cruft_fn cruft_cb, - each_loose_subdir_fn subdir_cb, - void *data); -int for_each_loose_file_in_objdir(const char *path, - each_loose_object_fn obj_cb, - each_loose_cruft_fn cruft_cb, - each_loose_subdir_fn subdir_cb, - void *data); -int for_each_loose_file_in_objdir_buf(struct strbuf *path, - each_loose_object_fn obj_cb, - each_loose_cruft_fn cruft_cb, - each_loose_subdir_fn subdir_cb, - void *data); - -/* Flags for for_each_*_object() below. */ -enum for_each_object_flags { - /* Iterate only over local objects, not alternates. */ - FOR_EACH_OBJECT_LOCAL_ONLY = (1<<0), - - /* Only iterate over packs obtained from the promisor remote. */ - FOR_EACH_OBJECT_PROMISOR_ONLY = (1<<1), - - /* - * Visit objects within a pack in packfile order rather than .idx order - */ - FOR_EACH_OBJECT_PACK_ORDER = (1<<2), - - /* Only iterate over packs that are not marked as kept in-core. */ - FOR_EACH_OBJECT_SKIP_IN_CORE_KEPT_PACKS = (1<<3), - - /* Only iterate over packs that do not have .keep files. */ - FOR_EACH_OBJECT_SKIP_ON_DISK_KEPT_PACKS = (1<<4), -}; - -/* - * Iterate over all accessible loose objects without respect to - * reachability. By default, this includes both local and alternate objects. - * The order in which objects are visited is unspecified. - * - * Any flags specific to packs are ignored. - */ -int for_each_loose_object(each_loose_object_fn, void *, - enum for_each_object_flags flags); - -/* - * Iterate over all accessible packed objects without respect to reachability. - * By default, this includes both local and alternate packs. - * - * Note that some objects may appear twice if they are found in multiple packs. - * Each pack is visited in an unspecified order. By default, objects within a - * pack are visited in pack-idx order (i.e., sorted by oid). - */ -typedef int each_packed_object_fn(const struct object_id *oid, - struct packed_git *pack, - uint32_t pos, - void *data); -int for_each_object_in_pack(struct packed_git *p, - each_packed_object_fn, void *data, - enum for_each_object_flags flags); -int for_each_packed_object(each_packed_object_fn, void *, - enum for_each_object_flags flags); - #endif /* OBJECT_STORE_H */ diff --git a/oss-fuzz/fuzz-pack-idx.c b/oss-fuzz/fuzz-pack-idx.c index 609a343ee3..3e190214d1 100644 --- a/oss-fuzz/fuzz-pack-idx.c +++ b/oss-fuzz/fuzz-pack-idx.c @@ -1,5 +1,5 @@ #include "git-compat-util.h" -#include "object-store.h" +#include "object-store-ll.h" #include "packfile.h" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size); diff --git a/pack-bitmap-write.c b/pack-bitmap-write.c index 623ee2a819..d86f4e739a 100644 --- a/pack-bitmap-write.c +++ b/pack-bitmap-write.c @@ -3,7 +3,7 @@ #include "environment.h" #include "gettext.h" #include "hex.h" -#include "object-store.h" +#include "object-store-ll.h" #include "commit.h" #include "tag.h" #include "diff.h" diff --git a/pack-bitmap.c b/pack-bitmap.c index 999f962602..576e613837 100644 --- a/pack-bitmap.c +++ b/pack-bitmap.c @@ -17,7 +17,7 @@ #include "repository.h" #include "trace2.h" #include "object-file.h" -#include "object-store.h" +#include "object-store-ll.h" #include "list-objects-filter-options.h" #include "midx.h" #include "config.h" diff --git a/pack-check.c b/pack-check.c index 049f2f0bfc..977f619618 100644 --- a/pack-check.c +++ b/pack-check.c @@ -7,7 +7,7 @@ #include "progress.h" #include "packfile.h" #include "object-file.h" -#include "object-store.h" +#include "object-store-ll.h" struct idx_entry { off_t offset; diff --git a/pack-mtimes.c b/pack-mtimes.c index 020a37f8fe..cdf30b8d2b 100644 --- a/pack-mtimes.c +++ b/pack-mtimes.c @@ -2,8 +2,9 @@ #include "gettext.h" #include "pack-mtimes.h" #include "object-file.h" -#include "object-store.h" +#include "object-store-ll.h" #include "packfile.h" +#include "strbuf.h" static char *pack_mtimes_filename(struct packed_git *p) { diff --git a/pack-objects.h b/pack-objects.h index 579476687c..0d78db40cb 100644 --- a/pack-objects.h +++ b/pack-objects.h @@ -1,7 +1,7 @@ #ifndef PACK_OBJECTS_H #define PACK_OBJECTS_H -#include "object-store.h" +#include "object-store-ll.h" #include "thread-utils.h" #include "pack.h" diff --git a/pack-revindex.c b/pack-revindex.c index 1f51b712e8..7fffcad912 100644 --- a/pack-revindex.c +++ b/pack-revindex.c @@ -2,8 +2,9 @@ #include "gettext.h" #include "pack-revindex.h" #include "object-file.h" -#include "object-store.h" +#include "object-store-ll.h" #include "packfile.h" +#include "strbuf.h" #include "trace2.h" #include "config.h" #include "midx.h" diff --git a/pack-write.c b/pack-write.c index 45681e2d7d..af48813a9b 100644 --- a/pack-write.c +++ b/pack-write.c @@ -11,6 +11,7 @@ #include "pack-objects.h" #include "pack-revindex.h" #include "path.h" +#include "strbuf.h" #include "wrapper.h" void reset_pack_idx_option(struct pack_idx_option *opts) diff --git a/packfile.c b/packfile.c index fd083c86e0..c60aeb05ec 100644 --- a/packfile.c +++ b/packfile.c @@ -19,7 +19,7 @@ #include "tree-walk.h" #include "tree.h" #include "object-file.h" -#include "object-store.h" +#include "object-store-ll.h" #include "midx.h" #include "commit-graph.h" #include "pack-revindex.h" diff --git a/path.c b/path.c index 7c1cd8182a..c3b6618c77 100644 --- a/path.c +++ b/path.c @@ -15,7 +15,7 @@ #include "submodule-config.h" #include "path.h" #include "packfile.h" -#include "object-store.h" +#include "object-store-ll.h" #include "lockfile.h" #include "exec-cmd.h" #include "wrapper.h" diff --git a/promisor-remote.c b/promisor-remote.c index 1adcd6fb0a..db88d2064d 100644 --- a/promisor-remote.c +++ b/promisor-remote.c @@ -1,7 +1,7 @@ #include "git-compat-util.h" #include "gettext.h" #include "hex.h" -#include "object-store.h" +#include "object-store-ll.h" #include "promisor-remote.h" #include "config.h" #include "trace2.h" diff --git a/protocol-caps.c b/protocol-caps.c index a90c48852e..808a68c974 100644 --- a/protocol-caps.c +++ b/protocol-caps.c @@ -7,7 +7,7 @@ #include "hash-ll.h" #include "hex.h" #include "object.h" -#include "object-store.h" +#include "object-store-ll.h" #include "string-list.h" #include "strbuf.h" diff --git a/prune-packed.c b/prune-packed.c index 58412b4fb9..e54daf740a 100644 --- a/prune-packed.c +++ b/prune-packed.c @@ -1,7 +1,7 @@ #include "git-compat-util.h" #include "environment.h" #include "gettext.h" -#include "object-store.h" +#include "object-store-ll.h" #include "packfile.h" #include "progress.h" #include "prune-packed.h" diff --git a/reachable.c b/reachable.c index 55bb114353..434f09e9eb 100644 --- a/reachable.c +++ b/reachable.c @@ -13,7 +13,7 @@ #include "list-objects.h" #include "packfile.h" #include "worktree.h" -#include "object-store.h" +#include "object-store-ll.h" #include "pack-bitmap.h" #include "pack-mtimes.h" diff --git a/read-cache.c b/read-cache.c index 86ada403a8..b9a995e5a1 100644 --- a/read-cache.c +++ b/read-cache.c @@ -17,7 +17,7 @@ #include "refs.h" #include "dir.h" #include "object-file.h" -#include "object-store.h" +#include "object-store-ll.h" #include "oid-array.h" #include "tree.h" #include "commit.h" diff --git a/ref-filter.c b/ref-filter.c index 4991cd4f7a..e0d03a9f8e 100644 --- a/ref-filter.c +++ b/ref-filter.c @@ -8,7 +8,7 @@ #include "refs.h" #include "wildmatch.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "oid-array.h" #include "repository.h" #include "commit.h" diff --git a/reflog.c b/reflog.c index ee1bf5d032..9ad50e7d93 100644 --- a/reflog.c +++ b/reflog.c @@ -1,6 +1,6 @@ #include "git-compat-util.h" #include "gettext.h" -#include "object-store.h" +#include "object-store-ll.h" #include "reflog.h" #include "refs.h" #include "revision.h" diff --git a/refs.c b/refs.c index 8b192e4cb4..c029f64982 100644 --- a/refs.c +++ b/refs.c @@ -17,7 +17,7 @@ #include "run-command.h" #include "hook.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "object.h" #include "path.h" #include "tag.h" diff --git a/remote.c b/remote.c index 8550056db4..6538b6037d 100644 --- a/remote.c +++ b/remote.c @@ -10,7 +10,7 @@ #include "refs.h" #include "refspec.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "path.h" #include "commit.h" #include "diff.h" diff --git a/replace-object.c b/replace-object.c index e98825d585..ca4017635d 100644 --- a/replace-object.c +++ b/replace-object.c @@ -2,7 +2,7 @@ #include "gettext.h" #include "hex.h" #include "oidmap.h" -#include "object-store.h" +#include "object-store-ll.h" #include "replace-object.h" #include "refs.h" #include "repository.h" diff --git a/replace-object.h b/replace-object.h index 500482b02b..a964db1670 100644 --- a/replace-object.h +++ b/replace-object.h @@ -3,7 +3,7 @@ #include "oidmap.h" #include "repository.h" -#include "object-store.h" +#include "object-store-ll.h" /* * Do replace refs need to be checked this run? This variable is diff --git a/repository.c b/repository.c index 4d68537407..a7679ceeaa 100644 --- a/repository.c +++ b/repository.c @@ -6,7 +6,7 @@ #include "git-compat-util.h" #include "abspath.h" #include "repository.h" -#include "object-store.h" +#include "object-store-ll.h" #include "config.h" #include "object.h" #include "lockfile.h" diff --git a/rerere.c b/rerere.c index 3584fecb07..e2b8597f88 100644 --- a/rerere.c +++ b/rerere.c @@ -17,7 +17,7 @@ #include "path.h" #include "pathspec.h" #include "object-file.h" -#include "object-store.h" +#include "object-store-ll.h" #include "hash-lookup.h" #include "strmap.h" #include "wrapper.h" diff --git a/revision.c b/revision.c index d4b4b34fd8..84768565ce 100644 --- a/revision.c +++ b/revision.c @@ -6,7 +6,7 @@ #include "hex.h" #include "object-name.h" #include "object-file.h" -#include "object-store.h" +#include "object-store-ll.h" #include "tag.h" #include "blob.h" #include "tree.h" diff --git a/send-pack.c b/send-pack.c index 0c7ccaef68..9510bef856 100644 --- a/send-pack.c +++ b/send-pack.c @@ -5,7 +5,7 @@ #include "gettext.h" #include "hex.h" #include "refs.h" -#include "object-store.h" +#include "object-store-ll.h" #include "pkt-line.h" #include "sideband.h" #include "run-command.h" diff --git a/sequencer.c b/sequencer.c index 282a6cff1b..8dd5bdeb36 100644 --- a/sequencer.c +++ b/sequencer.c @@ -11,7 +11,7 @@ #include "dir.h" #include "object-file.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "object.h" #include "pager.h" #include "commit.h" diff --git a/server-info.c b/server-info.c index 85d17bbb15..382e481a2b 100644 --- a/server-info.c +++ b/server-info.c @@ -11,7 +11,7 @@ #include "packfile.h" #include "path.h" #include "object-file.h" -#include "object-store.h" +#include "object-store-ll.h" #include "server-info.h" #include "strbuf.h" #include "wrapper.h" diff --git a/shallow.c b/shallow.c index 45343e6a78..f3ef94d4c9 100644 --- a/shallow.c +++ b/shallow.c @@ -4,7 +4,7 @@ #include "repository.h" #include "tempfile.h" #include "lockfile.h" -#include "object-store.h" +#include "object-store-ll.h" #include "commit.h" #include "tag.h" #include "pkt-line.h" diff --git a/streaming.c b/streaming.c index 21e39585e8..49791ab958 100644 --- a/streaming.c +++ b/streaming.c @@ -7,7 +7,7 @@ #include "streaming.h" #include "repository.h" #include "object-file.h" -#include "object-store.h" +#include "object-store-ll.h" #include "replace-object.h" #include "packfile.h" #include "wrapper.h" diff --git a/submodule-config.c b/submodule-config.c index 6786bcee52..515ff5bba4 100644 --- a/submodule-config.c +++ b/submodule-config.c @@ -11,7 +11,7 @@ #include "submodule.h" #include "strbuf.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "parse-options.h" #include "thread-utils.h" #include "tree-walk.h" diff --git a/submodule.c b/submodule.c index 245300596f..f0f8788d2e 100644 --- a/submodule.c +++ b/submodule.c @@ -27,7 +27,7 @@ #include "parse-options.h" #include "object-file.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "commit-reach.h" #include "read-cache-ll.h" #include "setup.h" diff --git a/t/helper/test-pack-mtimes.c b/t/helper/test-pack-mtimes.c index 0f3fbeec53..67a964ef90 100644 --- a/t/helper/test-pack-mtimes.c +++ b/t/helper/test-pack-mtimes.c @@ -1,7 +1,7 @@ #include "test-tool.h" #include "hex.h" #include "strbuf.h" -#include "object-store.h" +#include "object-store-ll.h" #include "packfile.h" #include "pack-mtimes.h" #include "setup.h" diff --git a/t/helper/test-partial-clone.c b/t/helper/test-partial-clone.c index 362bd64a4c..910a128614 100644 --- a/t/helper/test-partial-clone.c +++ b/t/helper/test-partial-clone.c @@ -1,7 +1,7 @@ #include "test-tool.h" #include "hex.h" #include "repository.h" -#include "object-store.h" +#include "object-store-ll.h" #include "setup.h" /* diff --git a/t/helper/test-read-graph.c b/t/helper/test-read-graph.c index 3ac496e27e..8c7a83f578 100644 --- a/t/helper/test-read-graph.c +++ b/t/helper/test-read-graph.c @@ -1,7 +1,7 @@ #include "test-tool.h" #include "commit-graph.h" #include "repository.h" -#include "object-store.h" +#include "object-store-ll.h" #include "bloom.h" #include "setup.h" diff --git a/t/helper/test-read-midx.c b/t/helper/test-read-midx.c index 211addaa00..e9a444ddba 100644 --- a/t/helper/test-read-midx.c +++ b/t/helper/test-read-midx.c @@ -2,7 +2,7 @@ #include "hex.h" #include "midx.h" #include "repository.h" -#include "object-store.h" +#include "object-store-ll.h" #include "pack-bitmap.h" #include "packfile.h" #include "setup.h" diff --git a/t/helper/test-ref-store.c b/t/helper/test-ref-store.c index 15fa3f880c..fb18831ec2 100644 --- a/t/helper/test-ref-store.c +++ b/t/helper/test-ref-store.c @@ -3,9 +3,10 @@ #include "refs.h" #include "setup.h" #include "worktree.h" -#include "object-store.h" +#include "object-store-ll.h" #include "path.h" #include "repository.h" +#include "strbuf.h" #include "revision.h" struct flag_definition { diff --git a/t/helper/test-repository.c b/t/helper/test-repository.c index bafd2a5bf9..4cd8a952e5 100644 --- a/t/helper/test-repository.c +++ b/t/helper/test-repository.c @@ -4,7 +4,7 @@ #include "config.h" #include "environment.h" #include "hex.h" -#include "object-store.h" +#include "object-store-ll.h" #include "object.h" #include "repository.h" #include "setup.h" diff --git a/tag.c b/tag.c index 96dbd5b2d5..c5426484b2 100644 --- a/tag.c +++ b/tag.c @@ -2,7 +2,7 @@ #include "environment.h" #include "tag.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "commit.h" #include "tree.h" #include "blob.h" diff --git a/tmp-objdir.c b/tmp-objdir.c index db1f7038da..5f9074ad1c 100644 --- a/tmp-objdir.c +++ b/tmp-objdir.c @@ -11,7 +11,7 @@ #include "strbuf.h" #include "strvec.h" #include "quote.h" -#include "object-store.h" +#include "object-store-ll.h" struct tmp_objdir { struct strbuf path; diff --git a/transport.c b/transport.c index 67afdae57c..4dc187a388 100644 --- a/transport.c +++ b/transport.c @@ -27,7 +27,7 @@ #include "transport-internal.h" #include "protocol.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "color.h" #include "bundle-uri.h" #include "wrapper.h" diff --git a/tree-walk.c b/tree-walk.c index d3c48e06df..42ed86ef58 100644 --- a/tree-walk.c +++ b/tree-walk.c @@ -5,7 +5,7 @@ #include "gettext.h" #include "hex.h" #include "object-file.h" -#include "object-store.h" +#include "object-store-ll.h" #include "trace2.h" #include "tree.h" #include "pathspec.h" diff --git a/tree.c b/tree.c index 0dd2029a8a..e118914a76 100644 --- a/tree.c +++ b/tree.c @@ -3,7 +3,7 @@ #include "hex.h" #include "tree.h" #include "object-name.h" -#include "object-store.h" +#include "object-store-ll.h" #include "blob.h" #include "commit.h" #include "tag.h" diff --git a/unpack-trees.c b/unpack-trees.c index 4b620df303..87517364dc 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -23,7 +23,7 @@ #include "symlinks.h" #include "trace2.h" #include "fsmonitor.h" -#include "object-store.h" +#include "object-store-ll.h" #include "promisor-remote.h" #include "entry.h" #include "parallel-checkout.h" diff --git a/upload-pack.c b/upload-pack.c index d3312006a3..318b650b1e 100644 --- a/upload-pack.c +++ b/upload-pack.c @@ -7,7 +7,7 @@ #include "pkt-line.h" #include "sideband.h" #include "repository.h" -#include "object-store.h" +#include "object-store-ll.h" #include "oid-array.h" #include "tag.h" #include "object.h" diff --git a/walker.c b/walker.c index 24ff7dfdc2..65002a7220 100644 --- a/walker.c +++ b/walker.c @@ -3,8 +3,9 @@ #include "hex.h" #include "walker.h" #include "repository.h" -#include "object-store.h" +#include "object-store-ll.h" #include "commit.h" +#include "strbuf.h" #include "tree.h" #include "tree-walk.h" #include "tag.h" diff --git a/xdiff-interface.c b/xdiff-interface.c index 0460e03f5e..abc7275a52 100644 --- a/xdiff-interface.c +++ b/xdiff-interface.c @@ -1,7 +1,8 @@ #include "git-compat-util.h" #include "config.h" #include "hex.h" -#include "object-store.h" +#include "object-store-ll.h" +#include "strbuf.h" #include "xdiff-interface.h" #include "xdiff/xtypes.h" #include "xdiff/xdiffi.h" From b9a7ac2c6897efbf78fd546b21986498577e3585 Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Tue, 16 May 2023 06:34:07 +0000 Subject: [PATCH 27/28] hash-ll, hashmap: move oidhash() to hash-ll oidhash() was used by both hashmap and khash, which makes sense. However, the location of this function in hashmap.[ch] meant that khash.h had to depend upon hashmap.h, making people unfamiliar with khash think that it was built upon hashmap. (Or at least, I personally was confused for a while about this in the past.) Move this function to hash-ll, so that khash.h can stop depending upon hashmap.h. This has another benefit as well: it allows us to remove hashmap.h's dependency on hash-ll.h. While some callers of hashmap.h were making use of oidhash, most were not, so this change provides another way to reduce the number of includes. Diff best viewed with `--color-moved`. Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- decorate.c | 1 - dir.h | 1 + hash-ll.h | 19 +++++++++++++++++++ hashmap.h | 21 --------------------- khash.h | 1 - remote.h | 1 + serve.c | 1 + 7 files changed, 22 insertions(+), 23 deletions(-) diff --git a/decorate.c b/decorate.c index 71e79daa82..a5c43c0c14 100644 --- a/decorate.c +++ b/decorate.c @@ -3,7 +3,6 @@ * data. */ #include "git-compat-util.h" -#include "hashmap.h" #include "object.h" #include "decorate.h" diff --git a/dir.h b/dir.h index 79b85a01ee..279a066080 100644 --- a/dir.h +++ b/dir.h @@ -1,6 +1,7 @@ #ifndef DIR_H #define DIR_H +#include "hash-ll.h" #include "hashmap.h" #include "pathspec.h" #include "statinfo.h" diff --git a/hash-ll.h b/hash-ll.h index 8050925137..8d7973769f 100644 --- a/hash-ll.h +++ b/hash-ll.h @@ -270,6 +270,25 @@ static inline void oid_set_algo(struct object_id *oid, const struct git_hash_alg oid->algo = hash_algo_by_ptr(algop); } +/* + * Converts a cryptographic hash (e.g. SHA-1) into an int-sized hash code + * for use in hash tables. Cryptographic hashes are supposed to have + * uniform distribution, so in contrast to `memhash()`, this just copies + * the first `sizeof(int)` bytes without shuffling any bits. Note that + * the results will be different on big-endian and little-endian + * platforms, so they should not be stored or transferred over the net. + */ +static inline unsigned int oidhash(const struct object_id *oid) +{ + /* + * Equivalent to 'return *(unsigned int *)oid->hash;', but safe on + * platforms that don't support unaligned reads. + */ + unsigned int hash; + memcpy(&hash, oid->hash, sizeof(hash)); + return hash; +} + const char *empty_tree_oid_hex(void); const char *empty_blob_oid_hex(void); diff --git a/hashmap.h b/hashmap.h index 2695f3d3a6..c8216e47bb 100644 --- a/hashmap.h +++ b/hashmap.h @@ -1,8 +1,6 @@ #ifndef HASHMAP_H #define HASHMAP_H -#include "hash-ll.h" - /* * Generic implementation of hash-based key-value mappings. * @@ -120,25 +118,6 @@ unsigned int memhash(const void *buf, size_t len); unsigned int memihash(const void *buf, size_t len); unsigned int memihash_cont(unsigned int hash_seed, const void *buf, size_t len); -/* - * Converts a cryptographic hash (e.g. SHA-1) into an int-sized hash code - * for use in hash tables. Cryptographic hashes are supposed to have - * uniform distribution, so in contrast to `memhash()`, this just copies - * the first `sizeof(int)` bytes without shuffling any bits. Note that - * the results will be different on big-endian and little-endian - * platforms, so they should not be stored or transferred over the net. - */ -static inline unsigned int oidhash(const struct object_id *oid) -{ - /* - * Equivalent to 'return *(unsigned int *)oid->hash;', but safe on - * platforms that don't support unaligned reads. - */ - unsigned int hash; - memcpy(&hash, oid->hash, sizeof(hash)); - return hash; -} - /* * struct hashmap_entry is an opaque structure representing an entry in the * hash table. diff --git a/khash.h b/khash.h index a0a08dad8b..ff88163177 100644 --- a/khash.h +++ b/khash.h @@ -26,7 +26,6 @@ #ifndef __AC_KHASH_H #define __AC_KHASH_H -#include "hashmap.h" #include "hash.h" #define AC_VERSION_KHASH_H "0.2.8" diff --git a/remote.h b/remote.h index 73638cefeb..929c7c676d 100644 --- a/remote.h +++ b/remote.h @@ -1,6 +1,7 @@ #ifndef REMOTE_H #define REMOTE_H +#include "hash-ll.h" #include "hashmap.h" #include "refspec.h" diff --git a/serve.c b/serve.c index 5329c91011..a1d71134d4 100644 --- a/serve.c +++ b/serve.c @@ -1,6 +1,7 @@ #include "git-compat-util.h" #include "repository.h" #include "config.h" +#include "hash-ll.h" #include "pkt-line.h" #include "version.h" #include "ls-refs.h" From 68d686460f58e45f2eb080e0cdf314987eca5ce5 Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Tue, 16 May 2023 06:34:08 +0000 Subject: [PATCH 28/28] fsmonitor-ll.h: split this header out of fsmonitor.h This creates a new fsmonitor-ll.h with most of the functions from fsmonitor.h, though it leaves three inline functions where they were. Two-thirds of the files that previously included fsmonitor.h did not need those three inline functions or the six extra includes those inline functions required, so this allows them to only include the lower level header. Diff best viewed with `--color-moved`. Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- builtin/fsmonitor--daemon.c | 4 +- compat/fsmonitor/fsm-health-darwin.c | 2 +- compat/fsmonitor/fsm-health-win32.c | 2 +- compat/fsmonitor/fsm-ipc-darwin.c | 2 +- compat/fsmonitor/fsm-listen-darwin.c | 3 +- compat/fsmonitor/fsm-listen-win32.c | 2 +- compat/fsmonitor/fsm-path-utils-darwin.c | 3 +- compat/fsmonitor/fsm-path-utils-win32.c | 3 +- compat/fsmonitor/fsm-settings-darwin.c | 2 +- compat/fsmonitor/fsm-settings-win32.c | 2 +- dir.c | 3 +- fsmonitor-ipc.c | 2 +- fsmonitor-ll.h | 52 ++++++++++++++++++++++++ fsmonitor.h | 46 +-------------------- sparse-index.c | 3 +- 15 files changed, 73 insertions(+), 58 deletions(-) create mode 100644 fsmonitor-ll.h diff --git a/builtin/fsmonitor--daemon.c b/builtin/fsmonitor--daemon.c index f6dd9a784c..74d1d6a585 100644 --- a/builtin/fsmonitor--daemon.c +++ b/builtin/fsmonitor--daemon.c @@ -5,15 +5,17 @@ #include "environment.h" #include "gettext.h" #include "parse-options.h" -#include "fsmonitor.h" +#include "fsmonitor-ll.h" #include "fsmonitor-ipc.h" #include "fsmonitor-path-utils.h" +#include "fsmonitor-settings.h" #include "compat/fsmonitor/fsm-health.h" #include "compat/fsmonitor/fsm-listen.h" #include "fsmonitor--daemon.h" #include "simple-ipc.h" #include "khash.h" #include "pkt-line.h" +#include "trace.h" #include "trace2.h" static const char * const builtin_fsmonitor__daemon_usage[] = { diff --git a/compat/fsmonitor/fsm-health-darwin.c b/compat/fsmonitor/fsm-health-darwin.c index 4c291f8a06..5b1709d63f 100644 --- a/compat/fsmonitor/fsm-health-darwin.c +++ b/compat/fsmonitor/fsm-health-darwin.c @@ -1,6 +1,6 @@ #include "git-compat-util.h" #include "config.h" -#include "fsmonitor.h" +#include "fsmonitor-ll.h" #include "fsm-health.h" #include "fsmonitor--daemon.h" diff --git a/compat/fsmonitor/fsm-health-win32.c b/compat/fsmonitor/fsm-health-win32.c index 6c81d7ee5c..2d4e245beb 100644 --- a/compat/fsmonitor/fsm-health-win32.c +++ b/compat/fsmonitor/fsm-health-win32.c @@ -1,6 +1,6 @@ #include "git-compat-util.h" #include "config.h" -#include "fsmonitor.h" +#include "fsmonitor-ll.h" #include "fsm-health.h" #include "fsmonitor--daemon.h" #include "gettext.h" diff --git a/compat/fsmonitor/fsm-ipc-darwin.c b/compat/fsmonitor/fsm-ipc-darwin.c index 964bc074db..6f3a95410c 100644 --- a/compat/fsmonitor/fsm-ipc-darwin.c +++ b/compat/fsmonitor/fsm-ipc-darwin.c @@ -5,7 +5,7 @@ #include "path.h" #include "repository.h" #include "strbuf.h" -#include "fsmonitor.h" +#include "fsmonitor-ll.h" #include "fsmonitor-ipc.h" #include "fsmonitor-path-utils.h" diff --git a/compat/fsmonitor/fsm-listen-darwin.c b/compat/fsmonitor/fsm-listen-darwin.c index 23e24b4b37..36c7e13281 100644 --- a/compat/fsmonitor/fsm-listen-darwin.c +++ b/compat/fsmonitor/fsm-listen-darwin.c @@ -24,12 +24,13 @@ #endif #include "git-compat-util.h" -#include "fsmonitor.h" +#include "fsmonitor-ll.h" #include "fsm-listen.h" #include "fsmonitor--daemon.h" #include "fsmonitor-path-utils.h" #include "gettext.h" #include "string-list.h" +#include "trace.h" struct fsm_listen_data { diff --git a/compat/fsmonitor/fsm-listen-win32.c b/compat/fsmonitor/fsm-listen-win32.c index 3c0df5cff8..a361a7db20 100644 --- a/compat/fsmonitor/fsm-listen-win32.c +++ b/compat/fsmonitor/fsm-listen-win32.c @@ -1,6 +1,6 @@ #include "git-compat-util.h" #include "config.h" -#include "fsmonitor.h" +#include "fsmonitor-ll.h" #include "fsm-listen.h" #include "fsmonitor--daemon.h" #include "gettext.h" diff --git a/compat/fsmonitor/fsm-path-utils-darwin.c b/compat/fsmonitor/fsm-path-utils-darwin.c index ef0142e0fb..049f97eaaf 100644 --- a/compat/fsmonitor/fsm-path-utils-darwin.c +++ b/compat/fsmonitor/fsm-path-utils-darwin.c @@ -1,7 +1,8 @@ #include "git-compat-util.h" -#include "fsmonitor.h" +#include "fsmonitor-ll.h" #include "fsmonitor-path-utils.h" #include "gettext.h" +#include "trace.h" #include #include #include diff --git a/compat/fsmonitor/fsm-path-utils-win32.c b/compat/fsmonitor/fsm-path-utils-win32.c index 27bb694518..c8a3e9dcdb 100644 --- a/compat/fsmonitor/fsm-path-utils-win32.c +++ b/compat/fsmonitor/fsm-path-utils-win32.c @@ -1,7 +1,8 @@ #include "git-compat-util.h" -#include "fsmonitor.h" +#include "fsmonitor-ll.h" #include "fsmonitor-path-utils.h" #include "gettext.h" +#include "trace.h" /* * Check remote working directory protocol. diff --git a/compat/fsmonitor/fsm-settings-darwin.c b/compat/fsmonitor/fsm-settings-darwin.c index 58b623fbb9..a382590635 100644 --- a/compat/fsmonitor/fsm-settings-darwin.c +++ b/compat/fsmonitor/fsm-settings-darwin.c @@ -1,6 +1,6 @@ #include "git-compat-util.h" #include "config.h" -#include "fsmonitor.h" +#include "fsmonitor-ll.h" #include "fsmonitor-ipc.h" #include "fsmonitor-settings.h" #include "fsmonitor-path-utils.h" diff --git a/compat/fsmonitor/fsm-settings-win32.c b/compat/fsmonitor/fsm-settings-win32.c index 3728897864..b6f6744494 100644 --- a/compat/fsmonitor/fsm-settings-win32.c +++ b/compat/fsmonitor/fsm-settings-win32.c @@ -1,7 +1,7 @@ #include "git-compat-util.h" #include "config.h" #include "repository.h" -#include "fsmonitor.h" +#include "fsmonitor-ll.h" #include "fsmonitor-settings.h" #include "fsmonitor-path-utils.h" diff --git a/dir.c b/dir.c index fada2713b9..3acac7beb1 100644 --- a/dir.c +++ b/dir.c @@ -24,7 +24,8 @@ #include "utf8.h" #include "varint.h" #include "ewah/ewok.h" -#include "fsmonitor.h" +#include "fsmonitor-ll.h" +#include "read-cache-ll.h" #include "setup.h" #include "sparse-index.h" #include "submodule-config.h" diff --git a/fsmonitor-ipc.c b/fsmonitor-ipc.c index 6ace978a1b..88575aa54c 100644 --- a/fsmonitor-ipc.c +++ b/fsmonitor-ipc.c @@ -1,5 +1,5 @@ #include "git-compat-util.h" -#include "fsmonitor.h" +#include "fsmonitor-ll.h" #include "gettext.h" #include "simple-ipc.h" #include "fsmonitor-ipc.h" diff --git a/fsmonitor-ll.h b/fsmonitor-ll.h new file mode 100644 index 0000000000..0504ca07d6 --- /dev/null +++ b/fsmonitor-ll.h @@ -0,0 +1,52 @@ +#ifndef FSMONITOR_LL_H +#define FSMONITOR_LL_H + +struct index_state; +struct strbuf; + +extern struct trace_key trace_fsmonitor; + +/* + * Read the fsmonitor index extension and (if configured) restore the + * CE_FSMONITOR_VALID state. + */ +int read_fsmonitor_extension(struct index_state *istate, const void *data, unsigned long sz); + +/* + * Fill the fsmonitor_dirty ewah bits with their state from the index, + * before it is split during writing. + */ +void fill_fsmonitor_bitmap(struct index_state *istate); + +/* + * Write the CE_FSMONITOR_VALID state into the fsmonitor index + * extension. Reads from the fsmonitor_dirty ewah in the index. + */ +void write_fsmonitor_extension(struct strbuf *sb, struct index_state *istate); + +/* + * Add/remove the fsmonitor index extension + */ +void add_fsmonitor(struct index_state *istate); +void remove_fsmonitor(struct index_state *istate); + +/* + * Add/remove the fsmonitor index extension as necessary based on the current + * core.fsmonitor setting. + */ +void tweak_fsmonitor(struct index_state *istate); + +/* + * Run the configured fsmonitor integration script and clear the + * CE_FSMONITOR_VALID bit for any files returned as dirty. Also invalidate + * any corresponding untracked cache directory structures. Optimized to only + * run the first time it is called. + */ +void refresh_fsmonitor(struct index_state *istate); + +/* + * Does the received result contain the "trivial" response? + */ +int fsmonitor_is_trivial_response(const struct strbuf *query_result); + +#endif /* FSMONITOR_LL_H */ diff --git a/fsmonitor.h b/fsmonitor.h index 7702301d21..5195a8624d 100644 --- a/fsmonitor.h +++ b/fsmonitor.h @@ -1,57 +1,13 @@ #ifndef FSMONITOR_H #define FSMONITOR_H +#include "fsmonitor-ll.h" #include "dir.h" #include "fsmonitor-settings.h" #include "object.h" #include "read-cache-ll.h" #include "trace.h" -extern struct trace_key trace_fsmonitor; - -/* - * Read the fsmonitor index extension and (if configured) restore the - * CE_FSMONITOR_VALID state. - */ -int read_fsmonitor_extension(struct index_state *istate, const void *data, unsigned long sz); - -/* - * Fill the fsmonitor_dirty ewah bits with their state from the index, - * before it is split during writing. - */ -void fill_fsmonitor_bitmap(struct index_state *istate); - -/* - * Write the CE_FSMONITOR_VALID state into the fsmonitor index - * extension. Reads from the fsmonitor_dirty ewah in the index. - */ -void write_fsmonitor_extension(struct strbuf *sb, struct index_state *istate); - -/* - * Add/remove the fsmonitor index extension - */ -void add_fsmonitor(struct index_state *istate); -void remove_fsmonitor(struct index_state *istate); - -/* - * Add/remove the fsmonitor index extension as necessary based on the current - * core.fsmonitor setting. - */ -void tweak_fsmonitor(struct index_state *istate); - -/* - * Run the configured fsmonitor integration script and clear the - * CE_FSMONITOR_VALID bit for any files returned as dirty. Also invalidate - * any corresponding untracked cache directory structures. Optimized to only - * run the first time it is called. - */ -void refresh_fsmonitor(struct index_state *istate); - -/* - * Does the received result contain the "trivial" response? - */ -int fsmonitor_is_trivial_response(const struct strbuf *query_result); - /* * Check if refresh_fsmonitor has been called at least once. * refresh_fsmonitor is idempotent. Returns true if fsmonitor is diff --git a/sparse-index.c b/sparse-index.c index 2c47954d93..90d0462256 100644 --- a/sparse-index.c +++ b/sparse-index.c @@ -3,6 +3,7 @@ #include "environment.h" #include "gettext.h" #include "name-hash.h" +#include "read-cache-ll.h" #include "repository.h" #include "sparse-index.h" #include "tree.h" @@ -11,7 +12,7 @@ #include "cache-tree.h" #include "config.h" #include "dir.h" -#include "fsmonitor.h" +#include "fsmonitor-ll.h" struct modify_index_context { struct index_state *write;