blob: f3428a9f122147501dc2845ad16f7855a6620386 [file] [log] [blame]
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001#include "../cache.h"
Brandon Williamsb2141fc2017-06-14 11:07:36 -07002#include "../config.h"
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003#include "../refs.h"
4#include "refs-internal.h"
Michael Haggerty958f9642017-04-16 08:41:31 +02005#include "ref-cache.h"
Michael Haggerty67be7c52017-06-23 09:01:37 +02006#include "packed-backend.h"
Michael Haggerty3bc581b2016-06-18 06:15:15 +02007#include "../iterator.h"
Michael Haggerty2880d162016-06-18 06:15:19 +02008#include "../dir-iterator.h"
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01009#include "../lockfile.h"
10#include "../object.h"
11#include "../dir.h"
Jeff Kingfb9c2d22018-03-30 14:35:12 -040012#include "../chdir-notify.h"
Nguyễn Thái Ngọc Duy3a3b9d82018-10-21 10:08:54 +020013#include "worktree.h"
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +010014
Michael Haggerty5ac95fe2017-11-05 09:42:05 +010015/*
16 * This backend uses the following flags in `ref_update::flags` for
17 * internal bookkeeping purposes. Their numerical values must not
Michael Haggerty91774af2017-11-05 09:42:06 +010018 * conflict with REF_NO_DEREF, REF_FORCE_CREATE_REFLOG, REF_HAVE_NEW,
Han-Wen Nienhuys0464d0a2021-12-07 13:38:16 +000019 * or REF_HAVE_OLD, which are also stored in `ref_update::flags`.
Michael Haggerty5ac95fe2017-11-05 09:42:05 +010020 */
21
22/*
23 * Used as a flag in ref_update::flags when a loose ref is being
Michael Haggerty91774af2017-11-05 09:42:06 +010024 * pruned. This flag must only be used when REF_NO_DEREF is set.
Michael Haggerty5ac95fe2017-11-05 09:42:05 +010025 */
Michael Haggertyacedcde2017-11-05 09:42:07 +010026#define REF_IS_PRUNING (1 << 4)
Michael Haggerty5ac95fe2017-11-05 09:42:05 +010027
28/*
29 * Flag passed to lock_ref_sha1_basic() telling it to tolerate broken
30 * refs (i.e., because the reference is about to be deleted anyway).
31 */
32#define REF_DELETING (1 << 5)
33
34/*
35 * Used as a flag in ref_update::flags when the lockfile needs to be
36 * committed.
37 */
38#define REF_NEEDS_COMMIT (1 << 6)
39
40/*
Michael Haggerty5ac95fe2017-11-05 09:42:05 +010041 * Used as a flag in ref_update::flags when the ref_update was via an
42 * update to HEAD.
43 */
44#define REF_UPDATE_VIA_HEAD (1 << 8)
45
46/*
Will Chandler5f03e512021-05-08 01:00:43 -040047 * Used as a flag in ref_update::flags when a reference has been
48 * deleted and the ref's parent directories may need cleanup.
Michael Haggerty5ac95fe2017-11-05 09:42:05 +010049 */
Will Chandler5f03e512021-05-08 01:00:43 -040050#define REF_DELETED_RMDIR (1 << 9)
Michael Haggerty5ac95fe2017-11-05 09:42:05 +010051
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +010052struct ref_lock {
53 char *ref_name;
Jeff Kingee4d8e42017-09-05 08:15:15 -040054 struct lock_file lk;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +010055 struct object_id old_oid;
56};
57
Michael Haggerty00eebe32016-09-04 18:08:11 +020058struct files_ref_store {
59 struct ref_store base;
Nguyễn Thái Ngọc Duy9e7ec632017-03-26 09:42:32 +070060 unsigned int store_flags;
Michael Haggerty32c597e2017-02-10 12:16:16 +010061
Nguyễn Thái Ngọc Duyf57f37e2017-03-26 09:42:24 +070062 char *gitcommondir;
Nguyễn Thái Ngọc Duy33dfb9f2017-03-26 09:42:18 +070063
Michael Haggerty7c22bc82017-04-16 08:41:32 +020064 struct ref_cache *loose;
Michael Haggerty55c6bc32017-05-22 16:17:40 +020065
Michael Haggertye0cc8ac2017-06-23 09:01:38 +020066 struct ref_store *packed_ref_store;
Michael Haggerty00eebe32016-09-04 18:08:11 +020067};
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +010068
Michael Haggerty65a0a8e2016-09-04 18:08:09 +020069static void clear_loose_ref_cache(struct files_ref_store *refs)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +010070{
71 if (refs->loose) {
Michael Haggerty7c22bc82017-04-16 08:41:32 +020072 free_ref_cache(refs->loose);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +010073 refs->loose = NULL;
74 }
75}
76
Jeff Kinga2d51562016-01-22 17:29:30 -050077/*
78 * Create a new submodule ref cache and add it to the internal
79 * set of caches.
80 */
Jonathan Tan34224e12021-10-08 14:08:14 -070081static struct ref_store *files_ref_store_create(struct repository *repo,
82 const char *gitdir,
Nguyễn Thái Ngọc Duy9e7ec632017-03-26 09:42:32 +070083 unsigned int flags)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +010084{
Michael Haggerty00eebe32016-09-04 18:08:11 +020085 struct files_ref_store *refs = xcalloc(1, sizeof(*refs));
86 struct ref_store *ref_store = (struct ref_store *)refs;
Nguyễn Thái Ngọc Duyf57f37e2017-03-26 09:42:24 +070087 struct strbuf sb = STRBUF_INIT;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +010088
Han-Wen Nienhuysf9f7fd32021-12-22 18:11:54 +000089 base_ref_store_init(ref_store, repo, gitdir, &refs_be_files);
Nguyễn Thái Ngọc Duy9e7ec632017-03-26 09:42:32 +070090 refs->store_flags = flags;
Nguyễn Thái Ngọc Duyf57f37e2017-03-26 09:42:24 +070091 get_common_dir_noenv(&sb, gitdir);
92 refs->gitcommondir = strbuf_detach(&sb, NULL);
Han-Wen Nienhuys99f0d972021-12-22 18:11:52 +000093 refs->packed_ref_store =
94 packed_ref_store_create(repo, refs->gitcommondir, flags);
Jeff Kinga2d51562016-01-22 17:29:30 -050095
Han-Wen Nienhuys5085aef2020-08-19 14:27:57 +000096 chdir_notify_reparent("files-backend $GIT_DIR", &refs->base.gitdir);
Jeff Kingfb9c2d22018-03-30 14:35:12 -040097 chdir_notify_reparent("files-backend $GIT_COMMONDIR",
98 &refs->gitcommondir);
99
Michael Haggerty00eebe32016-09-04 18:08:11 +0200100 return ref_store;
Jeff Kinga2d51562016-01-22 17:29:30 -0500101}
102
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100103/*
Nguyễn Thái Ngọc Duy9e7ec632017-03-26 09:42:32 +0700104 * Die if refs is not the main ref store. caller is used in any
105 * necessary error messages.
Michael Haggerty32c597e2017-02-10 12:16:16 +0100106 */
107static void files_assert_main_repository(struct files_ref_store *refs,
108 const char *caller)
109{
Nguyễn Thái Ngọc Duy9e7ec632017-03-26 09:42:32 +0700110 if (refs->store_flags & REF_STORE_MAIN)
111 return;
112
Johannes Schindelin033abf92018-05-02 11:38:39 +0200113 BUG("operation %s only allowed for main ref store", caller);
Michael Haggerty32c597e2017-02-10 12:16:16 +0100114}
115
116/*
Michael Haggerty00eebe32016-09-04 18:08:11 +0200117 * Downcast ref_store to files_ref_store. Die if ref_store is not a
Nguyễn Thái Ngọc Duy9e7ec632017-03-26 09:42:32 +0700118 * files_ref_store. required_flags is compared with ref_store's
119 * store_flags to ensure the ref_store has all required capabilities.
120 * "caller" is used in any necessary error messages.
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100121 */
Nguyễn Thái Ngọc Duy9e7ec632017-03-26 09:42:32 +0700122static struct files_ref_store *files_downcast(struct ref_store *ref_store,
123 unsigned int required_flags,
124 const char *caller)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100125{
Michael Haggerty32c597e2017-02-10 12:16:16 +0100126 struct files_ref_store *refs;
127
Michael Haggerty00eebe32016-09-04 18:08:11 +0200128 if (ref_store->be != &refs_be_files)
Johannes Schindelin033abf92018-05-02 11:38:39 +0200129 BUG("ref_store is type \"%s\" not \"files\" in %s",
Michael Haggerty00eebe32016-09-04 18:08:11 +0200130 ref_store->be->name, caller);
Michael Haggerty2eed2782016-06-18 06:15:12 +0200131
Michael Haggerty32c597e2017-02-10 12:16:16 +0100132 refs = (struct files_ref_store *)ref_store;
Michael Haggerty2eed2782016-06-18 06:15:12 +0200133
Nguyễn Thái Ngọc Duy9e7ec632017-03-26 09:42:32 +0700134 if ((refs->store_flags & required_flags) != required_flags)
Johannes Schindelin033abf92018-05-02 11:38:39 +0200135 BUG("operation %s requires abilities 0x%x, but only have 0x%x",
Nguyễn Thái Ngọc Duy9e7ec632017-03-26 09:42:32 +0700136 caller, required_flags, refs->store_flags);
Michael Haggerty32c597e2017-02-10 12:16:16 +0100137
138 return refs;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100139}
140
Nguyễn Thái Ngọc Duy3a3b9d82018-10-21 10:08:54 +0200141static void files_reflog_path_other_worktrees(struct files_ref_store *refs,
142 struct strbuf *sb,
143 const char *refname)
144{
145 const char *real_ref;
146 const char *worktree_name;
147 int length;
148
149 if (parse_worktree_ref(refname, &worktree_name, &length, &real_ref))
150 BUG("refname %s is not a other-worktree ref", refname);
151
152 if (worktree_name)
153 strbuf_addf(sb, "%s/worktrees/%.*s/logs/%s", refs->gitcommondir,
154 length, worktree_name, real_ref);
155 else
156 strbuf_addf(sb, "%s/logs/%s", refs->gitcommondir,
157 real_ref);
158}
159
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +0700160static void files_reflog_path(struct files_ref_store *refs,
161 struct strbuf *sb,
162 const char *refname)
163{
Nguyễn Thái Ngọc Duyf57f37e2017-03-26 09:42:24 +0700164 switch (ref_type(refname)) {
165 case REF_TYPE_PER_WORKTREE:
166 case REF_TYPE_PSEUDOREF:
Han-Wen Nienhuys5085aef2020-08-19 14:27:57 +0000167 strbuf_addf(sb, "%s/logs/%s", refs->base.gitdir, refname);
Nguyễn Thái Ngọc Duyf57f37e2017-03-26 09:42:24 +0700168 break;
Nguyễn Thái Ngọc Duy3a3b9d82018-10-21 10:08:54 +0200169 case REF_TYPE_OTHER_PSEUDOREF:
170 case REF_TYPE_MAIN_PSEUDOREF:
Nguyễn Thái Ngọc Duy46c0eb52018-11-25 05:58:16 +0100171 files_reflog_path_other_worktrees(refs, sb, refname);
172 break;
Nguyễn Thái Ngọc Duyf57f37e2017-03-26 09:42:24 +0700173 case REF_TYPE_NORMAL:
174 strbuf_addf(sb, "%s/logs/%s", refs->gitcommondir, refname);
175 break;
176 default:
Johannes Schindelin033abf92018-05-02 11:38:39 +0200177 BUG("unknown ref type %d of ref %s",
Nguyễn Thái Ngọc Duyf57f37e2017-03-26 09:42:24 +0700178 ref_type(refname), refname);
179 }
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +0700180}
181
Nguyễn Thái Ngọc Duy19e02f42017-03-26 09:42:23 +0700182static void files_ref_path(struct files_ref_store *refs,
183 struct strbuf *sb,
184 const char *refname)
185{
Nguyễn Thái Ngọc Duyf57f37e2017-03-26 09:42:24 +0700186 switch (ref_type(refname)) {
187 case REF_TYPE_PER_WORKTREE:
188 case REF_TYPE_PSEUDOREF:
Han-Wen Nienhuys5085aef2020-08-19 14:27:57 +0000189 strbuf_addf(sb, "%s/%s", refs->base.gitdir, refname);
Nguyễn Thái Ngọc Duyf57f37e2017-03-26 09:42:24 +0700190 break;
Nguyễn Thái Ngọc Duy3a3b9d82018-10-21 10:08:54 +0200191 case REF_TYPE_MAIN_PSEUDOREF:
192 if (!skip_prefix(refname, "main-worktree/", &refname))
193 BUG("ref %s is not a main pseudoref", refname);
194 /* fallthrough */
195 case REF_TYPE_OTHER_PSEUDOREF:
Nguyễn Thái Ngọc Duyf57f37e2017-03-26 09:42:24 +0700196 case REF_TYPE_NORMAL:
197 strbuf_addf(sb, "%s/%s", refs->gitcommondir, refname);
198 break;
199 default:
Johannes Schindelin033abf92018-05-02 11:38:39 +0200200 BUG("unknown ref type %d of ref %s",
Nguyễn Thái Ngọc Duyf57f37e2017-03-26 09:42:24 +0700201 ref_type(refname), refname);
202 }
Nguyễn Thái Ngọc Duy19e02f42017-03-26 09:42:23 +0700203}
204
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100205/*
Nguyễn Thái Ngọc Duyb9317d52019-03-07 19:29:17 +0700206 * Manually add refs/bisect, refs/rewritten and refs/worktree, which, being
Nguyễn Thái Ngọc Duy09e65642019-03-07 19:29:15 +0700207 * per-worktree, might not appear in the directory listing for
208 * refs/ in the main repo.
209 */
210static void add_per_worktree_entries_to_dir(struct ref_dir *dir, const char *dirname)
211{
Nguyễn Thái Ngọc Duyb9317d52019-03-07 19:29:17 +0700212 const char *prefixes[] = { "refs/bisect/", "refs/worktree/", "refs/rewritten/" };
Nguyễn Thái Ngọc Duy90d31ff2019-03-07 19:29:16 +0700213 int ip;
Nguyễn Thái Ngọc Duy09e65642019-03-07 19:29:15 +0700214
215 if (strcmp(dirname, "refs/"))
216 return;
217
Nguyễn Thái Ngọc Duy90d31ff2019-03-07 19:29:16 +0700218 for (ip = 0; ip < ARRAY_SIZE(prefixes); ip++) {
219 const char *prefix = prefixes[ip];
220 int prefix_len = strlen(prefix);
221 struct ref_entry *child_entry;
222 int pos;
Nguyễn Thái Ngọc Duy09e65642019-03-07 19:29:15 +0700223
Nguyễn Thái Ngọc Duy90d31ff2019-03-07 19:29:16 +0700224 pos = search_ref_dir(dir, prefix, prefix_len);
225 if (pos >= 0)
226 continue;
Ævar Arnfjörð Bjarmason750036c2021-09-28 15:02:24 +0200227 child_entry = create_dir_entry(dir->cache, prefix, prefix_len);
Nguyễn Thái Ngọc Duy09e65642019-03-07 19:29:15 +0700228 add_entry_to_dir(dir, child_entry);
229 }
230}
231
232/*
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100233 * Read the loose references from the namespace dirname into dir
234 * (without recursing). dirname must end with '/'. dir must be the
235 * directory entry corresponding to dirname.
236 */
Michael Haggertydf308752017-04-16 08:41:34 +0200237static void loose_fill_ref_dir(struct ref_store *ref_store,
238 struct ref_dir *dir, const char *dirname)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100239{
Michael Haggertydf308752017-04-16 08:41:34 +0200240 struct files_ref_store *refs =
241 files_downcast(ref_store, REF_STORE_READ, "fill_ref_dir");
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100242 DIR *d;
243 struct dirent *de;
244 int dirnamelen = strlen(dirname);
245 struct strbuf refname;
246 struct strbuf path = STRBUF_INIT;
247 size_t path_baselen;
248
Nguyễn Thái Ngọc Duy19e02f42017-03-26 09:42:23 +0700249 files_ref_path(refs, &path, dirname);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100250 path_baselen = path.len;
251
252 d = opendir(path.buf);
253 if (!d) {
254 strbuf_release(&path);
255 return;
256 }
257
258 strbuf_init(&refname, dirnamelen + 257);
259 strbuf_add(&refname, dirname, dirnamelen);
260
261 while ((de = readdir(d)) != NULL) {
brian m. carlson4417df82017-05-06 22:10:24 +0000262 struct object_id oid;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100263 struct stat st;
264 int flag;
265
266 if (de->d_name[0] == '.')
267 continue;
268 if (ends_with(de->d_name, ".lock"))
269 continue;
270 strbuf_addstr(&refname, de->d_name);
271 strbuf_addstr(&path, de->d_name);
272 if (stat(path.buf, &st) < 0) {
273 ; /* silently ignore */
274 } else if (S_ISDIR(st.st_mode)) {
275 strbuf_addch(&refname, '/');
276 add_entry_to_dir(dir,
Michael Haggertye00d1a42017-04-16 08:41:33 +0200277 create_dir_entry(dir->cache, refname.buf,
Ævar Arnfjörð Bjarmason750036c2021-09-28 15:02:24 +0200278 refname.len));
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100279 } else {
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +0700280 if (!refs_resolve_ref_unsafe(&refs->base,
Michael Haggerty3c0cb0c2017-02-09 21:53:52 +0100281 refname.buf,
282 RESOLVE_REF_READING,
Ævar Arnfjörð Bjarmasonce14de02022-01-26 15:37:01 +0100283 &oid, &flag)) {
brian m. carlson4417df82017-05-06 22:10:24 +0000284 oidclr(&oid);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100285 flag |= REF_ISBROKEN;
brian m. carlson4417df82017-05-06 22:10:24 +0000286 } else if (is_null_oid(&oid)) {
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100287 /*
288 * It is so astronomically unlikely
Michael Haggerty78fb4572017-11-05 09:42:09 +0100289 * that null_oid is the OID of an
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100290 * actual object that we consider its
291 * appearance in a loose reference
292 * file to be repo corruption
293 * (probably due to a software bug).
294 */
295 flag |= REF_ISBROKEN;
296 }
297
298 if (check_refname_format(refname.buf,
299 REFNAME_ALLOW_ONELEVEL)) {
300 if (!refname_is_safe(refname.buf))
301 die("loose refname is dangerous: %s", refname.buf);
brian m. carlson4417df82017-05-06 22:10:24 +0000302 oidclr(&oid);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100303 flag |= REF_BAD_NAME | REF_ISBROKEN;
304 }
305 add_entry_to_dir(dir,
Michael Haggertyc1da06c2017-05-22 16:17:53 +0200306 create_ref_entry(refname.buf, &oid, flag));
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100307 }
308 strbuf_setlen(&refname, dirnamelen);
309 strbuf_setlen(&path, path_baselen);
310 }
311 strbuf_release(&refname);
312 strbuf_release(&path);
313 closedir(d);
Michael Haggertye3bf2982017-04-16 08:41:35 +0200314
Nguyễn Thái Ngọc Duy09e65642019-03-07 19:29:15 +0700315 add_per_worktree_entries_to_dir(dir, dirname);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100316}
317
Michael Haggertya714b192017-04-16 08:41:38 +0200318static struct ref_cache *get_loose_ref_cache(struct files_ref_store *refs)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100319{
320 if (!refs->loose) {
321 /*
322 * Mark the top-level directory complete because we
323 * are about to read the only subdirectory that can
324 * hold references:
325 */
Michael Haggertydf308752017-04-16 08:41:34 +0200326 refs->loose = create_ref_cache(&refs->base, loose_fill_ref_dir);
Michael Haggerty7c22bc82017-04-16 08:41:32 +0200327
328 /* We're going to fill the top level ourselves: */
329 refs->loose->root->flag &= ~REF_INCOMPLETE;
330
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100331 /*
Michael Haggerty7c22bc82017-04-16 08:41:32 +0200332 * Add an incomplete entry for "refs/" (to be filled
333 * lazily):
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100334 */
Michael Haggerty7c22bc82017-04-16 08:41:32 +0200335 add_entry_to_dir(get_ref_dir(refs->loose->root),
Ævar Arnfjörð Bjarmason750036c2021-09-28 15:02:24 +0200336 create_dir_entry(refs->loose, "refs/", 5));
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100337 }
Michael Haggertya714b192017-04-16 08:41:38 +0200338 return refs->loose;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100339}
340
Han-Wen Nienhuys5b12e162021-08-23 13:52:40 +0200341static int files_read_raw_ref(struct ref_store *ref_store, const char *refname,
342 struct object_id *oid, struct strbuf *referent,
343 unsigned int *type, int *failure_errno)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100344{
Michael Haggerty43086512016-09-04 18:08:14 +0200345 struct files_ref_store *refs =
Nguyễn Thái Ngọc Duy9e7ec632017-03-26 09:42:32 +0700346 files_downcast(ref_store, REF_STORE_READ, "read_raw_ref");
Michael Haggerty42a38cf2016-04-07 15:03:02 -0400347 struct strbuf sb_contents = STRBUF_INIT;
348 struct strbuf sb_path = STRBUF_INIT;
David Turner70486532016-04-07 15:03:01 -0400349 const char *path;
350 const char *buf;
351 struct stat st;
352 int fd;
Michael Haggerty42a38cf2016-04-07 15:03:02 -0400353 int ret = -1;
Jeff Kinge8c42cb2016-10-06 12:48:42 -0400354 int remaining_retries = 3;
Han-Wen Nienhuysdf3458e2021-10-16 11:39:10 +0200355 int myerr = 0;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100356
Michael Haggertyfa96ea12016-04-22 01:11:17 +0200357 *type = 0;
Michael Haggerty42a38cf2016-04-07 15:03:02 -0400358 strbuf_reset(&sb_path);
Michael Haggerty34c7ad82016-09-04 18:08:20 +0200359
Nguyễn Thái Ngọc Duy19e02f42017-03-26 09:42:23 +0700360 files_ref_path(refs, &sb_path, refname);
Michael Haggerty34c7ad82016-09-04 18:08:20 +0200361
Michael Haggerty42a38cf2016-04-07 15:03:02 -0400362 path = sb_path.buf;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100363
David Turner70486532016-04-07 15:03:01 -0400364stat_ref:
365 /*
366 * We might have to loop back here to avoid a race
367 * condition: first we lstat() the file, then we try
368 * to read it as a link or as a file. But if somebody
369 * changes the type of the file (file <-> directory
370 * <-> symlink) between the lstat() and reading, then
371 * we don't want to report that as an error but rather
372 * try again starting with the lstat().
Jeff Kinge8c42cb2016-10-06 12:48:42 -0400373 *
374 * We'll keep a count of the retries, though, just to avoid
375 * any confusing situation sending us into an infinite loop.
David Turner70486532016-04-07 15:03:01 -0400376 */
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100377
Jeff Kinge8c42cb2016-10-06 12:48:42 -0400378 if (remaining_retries-- <= 0)
379 goto out;
380
David Turner70486532016-04-07 15:03:01 -0400381 if (lstat(path, &st) < 0) {
Han-Wen Nienhuys8b72fea2021-10-16 11:39:09 +0200382 int ignore_errno;
Han-Wen Nienhuysdf3458e2021-10-16 11:39:10 +0200383 myerr = errno;
Han-Wen Nienhuysdf3458e2021-10-16 11:39:10 +0200384 if (myerr != ENOENT)
Michael Haggerty42a38cf2016-04-07 15:03:02 -0400385 goto out;
Han-Wen Nienhuys8b72fea2021-10-16 11:39:09 +0200386 if (refs_read_raw_ref(refs->packed_ref_store, refname, oid,
387 referent, type, &ignore_errno)) {
Han-Wen Nienhuysdf3458e2021-10-16 11:39:10 +0200388 myerr = ENOENT;
Michael Haggerty42a38cf2016-04-07 15:03:02 -0400389 goto out;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100390 }
Michael Haggerty42a38cf2016-04-07 15:03:02 -0400391 ret = 0;
392 goto out;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100393 }
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100394
David Turner70486532016-04-07 15:03:01 -0400395 /* Follow "normalized" - ie "refs/.." symlinks by hand */
396 if (S_ISLNK(st.st_mode)) {
Michael Haggerty42a38cf2016-04-07 15:03:02 -0400397 strbuf_reset(&sb_contents);
Jeff King765b4962018-07-24 06:51:39 -0400398 if (strbuf_readlink(&sb_contents, path, st.st_size) < 0) {
Han-Wen Nienhuysdf3458e2021-10-16 11:39:10 +0200399 myerr = errno;
Han-Wen Nienhuysdf3458e2021-10-16 11:39:10 +0200400 if (myerr == ENOENT || myerr == EINVAL)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100401 /* inconsistent with lstat; retry */
402 goto stat_ref;
403 else
Michael Haggerty42a38cf2016-04-07 15:03:02 -0400404 goto out;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100405 }
Michael Haggerty42a38cf2016-04-07 15:03:02 -0400406 if (starts_with(sb_contents.buf, "refs/") &&
407 !check_refname_format(sb_contents.buf, 0)) {
Michael Haggerty92b38092016-04-22 01:11:17 +0200408 strbuf_swap(&sb_contents, referent);
Michael Haggerty3a0b6b92016-04-26 03:06:23 +0200409 *type |= REF_ISSYMREF;
Michael Haggerty42a38cf2016-04-07 15:03:02 -0400410 ret = 0;
411 goto out;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100412 }
Jeff King3f7bd762016-10-06 15:41:08 -0400413 /*
414 * It doesn't look like a refname; fall through to just
415 * treating it like a non-symlink, and reading whatever it
416 * points to.
417 */
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100418 }
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100419
David Turner70486532016-04-07 15:03:01 -0400420 /* Is it a directory? */
421 if (S_ISDIR(st.st_mode)) {
Han-Wen Nienhuys8b72fea2021-10-16 11:39:09 +0200422 int ignore_errno;
Michael Haggertye167a562016-05-05 14:09:41 +0200423 /*
424 * Even though there is a directory where the loose
425 * ref is supposed to be, there could still be a
426 * packed ref:
427 */
Han-Wen Nienhuys8b72fea2021-10-16 11:39:09 +0200428 if (refs_read_raw_ref(refs->packed_ref_store, refname, oid,
429 referent, type, &ignore_errno)) {
Han-Wen Nienhuysdf3458e2021-10-16 11:39:10 +0200430 myerr = EISDIR;
Michael Haggertye167a562016-05-05 14:09:41 +0200431 goto out;
432 }
433 ret = 0;
Michael Haggerty42a38cf2016-04-07 15:03:02 -0400434 goto out;
David Turner70486532016-04-07 15:03:01 -0400435 }
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100436
David Turner70486532016-04-07 15:03:01 -0400437 /*
438 * Anything else, just open it and try to use it as
439 * a ref
440 */
441 fd = open(path, O_RDONLY);
442 if (fd < 0) {
Han-Wen Nienhuysdf3458e2021-10-16 11:39:10 +0200443 myerr = errno;
444 if (myerr == ENOENT && !S_ISLNK(st.st_mode))
David Turner70486532016-04-07 15:03:01 -0400445 /* inconsistent with lstat; retry */
446 goto stat_ref;
447 else
Michael Haggerty42a38cf2016-04-07 15:03:02 -0400448 goto out;
David Turner70486532016-04-07 15:03:01 -0400449 }
Michael Haggerty42a38cf2016-04-07 15:03:02 -0400450 strbuf_reset(&sb_contents);
451 if (strbuf_read(&sb_contents, fd, 256) < 0) {
Han-Wen Nienhuysdf3458e2021-10-16 11:39:10 +0200452 myerr = errno;
David Turner70486532016-04-07 15:03:01 -0400453 close(fd);
Michael Haggerty42a38cf2016-04-07 15:03:02 -0400454 goto out;
David Turner70486532016-04-07 15:03:01 -0400455 }
456 close(fd);
Michael Haggerty42a38cf2016-04-07 15:03:02 -0400457 strbuf_rtrim(&sb_contents);
458 buf = sb_contents.buf;
David Turner70486532016-04-07 15:03:01 -0400459
Han-Wen Nienhuysdf3458e2021-10-16 11:39:10 +0200460 ret = parse_loose_ref_contents(buf, oid, referent, type, &myerr);
Michael Haggerty42a38cf2016-04-07 15:03:02 -0400461
462out:
Han-Wen Nienhuysdf3458e2021-10-16 11:39:10 +0200463 if (ret && !myerr)
464 BUG("returning non-zero %d, should have set myerr!", ret);
465 *failure_errno = myerr;
466
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100467 strbuf_release(&sb_path);
468 strbuf_release(&sb_contents);
Ævar Arnfjörð Bjarmasoncac15b32022-01-12 13:36:46 +0100469 errno = 0;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100470 return ret;
471}
472
Han-Wen Nienhuyse39620f2020-08-19 14:27:55 +0000473int parse_loose_ref_contents(const char *buf, struct object_id *oid,
Han-Wen Nienhuysdf3458e2021-10-16 11:39:10 +0200474 struct strbuf *referent, unsigned int *type,
475 int *failure_errno)
Han-Wen Nienhuyse39620f2020-08-19 14:27:55 +0000476{
477 const char *p;
478 if (skip_prefix(buf, "ref:", &buf)) {
479 while (isspace(*buf))
480 buf++;
481
482 strbuf_reset(referent);
483 strbuf_addstr(referent, buf);
484 *type |= REF_ISSYMREF;
485 return 0;
486 }
487
488 /*
489 * FETCH_HEAD has additional data after the sha.
490 */
491 if (parse_oid_hex(buf, oid, &p) ||
492 (*p != '\0' && !isspace(*p))) {
493 *type |= REF_ISBROKEN;
Han-Wen Nienhuysdf3458e2021-10-16 11:39:10 +0200494 *failure_errno = EINVAL;
Han-Wen Nienhuyse39620f2020-08-19 14:27:55 +0000495 return -1;
496 }
497 return 0;
498}
499
Michael Haggerty8415d242016-04-24 08:11:37 +0200500static void unlock_ref(struct ref_lock *lock)
501{
Jeff Kingee4d8e42017-09-05 08:15:15 -0400502 rollback_lock_file(&lock->lk);
Michael Haggerty8415d242016-04-24 08:11:37 +0200503 free(lock->ref_name);
Michael Haggerty8415d242016-04-24 08:11:37 +0200504 free(lock);
505}
506
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100507/*
Michael Haggerty92b15512016-04-25 15:56:07 +0200508 * Lock refname, without following symrefs, and set *lock_p to point
509 * at a newly-allocated lock object. Fill in lock->old_oid, referent,
510 * and type similarly to read_raw_ref().
511 *
512 * The caller must verify that refname is a "safe" reference name (in
513 * the sense of refname_is_safe()) before calling this function.
514 *
515 * If the reference doesn't already exist, verify that refname doesn't
516 * have a D/F conflict with any existing references. extras and skip
Michael Haggerty524a9fd2017-04-16 08:41:27 +0200517 * are passed to refs_verify_refname_available() for this check.
Michael Haggerty92b15512016-04-25 15:56:07 +0200518 *
519 * If mustexist is not set and the reference is not found or is
Michael Haggerty78fb4572017-11-05 09:42:09 +0100520 * broken, lock the reference anyway but clear old_oid.
Michael Haggerty92b15512016-04-25 15:56:07 +0200521 *
522 * Return 0 on success. On failure, write an error message to err and
523 * return TRANSACTION_NAME_CONFLICT or TRANSACTION_GENERIC_ERROR.
524 *
525 * Implementation note: This function is basically
526 *
527 * lock reference
528 * read_raw_ref()
529 *
530 * but it includes a lot more code to
531 * - Deal with possible races with other processes
Michael Haggerty524a9fd2017-04-16 08:41:27 +0200532 * - Avoid calling refs_verify_refname_available() when it can be
Michael Haggerty92b15512016-04-25 15:56:07 +0200533 * avoided, namely if we were successfully able to read the ref
534 * - Generate informative error messages in the case of failure
535 */
Michael Haggertyf7b0a982016-09-04 18:08:31 +0200536static int lock_raw_ref(struct files_ref_store *refs,
537 const char *refname, int mustexist,
Michael Haggerty92b15512016-04-25 15:56:07 +0200538 const struct string_list *extras,
Michael Haggerty92b15512016-04-25 15:56:07 +0200539 struct ref_lock **lock_p,
540 struct strbuf *referent,
541 unsigned int *type,
542 struct strbuf *err)
543{
544 struct ref_lock *lock;
545 struct strbuf ref_file = STRBUF_INIT;
546 int attempts_remaining = 3;
547 int ret = TRANSACTION_GENERIC_ERROR;
Han-Wen Nienhuys5b12e162021-08-23 13:52:40 +0200548 int failure_errno;
Michael Haggerty92b15512016-04-25 15:56:07 +0200549
550 assert(err);
Michael Haggerty32c597e2017-02-10 12:16:16 +0100551 files_assert_main_repository(refs, "lock_raw_ref");
Michael Haggertyf7b0a982016-09-04 18:08:31 +0200552
Michael Haggerty92b15512016-04-25 15:56:07 +0200553 *type = 0;
554
555 /* First lock the file so it can't change out from under us. */
556
René Scharfeca56dad2021-03-13 17:17:22 +0100557 *lock_p = CALLOC_ARRAY(lock, 1);
Michael Haggerty92b15512016-04-25 15:56:07 +0200558
559 lock->ref_name = xstrdup(refname);
Nguyễn Thái Ngọc Duy19e02f42017-03-26 09:42:23 +0700560 files_ref_path(refs, &ref_file, refname);
Michael Haggerty92b15512016-04-25 15:56:07 +0200561
562retry:
563 switch (safe_create_leading_directories(ref_file.buf)) {
564 case SCLD_OK:
565 break; /* success */
566 case SCLD_EXISTS:
567 /*
568 * Suppose refname is "refs/foo/bar". We just failed
569 * to create the containing directory, "refs/foo",
570 * because there was a non-directory in the way. This
571 * indicates a D/F conflict, probably because of
572 * another reference such as "refs/foo". There is no
573 * reason to expect this error to be transitory.
574 */
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +0700575 if (refs_verify_refname_available(&refs->base, refname,
Ævar Arnfjörð Bjarmason640d9d52021-08-23 13:36:06 +0200576 extras, NULL, err)) {
Michael Haggerty92b15512016-04-25 15:56:07 +0200577 if (mustexist) {
578 /*
579 * To the user the relevant error is
580 * that the "mustexist" reference is
581 * missing:
582 */
583 strbuf_reset(err);
584 strbuf_addf(err, "unable to resolve reference '%s'",
585 refname);
586 } else {
587 /*
588 * The error message set by
Michael Haggerty524a9fd2017-04-16 08:41:27 +0200589 * refs_verify_refname_available() is
590 * OK.
Michael Haggerty92b15512016-04-25 15:56:07 +0200591 */
592 ret = TRANSACTION_NAME_CONFLICT;
593 }
594 } else {
595 /*
596 * The file that is in the way isn't a loose
597 * reference. Report it as a low-level
598 * failure.
599 */
600 strbuf_addf(err, "unable to create lock file %s.lock; "
601 "non-directory in the way",
602 ref_file.buf);
603 }
604 goto error_return;
605 case SCLD_VANISHED:
606 /* Maybe another process was tidying up. Try again. */
607 if (--attempts_remaining > 0)
608 goto retry;
609 /* fall through */
610 default:
611 strbuf_addf(err, "unable to create directory for %s",
612 ref_file.buf);
613 goto error_return;
614 }
615
Michael Haggerty4ff0f012017-08-21 13:51:34 +0200616 if (hold_lock_file_for_update_timeout(
Jeff Kingee4d8e42017-09-05 08:15:15 -0400617 &lock->lk, ref_file.buf, LOCK_NO_DEREF,
Michael Haggerty4ff0f012017-08-21 13:51:34 +0200618 get_files_ref_lock_timeout_ms()) < 0) {
Han-Wen Nienhuys5b12e162021-08-23 13:52:40 +0200619 int myerr = errno;
620 errno = 0;
621 if (myerr == ENOENT && --attempts_remaining > 0) {
Michael Haggerty92b15512016-04-25 15:56:07 +0200622 /*
623 * Maybe somebody just deleted one of the
624 * directories leading to ref_file. Try
625 * again:
626 */
627 goto retry;
628 } else {
Han-Wen Nienhuys5b12e162021-08-23 13:52:40 +0200629 unable_to_lock_message(ref_file.buf, myerr, err);
Michael Haggerty92b15512016-04-25 15:56:07 +0200630 goto error_return;
631 }
632 }
633
634 /*
635 * Now we hold the lock and can read the reference without
636 * fear that its value will change.
637 */
638
Han-Wen Nienhuys5b12e162021-08-23 13:52:40 +0200639 if (files_read_raw_ref(&refs->base, refname, &lock->old_oid, referent,
640 type, &failure_errno)) {
641 if (failure_errno == ENOENT) {
Michael Haggerty92b15512016-04-25 15:56:07 +0200642 if (mustexist) {
643 /* Garden variety missing reference. */
644 strbuf_addf(err, "unable to resolve reference '%s'",
645 refname);
646 goto error_return;
647 } else {
648 /*
649 * Reference is missing, but that's OK. We
650 * know that there is not a conflict with
651 * another loose reference because
652 * (supposing that we are trying to lock
653 * reference "refs/foo/bar"):
654 *
655 * - We were successfully able to create
656 * the lockfile refs/foo/bar.lock, so we
657 * know there cannot be a loose reference
658 * named "refs/foo".
659 *
660 * - We got ENOENT and not EISDIR, so we
661 * know that there cannot be a loose
662 * reference named "refs/foo/bar/baz".
663 */
664 }
Han-Wen Nienhuys5b12e162021-08-23 13:52:40 +0200665 } else if (failure_errno == EISDIR) {
Michael Haggerty92b15512016-04-25 15:56:07 +0200666 /*
667 * There is a directory in the way. It might have
668 * contained references that have been deleted. If
669 * we don't require that the reference already
670 * exists, try to remove the directory so that it
671 * doesn't cause trouble when we want to rename the
672 * lockfile into place later.
673 */
674 if (mustexist) {
675 /* Garden variety missing reference. */
676 strbuf_addf(err, "unable to resolve reference '%s'",
677 refname);
678 goto error_return;
679 } else if (remove_dir_recursively(&ref_file,
680 REMOVE_DIR_EMPTY_ONLY)) {
Michael Haggertyb05855b2017-04-16 08:41:26 +0200681 if (refs_verify_refname_available(
682 &refs->base, refname,
Ævar Arnfjörð Bjarmason640d9d52021-08-23 13:36:06 +0200683 extras, NULL, err)) {
Michael Haggerty92b15512016-04-25 15:56:07 +0200684 /*
685 * The error message set by
686 * verify_refname_available() is OK.
687 */
688 ret = TRANSACTION_NAME_CONFLICT;
689 goto error_return;
690 } else {
691 /*
692 * We can't delete the directory,
693 * but we also don't know of any
694 * references that it should
695 * contain.
696 */
697 strbuf_addf(err, "there is a non-empty directory '%s' "
698 "blocking reference '%s'",
699 ref_file.buf, refname);
700 goto error_return;
701 }
702 }
Han-Wen Nienhuys5b12e162021-08-23 13:52:40 +0200703 } else if (failure_errno == EINVAL && (*type & REF_ISBROKEN)) {
Michael Haggerty92b15512016-04-25 15:56:07 +0200704 strbuf_addf(err, "unable to resolve reference '%s': "
705 "reference broken", refname);
706 goto error_return;
707 } else {
708 strbuf_addf(err, "unable to resolve reference '%s': %s",
Han-Wen Nienhuys5b12e162021-08-23 13:52:40 +0200709 refname, strerror(failure_errno));
Michael Haggerty92b15512016-04-25 15:56:07 +0200710 goto error_return;
711 }
712
713 /*
714 * If the ref did not exist and we are creating it,
Michael Haggerty8ec617c2017-08-17 17:12:50 +0200715 * make sure there is no existing packed ref that
716 * conflicts with refname:
Michael Haggerty92b15512016-04-25 15:56:07 +0200717 */
Michael Haggerty524a9fd2017-04-16 08:41:27 +0200718 if (refs_verify_refname_available(
Michael Haggerty8ec617c2017-08-17 17:12:50 +0200719 refs->packed_ref_store, refname,
Ævar Arnfjörð Bjarmason640d9d52021-08-23 13:36:06 +0200720 extras, NULL, err))
Michael Haggerty92b15512016-04-25 15:56:07 +0200721 goto error_return;
Michael Haggerty92b15512016-04-25 15:56:07 +0200722 }
723
724 ret = 0;
725 goto out;
726
727error_return:
728 unlock_ref(lock);
729 *lock_p = NULL;
730
731out:
732 strbuf_release(&ref_file);
733 return ret;
734}
735
Michael Haggerty3bc581b2016-06-18 06:15:15 +0200736struct files_ref_iterator {
737 struct ref_iterator base;
738
Michael Haggerty3bc581b2016-06-18 06:15:15 +0200739 struct ref_iterator *iter0;
Jonathan Tan9bc45a22021-10-08 14:08:15 -0700740 struct repository *repo;
Michael Haggerty3bc581b2016-06-18 06:15:15 +0200741 unsigned int flags;
742};
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100743
Michael Haggerty3bc581b2016-06-18 06:15:15 +0200744static int files_ref_iterator_advance(struct ref_iterator *ref_iterator)
745{
746 struct files_ref_iterator *iter =
747 (struct files_ref_iterator *)ref_iterator;
748 int ok;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100749
Michael Haggerty3bc581b2016-06-18 06:15:15 +0200750 while ((ok = ref_iterator_advance(iter->iter0)) == ITER_OK) {
David Turner0c09ec02016-09-04 18:08:44 +0200751 if (iter->flags & DO_FOR_EACH_PER_WORKTREE_ONLY &&
752 ref_type(iter->iter0->refname) != REF_TYPE_PER_WORKTREE)
753 continue;
754
Jeff King8dccb222021-09-24 14:41:32 -0400755 if ((iter->flags & DO_FOR_EACH_OMIT_DANGLING_SYMREFS) &&
756 (iter->iter0->flags & REF_ISSYMREF) &&
757 (iter->iter0->flags & REF_ISBROKEN))
758 continue;
759
Michael Haggerty3bc581b2016-06-18 06:15:15 +0200760 if (!(iter->flags & DO_FOR_EACH_INCLUDE_BROKEN) &&
761 !ref_resolves_to_object(iter->iter0->refname,
Jonathan Tan9bc45a22021-10-08 14:08:15 -0700762 iter->repo,
Michael Haggerty3bc581b2016-06-18 06:15:15 +0200763 iter->iter0->oid,
764 iter->iter0->flags))
765 continue;
766
767 iter->base.refname = iter->iter0->refname;
768 iter->base.oid = iter->iter0->oid;
769 iter->base.flags = iter->iter0->flags;
770 return ITER_OK;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100771 }
772
Michael Haggerty3bc581b2016-06-18 06:15:15 +0200773 iter->iter0 = NULL;
774 if (ref_iterator_abort(ref_iterator) != ITER_DONE)
775 ok = ITER_ERROR;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100776
Michael Haggerty3bc581b2016-06-18 06:15:15 +0200777 return ok;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100778}
779
Michael Haggerty3bc581b2016-06-18 06:15:15 +0200780static int files_ref_iterator_peel(struct ref_iterator *ref_iterator,
781 struct object_id *peeled)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100782{
Michael Haggerty3bc581b2016-06-18 06:15:15 +0200783 struct files_ref_iterator *iter =
784 (struct files_ref_iterator *)ref_iterator;
David Turner93770592016-04-07 15:02:49 -0400785
Michael Haggerty3bc581b2016-06-18 06:15:15 +0200786 return ref_iterator_peel(iter->iter0, peeled);
787}
788
789static int files_ref_iterator_abort(struct ref_iterator *ref_iterator)
790{
791 struct files_ref_iterator *iter =
792 (struct files_ref_iterator *)ref_iterator;
793 int ok = ITER_DONE;
794
795 if (iter->iter0)
796 ok = ref_iterator_abort(iter->iter0);
797
Michael Haggerty3bc581b2016-06-18 06:15:15 +0200798 base_ref_iterator_free(ref_iterator);
799 return ok;
800}
801
802static struct ref_iterator_vtable files_ref_iterator_vtable = {
803 files_ref_iterator_advance,
804 files_ref_iterator_peel,
805 files_ref_iterator_abort
806};
807
Michael Haggerty1a769002016-09-04 18:08:37 +0200808static struct ref_iterator *files_ref_iterator_begin(
Michael Haggerty37b6f6d2016-09-04 18:08:36 +0200809 struct ref_store *ref_store,
Michael Haggerty3bc581b2016-06-18 06:15:15 +0200810 const char *prefix, unsigned int flags)
811{
Nguyễn Thái Ngọc Duy9e7ec632017-03-26 09:42:32 +0700812 struct files_ref_store *refs;
Michael Haggerty8738a8a2017-09-13 19:15:55 +0200813 struct ref_iterator *loose_iter, *packed_iter, *overlay_iter;
Michael Haggerty3bc581b2016-06-18 06:15:15 +0200814 struct files_ref_iterator *iter;
815 struct ref_iterator *ref_iterator;
Michael Haggerty0a0865b2017-05-22 16:17:52 +0200816 unsigned int required_flags = REF_STORE_READ;
Michael Haggerty3bc581b2016-06-18 06:15:15 +0200817
Michael Haggerty0a0865b2017-05-22 16:17:52 +0200818 if (!(flags & DO_FOR_EACH_INCLUDE_BROKEN))
819 required_flags |= REF_STORE_ODB;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100820
Michael Haggerty0a0865b2017-05-22 16:17:52 +0200821 refs = files_downcast(ref_store, required_flags, "ref_iterator_begin");
Nguyễn Thái Ngọc Duy9e7ec632017-03-26 09:42:32 +0700822
Michael Haggerty3bc581b2016-06-18 06:15:15 +0200823 /*
824 * We must make sure that all loose refs are read before
825 * accessing the packed-refs file; this avoids a race
826 * condition if loose refs are migrated to the packed-refs
827 * file by a simultaneous process, but our in-memory view is
828 * from before the migration. We ensure this as follows:
Michael Haggerty059ae352017-04-16 08:41:39 +0200829 * First, we call start the loose refs iteration with its
830 * `prime_ref` argument set to true. This causes the loose
831 * references in the subtree to be pre-read into the cache.
832 * (If they've already been read, that's OK; we only need to
833 * guarantee that they're read before the packed refs, not
834 * *how much* before.) After that, we call
Michael Haggerty38b86e82017-06-23 09:01:35 +0200835 * packed_ref_iterator_begin(), which internally checks
836 * whether the packed-ref cache is up to date with what is on
837 * disk, and re-reads it if not.
Michael Haggerty3bc581b2016-06-18 06:15:15 +0200838 */
839
Michael Haggerty059ae352017-04-16 08:41:39 +0200840 loose_iter = cache_ref_iterator_begin(get_loose_ref_cache(refs),
Jonathan Tan87881952021-10-08 14:08:16 -0700841 prefix, ref_store->repo, 1);
Michael Haggerty3bc581b2016-06-18 06:15:15 +0200842
Michael Haggerty38b86e82017-06-23 09:01:35 +0200843 /*
844 * The packed-refs file might contain broken references, for
845 * example an old version of a reference that points at an
846 * object that has since been garbage-collected. This is OK as
847 * long as there is a corresponding loose reference that
848 * overrides it, and we don't want to emit an error message in
849 * this case. So ask the packed_ref_store for all of its
850 * references, and (if needed) do our own check for broken
851 * ones in files_ref_iterator_advance(), after we have merged
852 * the packed and loose references.
853 */
Michael Haggertye0cc8ac2017-06-23 09:01:38 +0200854 packed_iter = refs_ref_iterator_begin(
855 refs->packed_ref_store, prefix, 0,
Michael Haggerty38b86e82017-06-23 09:01:35 +0200856 DO_FOR_EACH_INCLUDE_BROKEN);
Michael Haggerty3bc581b2016-06-18 06:15:15 +0200857
Michael Haggerty8738a8a2017-09-13 19:15:55 +0200858 overlay_iter = overlay_ref_iterator_begin(loose_iter, packed_iter);
859
René Scharfeca56dad2021-03-13 17:17:22 +0100860 CALLOC_ARRAY(iter, 1);
Michael Haggerty8738a8a2017-09-13 19:15:55 +0200861 ref_iterator = &iter->base;
862 base_ref_iterator_init(ref_iterator, &files_ref_iterator_vtable,
863 overlay_iter->ordered);
864 iter->iter0 = overlay_iter;
Jonathan Tan9bc45a22021-10-08 14:08:15 -0700865 iter->repo = ref_store->repo;
Michael Haggerty3bc581b2016-06-18 06:15:15 +0200866 iter->flags = flags;
867
868 return ref_iterator;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100869}
870
Ævar Arnfjörð Bjarmason3fa2e912021-08-23 13:52:37 +0200871/*
872 * Callback function for raceproof_create_file(). This function is
873 * expected to do something that makes dirname(path) permanent despite
874 * the fact that other processes might be cleaning up empty
875 * directories at the same time. Usually it will create a file named
876 * path, but alternatively it could create another file in that
877 * directory, or even chdir() into that directory. The function should
878 * return 0 if the action was completed successfully. On error, it
879 * should return a nonzero result and set errno.
880 * raceproof_create_file() treats two errno values specially:
881 *
882 * - ENOENT -- dirname(path) does not exist. In this case,
883 * raceproof_create_file() tries creating dirname(path)
884 * (and any parent directories, if necessary) and calls
885 * the function again.
886 *
887 * - EISDIR -- the file already exists and is a directory. In this
888 * case, raceproof_create_file() removes the directory if
889 * it is empty (and recursively any empty directories that
890 * it contains) and calls the function again.
891 *
892 * Any other errno causes raceproof_create_file() to fail with the
893 * callback's return value and errno.
894 *
895 * Obviously, this function should be OK with being called again if it
896 * fails with ENOENT or EISDIR. In other scenarios it will not be
897 * called again.
898 */
899typedef int create_file_fn(const char *path, void *cb);
900
901/*
902 * Create a file in dirname(path) by calling fn, creating leading
903 * directories if necessary. Retry a few times in case we are racing
904 * with another process that is trying to clean up the directory that
905 * contains path. See the documentation for create_file_fn for more
906 * details.
907 *
908 * Return the value and set the errno that resulted from the most
909 * recent call of fn. fn is always called at least once, and will be
910 * called more than once if it returns ENOENT or EISDIR.
911 */
912static int raceproof_create_file(const char *path, create_file_fn fn, void *cb)
913{
914 /*
915 * The number of times we will try to remove empty directories
916 * in the way of path. This is only 1 because if another
917 * process is racily creating directories that conflict with
918 * us, we don't want to fight against them.
919 */
920 int remove_directories_remaining = 1;
921
922 /*
923 * The number of times that we will try to create the
924 * directories containing path. We are willing to attempt this
925 * more than once, because another process could be trying to
926 * clean up empty directories at the same time as we are
927 * trying to create them.
928 */
929 int create_directories_remaining = 3;
930
931 /* A scratch copy of path, filled lazily if we need it: */
932 struct strbuf path_copy = STRBUF_INIT;
933
934 int ret, save_errno;
935
936 /* Sanity check: */
937 assert(*path);
938
939retry_fn:
940 ret = fn(path, cb);
941 save_errno = errno;
942 if (!ret)
943 goto out;
944
945 if (errno == EISDIR && remove_directories_remaining-- > 0) {
946 /*
947 * A directory is in the way. Maybe it is empty; try
948 * to remove it:
949 */
950 if (!path_copy.len)
951 strbuf_addstr(&path_copy, path);
952
953 if (!remove_dir_recursively(&path_copy, REMOVE_DIR_EMPTY_ONLY))
954 goto retry_fn;
955 } else if (errno == ENOENT && create_directories_remaining-- > 0) {
956 /*
957 * Maybe the containing directory didn't exist, or
958 * maybe it was just deleted by a process that is
959 * racing with us to clean up empty directories. Try
960 * to create it:
961 */
962 enum scld_error scld_result;
963
964 if (!path_copy.len)
965 strbuf_addstr(&path_copy, path);
966
967 do {
968 scld_result = safe_create_leading_directories(path_copy.buf);
969 if (scld_result == SCLD_OK)
970 goto retry_fn;
971 } while (scld_result == SCLD_VANISHED && create_directories_remaining-- > 0);
972 }
973
974out:
975 strbuf_release(&path_copy);
976 errno = save_errno;
977 return ret;
978}
979
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100980static int remove_empty_directories(struct strbuf *path)
981{
982 /*
983 * we want to create a file but there is a directory there;
984 * if that is an empty directory (or a directory that contains
985 * only empty directories), remove them.
986 */
987 return remove_dir_recursively(path, REMOVE_DIR_EMPTY_ONLY);
988}
989
Michael Haggerty3b5d3c92017-01-06 17:22:28 +0100990static int create_reflock(const char *path, void *cb)
991{
992 struct lock_file *lk = cb;
993
Michael Haggerty4ff0f012017-08-21 13:51:34 +0200994 return hold_lock_file_for_update_timeout(
995 lk, path, LOCK_NO_DEREF,
996 get_files_ref_lock_timeout_ms()) < 0 ? -1 : 0;
Michael Haggerty3b5d3c92017-01-06 17:22:28 +0100997}
998
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +0100999/*
1000 * Locks a ref returning the lock on success and NULL on failure.
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001001 */
brian m. carlson4f01e502017-10-15 22:07:12 +00001002static struct ref_lock *lock_ref_oid_basic(struct files_ref_store *refs,
Ævar Arnfjörð Bjarmason52106432021-10-16 11:39:13 +02001003 const char *refname,
brian m. carlson4f01e502017-10-15 22:07:12 +00001004 struct strbuf *err)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001005{
1006 struct strbuf ref_file = STRBUF_INIT;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001007 struct ref_lock *lock;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001008
brian m. carlson4f01e502017-10-15 22:07:12 +00001009 files_assert_main_repository(refs, "lock_ref_oid_basic");
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001010 assert(err);
1011
René Scharfeca56dad2021-03-13 17:17:22 +01001012 CALLOC_ARRAY(lock, 1);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001013
Nguyễn Thái Ngọc Duy19e02f42017-03-26 09:42:23 +07001014 files_ref_path(refs, &ref_file, refname);
Jeff King2859dcd2016-01-12 16:45:09 -05001015
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001016 /*
1017 * If the ref did not exist and we are creating it, make sure
1018 * there is no existing packed ref whose name begins with our
1019 * refname, nor a packed ref whose name is a proper prefix of
1020 * our refname.
1021 */
1022 if (is_null_oid(&lock->old_oid) &&
Michael Haggerty8ec617c2017-08-17 17:12:50 +02001023 refs_verify_refname_available(refs->packed_ref_store, refname,
Han-Wen Nienhuys1ae6ed22021-08-23 13:52:39 +02001024 NULL, NULL, err))
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001025 goto error_return;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001026
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001027 lock->ref_name = xstrdup(refname);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001028
Jeff Kingee4d8e42017-09-05 08:15:15 -04001029 if (raceproof_create_file(ref_file.buf, create_reflock, &lock->lk)) {
Michael Haggerty3b5d3c92017-01-06 17:22:28 +01001030 unable_to_lock_message(ref_file.buf, errno, err);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001031 goto error_return;
1032 }
1033
Ævar Arnfjörð Bjarmasonf1da24c2021-10-16 11:39:27 +02001034 if (!refs_resolve_ref_unsafe(&refs->base, lock->ref_name, 0,
Ævar Arnfjörð Bjarmasonce14de02022-01-26 15:37:01 +01001035 &lock->old_oid, NULL))
Ævar Arnfjörð Bjarmasonff7a2e42021-08-23 13:36:12 +02001036 oidclr(&lock->old_oid);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001037 goto out;
1038
1039 error_return:
1040 unlock_ref(lock);
1041 lock = NULL;
1042
1043 out:
1044 strbuf_release(&ref_file);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001045 return lock;
1046}
1047
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001048struct ref_to_prune {
1049 struct ref_to_prune *next;
brian m. carlson49e99582017-10-15 22:06:49 +00001050 struct object_id oid;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001051 char name[FLEX_ARRAY];
1052};
1053
Michael Haggertya8f0db22017-01-06 17:22:42 +01001054enum {
1055 REMOVE_EMPTY_PARENTS_REF = 0x01,
1056 REMOVE_EMPTY_PARENTS_REFLOG = 0x02
1057};
1058
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001059/*
Michael Haggertya8f0db22017-01-06 17:22:42 +01001060 * Remove empty parent directories associated with the specified
1061 * reference and/or its reflog, but spare [logs/]refs/ and immediate
1062 * subdirs. flags is a combination of REMOVE_EMPTY_PARENTS_REF and/or
1063 * REMOVE_EMPTY_PARENTS_REFLOG.
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001064 */
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07001065static void try_remove_empty_parents(struct files_ref_store *refs,
1066 const char *refname,
1067 unsigned int flags)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001068{
Michael Haggerty8bdaecb2017-01-06 17:22:41 +01001069 struct strbuf buf = STRBUF_INIT;
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07001070 struct strbuf sb = STRBUF_INIT;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001071 char *p, *q;
1072 int i;
Michael Haggerty8bdaecb2017-01-06 17:22:41 +01001073
1074 strbuf_addstr(&buf, refname);
1075 p = buf.buf;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001076 for (i = 0; i < 2; i++) { /* refs/{heads,tags,...}/ */
1077 while (*p && *p != '/')
1078 p++;
1079 /* tolerate duplicate slashes; see check_refname_format() */
1080 while (*p == '/')
1081 p++;
1082 }
Michael Haggerty8bdaecb2017-01-06 17:22:41 +01001083 q = buf.buf + buf.len;
Michael Haggertya8f0db22017-01-06 17:22:42 +01001084 while (flags & (REMOVE_EMPTY_PARENTS_REF | REMOVE_EMPTY_PARENTS_REFLOG)) {
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001085 while (q > p && *q != '/')
1086 q--;
1087 while (q > p && *(q-1) == '/')
1088 q--;
1089 if (q == p)
1090 break;
Michael Haggerty8bdaecb2017-01-06 17:22:41 +01001091 strbuf_setlen(&buf, q - buf.buf);
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07001092
1093 strbuf_reset(&sb);
Nguyễn Thái Ngọc Duy19e02f42017-03-26 09:42:23 +07001094 files_ref_path(refs, &sb, buf.buf);
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07001095 if ((flags & REMOVE_EMPTY_PARENTS_REF) && rmdir(sb.buf))
Michael Haggertya8f0db22017-01-06 17:22:42 +01001096 flags &= ~REMOVE_EMPTY_PARENTS_REF;
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07001097
1098 strbuf_reset(&sb);
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07001099 files_reflog_path(refs, &sb, buf.buf);
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07001100 if ((flags & REMOVE_EMPTY_PARENTS_REFLOG) && rmdir(sb.buf))
Michael Haggertya8f0db22017-01-06 17:22:42 +01001101 flags &= ~REMOVE_EMPTY_PARENTS_REFLOG;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001102 }
Michael Haggerty8bdaecb2017-01-06 17:22:41 +01001103 strbuf_release(&buf);
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07001104 strbuf_release(&sb);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001105}
1106
1107/* make sure nobody touched the ref, and unlink */
Nguyễn Thái Ngọc Duy2f40e952017-03-26 09:42:36 +07001108static void prune_ref(struct files_ref_store *refs, struct ref_to_prune *r)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001109{
1110 struct ref_transaction *transaction;
1111 struct strbuf err = STRBUF_INIT;
Michael Haggertyb00f3cf2017-11-05 09:42:02 +01001112 int ret = -1;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001113
1114 if (check_refname_format(r->name, 0))
1115 return;
1116
Patrick Steinhardtffad9942022-01-17 09:12:48 +01001117 transaction = ref_store_transaction_begin(&refs->base,
1118 REF_TRANSACTION_SKIP_HOOK, &err);
Michael Haggertyb00f3cf2017-11-05 09:42:02 +01001119 if (!transaction)
1120 goto cleanup;
1121 ref_transaction_add_update(
1122 transaction, r->name,
Michael Haggertyacedcde2017-11-05 09:42:07 +01001123 REF_NO_DEREF | REF_HAVE_NEW | REF_HAVE_OLD | REF_IS_PRUNING,
brian m. carlson14228442021-04-26 01:02:56 +00001124 null_oid(), &r->oid, NULL);
Michael Haggertyb00f3cf2017-11-05 09:42:02 +01001125 if (ref_transaction_commit(transaction, &err))
1126 goto cleanup;
1127
1128 ret = 0;
1129
1130cleanup:
1131 if (ret)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001132 error("%s", err.buf);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001133 strbuf_release(&err);
Michael Haggertyb00f3cf2017-11-05 09:42:02 +01001134 ref_transaction_free(transaction);
1135 return;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001136}
1137
Michael Haggerty22b09cd2017-09-08 15:51:48 +02001138/*
1139 * Prune the loose versions of the references in the linked list
1140 * `*refs_to_prune`, freeing the entries in the list as we go.
1141 */
1142static void prune_refs(struct files_ref_store *refs, struct ref_to_prune **refs_to_prune)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001143{
Michael Haggerty22b09cd2017-09-08 15:51:48 +02001144 while (*refs_to_prune) {
1145 struct ref_to_prune *r = *refs_to_prune;
1146 *refs_to_prune = r->next;
Nguyễn Thái Ngọc Duy2f40e952017-03-26 09:42:36 +07001147 prune_ref(refs, r);
Michael Haggerty22b09cd2017-09-08 15:51:48 +02001148 free(r);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001149 }
1150}
1151
Michael Haggerty531cc4a2017-05-22 16:17:48 +02001152/*
1153 * Return true if the specified reference should be packed.
1154 */
1155static int should_pack_ref(const char *refname,
1156 const struct object_id *oid, unsigned int ref_flags,
1157 unsigned int pack_flags)
1158{
1159 /* Do not pack per-worktree refs: */
1160 if (ref_type(refname) != REF_TYPE_NORMAL)
1161 return 0;
1162
1163 /* Do not pack non-tags unless PACK_REFS_ALL is set: */
1164 if (!(pack_flags & PACK_REFS_ALL) && !starts_with(refname, "refs/tags/"))
1165 return 0;
1166
1167 /* Do not pack symbolic refs: */
1168 if (ref_flags & REF_ISSYMREF)
1169 return 0;
1170
1171 /* Do not pack broken refs: */
Jonathan Tan9bc45a22021-10-08 14:08:15 -07001172 if (!ref_resolves_to_object(refname, the_repository, oid, ref_flags))
Michael Haggerty531cc4a2017-05-22 16:17:48 +02001173 return 0;
1174
1175 return 1;
1176}
1177
Michael Haggerty82315272016-09-04 18:08:27 +02001178static int files_pack_refs(struct ref_store *ref_store, unsigned int flags)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001179{
Michael Haggerty00eebe32016-09-04 18:08:11 +02001180 struct files_ref_store *refs =
Nguyễn Thái Ngọc Duy9e7ec632017-03-26 09:42:32 +07001181 files_downcast(ref_store, REF_STORE_WRITE | REF_STORE_ODB,
1182 "pack_refs");
Michael Haggerty50c2d852017-04-16 08:41:41 +02001183 struct ref_iterator *iter;
Michael Haggerty50c2d852017-04-16 08:41:41 +02001184 int ok;
1185 struct ref_to_prune *refs_to_prune = NULL;
Michael Haggerty34789832017-06-23 09:01:39 +02001186 struct strbuf err = STRBUF_INIT;
Michael Haggerty27d03d02017-09-08 15:51:47 +02001187 struct ref_transaction *transaction;
1188
Patrick Steinhardtffad9942022-01-17 09:12:48 +01001189 transaction = ref_store_transaction_begin(refs->packed_ref_store,
1190 REF_TRANSACTION_SKIP_HOOK, &err);
Michael Haggerty27d03d02017-09-08 15:51:47 +02001191 if (!transaction)
1192 return -1;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001193
Michael Haggertyc8bed832017-06-23 09:01:42 +02001194 packed_refs_lock(refs->packed_ref_store, LOCK_DIE_ON_ERROR, &err);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001195
Jonathan Tan87881952021-10-08 14:08:16 -07001196 iter = cache_ref_iterator_begin(get_loose_ref_cache(refs), NULL,
1197 the_repository, 0);
Michael Haggerty50c2d852017-04-16 08:41:41 +02001198 while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
1199 /*
1200 * If the loose reference can be packed, add an entry
1201 * in the packed ref cache. If the reference should be
1202 * pruned, also add it to refs_to_prune.
1203 */
Michael Haggerty531cc4a2017-05-22 16:17:48 +02001204 if (!should_pack_ref(iter->refname, iter->oid, iter->flags,
1205 flags))
Michael Haggerty50c2d852017-04-16 08:41:41 +02001206 continue;
1207
1208 /*
Michael Haggerty27d03d02017-09-08 15:51:47 +02001209 * Add a reference creation for this reference to the
1210 * packed-refs transaction:
Michael Haggerty50c2d852017-04-16 08:41:41 +02001211 */
Michael Haggerty27d03d02017-09-08 15:51:47 +02001212 if (ref_transaction_update(transaction, iter->refname,
brian m. carlson89f3bbd2017-10-15 22:06:53 +00001213 iter->oid, NULL,
Michael Haggerty91774af2017-11-05 09:42:06 +01001214 REF_NO_DEREF, NULL, &err))
Michael Haggerty27d03d02017-09-08 15:51:47 +02001215 die("failure preparing to create packed reference %s: %s",
1216 iter->refname, err.buf);
Michael Haggerty50c2d852017-04-16 08:41:41 +02001217
1218 /* Schedule the loose reference for pruning if requested. */
1219 if ((flags & PACK_REFS_PRUNE)) {
1220 struct ref_to_prune *n;
1221 FLEX_ALLOC_STR(n, name, iter->refname);
brian m. carlson49e99582017-10-15 22:06:49 +00001222 oidcpy(&n->oid, iter->oid);
Michael Haggerty50c2d852017-04-16 08:41:41 +02001223 n->next = refs_to_prune;
1224 refs_to_prune = n;
1225 }
1226 }
1227 if (ok != ITER_DONE)
1228 die("error while iterating over references");
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001229
Michael Haggerty27d03d02017-09-08 15:51:47 +02001230 if (ref_transaction_commit(transaction, &err))
1231 die("unable to write new packed-refs: %s", err.buf);
1232
1233 ref_transaction_free(transaction);
1234
Michael Haggerty42c7f7f2017-06-23 09:01:45 +02001235 packed_refs_unlock(refs->packed_ref_store);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001236
Michael Haggerty22b09cd2017-09-08 15:51:48 +02001237 prune_refs(refs, &refs_to_prune);
Michael Haggerty34789832017-06-23 09:01:39 +02001238 strbuf_release(&err);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001239 return 0;
1240}
1241
Michael Haggerty64da4192017-05-22 16:17:38 +02001242static int files_delete_refs(struct ref_store *ref_store, const char *msg,
David Turnera27dcf82016-09-04 18:08:40 +02001243 struct string_list *refnames, unsigned int flags)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001244{
Michael Haggerty0a95ac52016-09-04 18:08:30 +02001245 struct files_ref_store *refs =
Nguyễn Thái Ngọc Duy9e7ec632017-03-26 09:42:32 +07001246 files_downcast(ref_store, REF_STORE_WRITE, "delete_refs");
Patrick Steinhardt69840cc2022-01-17 09:12:31 +01001247 struct ref_transaction *transaction = NULL;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001248 struct strbuf err = STRBUF_INIT;
1249 int i, result = 0;
1250
1251 if (!refnames->nr)
1252 return 0;
1253
Michael Haggertye5cc7d72017-07-01 20:31:06 +02001254 if (packed_refs_lock(refs->packed_ref_store, 0, &err))
1255 goto error;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001256
Patrick Steinhardt2ed1b642022-01-17 09:12:53 +01001257 transaction = ref_store_transaction_begin(refs->packed_ref_store,
1258 REF_TRANSACTION_SKIP_HOOK, &err);
Patrick Steinhardt69840cc2022-01-17 09:12:31 +01001259 if (!transaction)
Michael Haggertye5cc7d72017-07-01 20:31:06 +02001260 goto error;
Patrick Steinhardt69840cc2022-01-17 09:12:31 +01001261
1262 result = packed_refs_delete_refs(refs->packed_ref_store,
1263 transaction, msg, refnames, flags);
1264 if (result)
1265 goto error;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001266
Michael Haggertye5cc7d72017-07-01 20:31:06 +02001267 packed_refs_unlock(refs->packed_ref_store);
1268
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001269 for (i = 0; i < refnames->nr; i++) {
1270 const char *refname = refnames->items[i].string;
1271
Michael Haggerty64da4192017-05-22 16:17:38 +02001272 if (refs_delete_ref(&refs->base, msg, refname, NULL, flags))
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001273 result |= error(_("could not remove reference %s"), refname);
1274 }
1275
Patrick Steinhardt69840cc2022-01-17 09:12:31 +01001276 ref_transaction_free(transaction);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001277 strbuf_release(&err);
1278 return result;
Michael Haggertye5cc7d72017-07-01 20:31:06 +02001279
1280error:
1281 /*
1282 * If we failed to rewrite the packed-refs file, then it is
1283 * unsafe to try to remove loose refs, because doing so might
1284 * expose an obsolete packed value for a reference that might
1285 * even point at an object that has been garbage collected.
1286 */
1287 if (refnames->nr == 1)
1288 error(_("could not delete reference %s: %s"),
1289 refnames->items[0].string, err.buf);
1290 else
1291 error(_("could not delete references: %s"), err.buf);
1292
Patrick Steinhardt69840cc2022-01-17 09:12:31 +01001293 ref_transaction_free(transaction);
Michael Haggertye5cc7d72017-07-01 20:31:06 +02001294 strbuf_release(&err);
1295 return -1;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001296}
1297
1298/*
1299 * People using contrib's git-new-workdir have .git/logs/refs ->
1300 * /some/other/path/.git/logs/refs, and that may live on another device.
1301 *
1302 * IOW, to avoid cross device rename errors, the temporary renamed log must
1303 * live into logs/refs.
1304 */
Nguyễn Thái Ngọc Duya5c1efd2017-03-26 09:42:21 +07001305#define TMP_RENAMED_LOG "refs/.tmp-renamed-log"
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001306
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07001307struct rename_cb {
1308 const char *tmp_renamed_log;
1309 int true_errno;
1310};
Michael Haggerty6a7f3632017-01-06 17:22:29 +01001311
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07001312static int rename_tmp_log_callback(const char *path, void *cb_data)
1313{
1314 struct rename_cb *cb = cb_data;
1315
1316 if (rename(cb->tmp_renamed_log, path)) {
Michael Haggerty6a7f3632017-01-06 17:22:29 +01001317 /*
1318 * rename(a, b) when b is an existing directory ought
1319 * to result in ISDIR, but Solaris 5.8 gives ENOTDIR.
1320 * Sheesh. Record the true errno for error reporting,
1321 * but report EISDIR to raceproof_create_file() so
1322 * that it knows to retry.
1323 */
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07001324 cb->true_errno = errno;
Michael Haggerty6a7f3632017-01-06 17:22:29 +01001325 if (errno == ENOTDIR)
1326 errno = EISDIR;
1327 return -1;
1328 } else {
1329 return 0;
1330 }
1331}
1332
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07001333static int rename_tmp_log(struct files_ref_store *refs, const char *newrefname)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001334{
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07001335 struct strbuf path = STRBUF_INIT;
1336 struct strbuf tmp = STRBUF_INIT;
1337 struct rename_cb cb;
1338 int ret;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001339
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07001340 files_reflog_path(refs, &path, newrefname);
1341 files_reflog_path(refs, &tmp, TMP_RENAMED_LOG);
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07001342 cb.tmp_renamed_log = tmp.buf;
1343 ret = raceproof_create_file(path.buf, rename_tmp_log_callback, &cb);
Michael Haggerty6a7f3632017-01-06 17:22:29 +01001344 if (ret) {
1345 if (errno == EISDIR)
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07001346 error("directory not empty: %s", path.buf);
Michael Haggerty6a7f3632017-01-06 17:22:29 +01001347 else
Michael Haggerty990c98d2017-01-06 17:22:30 +01001348 error("unable to move logfile %s to %s: %s",
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07001349 tmp.buf, path.buf,
1350 strerror(cb.true_errno));
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001351 }
1352
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07001353 strbuf_release(&path);
1354 strbuf_release(&tmp);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001355 return ret;
1356}
1357
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001358static int write_ref_to_lockfile(struct ref_lock *lock,
Han-Wen Nienhuyse9706a12021-12-07 13:38:17 +00001359 const struct object_id *oid,
1360 int skip_oid_verification, struct strbuf *err);
Michael Haggertyf18a7892016-09-04 18:08:32 +02001361static int commit_ref_update(struct files_ref_store *refs,
1362 struct ref_lock *lock,
brian m. carlson4417df82017-05-06 22:10:24 +00001363 const struct object_id *oid, const char *logmsg,
Michael Haggerty5d9b2de2016-04-22 14:38:56 +02001364 struct strbuf *err);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001365
Ævar Arnfjörð Bjarmasonc339ff62021-10-16 11:39:11 +02001366/*
Ævar Arnfjörð Bjarmason52106432021-10-16 11:39:13 +02001367 * Emit a better error message than lockfile.c's
1368 * unable_to_lock_message() would in case there is a D/F conflict with
1369 * another existing reference. If there would be a conflict, emit an error
Ævar Arnfjörð Bjarmasonc339ff62021-10-16 11:39:11 +02001370 * message and return false; otherwise, return true.
1371 *
1372 * Note that this function is not safe against all races with other
Ævar Arnfjörð Bjarmason52106432021-10-16 11:39:13 +02001373 * processes, and that's not its job. We'll emit a more verbose error on D/f
1374 * conflicts if we get past it into lock_ref_oid_basic().
Ævar Arnfjörð Bjarmasonc339ff62021-10-16 11:39:11 +02001375 */
1376static int refs_rename_ref_available(struct ref_store *refs,
1377 const char *old_refname,
1378 const char *new_refname)
1379{
1380 struct string_list skip = STRING_LIST_INIT_NODUP;
1381 struct strbuf err = STRBUF_INIT;
1382 int ok;
1383
1384 string_list_insert(&skip, old_refname);
1385 ok = !refs_verify_refname_available(refs, new_refname,
1386 NULL, &skip, &err);
1387 if (!ok)
1388 error("%s", err.buf);
1389
1390 string_list_clear(&skip, 0);
1391 strbuf_release(&err);
1392 return ok;
1393}
1394
Sahil Dua52d59cc2017-06-18 23:19:16 +02001395static int files_copy_or_rename_ref(struct ref_store *ref_store,
David Turner9b6b40d2016-09-04 18:08:42 +02001396 const char *oldrefname, const char *newrefname,
Sahil Dua52d59cc2017-06-18 23:19:16 +02001397 const char *logmsg, int copy)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001398{
David Turner9b6b40d2016-09-04 18:08:42 +02001399 struct files_ref_store *refs =
Nguyễn Thái Ngọc Duy9e7ec632017-03-26 09:42:32 +07001400 files_downcast(ref_store, REF_STORE_WRITE, "rename_ref");
René Scharfee0ae2442019-12-11 19:46:19 +01001401 struct object_id orig_oid;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001402 int flag = 0, logmoved = 0;
1403 struct ref_lock *lock;
1404 struct stat loginfo;
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07001405 struct strbuf sb_oldref = STRBUF_INIT;
1406 struct strbuf sb_newref = STRBUF_INIT;
1407 struct strbuf tmp_renamed_log = STRBUF_INIT;
1408 int log, ret;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001409 struct strbuf err = STRBUF_INIT;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001410
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07001411 files_reflog_path(refs, &sb_oldref, oldrefname);
1412 files_reflog_path(refs, &sb_newref, newrefname);
1413 files_reflog_path(refs, &tmp_renamed_log, TMP_RENAMED_LOG);
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07001414
1415 log = !lstat(sb_oldref.buf, &loginfo);
Nguyễn Thái Ngọc Duy0a3f07d2017-03-26 09:42:19 +07001416 if (log && S_ISLNK(loginfo.st_mode)) {
1417 ret = error("reflog for %s is a symlink", oldrefname);
1418 goto out;
1419 }
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001420
Nguyễn Thái Ngọc Duy2f40e952017-03-26 09:42:36 +07001421 if (!refs_resolve_ref_unsafe(&refs->base, oldrefname,
1422 RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE,
Ævar Arnfjörð Bjarmasonce14de02022-01-26 15:37:01 +01001423 &orig_oid, &flag)) {
Nguyễn Thái Ngọc Duy0a3f07d2017-03-26 09:42:19 +07001424 ret = error("refname %s not found", oldrefname);
1425 goto out;
1426 }
Michael Haggertye711b1a2016-04-21 23:42:19 +02001427
Nguyễn Thái Ngọc Duy0a3f07d2017-03-26 09:42:19 +07001428 if (flag & REF_ISSYMREF) {
Sahil Dua52d59cc2017-06-18 23:19:16 +02001429 if (copy)
1430 ret = error("refname %s is a symbolic ref, copying it is not supported",
1431 oldrefname);
1432 else
1433 ret = error("refname %s is a symbolic ref, renaming it is not supported",
1434 oldrefname);
Nguyễn Thái Ngọc Duy0a3f07d2017-03-26 09:42:19 +07001435 goto out;
1436 }
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07001437 if (!refs_rename_ref_available(&refs->base, oldrefname, newrefname)) {
Nguyễn Thái Ngọc Duy0a3f07d2017-03-26 09:42:19 +07001438 ret = 1;
1439 goto out;
1440 }
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001441
Sahil Dua52d59cc2017-06-18 23:19:16 +02001442 if (!copy && log && rename(sb_oldref.buf, tmp_renamed_log.buf)) {
Nguyễn Thái Ngọc Duya5c1efd2017-03-26 09:42:21 +07001443 ret = error("unable to move logfile logs/%s to logs/"TMP_RENAMED_LOG": %s",
Nguyễn Thái Ngọc Duy0a3f07d2017-03-26 09:42:19 +07001444 oldrefname, strerror(errno));
1445 goto out;
1446 }
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001447
Sahil Dua52d59cc2017-06-18 23:19:16 +02001448 if (copy && log && copy_file(tmp_renamed_log.buf, sb_oldref.buf, 0644)) {
1449 ret = error("unable to copy logfile logs/%s to logs/"TMP_RENAMED_LOG": %s",
1450 oldrefname, strerror(errno));
1451 goto out;
1452 }
1453
1454 if (!copy && refs_delete_ref(&refs->base, logmsg, oldrefname,
Michael Haggerty91774af2017-11-05 09:42:06 +01001455 &orig_oid, REF_NO_DEREF)) {
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001456 error("unable to delete old %s", oldrefname);
1457 goto rollback;
1458 }
1459
David Turner12fd3492016-02-24 17:58:51 -05001460 /*
brian m. carlson4417df82017-05-06 22:10:24 +00001461 * Since we are doing a shallow lookup, oid is not the
1462 * correct value to pass to delete_ref as old_oid. But that
1463 * doesn't matter, because an old_oid check wouldn't add to
David Turner12fd3492016-02-24 17:58:51 -05001464 * the safety anyway; we want to delete the reference whatever
1465 * its current value.
1466 */
Ævar Arnfjörð Bjarmasonf1da24c2021-10-16 11:39:27 +02001467 if (!copy && refs_resolve_ref_unsafe(&refs->base, newrefname,
Ævar Arnfjörð Bjarmason76887df2021-10-16 11:39:14 +02001468 RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE,
Ævar Arnfjörð Bjarmasonce14de02022-01-26 15:37:01 +01001469 NULL, NULL) &&
Nguyễn Thái Ngọc Duy2f40e952017-03-26 09:42:36 +07001470 refs_delete_ref(&refs->base, NULL, newrefname,
Michael Haggerty91774af2017-11-05 09:42:06 +01001471 NULL, REF_NO_DEREF)) {
Michael Haggerty58364322017-01-06 17:22:21 +01001472 if (errno == EISDIR) {
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001473 struct strbuf path = STRBUF_INIT;
1474 int result;
1475
Nguyễn Thái Ngọc Duy19e02f42017-03-26 09:42:23 +07001476 files_ref_path(refs, &path, newrefname);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001477 result = remove_empty_directories(&path);
1478 strbuf_release(&path);
1479
1480 if (result) {
1481 error("Directory not empty: %s", newrefname);
1482 goto rollback;
1483 }
1484 } else {
1485 error("unable to delete existing %s", newrefname);
1486 goto rollback;
1487 }
1488 }
1489
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07001490 if (log && rename_tmp_log(refs, newrefname))
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001491 goto rollback;
1492
1493 logmoved = log;
1494
Ævar Arnfjörð Bjarmason52106432021-10-16 11:39:13 +02001495 lock = lock_ref_oid_basic(refs, newrefname, &err);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001496 if (!lock) {
Sahil Dua52d59cc2017-06-18 23:19:16 +02001497 if (copy)
1498 error("unable to copy '%s' to '%s': %s", oldrefname, newrefname, err.buf);
1499 else
1500 error("unable to rename '%s' to '%s': %s", oldrefname, newrefname, err.buf);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001501 strbuf_release(&err);
1502 goto rollback;
1503 }
brian m. carlson4417df82017-05-06 22:10:24 +00001504 oidcpy(&lock->old_oid, &orig_oid);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001505
Han-Wen Nienhuyse9706a12021-12-07 13:38:17 +00001506 if (write_ref_to_lockfile(lock, &orig_oid, 0, &err) ||
brian m. carlson4417df82017-05-06 22:10:24 +00001507 commit_ref_update(refs, lock, &orig_oid, logmsg, &err)) {
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001508 error("unable to write current sha1 into %s: %s", newrefname, err.buf);
1509 strbuf_release(&err);
1510 goto rollback;
1511 }
1512
Nguyễn Thái Ngọc Duy0a3f07d2017-03-26 09:42:19 +07001513 ret = 0;
1514 goto out;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001515
1516 rollback:
Ævar Arnfjörð Bjarmason52106432021-10-16 11:39:13 +02001517 lock = lock_ref_oid_basic(refs, oldrefname, &err);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001518 if (!lock) {
1519 error("unable to lock %s for rollback: %s", oldrefname, err.buf);
1520 strbuf_release(&err);
1521 goto rollbacklog;
1522 }
1523
1524 flag = log_all_ref_updates;
Cornelius Weig341fb282017-01-27 11:09:47 +01001525 log_all_ref_updates = LOG_REFS_NONE;
Han-Wen Nienhuyse9706a12021-12-07 13:38:17 +00001526 if (write_ref_to_lockfile(lock, &orig_oid, 0, &err) ||
brian m. carlson4417df82017-05-06 22:10:24 +00001527 commit_ref_update(refs, lock, &orig_oid, NULL, &err)) {
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001528 error("unable to write current sha1 into %s: %s", oldrefname, err.buf);
1529 strbuf_release(&err);
1530 }
1531 log_all_ref_updates = flag;
1532
1533 rollbacklog:
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07001534 if (logmoved && rename(sb_newref.buf, sb_oldref.buf))
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001535 error("unable to restore logfile %s from %s: %s",
1536 oldrefname, newrefname, strerror(errno));
1537 if (!logmoved && log &&
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07001538 rename(tmp_renamed_log.buf, sb_oldref.buf))
Nguyễn Thái Ngọc Duya5c1efd2017-03-26 09:42:21 +07001539 error("unable to restore logfile %s from logs/"TMP_RENAMED_LOG": %s",
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001540 oldrefname, strerror(errno));
Nguyễn Thái Ngọc Duy0a3f07d2017-03-26 09:42:19 +07001541 ret = 1;
1542 out:
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07001543 strbuf_release(&sb_newref);
1544 strbuf_release(&sb_oldref);
1545 strbuf_release(&tmp_renamed_log);
1546
Nguyễn Thái Ngọc Duy0a3f07d2017-03-26 09:42:19 +07001547 return ret;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001548}
1549
Sahil Dua52d59cc2017-06-18 23:19:16 +02001550static int files_rename_ref(struct ref_store *ref_store,
1551 const char *oldrefname, const char *newrefname,
1552 const char *logmsg)
1553{
1554 return files_copy_or_rename_ref(ref_store, oldrefname,
1555 newrefname, logmsg, 0);
1556}
1557
1558static int files_copy_ref(struct ref_store *ref_store,
1559 const char *oldrefname, const char *newrefname,
1560 const char *logmsg)
1561{
1562 return files_copy_or_rename_ref(ref_store, oldrefname,
1563 newrefname, logmsg, 1);
1564}
1565
Jeff King83a30692017-09-05 08:14:33 -04001566static int close_ref_gently(struct ref_lock *lock)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001567{
Jeff Kingee4d8e42017-09-05 08:15:15 -04001568 if (close_lock_file_gently(&lock->lk))
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001569 return -1;
1570 return 0;
1571}
1572
1573static int commit_ref(struct ref_lock *lock)
1574{
Jeff Kingee4d8e42017-09-05 08:15:15 -04001575 char *path = get_locked_file_path(&lock->lk);
Michael Haggerty5387c0d2016-05-05 15:33:03 +02001576 struct stat st;
1577
1578 if (!lstat(path, &st) && S_ISDIR(st.st_mode)) {
1579 /*
1580 * There is a directory at the path we want to rename
1581 * the lockfile to. Hopefully it is empty; try to
1582 * delete it.
1583 */
1584 size_t len = strlen(path);
1585 struct strbuf sb_path = STRBUF_INIT;
1586
1587 strbuf_attach(&sb_path, path, len, len);
1588
1589 /*
1590 * If this fails, commit_lock_file() will also fail
1591 * and will report the problem.
1592 */
1593 remove_empty_directories(&sb_path);
1594 strbuf_release(&sb_path);
1595 } else {
1596 free(path);
1597 }
1598
Jeff Kingee4d8e42017-09-05 08:15:15 -04001599 if (commit_lock_file(&lock->lk))
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001600 return -1;
1601 return 0;
1602}
1603
Michael Haggerty1fb0c802017-01-06 17:22:33 +01001604static int open_or_create_logfile(const char *path, void *cb)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001605{
Michael Haggerty1fb0c802017-01-06 17:22:33 +01001606 int *fd = cb;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001607
Michael Haggerty1fb0c802017-01-06 17:22:33 +01001608 *fd = open(path, O_APPEND | O_WRONLY | O_CREAT, 0666);
1609 return (*fd < 0) ? -1 : 0;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001610}
1611
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001612/*
Michael Haggerty4533e532017-01-06 17:22:36 +01001613 * Create a reflog for a ref. If force_create = 0, only create the
1614 * reflog for certain refs (those for which should_autocreate_reflog
1615 * returns non-zero). Otherwise, create it regardless of the reference
1616 * name. If the logfile already existed or was created, return 0 and
1617 * set *logfd to the file descriptor opened for appending to the file.
1618 * If no logfile exists and we decided not to create one, return 0 and
1619 * set *logfd to -1. On failure, fill in *err, set *logfd to -1, and
1620 * return -1.
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001621 */
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07001622static int log_ref_setup(struct files_ref_store *refs,
1623 const char *refname, int force_create,
Michael Haggerty4533e532017-01-06 17:22:36 +01001624 int *logfd, struct strbuf *err)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001625{
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07001626 struct strbuf logfile_sb = STRBUF_INIT;
1627 char *logfile;
1628
1629 files_reflog_path(refs, &logfile_sb, refname);
1630 logfile = strbuf_detach(&logfile_sb, NULL);
Michael Haggerty854bda62017-01-06 17:22:32 +01001631
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001632 if (force_create || should_autocreate_reflog(refname)) {
Michael Haggerty4533e532017-01-06 17:22:36 +01001633 if (raceproof_create_file(logfile, open_or_create_logfile, logfd)) {
Michael Haggerty1fb0c802017-01-06 17:22:33 +01001634 if (errno == ENOENT)
1635 strbuf_addf(err, "unable to create directory for '%s': "
Michael Haggerty4533e532017-01-06 17:22:36 +01001636 "%s", logfile, strerror(errno));
Michael Haggerty1fb0c802017-01-06 17:22:33 +01001637 else if (errno == EISDIR)
1638 strbuf_addf(err, "there are still logs under '%s'",
Michael Haggerty4533e532017-01-06 17:22:36 +01001639 logfile);
Michael Haggerty1fb0c802017-01-06 17:22:33 +01001640 else
Michael Haggerty854bda62017-01-06 17:22:32 +01001641 strbuf_addf(err, "unable to append to '%s': %s",
Michael Haggerty4533e532017-01-06 17:22:36 +01001642 logfile, strerror(errno));
Michael Haggerty1fb0c802017-01-06 17:22:33 +01001643
Michael Haggerty4533e532017-01-06 17:22:36 +01001644 goto error;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001645 }
Michael Haggerty854bda62017-01-06 17:22:32 +01001646 } else {
René Scharfe35cf94e2021-09-09 23:45:51 +02001647 *logfd = open(logfile, O_APPEND | O_WRONLY);
Michael Haggertye404f452017-01-06 17:22:34 +01001648 if (*logfd < 0) {
Michael Haggerty854bda62017-01-06 17:22:32 +01001649 if (errno == ENOENT || errno == EISDIR) {
1650 /*
1651 * The logfile doesn't already exist,
1652 * but that is not an error; it only
1653 * means that we won't write log
1654 * entries to it.
1655 */
1656 ;
1657 } else {
1658 strbuf_addf(err, "unable to append to '%s': %s",
Michael Haggerty4533e532017-01-06 17:22:36 +01001659 logfile, strerror(errno));
1660 goto error;
Michael Haggerty854bda62017-01-06 17:22:32 +01001661 }
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001662 }
1663 }
1664
Michael Haggertye404f452017-01-06 17:22:34 +01001665 if (*logfd >= 0)
Michael Haggerty4533e532017-01-06 17:22:36 +01001666 adjust_shared_perm(logfile);
Michael Haggerty854bda62017-01-06 17:22:32 +01001667
Michael Haggerty4533e532017-01-06 17:22:36 +01001668 free(logfile);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001669 return 0;
Michael Haggerty4533e532017-01-06 17:22:36 +01001670
1671error:
1672 free(logfile);
1673 return -1;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001674}
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001675
Han-Wen Nienhuys7b089122021-11-22 14:19:08 +00001676static int files_create_reflog(struct ref_store *ref_store, const char *refname,
David Turnere3688bd2016-09-04 18:08:38 +02001677 struct strbuf *err)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001678{
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07001679 struct files_ref_store *refs =
Nguyễn Thái Ngọc Duy9e7ec632017-03-26 09:42:32 +07001680 files_downcast(ref_store, REF_STORE_WRITE, "create_reflog");
Michael Haggertye404f452017-01-06 17:22:34 +01001681 int fd;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001682
Han-Wen Nienhuys7b089122021-11-22 14:19:08 +00001683 if (log_ref_setup(refs, refname, 1, &fd, err))
Michael Haggerty4533e532017-01-06 17:22:36 +01001684 return -1;
1685
Michael Haggertye404f452017-01-06 17:22:34 +01001686 if (fd >= 0)
1687 close(fd);
Michael Haggerty4533e532017-01-06 17:22:36 +01001688
1689 return 0;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001690}
1691
brian m. carlson4417df82017-05-06 22:10:24 +00001692static int log_ref_write_fd(int fd, const struct object_id *old_oid,
1693 const struct object_id *new_oid,
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001694 const char *committer, const char *msg)
1695{
Ben Peart80a6c202018-07-10 21:08:22 +00001696 struct strbuf sb = STRBUF_INIT;
1697 int ret = 0;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001698
Ben Peart80a6c202018-07-10 21:08:22 +00001699 strbuf_addf(&sb, "%s %s %s", oid_to_hex(old_oid), oid_to_hex(new_oid), committer);
Han-Wen Nienhuys25429fe2020-07-31 11:36:10 +00001700 if (msg && *msg) {
1701 strbuf_addch(&sb, '\t');
Junio C Hamano523fa692020-07-10 17:19:53 +00001702 strbuf_addstr(&sb, msg);
Han-Wen Nienhuys25429fe2020-07-31 11:36:10 +00001703 }
Ben Peart80a6c202018-07-10 21:08:22 +00001704 strbuf_addch(&sb, '\n');
1705 if (write_in_full(fd, sb.buf, sb.len) < 0)
1706 ret = -1;
1707 strbuf_release(&sb);
1708 return ret;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001709}
1710
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07001711static int files_log_ref_write(struct files_ref_store *refs,
brian m. carlson4417df82017-05-06 22:10:24 +00001712 const char *refname, const struct object_id *old_oid,
1713 const struct object_id *new_oid, const char *msg,
Nguyễn Thái Ngọc Duy11f84572017-03-26 09:42:15 +07001714 int flags, struct strbuf *err)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001715{
Michael Haggertye404f452017-01-06 17:22:34 +01001716 int logfd, result;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001717
Cornelius Weig341fb282017-01-27 11:09:47 +01001718 if (log_all_ref_updates == LOG_REFS_UNSET)
1719 log_all_ref_updates = is_bare_repository() ? LOG_REFS_NONE : LOG_REFS_NORMAL;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001720
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07001721 result = log_ref_setup(refs, refname,
1722 flags & REF_FORCE_CREATE_REFLOG,
Michael Haggerty4533e532017-01-06 17:22:36 +01001723 &logfd, err);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001724
1725 if (result)
1726 return result;
1727
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001728 if (logfd < 0)
1729 return 0;
brian m. carlson4417df82017-05-06 22:10:24 +00001730 result = log_ref_write_fd(logfd, old_oid, new_oid,
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001731 git_committer_info(0), msg);
1732 if (result) {
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07001733 struct strbuf sb = STRBUF_INIT;
Michael Haggerty87b21e02017-01-06 17:22:35 +01001734 int save_errno = errno;
1735
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07001736 files_reflog_path(refs, &sb, refname);
Michael Haggerty87b21e02017-01-06 17:22:35 +01001737 strbuf_addf(err, "unable to append to '%s': %s",
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07001738 sb.buf, strerror(save_errno));
1739 strbuf_release(&sb);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001740 close(logfd);
1741 return -1;
1742 }
1743 if (close(logfd)) {
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07001744 struct strbuf sb = STRBUF_INIT;
Michael Haggerty87b21e02017-01-06 17:22:35 +01001745 int save_errno = errno;
1746
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07001747 files_reflog_path(refs, &sb, refname);
Michael Haggerty87b21e02017-01-06 17:22:35 +01001748 strbuf_addf(err, "unable to append to '%s': %s",
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07001749 sb.buf, strerror(save_errno));
1750 strbuf_release(&sb);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001751 return -1;
1752 }
1753 return 0;
1754}
1755
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001756/*
Michael Haggerty78fb4572017-11-05 09:42:09 +01001757 * Write oid into the open lockfile, then close the lockfile. On
1758 * errors, rollback the lockfile, fill in *err and return -1.
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001759 */
1760static int write_ref_to_lockfile(struct ref_lock *lock,
Han-Wen Nienhuyse9706a12021-12-07 13:38:17 +00001761 const struct object_id *oid,
1762 int skip_oid_verification, struct strbuf *err)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001763{
1764 static char term = '\n';
1765 struct object *o;
1766 int fd;
1767
Han-Wen Nienhuyse9706a12021-12-07 13:38:17 +00001768 if (!skip_oid_verification) {
1769 o = parse_object(the_repository, oid);
1770 if (!o) {
1771 strbuf_addf(
1772 err,
1773 "trying to write ref '%s' with nonexistent object %s",
1774 lock->ref_name, oid_to_hex(oid));
1775 unlock_ref(lock);
1776 return -1;
1777 }
1778 if (o->type != OBJ_COMMIT && is_branch(lock->ref_name)) {
1779 strbuf_addf(
1780 err,
1781 "trying to write non-commit object %s to branch '%s'",
1782 oid_to_hex(oid), lock->ref_name);
1783 unlock_ref(lock);
1784 return -1;
1785 }
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001786 }
Jeff Kingee4d8e42017-09-05 08:15:15 -04001787 fd = get_lock_file_fd(&lock->lk);
brian m. carlson2ae2e2a2018-07-16 01:27:59 +00001788 if (write_in_full(fd, oid_to_hex(oid), the_hash_algo->hexsz) < 0 ||
Jeff King06f46f22017-09-13 13:16:03 -04001789 write_in_full(fd, &term, 1) < 0 ||
Jeff King83a30692017-09-05 08:14:33 -04001790 close_ref_gently(lock) < 0) {
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001791 strbuf_addf(err,
Jeff Kingee4d8e42017-09-05 08:15:15 -04001792 "couldn't write '%s'", get_lock_file_path(&lock->lk));
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001793 unlock_ref(lock);
1794 return -1;
1795 }
1796 return 0;
1797}
1798
1799/*
1800 * Commit a change to a loose reference that has already been written
1801 * to the loose reference lockfile. Also update the reflogs if
1802 * necessary, using the specified lockmsg (which can be NULL).
1803 */
Michael Haggertyf18a7892016-09-04 18:08:32 +02001804static int commit_ref_update(struct files_ref_store *refs,
1805 struct ref_lock *lock,
brian m. carlson4417df82017-05-06 22:10:24 +00001806 const struct object_id *oid, const char *logmsg,
Michael Haggerty5d9b2de2016-04-22 14:38:56 +02001807 struct strbuf *err)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001808{
Michael Haggerty32c597e2017-02-10 12:16:16 +01001809 files_assert_main_repository(refs, "commit_ref_update");
Michael Haggerty00eebe32016-09-04 18:08:11 +02001810
1811 clear_loose_ref_cache(refs);
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07001812 if (files_log_ref_write(refs, lock->ref_name,
brian m. carlson4417df82017-05-06 22:10:24 +00001813 &lock->old_oid, oid,
Michael Haggerty81b1b6d2017-01-06 17:22:31 +01001814 logmsg, 0, err)) {
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001815 char *old_msg = strbuf_detach(err, NULL);
Michael Haggerty0568c8e2016-04-27 15:21:36 +02001816 strbuf_addf(err, "cannot update the ref '%s': %s",
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001817 lock->ref_name, old_msg);
1818 free(old_msg);
1819 unlock_ref(lock);
1820 return -1;
1821 }
Michael Haggerty7a418f32016-04-22 15:25:25 +02001822
1823 if (strcmp(lock->ref_name, "HEAD") != 0) {
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001824 /*
1825 * Special hack: If a branch is updated directly and HEAD
1826 * points to it (may happen on the remote side of a push
1827 * for example) then logically the HEAD reflog should be
1828 * updated too.
1829 * A generic solution implies reverse symref information,
1830 * but finding all symrefs pointing to the given branch
1831 * would be rather costly for this rare event (the direct
1832 * update of a branch) to be worth it. So let's cheat and
1833 * check with HEAD only which should cover 99% of all usage
1834 * scenarios (even 100% of the default ones).
1835 */
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001836 int head_flag;
1837 const char *head_ref;
Michael Haggerty7a418f32016-04-22 15:25:25 +02001838
Nguyễn Thái Ngọc Duy2f40e952017-03-26 09:42:36 +07001839 head_ref = refs_resolve_ref_unsafe(&refs->base, "HEAD",
1840 RESOLVE_REF_READING,
Ævar Arnfjörð Bjarmasonce14de02022-01-26 15:37:01 +01001841 NULL, &head_flag);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001842 if (head_ref && (head_flag & REF_ISSYMREF) &&
1843 !strcmp(head_ref, lock->ref_name)) {
1844 struct strbuf log_err = STRBUF_INIT;
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07001845 if (files_log_ref_write(refs, "HEAD",
brian m. carlson4417df82017-05-06 22:10:24 +00001846 &lock->old_oid, oid,
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07001847 logmsg, 0, &log_err)) {
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001848 error("%s", log_err.buf);
1849 strbuf_release(&log_err);
1850 }
1851 }
1852 }
Michael Haggerty7a418f32016-04-22 15:25:25 +02001853
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001854 if (commit_ref(lock)) {
Michael Haggerty0568c8e2016-04-27 15:21:36 +02001855 strbuf_addf(err, "couldn't set '%s'", lock->ref_name);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001856 unlock_ref(lock);
1857 return -1;
1858 }
1859
1860 unlock_ref(lock);
1861 return 0;
1862}
1863
Jeff King370e5ad2015-12-29 00:57:01 -05001864static int create_ref_symlink(struct ref_lock *lock, const char *target)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001865{
Jeff King370e5ad2015-12-29 00:57:01 -05001866 int ret = -1;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001867#ifndef NO_SYMLINK_HEAD
Jeff Kingee4d8e42017-09-05 08:15:15 -04001868 char *ref_path = get_locked_file_path(&lock->lk);
Jeff King370e5ad2015-12-29 00:57:01 -05001869 unlink(ref_path);
1870 ret = symlink(target, ref_path);
1871 free(ref_path);
1872
1873 if (ret)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001874 fprintf(stderr, "no symlink - falling back to symbolic ref\n");
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001875#endif
Jeff King370e5ad2015-12-29 00:57:01 -05001876 return ret;
1877}
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001878
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07001879static void update_symref_reflog(struct files_ref_store *refs,
1880 struct ref_lock *lock, const char *refname,
Jeff King370e5ad2015-12-29 00:57:01 -05001881 const char *target, const char *logmsg)
1882{
1883 struct strbuf err = STRBUF_INIT;
brian m. carlson4417df82017-05-06 22:10:24 +00001884 struct object_id new_oid;
Ævar Arnfjörð Bjarmason76887df2021-10-16 11:39:14 +02001885
Nguyễn Thái Ngọc Duy2f40e952017-03-26 09:42:36 +07001886 if (logmsg &&
Ævar Arnfjörð Bjarmasonf1da24c2021-10-16 11:39:27 +02001887 refs_resolve_ref_unsafe(&refs->base, target,
Ævar Arnfjörð Bjarmasonce14de02022-01-26 15:37:01 +01001888 RESOLVE_REF_READING, &new_oid, NULL) &&
brian m. carlson4417df82017-05-06 22:10:24 +00001889 files_log_ref_write(refs, refname, &lock->old_oid,
1890 &new_oid, logmsg, 0, &err)) {
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001891 error("%s", err.buf);
1892 strbuf_release(&err);
1893 }
Jeff King370e5ad2015-12-29 00:57:01 -05001894}
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001895
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07001896static int create_symref_locked(struct files_ref_store *refs,
1897 struct ref_lock *lock, const char *refname,
Jeff King370e5ad2015-12-29 00:57:01 -05001898 const char *target, const char *logmsg)
1899{
1900 if (prefer_symlink_refs && !create_ref_symlink(lock, target)) {
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07001901 update_symref_reflog(refs, lock, refname, target, logmsg);
Jeff King370e5ad2015-12-29 00:57:01 -05001902 return 0;
1903 }
1904
Jeff Kingee4d8e42017-09-05 08:15:15 -04001905 if (!fdopen_lock_file(&lock->lk, "w"))
Jeff King370e5ad2015-12-29 00:57:01 -05001906 return error("unable to fdopen %s: %s",
Martin Ågren7f0dc792021-01-05 20:23:49 +01001907 get_lock_file_path(&lock->lk), strerror(errno));
Jeff King370e5ad2015-12-29 00:57:01 -05001908
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07001909 update_symref_reflog(refs, lock, refname, target, logmsg);
Jeff King396da8f2015-12-29 00:57:25 -05001910
Jeff King370e5ad2015-12-29 00:57:01 -05001911 /* no error check; commit_ref will check ferror */
Martin Ågren7f0dc792021-01-05 20:23:49 +01001912 fprintf(get_lock_file_fp(&lock->lk), "ref: %s\n", target);
Jeff King370e5ad2015-12-29 00:57:01 -05001913 if (commit_ref(lock) < 0)
1914 return error("unable to write symref for %s: %s", refname,
1915 strerror(errno));
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001916 return 0;
1917}
1918
Michael Haggerty284689b2016-09-04 18:08:28 +02001919static int files_create_symref(struct ref_store *ref_store,
1920 const char *refname, const char *target,
1921 const char *logmsg)
Jeff King370e5ad2015-12-29 00:57:01 -05001922{
Michael Haggerty7eb27cd2016-09-04 18:08:34 +02001923 struct files_ref_store *refs =
Nguyễn Thái Ngọc Duy9e7ec632017-03-26 09:42:32 +07001924 files_downcast(ref_store, REF_STORE_WRITE, "create_symref");
Jeff King370e5ad2015-12-29 00:57:01 -05001925 struct strbuf err = STRBUF_INIT;
1926 struct ref_lock *lock;
1927 int ret;
1928
Ævar Arnfjörð Bjarmason52106432021-10-16 11:39:13 +02001929 lock = lock_ref_oid_basic(refs, refname, &err);
Jeff King370e5ad2015-12-29 00:57:01 -05001930 if (!lock) {
1931 error("%s", err.buf);
1932 strbuf_release(&err);
1933 return -1;
1934 }
1935
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07001936 ret = create_symref_locked(refs, lock, refname, target, logmsg);
Jeff King370e5ad2015-12-29 00:57:01 -05001937 unlock_ref(lock);
1938 return ret;
1939}
1940
David Turnere3688bd2016-09-04 18:08:38 +02001941static int files_reflog_exists(struct ref_store *ref_store,
1942 const char *refname)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001943{
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07001944 struct files_ref_store *refs =
Nguyễn Thái Ngọc Duy9e7ec632017-03-26 09:42:32 +07001945 files_downcast(ref_store, REF_STORE_READ, "reflog_exists");
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07001946 struct strbuf sb = STRBUF_INIT;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001947 struct stat st;
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07001948 int ret;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001949
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07001950 files_reflog_path(refs, &sb, refname);
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07001951 ret = !lstat(sb.buf, &st) && S_ISREG(st.st_mode);
1952 strbuf_release(&sb);
1953 return ret;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001954}
1955
David Turnere3688bd2016-09-04 18:08:38 +02001956static int files_delete_reflog(struct ref_store *ref_store,
1957 const char *refname)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001958{
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07001959 struct files_ref_store *refs =
Nguyễn Thái Ngọc Duy9e7ec632017-03-26 09:42:32 +07001960 files_downcast(ref_store, REF_STORE_WRITE, "delete_reflog");
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07001961 struct strbuf sb = STRBUF_INIT;
1962 int ret;
1963
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07001964 files_reflog_path(refs, &sb, refname);
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07001965 ret = remove_path(sb.buf);
1966 strbuf_release(&sb);
1967 return ret;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001968}
1969
1970static int show_one_reflog_ent(struct strbuf *sb, each_reflog_ent_fn fn, void *cb_data)
1971{
brian m. carlson9461d272017-02-21 23:47:32 +00001972 struct object_id ooid, noid;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001973 char *email_end, *message;
Johannes Schindelindddbad72017-04-26 21:29:31 +02001974 timestamp_t timestamp;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001975 int tz;
brian m. carlson43bc3b62017-02-21 23:47:33 +00001976 const char *p = sb->buf;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001977
1978 /* old SP new SP name <email> SP time TAB msg LF */
brian m. carlson43bc3b62017-02-21 23:47:33 +00001979 if (!sb->len || sb->buf[sb->len - 1] != '\n' ||
1980 parse_oid_hex(p, &ooid, &p) || *p++ != ' ' ||
1981 parse_oid_hex(p, &noid, &p) || *p++ != ' ' ||
1982 !(email_end = strchr(p, '>')) ||
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001983 email_end[1] != ' ' ||
Johannes Schindelin1aeb7e72017-04-21 12:45:44 +02001984 !(timestamp = parse_timestamp(email_end + 2, &message, 10)) ||
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001985 !message || message[0] != ' ' ||
1986 (message[1] != '+' && message[1] != '-') ||
1987 !isdigit(message[2]) || !isdigit(message[3]) ||
1988 !isdigit(message[4]) || !isdigit(message[5]))
1989 return 0; /* corrupt? */
1990 email_end[1] = '\0';
1991 tz = strtol(message + 1, NULL, 10);
1992 if (message[6] != '\t')
1993 message += 6;
1994 else
1995 message += 7;
brian m. carlson43bc3b62017-02-21 23:47:33 +00001996 return fn(&ooid, &noid, p, timestamp, tz, message, cb_data);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01001997}
1998
1999static char *find_beginning_of_line(char *bob, char *scan)
2000{
2001 while (bob < scan && *(--scan) != '\n')
2002 ; /* keep scanning backwards */
2003 /*
2004 * Return either beginning of the buffer, or LF at the end of
2005 * the previous line.
2006 */
2007 return scan;
2008}
2009
David Turnere3688bd2016-09-04 18:08:38 +02002010static int files_for_each_reflog_ent_reverse(struct ref_store *ref_store,
2011 const char *refname,
2012 each_reflog_ent_fn fn,
2013 void *cb_data)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002014{
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07002015 struct files_ref_store *refs =
Nguyễn Thái Ngọc Duy9e7ec632017-03-26 09:42:32 +07002016 files_downcast(ref_store, REF_STORE_READ,
2017 "for_each_reflog_ent_reverse");
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002018 struct strbuf sb = STRBUF_INIT;
2019 FILE *logfp;
2020 long pos;
2021 int ret = 0, at_tail = 1;
2022
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07002023 files_reflog_path(refs, &sb, refname);
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07002024 logfp = fopen(sb.buf, "r");
2025 strbuf_release(&sb);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002026 if (!logfp)
2027 return -1;
2028
2029 /* Jump to the end */
2030 if (fseek(logfp, 0, SEEK_END) < 0)
René Scharfebe686f02017-04-16 18:55:46 +02002031 ret = error("cannot seek back reflog for %s: %s",
2032 refname, strerror(errno));
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002033 pos = ftell(logfp);
2034 while (!ret && 0 < pos) {
2035 int cnt;
2036 size_t nread;
2037 char buf[BUFSIZ];
2038 char *endp, *scanp;
2039
2040 /* Fill next block from the end */
2041 cnt = (sizeof(buf) < pos) ? sizeof(buf) : pos;
René Scharfebe686f02017-04-16 18:55:46 +02002042 if (fseek(logfp, pos - cnt, SEEK_SET)) {
2043 ret = error("cannot seek back reflog for %s: %s",
2044 refname, strerror(errno));
2045 break;
2046 }
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002047 nread = fread(buf, cnt, 1, logfp);
René Scharfebe686f02017-04-16 18:55:46 +02002048 if (nread != 1) {
2049 ret = error("cannot read %d bytes from reflog for %s: %s",
2050 cnt, refname, strerror(errno));
2051 break;
2052 }
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002053 pos -= cnt;
2054
2055 scanp = endp = buf + cnt;
2056 if (at_tail && scanp[-1] == '\n')
2057 /* Looking at the final LF at the end of the file */
2058 scanp--;
2059 at_tail = 0;
2060
2061 while (buf < scanp) {
2062 /*
2063 * terminating LF of the previous line, or the beginning
2064 * of the buffer.
2065 */
2066 char *bp;
2067
2068 bp = find_beginning_of_line(buf, scanp);
2069
2070 if (*bp == '\n') {
2071 /*
2072 * The newline is the end of the previous line,
2073 * so we know we have complete line starting
2074 * at (bp + 1). Prefix it onto any prior data
2075 * we collected for the line and process it.
2076 */
2077 strbuf_splice(&sb, 0, 0, bp + 1, endp - (bp + 1));
2078 scanp = bp;
2079 endp = bp + 1;
2080 ret = show_one_reflog_ent(&sb, fn, cb_data);
2081 strbuf_reset(&sb);
2082 if (ret)
2083 break;
2084 } else if (!pos) {
2085 /*
2086 * We are at the start of the buffer, and the
2087 * start of the file; there is no previous
2088 * line, and we have everything for this one.
2089 * Process it, and we can end the loop.
2090 */
2091 strbuf_splice(&sb, 0, 0, buf, endp - buf);
2092 ret = show_one_reflog_ent(&sb, fn, cb_data);
2093 strbuf_reset(&sb);
2094 break;
2095 }
2096
2097 if (bp == buf) {
2098 /*
2099 * We are at the start of the buffer, and there
2100 * is more file to read backwards. Which means
2101 * we are in the middle of a line. Note that we
2102 * may get here even if *bp was a newline; that
2103 * just means we are at the exact end of the
2104 * previous line, rather than some spot in the
2105 * middle.
2106 *
2107 * Save away what we have to be combined with
2108 * the data from the next read.
2109 */
2110 strbuf_splice(&sb, 0, 0, buf, endp - buf);
2111 break;
2112 }
2113 }
2114
2115 }
2116 if (!ret && sb.len)
Johannes Schindelin033abf92018-05-02 11:38:39 +02002117 BUG("reverse reflog parser had leftover data");
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002118
2119 fclose(logfp);
2120 strbuf_release(&sb);
2121 return ret;
2122}
2123
David Turnere3688bd2016-09-04 18:08:38 +02002124static int files_for_each_reflog_ent(struct ref_store *ref_store,
2125 const char *refname,
2126 each_reflog_ent_fn fn, void *cb_data)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002127{
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07002128 struct files_ref_store *refs =
Nguyễn Thái Ngọc Duy9e7ec632017-03-26 09:42:32 +07002129 files_downcast(ref_store, REF_STORE_READ,
2130 "for_each_reflog_ent");
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002131 FILE *logfp;
2132 struct strbuf sb = STRBUF_INIT;
2133 int ret = 0;
2134
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07002135 files_reflog_path(refs, &sb, refname);
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07002136 logfp = fopen(sb.buf, "r");
2137 strbuf_release(&sb);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002138 if (!logfp)
2139 return -1;
2140
2141 while (!ret && !strbuf_getwholeline(&sb, logfp, '\n'))
2142 ret = show_one_reflog_ent(&sb, fn, cb_data);
2143 fclose(logfp);
2144 strbuf_release(&sb);
2145 return ret;
2146}
Michael Haggerty2880d162016-06-18 06:15:19 +02002147
2148struct files_reflog_iterator {
2149 struct ref_iterator base;
2150
Nguyễn Thái Ngọc Duy2f40e952017-03-26 09:42:36 +07002151 struct ref_store *ref_store;
Michael Haggerty2880d162016-06-18 06:15:19 +02002152 struct dir_iterator *dir_iterator;
2153 struct object_id oid;
2154};
2155
2156static int files_reflog_iterator_advance(struct ref_iterator *ref_iterator)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002157{
Michael Haggerty2880d162016-06-18 06:15:19 +02002158 struct files_reflog_iterator *iter =
2159 (struct files_reflog_iterator *)ref_iterator;
2160 struct dir_iterator *diter = iter->dir_iterator;
2161 int ok;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002162
Michael Haggerty2880d162016-06-18 06:15:19 +02002163 while ((ok = dir_iterator_advance(diter)) == ITER_OK) {
2164 int flags;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002165
Michael Haggerty2880d162016-06-18 06:15:19 +02002166 if (!S_ISREG(diter->st.st_mode))
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002167 continue;
Michael Haggerty2880d162016-06-18 06:15:19 +02002168 if (diter->basename[0] == '.')
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002169 continue;
Michael Haggerty2880d162016-06-18 06:15:19 +02002170 if (ends_with(diter->basename, ".lock"))
2171 continue;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002172
Ævar Arnfjörð Bjarmasonf1da24c2021-10-16 11:39:27 +02002173 if (!refs_resolve_ref_unsafe(iter->ref_store,
Ævar Arnfjörð Bjarmason76887df2021-10-16 11:39:14 +02002174 diter->relative_path, 0,
Ævar Arnfjörð Bjarmasonce14de02022-01-26 15:37:01 +01002175 &iter->oid, &flags)) {
Michael Haggerty2880d162016-06-18 06:15:19 +02002176 error("bad ref for %s", diter->path.buf);
2177 continue;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002178 }
Michael Haggerty2880d162016-06-18 06:15:19 +02002179
2180 iter->base.refname = diter->relative_path;
2181 iter->base.oid = &iter->oid;
2182 iter->base.flags = flags;
2183 return ITER_OK;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002184 }
Michael Haggerty2880d162016-06-18 06:15:19 +02002185
2186 iter->dir_iterator = NULL;
2187 if (ref_iterator_abort(ref_iterator) == ITER_ERROR)
2188 ok = ITER_ERROR;
2189 return ok;
2190}
2191
2192static int files_reflog_iterator_peel(struct ref_iterator *ref_iterator,
Han-Wen Nienhuyse9706a12021-12-07 13:38:17 +00002193 struct object_id *peeled)
Michael Haggerty2880d162016-06-18 06:15:19 +02002194{
Johannes Schindelin033abf92018-05-02 11:38:39 +02002195 BUG("ref_iterator_peel() called for reflog_iterator");
Michael Haggerty2880d162016-06-18 06:15:19 +02002196}
2197
2198static int files_reflog_iterator_abort(struct ref_iterator *ref_iterator)
2199{
2200 struct files_reflog_iterator *iter =
2201 (struct files_reflog_iterator *)ref_iterator;
2202 int ok = ITER_DONE;
2203
2204 if (iter->dir_iterator)
2205 ok = dir_iterator_abort(iter->dir_iterator);
2206
2207 base_ref_iterator_free(ref_iterator);
2208 return ok;
2209}
2210
2211static struct ref_iterator_vtable files_reflog_iterator_vtable = {
2212 files_reflog_iterator_advance,
2213 files_reflog_iterator_peel,
2214 files_reflog_iterator_abort
2215};
2216
Nguyễn Thái Ngọc Duy944b4e32017-08-23 19:37:00 +07002217static struct ref_iterator *reflog_iterator_begin(struct ref_store *ref_store,
2218 const char *gitdir)
Michael Haggerty2880d162016-06-18 06:15:19 +02002219{
Matheus Tavares30123972019-07-10 20:58:59 -03002220 struct dir_iterator *diter;
2221 struct files_reflog_iterator *iter;
2222 struct ref_iterator *ref_iterator;
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07002223 struct strbuf sb = STRBUF_INIT;
Michael Haggerty2880d162016-06-18 06:15:19 +02002224
Nguyễn Thái Ngọc Duy944b4e32017-08-23 19:37:00 +07002225 strbuf_addf(&sb, "%s/logs", gitdir);
Matheus Tavares30123972019-07-10 20:58:59 -03002226
Matheus Tavaresfa1da7d2019-07-10 20:59:00 -03002227 diter = dir_iterator_begin(sb.buf, 0);
René Scharfe9b7b0292019-08-07 13:15:14 +02002228 if (!diter) {
2229 strbuf_release(&sb);
Matheus Tavares30123972019-07-10 20:58:59 -03002230 return empty_ref_iterator_begin();
René Scharfe9b7b0292019-08-07 13:15:14 +02002231 }
Matheus Tavares30123972019-07-10 20:58:59 -03002232
René Scharfeca56dad2021-03-13 17:17:22 +01002233 CALLOC_ARRAY(iter, 1);
Matheus Tavares30123972019-07-10 20:58:59 -03002234 ref_iterator = &iter->base;
2235
2236 base_ref_iterator_init(ref_iterator, &files_reflog_iterator_vtable, 0);
2237 iter->dir_iterator = diter;
Nguyễn Thái Ngọc Duy2f40e952017-03-26 09:42:36 +07002238 iter->ref_store = ref_store;
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07002239 strbuf_release(&sb);
Nguyễn Thái Ngọc Duy944b4e32017-08-23 19:37:00 +07002240
Michael Haggerty2880d162016-06-18 06:15:19 +02002241 return ref_iterator;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002242}
2243
Nguyễn Thái Ngọc Duy944b4e32017-08-23 19:37:00 +07002244static enum iterator_selection reflog_iterator_select(
2245 struct ref_iterator *iter_worktree,
2246 struct ref_iterator *iter_common,
2247 void *cb_data)
2248{
2249 if (iter_worktree) {
2250 /*
2251 * We're a bit loose here. We probably should ignore
2252 * common refs if they are accidentally added as
2253 * per-worktree refs.
2254 */
2255 return ITER_SELECT_0;
2256 } else if (iter_common) {
2257 if (ref_type(iter_common->refname) == REF_TYPE_NORMAL)
2258 return ITER_SELECT_1;
2259
2260 /*
2261 * The main ref store may contain main worktree's
2262 * per-worktree refs, which should be ignored
2263 */
2264 return ITER_SKIP_1;
2265 } else
2266 return ITER_DONE;
2267}
2268
2269static struct ref_iterator *files_reflog_iterator_begin(struct ref_store *ref_store)
2270{
2271 struct files_ref_store *refs =
2272 files_downcast(ref_store, REF_STORE_READ,
2273 "reflog_iterator_begin");
2274
Han-Wen Nienhuys5085aef2020-08-19 14:27:57 +00002275 if (!strcmp(refs->base.gitdir, refs->gitcommondir)) {
Nguyễn Thái Ngọc Duy944b4e32017-08-23 19:37:00 +07002276 return reflog_iterator_begin(ref_store, refs->gitcommondir);
2277 } else {
2278 return merge_ref_iterator_begin(
Han-Wen Nienhuys5085aef2020-08-19 14:27:57 +00002279 0, reflog_iterator_begin(ref_store, refs->base.gitdir),
Nguyễn Thái Ngọc Duy944b4e32017-08-23 19:37:00 +07002280 reflog_iterator_begin(ref_store, refs->gitcommondir),
2281 reflog_iterator_select, refs);
2282 }
2283}
2284
Michael Haggerty165056b2016-04-24 08:58:41 +02002285/*
Michael Haggerty92b15512016-04-25 15:56:07 +02002286 * If update is a direct update of head_ref (the reference pointed to
2287 * by HEAD), then add an extra REF_LOG_ONLY update for HEAD.
Michael Haggerty165056b2016-04-24 08:58:41 +02002288 */
Michael Haggerty92b15512016-04-25 15:56:07 +02002289static int split_head_update(struct ref_update *update,
2290 struct ref_transaction *transaction,
2291 const char *head_ref,
2292 struct string_list *affected_refnames,
2293 struct strbuf *err)
2294{
2295 struct string_list_item *item;
2296 struct ref_update *new_update;
2297
2298 if ((update->flags & REF_LOG_ONLY) ||
Michael Haggertyacedcde2017-11-05 09:42:07 +01002299 (update->flags & REF_IS_PRUNING) ||
Michael Haggerty92b15512016-04-25 15:56:07 +02002300 (update->flags & REF_UPDATE_VIA_HEAD))
2301 return 0;
2302
2303 if (strcmp(update->refname, head_ref))
2304 return 0;
2305
2306 /*
2307 * First make sure that HEAD is not already in the
Martin Ågren276d0e32017-09-09 08:57:18 +02002308 * transaction. This check is O(lg N) in the transaction
Michael Haggerty92b15512016-04-25 15:56:07 +02002309 * size, but it happens at most once per transaction.
2310 */
Martin Ågren276d0e32017-09-09 08:57:18 +02002311 if (string_list_has_string(affected_refnames, "HEAD")) {
Michael Haggerty92b15512016-04-25 15:56:07 +02002312 /* An entry already existed */
2313 strbuf_addf(err,
2314 "multiple updates for 'HEAD' (including one "
2315 "via its referent '%s') are not allowed",
2316 update->refname);
2317 return TRANSACTION_NAME_CONFLICT;
2318 }
2319
2320 new_update = ref_transaction_add_update(
2321 transaction, "HEAD",
Michael Haggerty91774af2017-11-05 09:42:06 +01002322 update->flags | REF_LOG_ONLY | REF_NO_DEREF,
brian m. carlson89f3bbd2017-10-15 22:06:53 +00002323 &update->new_oid, &update->old_oid,
Michael Haggerty92b15512016-04-25 15:56:07 +02002324 update->msg);
2325
Martin Ågren276d0e32017-09-09 08:57:18 +02002326 /*
2327 * Add "HEAD". This insertion is O(N) in the transaction
2328 * size, but it happens at most once per transaction.
2329 * Add new_update->refname instead of a literal "HEAD".
2330 */
2331 if (strcmp(new_update->refname, "HEAD"))
2332 BUG("%s unexpectedly not 'HEAD'", new_update->refname);
2333 item = string_list_insert(affected_refnames, new_update->refname);
Michael Haggerty92b15512016-04-25 15:56:07 +02002334 item->util = new_update;
2335
2336 return 0;
2337}
2338
2339/*
2340 * update is for a symref that points at referent and doesn't have
Michael Haggerty91774af2017-11-05 09:42:06 +01002341 * REF_NO_DEREF set. Split it into two updates:
2342 * - The original update, but with REF_LOG_ONLY and REF_NO_DEREF set
Michael Haggerty92b15512016-04-25 15:56:07 +02002343 * - A new, separate update for the referent reference
2344 * Note that the new update will itself be subject to splitting when
2345 * the iteration gets to it.
2346 */
Jeff King10dee402019-02-14 00:50:46 -05002347static int split_symref_update(struct ref_update *update,
Michael Haggerty92b15512016-04-25 15:56:07 +02002348 const char *referent,
Michael Haggerty165056b2016-04-24 08:58:41 +02002349 struct ref_transaction *transaction,
2350 struct string_list *affected_refnames,
2351 struct strbuf *err)
2352{
Michael Haggerty92b15512016-04-25 15:56:07 +02002353 struct string_list_item *item;
2354 struct ref_update *new_update;
2355 unsigned int new_flags;
Michael Haggerty165056b2016-04-24 08:58:41 +02002356
Michael Haggerty92b15512016-04-25 15:56:07 +02002357 /*
2358 * First make sure that referent is not already in the
Martin Ågrenc2994682017-09-09 08:57:15 +02002359 * transaction. This check is O(lg N) in the transaction
Michael Haggerty92b15512016-04-25 15:56:07 +02002360 * size, but it happens at most once per symref in a
2361 * transaction.
2362 */
Martin Ågrenc2994682017-09-09 08:57:15 +02002363 if (string_list_has_string(affected_refnames, referent)) {
2364 /* An entry already exists */
Michael Haggerty92b15512016-04-25 15:56:07 +02002365 strbuf_addf(err,
2366 "multiple updates for '%s' (including one "
2367 "via symref '%s') are not allowed",
2368 referent, update->refname);
2369 return TRANSACTION_NAME_CONFLICT;
2370 }
2371
2372 new_flags = update->flags;
2373 if (!strcmp(update->refname, "HEAD")) {
2374 /*
2375 * Record that the new update came via HEAD, so that
2376 * when we process it, split_head_update() doesn't try
2377 * to add another reflog update for HEAD. Note that
2378 * this bit will be propagated if the new_update
2379 * itself needs to be split.
2380 */
2381 new_flags |= REF_UPDATE_VIA_HEAD;
2382 }
2383
2384 new_update = ref_transaction_add_update(
2385 transaction, referent, new_flags,
brian m. carlson89f3bbd2017-10-15 22:06:53 +00002386 &update->new_oid, &update->old_oid,
Michael Haggerty92b15512016-04-25 15:56:07 +02002387 update->msg);
2388
Michael Haggerty6e30b2f2016-04-25 17:48:32 +02002389 new_update->parent_update = update;
2390
2391 /*
2392 * Change the symbolic ref update to log only. Also, it
Michael Haggerty78fb4572017-11-05 09:42:09 +01002393 * doesn't need to check its old OID value, as that will be
Michael Haggerty6e30b2f2016-04-25 17:48:32 +02002394 * done when new_update is processed.
2395 */
Michael Haggerty91774af2017-11-05 09:42:06 +01002396 update->flags |= REF_LOG_ONLY | REF_NO_DEREF;
Michael Haggerty6e30b2f2016-04-25 17:48:32 +02002397 update->flags &= ~REF_HAVE_OLD;
Michael Haggerty92b15512016-04-25 15:56:07 +02002398
Martin Ågrenc2994682017-09-09 08:57:15 +02002399 /*
2400 * Add the referent. This insertion is O(N) in the transaction
2401 * size, but it happens at most once per symref in a
2402 * transaction. Make sure to add new_update->refname, which will
2403 * be valid as long as affected_refnames is in use, and NOT
2404 * referent, which might soon be freed by our caller.
2405 */
2406 item = string_list_insert(affected_refnames, new_update->refname);
2407 if (item->util)
2408 BUG("%s unexpectedly found in affected_refnames",
2409 new_update->refname);
Michael Haggerty92b15512016-04-25 15:56:07 +02002410 item->util = new_update;
2411
2412 return 0;
2413}
2414
2415/*
Michael Haggerty6e30b2f2016-04-25 17:48:32 +02002416 * Return the refname under which update was originally requested.
2417 */
2418static const char *original_update_refname(struct ref_update *update)
2419{
2420 while (update->parent_update)
2421 update = update->parent_update;
2422
2423 return update->refname;
2424}
2425
2426/*
Michael Haggertye3f51032016-06-07 09:29:23 +02002427 * Check whether the REF_HAVE_OLD and old_oid values stored in update
2428 * are consistent with oid, which is the reference's current value. If
2429 * everything is OK, return 0; otherwise, write an error message to
2430 * err and return -1.
2431 */
2432static int check_old_oid(struct ref_update *update, struct object_id *oid,
2433 struct strbuf *err)
2434{
2435 if (!(update->flags & REF_HAVE_OLD) ||
Jeff King4a7e27e2018-08-28 17:22:40 -04002436 oideq(oid, &update->old_oid))
Michael Haggertye3f51032016-06-07 09:29:23 +02002437 return 0;
2438
brian m. carlson98491292017-05-06 22:10:23 +00002439 if (is_null_oid(&update->old_oid))
Michael Haggertye3f51032016-06-07 09:29:23 +02002440 strbuf_addf(err, "cannot lock ref '%s': "
2441 "reference already exists",
2442 original_update_refname(update));
2443 else if (is_null_oid(oid))
2444 strbuf_addf(err, "cannot lock ref '%s': "
2445 "reference is missing but expected %s",
2446 original_update_refname(update),
brian m. carlson98491292017-05-06 22:10:23 +00002447 oid_to_hex(&update->old_oid));
Michael Haggertye3f51032016-06-07 09:29:23 +02002448 else
2449 strbuf_addf(err, "cannot lock ref '%s': "
2450 "is at %s but expected %s",
2451 original_update_refname(update),
2452 oid_to_hex(oid),
brian m. carlson98491292017-05-06 22:10:23 +00002453 oid_to_hex(&update->old_oid));
Michael Haggertye3f51032016-06-07 09:29:23 +02002454
2455 return -1;
2456}
2457
2458/*
Michael Haggerty92b15512016-04-25 15:56:07 +02002459 * Prepare for carrying out update:
2460 * - Lock the reference referred to by update.
2461 * - Read the reference under lock.
Michael Haggerty78fb4572017-11-05 09:42:09 +01002462 * - Check that its old OID value (if specified) is correct, and in
Michael Haggerty92b15512016-04-25 15:56:07 +02002463 * any case record it in update->lock->old_oid for later use when
2464 * writing the reflog.
Michael Haggerty91774af2017-11-05 09:42:06 +01002465 * - If it is a symref update without REF_NO_DEREF, split it up into a
Michael Haggerty92b15512016-04-25 15:56:07 +02002466 * REF_LOG_ONLY update of the symref and add a separate update for
2467 * the referent to transaction.
2468 * - If it is an update of head_ref, add a corresponding REF_LOG_ONLY
2469 * update of HEAD.
2470 */
Michael Haggertyb3bbbc52016-09-04 18:08:33 +02002471static int lock_ref_for_update(struct files_ref_store *refs,
2472 struct ref_update *update,
Michael Haggerty92b15512016-04-25 15:56:07 +02002473 struct ref_transaction *transaction,
2474 const char *head_ref,
2475 struct string_list *affected_refnames,
2476 struct strbuf *err)
2477{
2478 struct strbuf referent = STRBUF_INIT;
2479 int mustexist = (update->flags & REF_HAVE_OLD) &&
brian m. carlson98491292017-05-06 22:10:23 +00002480 !is_null_oid(&update->old_oid);
Martin Ågren851e1fb2017-09-09 08:57:16 +02002481 int ret = 0;
Michael Haggerty92b15512016-04-25 15:56:07 +02002482 struct ref_lock *lock;
2483
Michael Haggerty32c597e2017-02-10 12:16:16 +01002484 files_assert_main_repository(refs, "lock_ref_for_update");
Michael Haggertyb3bbbc52016-09-04 18:08:33 +02002485
brian m. carlson98491292017-05-06 22:10:23 +00002486 if ((update->flags & REF_HAVE_NEW) && is_null_oid(&update->new_oid))
Michael Haggerty165056b2016-04-24 08:58:41 +02002487 update->flags |= REF_DELETING;
Michael Haggerty92b15512016-04-25 15:56:07 +02002488
2489 if (head_ref) {
2490 ret = split_head_update(update, transaction, head_ref,
2491 affected_refnames, err);
2492 if (ret)
Martin Ågren851e1fb2017-09-09 08:57:16 +02002493 goto out;
Michael Haggerty92b15512016-04-25 15:56:07 +02002494 }
2495
Michael Haggertyf7b0a982016-09-04 18:08:31 +02002496 ret = lock_raw_ref(refs, update->refname, mustexist,
Ævar Arnfjörð Bjarmason640d9d52021-08-23 13:36:06 +02002497 affected_refnames,
David Turner7d618262016-09-04 18:08:43 +02002498 &lock, &referent,
Michael Haggerty92b15512016-04-25 15:56:07 +02002499 &update->type, err);
Michael Haggerty92b15512016-04-25 15:56:07 +02002500 if (ret) {
Michael Haggerty165056b2016-04-24 08:58:41 +02002501 char *reason;
2502
Michael Haggerty165056b2016-04-24 08:58:41 +02002503 reason = strbuf_detach(err, NULL);
2504 strbuf_addf(err, "cannot lock ref '%s': %s",
Michael Haggertye3f51032016-06-07 09:29:23 +02002505 original_update_refname(update), reason);
Michael Haggerty165056b2016-04-24 08:58:41 +02002506 free(reason);
Martin Ågren851e1fb2017-09-09 08:57:16 +02002507 goto out;
Michael Haggerty165056b2016-04-24 08:58:41 +02002508 }
Michael Haggerty92b15512016-04-25 15:56:07 +02002509
David Turner7d618262016-09-04 18:08:43 +02002510 update->backend_data = lock;
Michael Haggerty92b15512016-04-25 15:56:07 +02002511
Michael Haggerty92b15512016-04-25 15:56:07 +02002512 if (update->type & REF_ISSYMREF) {
Michael Haggerty91774af2017-11-05 09:42:06 +01002513 if (update->flags & REF_NO_DEREF) {
Michael Haggerty6e30b2f2016-04-25 17:48:32 +02002514 /*
2515 * We won't be reading the referent as part of
2516 * the transaction, so we have to read it here
Michael Haggerty78fb4572017-11-05 09:42:09 +01002517 * to record and possibly check old_oid:
Michael Haggerty6e30b2f2016-04-25 17:48:32 +02002518 */
Ævar Arnfjörð Bjarmasonf1da24c2021-10-16 11:39:27 +02002519 if (!refs_resolve_ref_unsafe(&refs->base,
Ævar Arnfjörð Bjarmason76887df2021-10-16 11:39:14 +02002520 referent.buf, 0,
Ævar Arnfjörð Bjarmasonce14de02022-01-26 15:37:01 +01002521 &lock->old_oid, NULL)) {
Michael Haggerty6e30b2f2016-04-25 17:48:32 +02002522 if (update->flags & REF_HAVE_OLD) {
2523 strbuf_addf(err, "cannot lock ref '%s': "
Michael Haggertye3f51032016-06-07 09:29:23 +02002524 "error reading reference",
2525 original_update_refname(update));
Martin Ågren3f5ef952017-09-09 08:57:17 +02002526 ret = TRANSACTION_GENERIC_ERROR;
Martin Ågren851e1fb2017-09-09 08:57:16 +02002527 goto out;
Michael Haggerty6e30b2f2016-04-25 17:48:32 +02002528 }
Michael Haggertye3f51032016-06-07 09:29:23 +02002529 } else if (check_old_oid(update, &lock->old_oid, err)) {
Martin Ågren851e1fb2017-09-09 08:57:16 +02002530 ret = TRANSACTION_GENERIC_ERROR;
2531 goto out;
Michael Haggerty6e30b2f2016-04-25 17:48:32 +02002532 }
Michael Haggerty6e30b2f2016-04-25 17:48:32 +02002533 } else {
2534 /*
2535 * Create a new update for the reference this
2536 * symref is pointing at. Also, we will record
Michael Haggerty78fb4572017-11-05 09:42:09 +01002537 * and verify old_oid for this update as part
Michael Haggerty6e30b2f2016-04-25 17:48:32 +02002538 * of processing the split-off update, so we
2539 * don't have to do it here.
2540 */
Jeff King10dee402019-02-14 00:50:46 -05002541 ret = split_symref_update(update,
Michael Haggertyfcc42ea2016-09-04 18:08:35 +02002542 referent.buf, transaction,
Michael Haggerty92b15512016-04-25 15:56:07 +02002543 affected_refnames, err);
2544 if (ret)
Martin Ågren851e1fb2017-09-09 08:57:16 +02002545 goto out;
Michael Haggerty92b15512016-04-25 15:56:07 +02002546 }
Michael Haggerty6e30b2f2016-04-25 17:48:32 +02002547 } else {
2548 struct ref_update *parent_update;
Michael Haggerty8169d0d2016-04-25 17:38:35 +02002549
Martin Ågren851e1fb2017-09-09 08:57:16 +02002550 if (check_old_oid(update, &lock->old_oid, err)) {
2551 ret = TRANSACTION_GENERIC_ERROR;
2552 goto out;
2553 }
Michael Haggertye3f51032016-06-07 09:29:23 +02002554
Michael Haggerty6e30b2f2016-04-25 17:48:32 +02002555 /*
2556 * If this update is happening indirectly because of a
Michael Haggerty78fb4572017-11-05 09:42:09 +01002557 * symref update, record the old OID in the parent
Michael Haggerty6e30b2f2016-04-25 17:48:32 +02002558 * update:
2559 */
2560 for (parent_update = update->parent_update;
2561 parent_update;
2562 parent_update = parent_update->parent_update) {
David Turner7d618262016-09-04 18:08:43 +02002563 struct ref_lock *parent_lock = parent_update->backend_data;
2564 oidcpy(&parent_lock->old_oid, &lock->old_oid);
Michael Haggerty6e30b2f2016-04-25 17:48:32 +02002565 }
Michael Haggerty92b15512016-04-25 15:56:07 +02002566 }
2567
Michael Haggerty165056b2016-04-24 08:58:41 +02002568 if ((update->flags & REF_HAVE_NEW) &&
2569 !(update->flags & REF_DELETING) &&
2570 !(update->flags & REF_LOG_ONLY)) {
Michael Haggerty92b15512016-04-25 15:56:07 +02002571 if (!(update->type & REF_ISSYMREF) &&
Jeff King4a7e27e2018-08-28 17:22:40 -04002572 oideq(&lock->old_oid, &update->new_oid)) {
Michael Haggerty165056b2016-04-24 08:58:41 +02002573 /*
2574 * The reference already has the desired
2575 * value, so we don't need to write it.
2576 */
Han-Wen Nienhuyse9706a12021-12-07 13:38:17 +00002577 } else if (write_ref_to_lockfile(
2578 lock, &update->new_oid,
2579 update->flags & REF_SKIP_OID_VERIFICATION,
2580 err)) {
Michael Haggerty165056b2016-04-24 08:58:41 +02002581 char *write_err = strbuf_detach(err, NULL);
2582
2583 /*
2584 * The lock was freed upon failure of
2585 * write_ref_to_lockfile():
2586 */
David Turner7d618262016-09-04 18:08:43 +02002587 update->backend_data = NULL;
Michael Haggerty165056b2016-04-24 08:58:41 +02002588 strbuf_addf(err,
Michael Haggertye3f51032016-06-07 09:29:23 +02002589 "cannot update ref '%s': %s",
Michael Haggerty165056b2016-04-24 08:58:41 +02002590 update->refname, write_err);
2591 free(write_err);
Martin Ågren851e1fb2017-09-09 08:57:16 +02002592 ret = TRANSACTION_GENERIC_ERROR;
2593 goto out;
Michael Haggerty165056b2016-04-24 08:58:41 +02002594 } else {
2595 update->flags |= REF_NEEDS_COMMIT;
2596 }
2597 }
2598 if (!(update->flags & REF_NEEDS_COMMIT)) {
2599 /*
2600 * We didn't call write_ref_to_lockfile(), so
2601 * the lockfile is still open. Close it to
2602 * free up the file descriptor:
2603 */
Jeff King83a30692017-09-05 08:14:33 -04002604 if (close_ref_gently(lock)) {
Michael Haggerty165056b2016-04-24 08:58:41 +02002605 strbuf_addf(err, "couldn't close '%s.lock'",
2606 update->refname);
Martin Ågren851e1fb2017-09-09 08:57:16 +02002607 ret = TRANSACTION_GENERIC_ERROR;
2608 goto out;
Michael Haggerty165056b2016-04-24 08:58:41 +02002609 }
2610 }
Martin Ågren851e1fb2017-09-09 08:57:16 +02002611
2612out:
2613 strbuf_release(&referent);
2614 return ret;
Michael Haggerty165056b2016-04-24 08:58:41 +02002615}
2616
Michael Haggertydc39e092017-09-08 15:51:51 +02002617struct files_transaction_backend_data {
2618 struct ref_transaction *packed_transaction;
2619 int packed_refs_locked;
2620};
2621
Michael Haggertyc0ca9352017-05-22 16:17:42 +02002622/*
2623 * Unlock any references in `transaction` that are still locked, and
2624 * mark the transaction closed.
2625 */
Michael Haggertydc39e092017-09-08 15:51:51 +02002626static void files_transaction_cleanup(struct files_ref_store *refs,
2627 struct ref_transaction *transaction)
Michael Haggertyc0ca9352017-05-22 16:17:42 +02002628{
2629 size_t i;
Michael Haggertydc39e092017-09-08 15:51:51 +02002630 struct files_transaction_backend_data *backend_data =
2631 transaction->backend_data;
2632 struct strbuf err = STRBUF_INIT;
Michael Haggertyc0ca9352017-05-22 16:17:42 +02002633
2634 for (i = 0; i < transaction->nr; i++) {
2635 struct ref_update *update = transaction->updates[i];
2636 struct ref_lock *lock = update->backend_data;
2637
2638 if (lock) {
2639 unlock_ref(lock);
2640 update->backend_data = NULL;
2641 }
2642 }
2643
Patrick Steinhardtedc30692020-03-30 15:46:13 +02002644 if (backend_data) {
2645 if (backend_data->packed_transaction &&
2646 ref_transaction_abort(backend_data->packed_transaction, &err)) {
2647 error("error aborting transaction: %s", err.buf);
2648 strbuf_release(&err);
2649 }
2650
2651 if (backend_data->packed_refs_locked)
2652 packed_refs_unlock(refs->packed_ref_store);
2653
2654 free(backend_data);
Michael Haggertydc39e092017-09-08 15:51:51 +02002655 }
2656
Michael Haggertyc0ca9352017-05-22 16:17:42 +02002657 transaction->state = REF_TRANSACTION_CLOSED;
2658}
2659
Michael Haggerty30173b82017-05-22 16:17:44 +02002660static int files_transaction_prepare(struct ref_store *ref_store,
2661 struct ref_transaction *transaction,
2662 struct strbuf *err)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002663{
Michael Haggerty00eebe32016-09-04 18:08:11 +02002664 struct files_ref_store *refs =
Nguyễn Thái Ngọc Duy9e7ec632017-03-26 09:42:32 +07002665 files_downcast(ref_store, REF_STORE_WRITE,
Michael Haggerty30173b82017-05-22 16:17:44 +02002666 "ref_transaction_prepare");
Michael Haggerty43a2dfd2017-05-22 16:17:37 +02002667 size_t i;
2668 int ret = 0;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002669 struct string_list affected_refnames = STRING_LIST_INIT_NODUP;
Michael Haggerty92b15512016-04-25 15:56:07 +02002670 char *head_ref = NULL;
2671 int head_type;
Michael Haggertydc39e092017-09-08 15:51:51 +02002672 struct files_transaction_backend_data *backend_data;
2673 struct ref_transaction *packed_transaction = NULL;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002674
2675 assert(err);
2676
Michael Haggertyc0ca9352017-05-22 16:17:42 +02002677 if (!transaction->nr)
2678 goto cleanup;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002679
René Scharfeca56dad2021-03-13 17:17:22 +01002680 CALLOC_ARRAY(backend_data, 1);
Michael Haggertydc39e092017-09-08 15:51:51 +02002681 transaction->backend_data = backend_data;
2682
Michael Haggerty92b15512016-04-25 15:56:07 +02002683 /*
2684 * Fail if a refname appears more than once in the
2685 * transaction. (If we end up splitting up any updates using
2686 * split_symref_update() or split_head_update(), those
2687 * functions will check that the new updates don't have the
Michael Haggerty62c72d12017-11-05 09:42:04 +01002688 * same refname as any existing ones.) Also fail if any of the
Michael Haggertyacedcde2017-11-05 09:42:07 +01002689 * updates use REF_IS_PRUNING without REF_NO_DEREF.
Michael Haggerty92b15512016-04-25 15:56:07 +02002690 */
2691 for (i = 0; i < transaction->nr; i++) {
2692 struct ref_update *update = transaction->updates[i];
2693 struct string_list_item *item =
2694 string_list_append(&affected_refnames, update->refname);
2695
Michael Haggertyacedcde2017-11-05 09:42:07 +01002696 if ((update->flags & REF_IS_PRUNING) &&
Michael Haggerty91774af2017-11-05 09:42:06 +01002697 !(update->flags & REF_NO_DEREF))
Michael Haggertyacedcde2017-11-05 09:42:07 +01002698 BUG("REF_IS_PRUNING set without REF_NO_DEREF");
Michael Haggerty62c72d12017-11-05 09:42:04 +01002699
Michael Haggerty92b15512016-04-25 15:56:07 +02002700 /*
2701 * We store a pointer to update in item->util, but at
2702 * the moment we never use the value of this field
2703 * except to check whether it is non-NULL.
2704 */
2705 item->util = update;
2706 }
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002707 string_list_sort(&affected_refnames);
2708 if (ref_update_reject_duplicates(&affected_refnames, err)) {
2709 ret = TRANSACTION_GENERIC_ERROR;
2710 goto cleanup;
2711 }
2712
2713 /*
Michael Haggerty92b15512016-04-25 15:56:07 +02002714 * Special hack: If a branch is updated directly and HEAD
2715 * points to it (may happen on the remote side of a push
2716 * for example) then logically the HEAD reflog should be
2717 * updated too.
2718 *
2719 * A generic solution would require reverse symref lookups,
2720 * but finding all symrefs pointing to a given branch would be
2721 * rather costly for this rare event (the direct update of a
2722 * branch) to be worth it. So let's cheat and check with HEAD
2723 * only, which should cover 99% of all usage scenarios (even
2724 * 100% of the default ones).
2725 *
2726 * So if HEAD is a symbolic reference, then record the name of
2727 * the reference that it points to. If we see an update of
2728 * head_ref within the transaction, then split_head_update()
2729 * arranges for the reflog of HEAD to be updated, too.
2730 */
Nguyễn Thái Ngọc Duy2f40e952017-03-26 09:42:36 +07002731 head_ref = refs_resolve_refdup(ref_store, "HEAD",
2732 RESOLVE_REF_NO_RECURSE,
René Scharfe872ccb22017-10-01 09:28:50 +02002733 NULL, &head_type);
Michael Haggerty92b15512016-04-25 15:56:07 +02002734
2735 if (head_ref && !(head_type & REF_ISSYMREF)) {
Ævar Arnfjörð Bjarmason6a83d902017-06-15 23:15:46 +00002736 FREE_AND_NULL(head_ref);
Michael Haggerty92b15512016-04-25 15:56:07 +02002737 }
2738
2739 /*
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002740 * Acquire all locks, verify old values if provided, check
2741 * that new values are valid, and write new values to the
2742 * lockfiles, ready to be activated. Only keep one lockfile
2743 * open at a time to avoid running out of file descriptors.
Michael Haggerty30173b82017-05-22 16:17:44 +02002744 * Note that lock_ref_for_update() might append more updates
2745 * to the transaction.
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002746 */
Michael Haggertyefe47282016-04-22 00:02:50 +02002747 for (i = 0; i < transaction->nr; i++) {
2748 struct ref_update *update = transaction->updates[i];
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002749
Michael Haggertyb3bbbc52016-09-04 18:08:33 +02002750 ret = lock_ref_for_update(refs, update, transaction,
2751 head_ref, &affected_refnames, err);
Michael Haggerty165056b2016-04-24 08:58:41 +02002752 if (ret)
Michael Haggertyda5267f2017-10-24 17:16:25 +02002753 goto cleanup;
Michael Haggertydc39e092017-09-08 15:51:51 +02002754
2755 if (update->flags & REF_DELETING &&
2756 !(update->flags & REF_LOG_ONLY) &&
Michael Haggertyacedcde2017-11-05 09:42:07 +01002757 !(update->flags & REF_IS_PRUNING)) {
Michael Haggertydc39e092017-09-08 15:51:51 +02002758 /*
2759 * This reference has to be deleted from
2760 * packed-refs if it exists there.
2761 */
2762 if (!packed_transaction) {
2763 packed_transaction = ref_store_transaction_begin(
Patrick Steinhardt2ed1b642022-01-17 09:12:53 +01002764 refs->packed_ref_store,
2765 REF_TRANSACTION_SKIP_HOOK, err);
Michael Haggertydc39e092017-09-08 15:51:51 +02002766 if (!packed_transaction) {
2767 ret = TRANSACTION_GENERIC_ERROR;
2768 goto cleanup;
2769 }
2770
2771 backend_data->packed_transaction =
2772 packed_transaction;
2773 }
2774
2775 ref_transaction_add_update(
2776 packed_transaction, update->refname,
Michael Haggerty91774af2017-11-05 09:42:06 +01002777 REF_HAVE_NEW | REF_NO_DEREF,
Michael Haggertyb0ca4112017-11-05 09:42:01 +01002778 &update->new_oid, NULL,
Michael Haggertydc39e092017-09-08 15:51:51 +02002779 NULL);
2780 }
2781 }
2782
2783 if (packed_transaction) {
2784 if (packed_refs_lock(refs->packed_ref_store, 0, err)) {
2785 ret = TRANSACTION_GENERIC_ERROR;
2786 goto cleanup;
2787 }
2788 backend_data->packed_refs_locked = 1;
Michael Haggerty7c6bd252017-10-28 11:16:02 +02002789
2790 if (is_packed_transaction_needed(refs->packed_ref_store,
2791 packed_transaction)) {
2792 ret = ref_transaction_prepare(packed_transaction, err);
Jeff King249e8dc2019-03-21 05:28:44 -04002793 /*
2794 * A failure during the prepare step will abort
2795 * itself, but not free. Do that now, and disconnect
2796 * from the files_transaction so it does not try to
2797 * abort us when we hit the cleanup code below.
2798 */
2799 if (ret) {
2800 ref_transaction_free(packed_transaction);
2801 backend_data->packed_transaction = NULL;
2802 }
Michael Haggerty7c6bd252017-10-28 11:16:02 +02002803 } else {
2804 /*
2805 * We can skip rewriting the `packed-refs`
2806 * file. But we do need to leave it locked, so
2807 * that somebody else doesn't pack a reference
2808 * that we are trying to delete.
Jeff Kingd3322eb2019-03-21 05:28:54 -04002809 *
2810 * We need to disconnect our transaction from
2811 * backend_data, since the abort (whether successful or
2812 * not) will free it.
Michael Haggerty7c6bd252017-10-28 11:16:02 +02002813 */
Jeff Kingd3322eb2019-03-21 05:28:54 -04002814 backend_data->packed_transaction = NULL;
Michael Haggerty7c6bd252017-10-28 11:16:02 +02002815 if (ref_transaction_abort(packed_transaction, err)) {
2816 ret = TRANSACTION_GENERIC_ERROR;
2817 goto cleanup;
2818 }
Michael Haggerty7c6bd252017-10-28 11:16:02 +02002819 }
Michael Haggerty30173b82017-05-22 16:17:44 +02002820 }
2821
2822cleanup:
2823 free(head_ref);
2824 string_list_clear(&affected_refnames, 0);
2825
2826 if (ret)
Michael Haggertydc39e092017-09-08 15:51:51 +02002827 files_transaction_cleanup(refs, transaction);
Michael Haggerty30173b82017-05-22 16:17:44 +02002828 else
2829 transaction->state = REF_TRANSACTION_PREPARED;
2830
2831 return ret;
2832}
2833
2834static int files_transaction_finish(struct ref_store *ref_store,
2835 struct ref_transaction *transaction,
2836 struct strbuf *err)
2837{
2838 struct files_ref_store *refs =
2839 files_downcast(ref_store, 0, "ref_transaction_finish");
2840 size_t i;
2841 int ret = 0;
Michael Haggerty30173b82017-05-22 16:17:44 +02002842 struct strbuf sb = STRBUF_INIT;
Michael Haggertydc39e092017-09-08 15:51:51 +02002843 struct files_transaction_backend_data *backend_data;
2844 struct ref_transaction *packed_transaction;
2845
Michael Haggerty30173b82017-05-22 16:17:44 +02002846
2847 assert(err);
2848
2849 if (!transaction->nr) {
2850 transaction->state = REF_TRANSACTION_CLOSED;
2851 return 0;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002852 }
2853
Michael Haggertydc39e092017-09-08 15:51:51 +02002854 backend_data = transaction->backend_data;
2855 packed_transaction = backend_data->packed_transaction;
2856
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002857 /* Perform updates first so live commits remain referenced */
Michael Haggertyefe47282016-04-22 00:02:50 +02002858 for (i = 0; i < transaction->nr; i++) {
2859 struct ref_update *update = transaction->updates[i];
David Turner7d618262016-09-04 18:08:43 +02002860 struct ref_lock *lock = update->backend_data;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002861
David Turnerd99aa882016-02-24 17:58:50 -05002862 if (update->flags & REF_NEEDS_COMMIT ||
2863 update->flags & REF_LOG_ONLY) {
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07002864 if (files_log_ref_write(refs,
2865 lock->ref_name,
brian m. carlson4417df82017-05-06 22:10:24 +00002866 &lock->old_oid,
2867 &update->new_oid,
Michael Haggerty81b1b6d2017-01-06 17:22:31 +01002868 update->msg, update->flags,
2869 err)) {
Michael Haggerty92b15512016-04-25 15:56:07 +02002870 char *old_msg = strbuf_detach(err, NULL);
2871
2872 strbuf_addf(err, "cannot update the ref '%s': %s",
2873 lock->ref_name, old_msg);
2874 free(old_msg);
2875 unlock_ref(lock);
David Turner7d618262016-09-04 18:08:43 +02002876 update->backend_data = NULL;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002877 ret = TRANSACTION_GENERIC_ERROR;
2878 goto cleanup;
Michael Haggerty92b15512016-04-25 15:56:07 +02002879 }
2880 }
2881 if (update->flags & REF_NEEDS_COMMIT) {
Michael Haggerty00eebe32016-09-04 18:08:11 +02002882 clear_loose_ref_cache(refs);
Michael Haggerty92b15512016-04-25 15:56:07 +02002883 if (commit_ref(lock)) {
2884 strbuf_addf(err, "couldn't set '%s'", lock->ref_name);
2885 unlock_ref(lock);
David Turner7d618262016-09-04 18:08:43 +02002886 update->backend_data = NULL;
Michael Haggerty92b15512016-04-25 15:56:07 +02002887 ret = TRANSACTION_GENERIC_ERROR;
2888 goto cleanup;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002889 }
2890 }
2891 }
Michael Haggertydc39e092017-09-08 15:51:51 +02002892
2893 /*
Michael Haggerty5e00a6c2017-09-08 15:51:53 +02002894 * Now that updates are safely completed, we can perform
2895 * deletes. First delete the reflogs of any references that
2896 * will be deleted, since (in the unexpected event of an
2897 * error) leaving a reference without a reflog is less bad
2898 * than leaving a reflog without a reference (the latter is a
2899 * mildly invalid repository state):
2900 */
2901 for (i = 0; i < transaction->nr; i++) {
2902 struct ref_update *update = transaction->updates[i];
2903 if (update->flags & REF_DELETING &&
2904 !(update->flags & REF_LOG_ONLY) &&
Michael Haggertyacedcde2017-11-05 09:42:07 +01002905 !(update->flags & REF_IS_PRUNING)) {
Michael Haggerty5e00a6c2017-09-08 15:51:53 +02002906 strbuf_reset(&sb);
2907 files_reflog_path(refs, &sb, update->refname);
2908 if (!unlink_or_warn(sb.buf))
2909 try_remove_empty_parents(refs, update->refname,
2910 REMOVE_EMPTY_PARENTS_REFLOG);
2911 }
2912 }
2913
2914 /*
Michael Haggertydc39e092017-09-08 15:51:51 +02002915 * Perform deletes now that updates are safely completed.
2916 *
2917 * First delete any packed versions of the references, while
2918 * retaining the packed-refs lock:
2919 */
2920 if (packed_transaction) {
2921 ret = ref_transaction_commit(packed_transaction, err);
2922 ref_transaction_free(packed_transaction);
2923 packed_transaction = NULL;
2924 backend_data->packed_transaction = NULL;
2925 if (ret)
2926 goto cleanup;
2927 }
2928
2929 /* Now delete the loose versions of the references: */
Michael Haggertyefe47282016-04-22 00:02:50 +02002930 for (i = 0; i < transaction->nr; i++) {
2931 struct ref_update *update = transaction->updates[i];
David Turner7d618262016-09-04 18:08:43 +02002932 struct ref_lock *lock = update->backend_data;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002933
David Turnerd99aa882016-02-24 17:58:50 -05002934 if (update->flags & REF_DELETING &&
2935 !(update->flags & REF_LOG_ONLY)) {
Will Chandler5f03e512021-05-08 01:00:43 -04002936 update->flags |= REF_DELETED_RMDIR;
Michael Haggertyce0af242017-01-06 17:22:39 +01002937 if (!(update->type & REF_ISPACKED) ||
2938 update->type & REF_ISSYMREF) {
2939 /* It is a loose reference. */
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07002940 strbuf_reset(&sb);
Nguyễn Thái Ngọc Duy19e02f42017-03-26 09:42:23 +07002941 files_ref_path(refs, &sb, lock->ref_name);
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07002942 if (unlink_or_msg(sb.buf, err)) {
Michael Haggertyce0af242017-01-06 17:22:39 +01002943 ret = TRANSACTION_GENERIC_ERROR;
2944 goto cleanup;
2945 }
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002946 }
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002947 }
2948 }
2949
Michael Haggerty00eebe32016-09-04 18:08:11 +02002950 clear_loose_ref_cache(refs);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002951
2952cleanup:
Michael Haggertydc39e092017-09-08 15:51:51 +02002953 files_transaction_cleanup(refs, transaction);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002954
Michael Haggerty44639772017-01-06 17:22:43 +01002955 for (i = 0; i < transaction->nr; i++) {
2956 struct ref_update *update = transaction->updates[i];
Michael Haggerty44639772017-01-06 17:22:43 +01002957
Will Chandler5f03e512021-05-08 01:00:43 -04002958 if (update->flags & REF_DELETED_RMDIR) {
Michael Haggerty44639772017-01-06 17:22:43 +01002959 /*
Will Chandler5f03e512021-05-08 01:00:43 -04002960 * The reference was deleted. Delete any
Michael Haggerty44639772017-01-06 17:22:43 +01002961 * empty parent directories. (Note that this
2962 * can only work because we have already
2963 * removed the lockfile.)
2964 */
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07002965 try_remove_empty_parents(refs, update->refname,
Michael Haggerty44639772017-01-06 17:22:43 +01002966 REMOVE_EMPTY_PARENTS_REF);
2967 }
2968 }
2969
Michael Haggerty30173b82017-05-22 16:17:44 +02002970 strbuf_release(&sb);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002971 return ret;
2972}
2973
Michael Haggerty30173b82017-05-22 16:17:44 +02002974static int files_transaction_abort(struct ref_store *ref_store,
2975 struct ref_transaction *transaction,
2976 struct strbuf *err)
2977{
Michael Haggertydc39e092017-09-08 15:51:51 +02002978 struct files_ref_store *refs =
2979 files_downcast(ref_store, 0, "ref_transaction_abort");
2980
2981 files_transaction_cleanup(refs, transaction);
Michael Haggerty30173b82017-05-22 16:17:44 +02002982 return 0;
2983}
2984
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002985static int ref_present(const char *refname,
2986 const struct object_id *oid, int flags, void *cb_data)
2987{
2988 struct string_list *affected_refnames = cb_data;
2989
2990 return string_list_has_string(affected_refnames, refname);
2991}
2992
David Turnerfc681462016-09-04 18:08:39 +02002993static int files_initial_transaction_commit(struct ref_store *ref_store,
2994 struct ref_transaction *transaction,
2995 struct strbuf *err)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01002996{
Michael Haggertyd99825a2016-09-04 18:08:12 +02002997 struct files_ref_store *refs =
Nguyễn Thái Ngọc Duy9e7ec632017-03-26 09:42:32 +07002998 files_downcast(ref_store, REF_STORE_WRITE,
2999 "initial_ref_transaction_commit");
Michael Haggerty43a2dfd2017-05-22 16:17:37 +02003000 size_t i;
3001 int ret = 0;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003002 struct string_list affected_refnames = STRING_LIST_INIT_NODUP;
Michael Haggerty1444bfe2017-09-08 15:51:49 +02003003 struct ref_transaction *packed_transaction = NULL;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003004
3005 assert(err);
3006
3007 if (transaction->state != REF_TRANSACTION_OPEN)
Johannes Schindelin033abf92018-05-02 11:38:39 +02003008 BUG("commit called for transaction that is not open");
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003009
3010 /* Fail if a refname appears more than once in the transaction: */
Michael Haggertyefe47282016-04-22 00:02:50 +02003011 for (i = 0; i < transaction->nr; i++)
3012 string_list_append(&affected_refnames,
3013 transaction->updates[i]->refname);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003014 string_list_sort(&affected_refnames);
3015 if (ref_update_reject_duplicates(&affected_refnames, err)) {
3016 ret = TRANSACTION_GENERIC_ERROR;
3017 goto cleanup;
3018 }
3019
3020 /*
3021 * It's really undefined to call this function in an active
3022 * repository or when there are existing references: we are
3023 * only locking and changing packed-refs, so (1) any
3024 * simultaneous processes might try to change a reference at
3025 * the same time we do, and (2) any existing loose versions of
3026 * the references that we are setting would have precedence
3027 * over our values. But some remote helpers create the remote
3028 * "HEAD" and "master" branches before calling this function,
3029 * so here we really only check that none of the references
3030 * that we are creating already exists.
3031 */
Nguyễn Thái Ngọc Duy2f40e952017-03-26 09:42:36 +07003032 if (refs_for_each_rawref(&refs->base, ref_present,
3033 &affected_refnames))
Johannes Schindelin033abf92018-05-02 11:38:39 +02003034 BUG("initial ref transaction called with existing refs");
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003035
Patrick Steinhardt2ed1b642022-01-17 09:12:53 +01003036 packed_transaction = ref_store_transaction_begin(refs->packed_ref_store,
3037 REF_TRANSACTION_SKIP_HOOK, err);
Michael Haggerty1444bfe2017-09-08 15:51:49 +02003038 if (!packed_transaction) {
3039 ret = TRANSACTION_GENERIC_ERROR;
3040 goto cleanup;
3041 }
3042
Michael Haggertyefe47282016-04-22 00:02:50 +02003043 for (i = 0; i < transaction->nr; i++) {
3044 struct ref_update *update = transaction->updates[i];
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003045
3046 if ((update->flags & REF_HAVE_OLD) &&
brian m. carlson98491292017-05-06 22:10:23 +00003047 !is_null_oid(&update->old_oid))
Johannes Schindelin033abf92018-05-02 11:38:39 +02003048 BUG("initial ref transaction with old_sha1 set");
Nguyễn Thái Ngọc Duy7d2df052017-03-26 09:42:34 +07003049 if (refs_verify_refname_available(&refs->base, update->refname,
3050 &affected_refnames, NULL,
3051 err)) {
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003052 ret = TRANSACTION_NAME_CONFLICT;
3053 goto cleanup;
3054 }
Michael Haggerty1444bfe2017-09-08 15:51:49 +02003055
3056 /*
3057 * Add a reference creation for this reference to the
3058 * packed-refs transaction:
3059 */
3060 ref_transaction_add_update(packed_transaction, update->refname,
3061 update->flags & ~REF_HAVE_OLD,
brian m. carlson89f3bbd2017-10-15 22:06:53 +00003062 &update->new_oid, &update->old_oid,
Michael Haggerty1444bfe2017-09-08 15:51:49 +02003063 NULL);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003064 }
3065
Michael Haggertyc8bed832017-06-23 09:01:42 +02003066 if (packed_refs_lock(refs->packed_ref_store, 0, err)) {
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003067 ret = TRANSACTION_GENERIC_ERROR;
3068 goto cleanup;
3069 }
3070
Michael Haggerty1444bfe2017-09-08 15:51:49 +02003071 if (initial_ref_transaction_commit(packed_transaction, err)) {
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003072 ret = TRANSACTION_GENERIC_ERROR;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003073 }
3074
Mathias Rav81fcb692018-01-18 14:38:41 +01003075 packed_refs_unlock(refs->packed_ref_store);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003076cleanup:
Michael Haggerty1444bfe2017-09-08 15:51:49 +02003077 if (packed_transaction)
3078 ref_transaction_free(packed_transaction);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003079 transaction->state = REF_TRANSACTION_CLOSED;
3080 string_list_clear(&affected_refnames, 0);
3081 return ret;
3082}
3083
3084struct expire_reflog_cb {
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003085 reflog_expiry_should_prune_fn *should_prune_fn;
3086 void *policy_cb;
3087 FILE *newlog;
brian m. carlson9461d272017-02-21 23:47:32 +00003088 struct object_id last_kept_oid;
Ævar Arnfjörð Bjarmasonfcd2c3d2021-12-22 05:06:48 +01003089 unsigned int rewrite:1,
3090 dry_run:1;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003091};
3092
brian m. carlson9461d272017-02-21 23:47:32 +00003093static int expire_reflog_ent(struct object_id *ooid, struct object_id *noid,
Johannes Schindelindddbad72017-04-26 21:29:31 +02003094 const char *email, timestamp_t timestamp, int tz,
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003095 const char *message, void *cb_data)
3096{
3097 struct expire_reflog_cb *cb = cb_data;
Ævar Arnfjörð Bjarmasonfcd2c3d2021-12-22 05:06:48 +01003098 reflog_expiry_should_prune_fn *fn = cb->should_prune_fn;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003099
Ævar Arnfjörð Bjarmasonfcd2c3d2021-12-22 05:06:48 +01003100 if (cb->rewrite)
brian m. carlson9461d272017-02-21 23:47:32 +00003101 ooid = &cb->last_kept_oid;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003102
Ævar Arnfjörð Bjarmasonfcd2c3d2021-12-22 05:06:48 +01003103 if (fn(ooid, noid, email, timestamp, tz, message, cb->policy_cb))
3104 return 0;
3105
3106 if (cb->dry_run)
3107 return 0; /* --dry-run */
3108
3109 fprintf(cb->newlog, "%s %s %s %"PRItime" %+05d\t%s", oid_to_hex(ooid),
3110 oid_to_hex(noid), email, timestamp, tz, message);
3111 oidcpy(&cb->last_kept_oid, noid);
3112
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003113 return 0;
3114}
3115
David Turnere3688bd2016-09-04 18:08:38 +02003116static int files_reflog_expire(struct ref_store *ref_store,
Ævar Arnfjörð Bjarmasoncc40b5c2021-08-23 13:36:11 +02003117 const char *refname,
Ævar Arnfjörð Bjarmasonfcd2c3d2021-12-22 05:06:48 +01003118 unsigned int expire_flags,
David Turnere3688bd2016-09-04 18:08:38 +02003119 reflog_expiry_prepare_fn prepare_fn,
3120 reflog_expiry_should_prune_fn should_prune_fn,
3121 reflog_expiry_cleanup_fn cleanup_fn,
3122 void *policy_cb_data)
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003123{
Michael Haggerty7eb27cd2016-09-04 18:08:34 +02003124 struct files_ref_store *refs =
Nguyễn Thái Ngọc Duy9e7ec632017-03-26 09:42:32 +07003125 files_downcast(ref_store, REF_STORE_WRITE, "reflog_expire");
Martin Ågrenb2275862018-05-09 22:55:38 +02003126 struct lock_file reflog_lock = LOCK_INIT;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003127 struct expire_reflog_cb cb;
3128 struct ref_lock *lock;
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07003129 struct strbuf log_file_sb = STRBUF_INIT;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003130 char *log_file;
3131 int status = 0;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003132 struct strbuf err = STRBUF_INIT;
Ævar Arnfjörð Bjarmasonae35e162021-08-23 13:36:10 +02003133 const struct object_id *oid;
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003134
3135 memset(&cb, 0, sizeof(cb));
Ævar Arnfjörð Bjarmasonfcd2c3d2021-12-22 05:06:48 +01003136 cb.rewrite = !!(expire_flags & EXPIRE_REFLOGS_REWRITE);
3137 cb.dry_run = !!(expire_flags & EXPIRE_REFLOGS_DRY_RUN);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003138 cb.policy_cb = policy_cb_data;
3139 cb.should_prune_fn = should_prune_fn;
3140
3141 /*
3142 * The reflog file is locked by holding the lock on the
3143 * reference itself, plus we might need to update the
3144 * reference if --updateref was specified:
3145 */
Ævar Arnfjörð Bjarmason52106432021-10-16 11:39:13 +02003146 lock = lock_ref_oid_basic(refs, refname, &err);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003147 if (!lock) {
3148 error("cannot lock ref '%s': %s", refname, err.buf);
3149 strbuf_release(&err);
3150 return -1;
3151 }
Ævar Arnfjörð Bjarmasonae35e162021-08-23 13:36:10 +02003152 oid = &lock->old_oid;
Ævar Arnfjörð Bjarmason7aa78292021-08-23 13:36:09 +02003153
3154 /*
3155 * When refs are deleted, their reflog is deleted before the
3156 * ref itself is deleted. This is because there is no separate
3157 * lock for reflog; instead we take a lock on the ref with
3158 * lock_ref_oid_basic().
3159 *
3160 * If a race happens and the reflog doesn't exist after we've
3161 * acquired the lock that's OK. We've got nothing more to do;
3162 * We were asked to delete the reflog, but someone else
3163 * deleted it! The caller doesn't care that we deleted it,
3164 * just that it is deleted. So we can return successfully.
3165 */
Nguyễn Thái Ngọc Duy2f40e952017-03-26 09:42:36 +07003166 if (!refs_reflog_exists(ref_store, refname)) {
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003167 unlock_ref(lock);
3168 return 0;
3169 }
3170
Nguyễn Thái Ngọc Duy802de3d2017-03-26 09:42:22 +07003171 files_reflog_path(refs, &log_file_sb, refname);
3172 log_file = strbuf_detach(&log_file_sb, NULL);
Ævar Arnfjörð Bjarmasonfcd2c3d2021-12-22 05:06:48 +01003173 if (!cb.dry_run) {
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003174 /*
3175 * Even though holding $GIT_DIR/logs/$reflog.lock has
3176 * no locking implications, we use the lock_file
3177 * machinery here anyway because it does a lot of the
3178 * work we need, including cleaning up if the program
3179 * exits unexpectedly.
3180 */
3181 if (hold_lock_file_for_update(&reflog_lock, log_file, 0) < 0) {
3182 struct strbuf err = STRBUF_INIT;
3183 unable_to_lock_message(log_file, errno, &err);
3184 error("%s", err.buf);
3185 strbuf_release(&err);
3186 goto failure;
3187 }
3188 cb.newlog = fdopen_lock_file(&reflog_lock, "w");
3189 if (!cb.newlog) {
3190 error("cannot fdopen %s (%s)",
3191 get_lock_file_path(&reflog_lock), strerror(errno));
3192 goto failure;
3193 }
3194 }
3195
brian m. carlson0155f712017-10-15 22:07:04 +00003196 (*prepare_fn)(refname, oid, cb.policy_cb);
Nguyễn Thái Ngọc Duy2f40e952017-03-26 09:42:36 +07003197 refs_for_each_reflog_ent(ref_store, refname, expire_reflog_ent, &cb);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003198 (*cleanup_fn)(cb.policy_cb);
3199
Ævar Arnfjörð Bjarmasonfcd2c3d2021-12-22 05:06:48 +01003200 if (!cb.dry_run) {
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003201 /*
3202 * It doesn't make sense to adjust a reference pointed
3203 * to by a symbolic ref based on expiring entries in
3204 * the symbolic reference's reflog. Nor can we update
3205 * a reference if there are no remaining reflog
3206 * entries.
3207 */
Ævar Arnfjörð Bjarmason52106432021-10-16 11:39:13 +02003208 int update = 0;
3209
Ævar Arnfjörð Bjarmasonfcd2c3d2021-12-22 05:06:48 +01003210 if ((expire_flags & EXPIRE_REFLOGS_UPDATE_REF) &&
Ævar Arnfjörð Bjarmason52106432021-10-16 11:39:13 +02003211 !is_null_oid(&cb.last_kept_oid)) {
Ævar Arnfjörð Bjarmason52106432021-10-16 11:39:13 +02003212 int type;
3213 const char *ref;
3214
Ævar Arnfjörð Bjarmasonf1da24c2021-10-16 11:39:27 +02003215 ref = refs_resolve_ref_unsafe(&refs->base, refname,
Ævar Arnfjörð Bjarmason52106432021-10-16 11:39:13 +02003216 RESOLVE_REF_NO_RECURSE,
Ævar Arnfjörð Bjarmasonce14de02022-01-26 15:37:01 +01003217 NULL, &type);
Ævar Arnfjörð Bjarmason52106432021-10-16 11:39:13 +02003218 update = !!(ref && !(type & REF_ISSYMREF));
3219 }
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003220
Jeff King83a30692017-09-05 08:14:33 -04003221 if (close_lock_file_gently(&reflog_lock)) {
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003222 status |= error("couldn't write %s: %s", log_file,
3223 strerror(errno));
Jeff King83a30692017-09-05 08:14:33 -04003224 rollback_lock_file(&reflog_lock);
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003225 } else if (update &&
Jeff Kingee4d8e42017-09-05 08:15:15 -04003226 (write_in_full(get_lock_file_fd(&lock->lk),
brian m. carlson2ae2e2a2018-07-16 01:27:59 +00003227 oid_to_hex(&cb.last_kept_oid), the_hash_algo->hexsz) < 0 ||
Jeff King88780c32017-09-25 16:27:17 -04003228 write_str_in_full(get_lock_file_fd(&lock->lk), "\n") < 0 ||
Jeff King83a30692017-09-05 08:14:33 -04003229 close_ref_gently(lock) < 0)) {
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003230 status |= error("couldn't write %s",
Jeff Kingee4d8e42017-09-05 08:15:15 -04003231 get_lock_file_path(&lock->lk));
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003232 rollback_lock_file(&reflog_lock);
3233 } else if (commit_lock_file(&reflog_lock)) {
Junio C Hamanoe0048d32015-12-11 10:40:54 -08003234 status |= error("unable to write reflog '%s' (%s)",
Michael Haggerty7bd9bcf2015-11-09 14:34:01 +01003235 log_file, strerror(errno));
3236 } else if (update && commit_ref(lock)) {
3237 status |= error("couldn't set %s", lock->ref_name);
3238 }
3239 }
3240 free(log_file);
3241 unlock_ref(lock);
3242 return status;
3243
3244 failure:
3245 rollback_lock_file(&reflog_lock);
3246 free(log_file);
3247 unlock_ref(lock);
3248 return -1;
3249}
Ronnie Sahlberg3dce4442016-09-04 18:08:10 +02003250
David Turner6fb5acf2016-09-04 18:08:41 +02003251static int files_init_db(struct ref_store *ref_store, struct strbuf *err)
3252{
Nguyễn Thái Ngọc Duy19e02f42017-03-26 09:42:23 +07003253 struct files_ref_store *refs =
Nguyễn Thái Ngọc Duy9e7ec632017-03-26 09:42:32 +07003254 files_downcast(ref_store, REF_STORE_WRITE, "init_db");
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07003255 struct strbuf sb = STRBUF_INIT;
3256
David Turner6fb5acf2016-09-04 18:08:41 +02003257 /*
3258 * Create .git/refs/{heads,tags}
3259 */
Nguyễn Thái Ngọc Duy19e02f42017-03-26 09:42:23 +07003260 files_ref_path(refs, &sb, "refs/heads");
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07003261 safe_create_dir(sb.buf, 1);
3262
3263 strbuf_reset(&sb);
Nguyễn Thái Ngọc Duy19e02f42017-03-26 09:42:23 +07003264 files_ref_path(refs, &sb, "refs/tags");
Nguyễn Thái Ngọc Duye9dcc302017-03-26 09:42:20 +07003265 safe_create_dir(sb.buf, 1);
3266
3267 strbuf_release(&sb);
David Turner6fb5acf2016-09-04 18:08:41 +02003268 return 0;
3269}
3270
Ronnie Sahlberg3dce4442016-09-04 18:08:10 +02003271struct ref_storage_be refs_be_files = {
3272 NULL,
Michael Haggerty00eebe32016-09-04 18:08:11 +02003273 "files",
Ronnie Sahlberg127b42a2016-09-04 18:08:16 +02003274 files_ref_store_create,
David Turner6fb5acf2016-09-04 18:08:41 +02003275 files_init_db,
Michael Haggerty30173b82017-05-22 16:17:44 +02003276 files_transaction_prepare,
3277 files_transaction_finish,
3278 files_transaction_abort,
David Turnerfc681462016-09-04 18:08:39 +02003279 files_initial_transaction_commit,
Michael Haggertye1e33b72016-09-04 18:08:25 +02003280
Michael Haggerty82315272016-09-04 18:08:27 +02003281 files_pack_refs,
Michael Haggerty284689b2016-09-04 18:08:28 +02003282 files_create_symref,
David Turnera27dcf82016-09-04 18:08:40 +02003283 files_delete_refs,
David Turner9b6b40d2016-09-04 18:08:42 +02003284 files_rename_ref,
Sahil Dua52d59cc2017-06-18 23:19:16 +02003285 files_copy_ref,
Michael Haggerty82315272016-09-04 18:08:27 +02003286
Michael Haggerty1a769002016-09-04 18:08:37 +02003287 files_ref_iterator_begin,
Michael Haggerty62665822016-09-04 18:08:26 +02003288 files_read_raw_ref,
Patrick Steinhardtcd475b32022-03-01 10:33:46 +01003289 NULL,
David Turnere3688bd2016-09-04 18:08:38 +02003290
3291 files_reflog_iterator_begin,
3292 files_for_each_reflog_ent,
3293 files_for_each_reflog_ent_reverse,
3294 files_reflog_exists,
3295 files_create_reflog,
3296 files_delete_reflog,
3297 files_reflog_expire
Ronnie Sahlberg3dce4442016-09-04 18:08:10 +02003298};