🌐 AI搜索 & 代理 主页
blob: 268436779c8f315228aef0dde9039f9ebf4f723e [file] [log] [blame]
Brandon Williams359efef2017-06-22 18:43:321#ifndef REPOSITORY_H
2#define REPOSITORY_H
3
Brandon Williams3b256222017-06-22 18:43:424struct config_set;
Jeff Hostetler1e0ea5c2022-03-25 18:02:465struct fsmonitor_settings;
brian m. carlson78a67662017-11-12 21:28:536struct git_hash_algo;
Stefan Beller90c62152018-03-23 17:20:557struct index_state;
Nguyễn Thái Ngọc Duy3a95f312019-01-12 02:13:248struct lock_file;
Nguyễn Thái Ngọc Duye1ff0a32019-01-12 02:13:269struct pathspec;
Stefan Beller90c62152018-03-23 17:20:5510struct raw_object_store;
11struct submodule_cache;
Jonathan Tanef7dc2e2021-06-17 17:13:2312struct promisor_remote_config;
Glen Choofd3cb052021-11-18 00:53:2213struct remote_state;
Brandon Williams3b256222017-06-22 18:43:4214
Derrick Stoleead0fb652019-08-13 18:37:4615enum untracked_cache_setting {
Ævar Arnfjörð Bjarmason3050b6d2021-09-21 13:13:0216 UNTRACKED_CACHE_KEEP,
17 UNTRACKED_CACHE_REMOVE,
18 UNTRACKED_CACHE_WRITE,
Derrick Stoleead0fb652019-08-13 18:37:4619};
20
Derrick Stoleeaaf633c2019-08-13 18:37:4821enum fetch_negotiation_setting {
Elijah Newren714edc62022-02-02 03:42:4022 FETCH_NEGOTIATION_CONSECUTIVE,
Ævar Arnfjörð Bjarmason3050b6d2021-09-21 13:13:0223 FETCH_NEGOTIATION_SKIPPING,
24 FETCH_NEGOTIATION_NOOP,
Derrick Stoleeaaf633c2019-08-13 18:37:4825};
26
Patrick Steinhardt57db2a02024-02-07 07:20:3127#define REF_STORAGE_FORMAT_UNKNOWN 0
28#define REF_STORAGE_FORMAT_FILES 1
29#define REF_STORAGE_FORMAT_REFTABLE 2
Patrick Steinhardt0fcc2852023-12-29 07:26:3430
Derrick Stolee7211b9e2019-08-13 18:37:4331struct repo_settings {
32 int initialized;
33
34 int core_commit_graph;
Taylor Blaua92d8522022-07-14 21:43:0635 int commit_graph_generation_version;
Taylor Blaub66d8472020-09-09 15:23:1036 int commit_graph_read_changed_paths;
Derrick Stolee7211b9e2019-08-13 18:37:4337 int gc_write_commit_graph;
Derrick Stolee50f26bd2019-09-03 02:22:0238 int fetch_write_commit_graph;
Ævar Arnfjörð Bjarmasonc21919f2021-09-21 13:13:0339 int command_requires_full_index;
40 int sparse_index;
Taylor Blaudbcf6112023-04-12 22:20:3041 int pack_read_reverse_index;
Taylor Blaub0afdce2023-05-08 17:38:1242 int pack_use_bitmap_boundary_traversal;
Taylor Blau23c1e712024-02-05 22:50:2343 int pack_use_multi_pack_reuse;
Derrick Stolee7211b9e2019-08-13 18:37:4344
Derrick Stolee9c7d1b02023-06-06 13:24:3745 /*
46 * Does this repository have core.useReplaceRefs=true (on by
47 * default)? This provides a repository-scoped version of this
48 * config, though it could be disabled process-wide via some Git
49 * builtins or the --no-replace-objects option. See
50 * replace_refs_enabled() for more details.
51 */
52 int read_replace_refs;
53
Jeff Hostetler1e0ea5c2022-03-25 18:02:4654 struct fsmonitor_settings *fsmonitor; /* lazily loaded */
55
Derrick Stolee7211b9e2019-08-13 18:37:4356 int index_version;
Derrick Stolee17194b12023-01-06 16:31:5657 int index_skip_hash;
Derrick Stoleead0fb652019-08-13 18:37:4658 enum untracked_cache_setting core_untracked_cache;
Derrick Stolee7211b9e2019-08-13 18:37:4359
60 int pack_use_sparse;
Derrick Stoleeaaf633c2019-08-13 18:37:4861 enum fetch_negotiation_setting fetch_negotiation_algorithm;
Derrick Stolee18e449f2020-09-25 12:33:3462
63 int core_multi_pack_index;
Derrick Stolee7211b9e2019-08-13 18:37:4364};
65
Ævar Arnfjörð Bjarmason759f3402022-03-04 18:32:1766struct repo_path_cache {
67 char *squash_msg;
68 char *merge_msg;
69 char *merge_rr;
70 char *merge_mode;
71 char *merge_head;
Ævar Arnfjörð Bjarmason759f3402022-03-04 18:32:1772 char *fetch_head;
73 char *shallow;
74};
75
Brandon Williams359efef2017-06-22 18:43:3276struct repository {
77 /* Environment */
78 /*
79 * Path to the git directory.
80 * Cannot be NULL after initialization.
81 */
82 char *gitdir;
83
84 /*
85 * Path to the common git directory.
86 * Cannot be NULL after initialization.
87 */
88 char *commondir;
89
90 /*
Stefan Beller90c62152018-03-23 17:20:5591 * Holds any information related to accessing the raw object content.
Brandon Williams359efef2017-06-22 18:43:3292 */
Stefan Beller90c62152018-03-23 17:20:5593 struct raw_object_store *objects;
Nguyễn Thái Ngọc Duy7bc0dca2018-03-03 11:35:5794
Stefan Beller99bf1152018-05-08 19:37:2495 /*
96 * All objects in this repository that have been parsed. This structure
97 * owns all objects it references, so users of "struct object *"
98 * generally do not need to free them; instead, when a repository is no
99 * longer used, call parsed_object_pool_clear() on this structure, which
100 * is called by the repositories repo_clear on its desconstruction.
101 */
102 struct parsed_object_pool *parsed_objects;
103
Jeff King02204612020-04-10 03:04:11104 /*
105 * The store in which the refs are held. This should generally only be
106 * accessed via get_main_ref_store(), as that will lazily initialize
107 * the ref object.
108 */
109 struct ref_store *refs_private;
Stefan Beller64a74162018-04-12 00:21:14110
Brandon Williams359efef2017-06-22 18:43:32111 /*
Stefan Beller102de882018-05-17 22:51:51112 * Contains path to often used file names.
113 */
Ævar Arnfjörð Bjarmason759f3402022-03-04 18:32:17114 struct repo_path_cache cached_paths;
Stefan Beller102de882018-05-17 22:51:51115
116 /*
Brandon Williams359efef2017-06-22 18:43:32117 * Path to the repository's graft file.
118 * Cannot be NULL after initialization.
119 */
120 char *graft_file;
121
122 /*
123 * Path to the current worktree's index file.
124 * Cannot be NULL after initialization.
125 */
126 char *index_file;
127
128 /*
129 * Path to the working directory.
130 * A NULL value indicates that there is no working directory.
131 */
132 char *worktree;
133
Brandon Williams96dc8832017-06-22 18:43:47134 /*
135 * Path from the root of the top-level superproject down to this
136 * repository. This is only non-NULL if the repository is initialized
137 * as a submodule of another repository.
138 */
139 char *submodule_prefix;
140
Derrick Stolee7211b9e2019-08-13 18:37:43141 struct repo_settings settings;
142
Brandon Williams3b256222017-06-22 18:43:42143 /* Subsystems */
144 /*
145 * Repository's config which contains key-value pairs from the usual
146 * set of config files (i.e. repo specific .git/config, user wide
147 * ~/.gitconfig, XDG config file and the global /etc/gitconfig)
148 */
149 struct config_set *config;
150
Brandon Williamsbf12fcd2017-06-22 18:43:44151 /* Repository's submodule config as defined by '.gitmodules' */
152 struct submodule_cache *submodule_cache;
153
Brandon Williams639e30b2017-06-22 18:43:43154 /*
155 * Repository's in-memory index.
156 * 'repo_read_index()' can be used to populate 'index'.
157 */
158 struct index_state *index;
159
Glen Choofd3cb052021-11-18 00:53:22160 /* Repository's remotes and associated structures. */
161 struct remote_state *remote_state;
162
brian m. carlson78a67662017-11-12 21:28:53163 /* Repository's current hash algorithm, as serialized on disk. */
164 const struct git_hash_algo *hash_algo;
165
Eric W. Biederman15a1ca12023-10-02 02:40:08166 /* Repository's compatibility hash algorithm. */
167 const struct git_hash_algo *compat_hash_algo;
168
Patrick Steinhardt173761e2023-12-29 07:26:39169 /* Repository's reference storage format, as serialized on disk. */
170 unsigned int ref_storage_format;
171
Jeff Hostetleree4512e2019-02-22 22:25:01172 /* A unique-id for tracing purposes. */
173 int trace2_repo_id;
174
Jeff King6abada12019-09-12 14:44:45175 /* True if commit-graph has been disabled within this process. */
176 int commit_graph_disabled;
177
Jonathan Tanebaf3bc2021-06-17 17:13:22178 /* Configurations related to promisor remotes. */
179 char *repository_format_partial_clone;
Jonathan Tanef7dc2e2021-06-17 17:13:23180 struct promisor_remote_config *promisor_remote_config;
Jonathan Tanebaf3bc2021-06-17 17:13:22181
Brandon Williams359efef2017-06-22 18:43:32182 /* Configurations */
Victoria Dye3867f6d2023-05-26 01:33:00183 int repository_format_worktree_config;
Brandon Williams359efef2017-06-22 18:43:32184
185 /* Indicate if a repository has a different 'commondir' from 'gitdir' */
186 unsigned different_commondir:1;
187};
188
189extern struct repository *the_repository;
Elijah Newrenbc47f162023-05-16 06:33:55190#ifdef USE_THE_INDEX_VARIABLE
191extern struct index_state the_index;
192#endif
Brandon Williams359efef2017-06-22 18:43:32193
Nguyễn Thái Ngọc Duy00a3da22018-03-23 15:55:23194/*
195 * Define a custom repository layout. Any field can be NULL, which
196 * will default back to the path according to the default layout.
197 */
Nguyễn Thái Ngọc Duy357a03e2018-03-03 11:35:55198struct set_gitdir_args {
199 const char *commondir;
200 const char *object_dir;
201 const char *graft_file;
202 const char *index_file;
Nguyễn Thái Ngọc Duy7bc0dca2018-03-03 11:35:57203 const char *alternate_db;
Neeraj Singhecd81df2021-12-06 22:05:05204 int disable_ref_updates;
Nguyễn Thái Ngọc Duy357a03e2018-03-03 11:35:55205};
206
Nguyễn Thái Ngọc Duyc2ec4172018-06-30 09:20:29207void repo_set_gitdir(struct repository *repo, const char *root,
208 const struct set_gitdir_args *extra_args);
209void repo_set_worktree(struct repository *repo, const char *path);
210void repo_set_hash_algo(struct repository *repo, int algo);
Eric W. Biederman15a1ca12023-10-02 02:40:08211void repo_set_compat_hash_algo(struct repository *repo, int compat_algo);
Patrick Steinhardt173761e2023-12-29 07:26:39212void repo_set_ref_storage_format(struct repository *repo, unsigned int format);
Nguyễn Thái Ngọc Duyc2ec4172018-06-30 09:20:29213void initialize_the_repository(void);
Ævar Arnfjörð Bjarmason1e8697b2022-08-31 23:18:12214RESULT_MUST_BE_USED
Nguyễn Thái Ngọc Duyc2ec4172018-06-30 09:20:29215int repo_init(struct repository *r, const char *gitdir, const char *worktree);
Stefan Bellerd5498e02018-11-29 00:27:53216
217/*
Jonathan Tan8eb8dcf2021-09-09 18:47:28218 * Initialize the repository 'subrepo' as the submodule at the given path. If
219 * the submodule's gitdir cannot be found at <path>/.git, this function calls
220 * submodule_from_path() to try to find it. treeish_name is only used if
221 * submodule_from_path() needs to be called; see its documentation for more
222 * information.
223 * Return 0 upon success and a non-zero value upon failure.
Stefan Bellerd5498e02018-11-29 00:27:53224 */
Jonathan Tan8eb8dcf2021-09-09 18:47:28225struct object_id;
Ævar Arnfjörð Bjarmason1e8697b2022-08-31 23:18:12226RESULT_MUST_BE_USED
Stefan Bellerd5498e02018-11-29 00:27:53227int repo_submodule_init(struct repository *subrepo,
Nguyễn Thái Ngọc Duyc2ec4172018-06-30 09:20:29228 struct repository *superproject,
Jonathan Tan8eb8dcf2021-09-09 18:47:28229 const char *path,
230 const struct object_id *treeish_name);
Nguyễn Thái Ngọc Duyc2ec4172018-06-30 09:20:29231void repo_clear(struct repository *repo);
Brandon Williams359efef2017-06-22 18:43:32232
Brandon Williams3f138772017-07-18 19:05:18233/*
234 * Populates the repository's index from its index_file, an index struct will
235 * be allocated if needed.
236 *
237 * Return the number of index entries in the populated index or a value less
Elijah Newren15beaaa2019-11-05 17:07:23238 * than zero if an error occurred. If the repository's index has already been
Brandon Williams3f138772017-07-18 19:05:18239 * populated then the number of entries will simply be returned.
240 */
Nguyễn Thái Ngọc Duyc2ec4172018-06-30 09:20:29241int repo_read_index(struct repository *repo);
Nguyễn Thái Ngọc Duy3a95f312019-01-12 02:13:24242int repo_hold_locked_index(struct repository *repo,
243 struct lock_file *lf,
244 int flags);
Brandon Williams639e30b2017-06-22 18:43:43245
Nguyễn Thái Ngọc Duye1ff0a32019-01-12 02:13:26246int repo_read_index_unmerged(struct repository *);
Nguyễn Thái Ngọc Duy1b0d9682019-01-12 02:13:27247/*
248 * Opportunistically update the index but do not complain if we can't.
249 * The lockfile is always committed or rolled back.
250 */
251void repo_update_index_if_able(struct repository *, struct lock_file *);
252
Derrick Stolee7211b9e2019-08-13 18:37:43253void prepare_repo_settings(struct repository *r);
Brandon Williams639e30b2017-06-22 18:43:43254
Xin Li16af5f12020-06-05 09:10:01255/*
256 * Return 1 if upgrade repository format to target_version succeeded,
257 * 0 if no upgrade is necessary, and -1 when upgrade is not possible.
258 */
259int upgrade_repository_format(int target_version);
260
Brandon Williams359efef2017-06-22 18:43:32261#endif /* REPOSITORY_H */