]> git.ipfire.org Git - thirdparty/git.git/blame - refs.c
prune_ref(): call `ref_transaction_add_update()` directly
[thirdparty/git.git] / refs.c
CommitLineData
7bd9bcf3
MH
1/*
2 * The backend-independent part of the reference module.
3 */
4
95fc7512 5#include "cache.h"
b2141fc1 6#include "config.h"
7d4558c4 7#include "hashmap.h"
697cc8ef 8#include "lockfile.h"
b05855b5 9#include "iterator.h"
85023577 10#include "refs.h"
4cb77009 11#include "refs/refs-internal.h"
cf0adba7
JH
12#include "object.h"
13#include "tag.h"
5d0bc90e 14#include "submodule.h"
17eff96b 15#include "worktree.h"
3581d793 16
3dce444f
RS
17/*
18 * List of all available backends
19 */
20static struct ref_storage_be *refs_backends = &refs_be_files;
21
22static struct ref_storage_be *find_ref_storage_backend(const char *name)
23{
24 struct ref_storage_be *be;
25 for (be = refs_backends; be; be = be->next)
26 if (!strcmp(be->name, name))
27 return be;
28 return NULL;
29}
30
31int ref_storage_backend_exists(const char *name)
32{
33 return find_ref_storage_backend(name) != NULL;
34}
35
bc5fd6d3 36/*
dde8a902
DT
37 * How to handle various characters in refnames:
38 * 0: An acceptable character for refs
5e650228
JH
39 * 1: End-of-component
40 * 2: ., look for a preceding . to reject .. in refs
41 * 3: {, look for a preceding @ to reject @{ in refs
53a8555e 42 * 4: A bad character: ASCII control characters, and
cd377f45
JK
43 * ":", "?", "[", "\", "^", "~", SP, or TAB
44 * 5: *, reject unless REFNAME_REFSPEC_PATTERN is set
dde8a902
DT
45 */
46static unsigned char refname_disposition[256] = {
5e650228
JH
47 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
48 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
cd377f45 49 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 2, 1,
5e650228 50 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4,
dde8a902 51 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5e650228
JH
52 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 0,
53 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
54 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 4, 4
dde8a902
DT
55};
56
57/*
58 * Try to read one refname component from the front of refname.
59 * Return the length of the component found, or -1 if the component is
60 * not legal. It is legal if it is something reasonable to have under
61 * ".git/refs/"; We do not like it if:
bc5fd6d3
MH
62 *
63 * - any path component of it begins with ".", or
64 * - it has double dots "..", or
53a8555e 65 * - it has ASCII control characters, or
cd377f45
JK
66 * - it has ":", "?", "[", "\", "^", "~", SP, or TAB anywhere, or
67 * - it has "*" anywhere unless REFNAME_REFSPEC_PATTERN is set, or
53a8555e
JK
68 * - it ends with a "/", or
69 * - it ends with ".lock", or
70 * - it contains a "@{" portion
bc5fd6d3 71 */
cd377f45 72static int check_refname_component(const char *refname, int *flags)
bc5fd6d3
MH
73{
74 const char *cp;
75 char last = '\0';
76
77 for (cp = refname; ; cp++) {
dde8a902
DT
78 int ch = *cp & 255;
79 unsigned char disp = refname_disposition[ch];
80 switch (disp) {
5e650228 81 case 1:
dde8a902 82 goto out;
5e650228 83 case 2:
dde8a902
DT
84 if (last == '.')
85 return -1; /* Refname contains "..". */
86 break;
5e650228 87 case 3:
dde8a902
DT
88 if (last == '@')
89 return -1; /* Refname contains "@{". */
bc5fd6d3 90 break;
5e650228 91 case 4:
dde8a902 92 return -1;
cd377f45
JK
93 case 5:
94 if (!(*flags & REFNAME_REFSPEC_PATTERN))
95 return -1; /* refspec can't be a pattern */
96
97 /*
98 * Unset the pattern flag so that we only accept
99 * a single asterisk for one side of refspec.
100 */
101 *flags &= ~ REFNAME_REFSPEC_PATTERN;
102 break;
dde8a902 103 }
bc5fd6d3
MH
104 last = ch;
105 }
dde8a902 106out:
bc5fd6d3 107 if (cp == refname)
dac529e4 108 return 0; /* Component has zero length. */
f3cc52d8
JN
109 if (refname[0] == '.')
110 return -1; /* Component starts with '.'. */
7108ad23
MH
111 if (cp - refname >= LOCK_SUFFIX_LEN &&
112 !memcmp(cp - LOCK_SUFFIX_LEN, LOCK_SUFFIX, LOCK_SUFFIX_LEN))
bc5fd6d3
MH
113 return -1; /* Refname ends with ".lock". */
114 return cp - refname;
115}
116
5e650228 117int check_refname_format(const char *refname, int flags)
bc5fd6d3
MH
118{
119 int component_len, component_count = 0;
120
9ba89f48
FC
121 if (!strcmp(refname, "@"))
122 /* Refname is a single character '@'. */
123 return -1;
124
bc5fd6d3
MH
125 while (1) {
126 /* We are at the start of a path component. */
cd377f45
JK
127 component_len = check_refname_component(refname, &flags);
128 if (component_len <= 0)
129 return -1;
130
bc5fd6d3
MH
131 component_count++;
132 if (refname[component_len] == '\0')
133 break;
134 /* Skip to next component. */
135 refname += component_len + 1;
136 }
137
138 if (refname[component_len - 1] == '.')
139 return -1; /* Refname ends with '.'. */
140 if (!(flags & REFNAME_ALLOW_ONELEVEL) && component_count < 2)
141 return -1; /* Refname has only one component. */
142 return 0;
143}
144
4cb77009 145int refname_is_safe(const char *refname)
d0f810f0 146{
39950fef
MH
147 const char *rest;
148
149 if (skip_prefix(refname, "refs/", &rest)) {
d0f810f0
RS
150 char *buf;
151 int result;
e40f3557
MH
152 size_t restlen = strlen(rest);
153
154 /* rest must not be empty, or start or end with "/" */
155 if (!restlen || *rest == '/' || rest[restlen - 1] == '/')
156 return 0;
d0f810f0 157
d0f810f0
RS
158 /*
159 * Does the refname try to escape refs/?
160 * For example: refs/foo/../bar is safe but refs/foo/../../bar
161 * is not.
162 */
e40f3557
MH
163 buf = xmallocz(restlen);
164 result = !normalize_path_copy(buf, rest) && !strcmp(buf, rest);
d0f810f0
RS
165 free(buf);
166 return result;
167 }
35db25c6
MH
168
169 do {
d0f810f0
RS
170 if (!isupper(*refname) && *refname != '_')
171 return 0;
172 refname++;
35db25c6 173 } while (*refname);
d0f810f0
RS
174 return 1;
175}
176
67be7c5a
MH
177/*
178 * Return true if refname, which has the specified oid and flags, can
179 * be resolved to an object in the database. If the referred-to object
180 * does not exist, emit a warning and return false.
181 */
182int ref_resolves_to_object(const char *refname,
183 const struct object_id *oid,
184 unsigned int flags)
185{
186 if (flags & REF_ISBROKEN)
187 return 0;
188 if (!has_sha1_file(oid->hash)) {
189 error("%s does not point to a valid object!", refname);
190 return 0;
191 }
192 return 1;
193}
194
7d2df051
NTND
195char *refs_resolve_refdup(struct ref_store *refs,
196 const char *refname, int resolve_flags,
0f2dc722 197 struct object_id *oid, int *flags)
7d2df051
NTND
198{
199 const char *result;
200
201 result = refs_resolve_ref_unsafe(refs, refname, resolve_flags,
49e61479 202 oid, flags);
7d2df051
NTND
203 return xstrdup_or_null(result);
204}
205
7bd9bcf3 206char *resolve_refdup(const char *refname, int resolve_flags,
0f2dc722 207 struct object_id *oid, int *flags)
e1e22e37 208{
7d2df051
NTND
209 return refs_resolve_refdup(get_main_ref_store(),
210 refname, resolve_flags,
0f2dc722 211 oid, flags);
cddc4258
MH
212}
213
7bd9bcf3
MH
214/* The argument to filter_refs */
215struct ref_filter {
216 const char *pattern;
217 each_ref_fn *fn;
218 void *cb_data;
219};
432ad41e 220
7d2df051 221int refs_read_ref_full(struct ref_store *refs, const char *refname,
34c290a6 222 int resolve_flags, struct object_id *oid, int *flags)
732134ed 223{
49e61479 224 if (refs_resolve_ref_unsafe(refs, refname, resolve_flags, oid, flags))
7bd9bcf3
MH
225 return 0;
226 return -1;
732134ed
MH
227}
228
34c290a6 229int read_ref_full(const char *refname, int resolve_flags, struct object_id *oid, int *flags)
7d2df051
NTND
230{
231 return refs_read_ref_full(get_main_ref_store(), refname,
34c290a6 232 resolve_flags, oid, flags);
7d2df051
NTND
233}
234
34c290a6 235int read_ref(const char *refname, struct object_id *oid)
cddc4258 236{
34c290a6 237 return read_ref_full(refname, RESOLVE_REF_READING, oid, NULL);
c774aab9
JP
238}
239
7bd9bcf3 240int ref_exists(const char *refname)
bc5fd6d3 241{
744c040b 242 return !!resolve_ref_unsafe(refname, RESOLVE_REF_READING, NULL, NULL);
bc5fd6d3
MH
243}
244
7bd9bcf3
MH
245static int filter_refs(const char *refname, const struct object_id *oid,
246 int flags, void *data)
432ad41e 247{
7bd9bcf3
MH
248 struct ref_filter *filter = (struct ref_filter *)data;
249
55d34269 250 if (wildmatch(filter->pattern, refname, 0))
7bd9bcf3
MH
251 return 0;
252 return filter->fn(refname, oid, flags, filter->cb_data);
432ad41e
MH
253}
254
ac2ed0d7 255enum peel_status peel_object(const struct object_id *name, struct object_id *oid)
c774aab9 256{
ac2ed0d7 257 struct object *o = lookup_unknown_object(name->hash);
c774aab9 258
7bd9bcf3 259 if (o->type == OBJ_NONE) {
ac2ed0d7 260 int type = sha1_object_info(name->hash, NULL);
7bd9bcf3
MH
261 if (type < 0 || !object_as_type(o, type, 0))
262 return PEEL_INVALID;
263 }
bc5fd6d3 264
7bd9bcf3
MH
265 if (o->type != OBJ_TAG)
266 return PEEL_NON_TAG;
e1980c9d 267
7bd9bcf3
MH
268 o = deref_tag_noverify(o);
269 if (!o)
270 return PEEL_INVALID;
271
ac2ed0d7 272 oidcpy(oid, &o->oid);
7bd9bcf3 273 return PEEL_PEELED;
e1980c9d
JH
274}
275
7bd9bcf3
MH
276struct warn_if_dangling_data {
277 FILE *fp;
278 const char *refname;
279 const struct string_list *refnames;
280 const char *msg_fmt;
281};
bc5fd6d3 282
7bd9bcf3
MH
283static int warn_if_dangling_symref(const char *refname, const struct object_id *oid,
284 int flags, void *cb_data)
285{
286 struct warn_if_dangling_data *d = cb_data;
287 const char *resolves_to;
bc5fd6d3 288
7bd9bcf3
MH
289 if (!(flags & REF_ISSYMREF))
290 return 0;
bc5fd6d3 291
744c040b 292 resolves_to = resolve_ref_unsafe(refname, 0, NULL, NULL);
7bd9bcf3
MH
293 if (!resolves_to
294 || (d->refname
295 ? strcmp(resolves_to, d->refname)
296 : !string_list_has_string(d->refnames, resolves_to))) {
297 return 0;
298 }
bc5fd6d3 299
7bd9bcf3
MH
300 fprintf(d->fp, d->msg_fmt, refname);
301 fputc('\n', d->fp);
302 return 0;
bc5fd6d3
MH
303}
304
7bd9bcf3 305void warn_dangling_symref(FILE *fp, const char *msg_fmt, const char *refname)
f348ac92 306{
7bd9bcf3
MH
307 struct warn_if_dangling_data data;
308
309 data.fp = fp;
310 data.refname = refname;
311 data.refnames = NULL;
312 data.msg_fmt = msg_fmt;
313 for_each_rawref(warn_if_dangling_symref, &data);
f348ac92
MH
314}
315
7bd9bcf3 316void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct string_list *refnames)
432ad41e 317{
7bd9bcf3 318 struct warn_if_dangling_data data;
432ad41e 319
7bd9bcf3
MH
320 data.fp = fp;
321 data.refname = NULL;
322 data.refnames = refnames;
323 data.msg_fmt = msg_fmt;
324 for_each_rawref(warn_if_dangling_symref, &data);
432ad41e
MH
325}
326
7d2df051
NTND
327int refs_for_each_tag_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
328{
329 return refs_for_each_ref_in(refs, "refs/tags/", fn, cb_data);
330}
331
7bd9bcf3 332int for_each_tag_ref(each_ref_fn fn, void *cb_data)
432ad41e 333{
7d2df051 334 return refs_for_each_tag_ref(get_main_ref_store(), fn, cb_data);
432ad41e
MH
335}
336
7d2df051
NTND
337int refs_for_each_branch_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
338{
339 return refs_for_each_ref_in(refs, "refs/heads/", fn, cb_data);
432ad41e
MH
340}
341
7bd9bcf3 342int for_each_branch_ref(each_ref_fn fn, void *cb_data)
432ad41e 343{
7d2df051 344 return refs_for_each_branch_ref(get_main_ref_store(), fn, cb_data);
432ad41e
MH
345}
346
7d2df051
NTND
347int refs_for_each_remote_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
348{
349 return refs_for_each_ref_in(refs, "refs/remotes/", fn, cb_data);
202a56a9 350}
432ad41e 351
7bd9bcf3 352int for_each_remote_ref(each_ref_fn fn, void *cb_data)
e9c4c111 353{
7d2df051 354 return refs_for_each_remote_ref(get_main_ref_store(), fn, cb_data);
202a56a9
MH
355}
356
7bd9bcf3
MH
357int head_ref_namespaced(each_ref_fn fn, void *cb_data)
358{
359 struct strbuf buf = STRBUF_INIT;
360 int ret = 0;
361 struct object_id oid;
362 int flag;
c774aab9 363
7bd9bcf3 364 strbuf_addf(&buf, "%sHEAD", get_git_namespace());
34c290a6 365 if (!read_ref_full(buf.buf, RESOLVE_REF_READING, &oid, &flag))
7bd9bcf3
MH
366 ret = fn(buf.buf, &oid, flag, cb_data);
367 strbuf_release(&buf);
c774aab9 368
7bd9bcf3 369 return ret;
e9c4c111 370}
c774aab9 371
7bd9bcf3
MH
372int for_each_glob_ref_in(each_ref_fn fn, const char *pattern,
373 const char *prefix, void *cb_data)
662428f4 374{
7bd9bcf3
MH
375 struct strbuf real_pattern = STRBUF_INIT;
376 struct ref_filter filter;
377 int ret;
d08bae7e 378
59556548 379 if (!prefix && !starts_with(pattern, "refs/"))
d08bae7e 380 strbuf_addstr(&real_pattern, "refs/");
b09fe971
IL
381 else if (prefix)
382 strbuf_addstr(&real_pattern, prefix);
d08bae7e
IL
383 strbuf_addstr(&real_pattern, pattern);
384
894a9d33 385 if (!has_glob_specials(pattern)) {
9517e6b8 386 /* Append implied '/' '*' if not present. */
00b6c178 387 strbuf_complete(&real_pattern, '/');
d08bae7e
IL
388 /* No need to check for '*', there is none. */
389 strbuf_addch(&real_pattern, '*');
390 }
391
392 filter.pattern = real_pattern.buf;
393 filter.fn = fn;
394 filter.cb_data = cb_data;
395 ret = for_each_ref(filter_refs, &filter);
396
397 strbuf_release(&real_pattern);
398 return ret;
399}
400
b09fe971
IL
401int for_each_glob_ref(each_ref_fn fn, const char *pattern, void *cb_data)
402{
403 return for_each_glob_ref_in(fn, pattern, NULL, cb_data);
404}
405
4577e483 406const char *prettify_refname(const char *name)
a9c37a72 407{
3e5b36c6
SG
408 if (skip_prefix(name, "refs/heads/", &name) ||
409 skip_prefix(name, "refs/tags/", &name) ||
410 skip_prefix(name, "refs/remotes/", &name))
411 ; /* nothing */
412 return name;
a9c37a72
DB
413}
414
54457fe5 415static const char *ref_rev_parse_rules[] = {
79803322
SP
416 "%.*s",
417 "refs/%.*s",
418 "refs/tags/%.*s",
419 "refs/heads/%.*s",
420 "refs/remotes/%.*s",
421 "refs/remotes/%.*s/HEAD",
422 NULL
423};
424
54457fe5 425int refname_match(const char *abbrev_name, const char *full_name)
79803322
SP
426{
427 const char **p;
428 const int abbrev_name_len = strlen(abbrev_name);
429
54457fe5 430 for (p = ref_rev_parse_rules; *p; p++) {
79803322
SP
431 if (!strcmp(full_name, mkpath(*p, abbrev_name_len, abbrev_name))) {
432 return 1;
433 }
434 }
435
436 return 0;
437}
438
ff74f7f1
JH
439/*
440 * *string and *len will only be substituted, and *string returned (for
441 * later free()ing) if the string passed in is a magic short-hand form
442 * to name a branch.
443 */
444static char *substitute_branch_name(const char **string, int *len)
445{
446 struct strbuf buf = STRBUF_INIT;
0e9f62da 447 int ret = interpret_branch_name(*string, *len, &buf, 0);
ff74f7f1
JH
448
449 if (ret == *len) {
450 size_t size;
451 *string = strbuf_detach(&buf, &size);
452 *len = size;
453 return (char *)*string;
454 }
455
456 return NULL;
457}
458
cca5fa64 459int dwim_ref(const char *str, int len, struct object_id *oid, char **ref)
ff74f7f1
JH
460{
461 char *last_branch = substitute_branch_name(&str, &len);
cca5fa64 462 int refs_found = expand_ref(str, len, oid, ref);
41da7111
NTND
463 free(last_branch);
464 return refs_found;
465}
466
cca5fa64 467int expand_ref(const char *str, int len, struct object_id *oid, char **ref)
41da7111 468{
ff74f7f1
JH
469 const char **p, *r;
470 int refs_found = 0;
6cd4a898 471 struct strbuf fullref = STRBUF_INIT;
ff74f7f1
JH
472
473 *ref = NULL;
474 for (p = ref_rev_parse_rules; *p; p++) {
cca5fa64 475 struct object_id oid_from_ref;
476 struct object_id *this_result;
ff74f7f1
JH
477 int flag;
478
cca5fa64 479 this_result = refs_found ? &oid_from_ref : oid;
6cd4a898
JK
480 strbuf_reset(&fullref);
481 strbuf_addf(&fullref, *p, len, str);
482 r = resolve_ref_unsafe(fullref.buf, RESOLVE_REF_READING,
49e61479 483 this_result, &flag);
ff74f7f1
JH
484 if (r) {
485 if (!refs_found++)
486 *ref = xstrdup(r);
487 if (!warn_ambiguous_refs)
488 break;
6cd4a898
JK
489 } else if ((flag & REF_ISSYMREF) && strcmp(fullref.buf, "HEAD")) {
490 warning("ignoring dangling symref %s.", fullref.buf);
491 } else if ((flag & REF_ISBROKEN) && strchr(fullref.buf, '/')) {
492 warning("ignoring broken ref %s.", fullref.buf);
55956350 493 }
ff74f7f1 494 }
6cd4a898 495 strbuf_release(&fullref);
ff74f7f1
JH
496 return refs_found;
497}
498
334dc52f 499int dwim_log(const char *str, int len, struct object_id *oid, char **log)
ff74f7f1
JH
500{
501 char *last_branch = substitute_branch_name(&str, &len);
502 const char **p;
503 int logs_found = 0;
6cd4a898 504 struct strbuf path = STRBUF_INIT;
ff74f7f1
JH
505
506 *log = NULL;
507 for (p = ref_rev_parse_rules; *p; p++) {
334dc52f 508 struct object_id hash;
ff74f7f1
JH
509 const char *ref, *it;
510
6cd4a898
JK
511 strbuf_reset(&path);
512 strbuf_addf(&path, *p, len, str);
513 ref = resolve_ref_unsafe(path.buf, RESOLVE_REF_READING,
49e61479 514 &hash, NULL);
ff74f7f1
JH
515 if (!ref)
516 continue;
6cd4a898
JK
517 if (reflog_exists(path.buf))
518 it = path.buf;
519 else if (strcmp(ref, path.buf) && reflog_exists(ref))
ff74f7f1
JH
520 it = ref;
521 else
522 continue;
523 if (!logs_found++) {
524 *log = xstrdup(it);
334dc52f 525 oidcpy(oid, &hash);
ff74f7f1 526 }
7bd9bcf3
MH
527 if (!warn_ambiguous_refs)
528 break;
c0277d15 529 }
6cd4a898 530 strbuf_release(&path);
7bd9bcf3
MH
531 free(last_branch);
532 return logs_found;
2ddb5d17
BK
533}
534
266b1827
DT
535static int is_per_worktree_ref(const char *refname)
536{
ce414b33
DT
537 return !strcmp(refname, "HEAD") ||
538 starts_with(refname, "refs/bisect/");
266b1827
DT
539}
540
541static int is_pseudoref_syntax(const char *refname)
542{
543 const char *c;
544
545 for (c = refname; *c; c++) {
546 if (!isupper(*c) && *c != '-' && *c != '_')
547 return 0;
548 }
549
550 return 1;
551}
552
553enum ref_type ref_type(const char *refname)
554{
555 if (is_per_worktree_ref(refname))
556 return REF_TYPE_PER_WORKTREE;
557 if (is_pseudoref_syntax(refname))
558 return REF_TYPE_PSEUDOREF;
559 return REF_TYPE_NORMAL;
560}
561
4ff0f01c
MH
562long get_files_ref_lock_timeout_ms(void)
563{
564 static int configured = 0;
565
566 /* The default timeout is 100 ms: */
567 static int timeout_ms = 100;
568
569 if (!configured) {
570 git_config_get_int("core.filesreflocktimeout", &timeout_ms);
571 configured = 1;
572 }
573
574 return timeout_ms;
575}
576
ae077771 577static int write_pseudoref(const char *pseudoref, const struct object_id *oid,
578 const struct object_id *old_oid, struct strbuf *err)
74ec19d4
DT
579{
580 const char *filename;
581 int fd;
582 static struct lock_file lock;
583 struct strbuf buf = STRBUF_INIT;
584 int ret = -1;
585
6ee18216 586 if (!oid)
587 return 0;
588
ae077771 589 strbuf_addf(&buf, "%s\n", oid_to_hex(oid));
74ec19d4
DT
590
591 filename = git_path("%s", pseudoref);
4ff0f01c
MH
592 fd = hold_lock_file_for_update_timeout(&lock, filename,
593 LOCK_DIE_ON_ERROR,
594 get_files_ref_lock_timeout_ms());
74ec19d4 595 if (fd < 0) {
0568c8e9 596 strbuf_addf(err, "could not open '%s' for writing: %s",
74ec19d4 597 filename, strerror(errno));
aeb014f6 598 goto done;
74ec19d4
DT
599 }
600
ae077771 601 if (old_oid) {
602 struct object_id actual_old_oid;
2c3aed13 603
34c290a6 604 if (read_ref(pseudoref, &actual_old_oid))
2c3aed13 605 die("could not read ref '%s'", pseudoref);
ae077771 606 if (oidcmp(&actual_old_oid, old_oid)) {
0568c8e9 607 strbuf_addf(err, "unexpected sha1 when writing '%s'", pseudoref);
74ec19d4
DT
608 rollback_lock_file(&lock);
609 goto done;
610 }
611 }
612
06f46f23 613 if (write_in_full(fd, buf.buf, buf.len) < 0) {
0568c8e9 614 strbuf_addf(err, "could not write to '%s'", filename);
74ec19d4
DT
615 rollback_lock_file(&lock);
616 goto done;
617 }
618
619 commit_lock_file(&lock);
620 ret = 0;
621done:
622 strbuf_release(&buf);
623 return ret;
624}
625
2616a5e5 626static int delete_pseudoref(const char *pseudoref, const struct object_id *old_oid)
74ec19d4
DT
627{
628 static struct lock_file lock;
629 const char *filename;
630
631 filename = git_path("%s", pseudoref);
632
2616a5e5 633 if (old_oid && !is_null_oid(old_oid)) {
74ec19d4 634 int fd;
2616a5e5 635 struct object_id actual_old_oid;
74ec19d4 636
4ff0f01c
MH
637 fd = hold_lock_file_for_update_timeout(
638 &lock, filename, LOCK_DIE_ON_ERROR,
639 get_files_ref_lock_timeout_ms());
74ec19d4
DT
640 if (fd < 0)
641 die_errno(_("Could not open '%s' for writing"), filename);
34c290a6 642 if (read_ref(pseudoref, &actual_old_oid))
2c3aed13 643 die("could not read ref '%s'", pseudoref);
2616a5e5 644 if (oidcmp(&actual_old_oid, old_oid)) {
74ec19d4
DT
645 warning("Unexpected sha1 when deleting %s", pseudoref);
646 rollback_lock_file(&lock);
647 return -1;
a4c653df 648 }
74ec19d4
DT
649
650 unlink(filename);
651 rollback_lock_file(&lock);
652 } else {
653 unlink(filename);
4bd18c43 654 }
a4c653df 655
4bd18c43 656 return 0;
95fc7512 657}
d556fae2 658
c0fe4e8b
NTND
659int refs_delete_ref(struct ref_store *refs, const char *msg,
660 const char *refname,
2616a5e5 661 const struct object_id *old_oid,
c0fe4e8b 662 unsigned int flags)
41b625b0 663{
7521cc46 664 struct ref_transaction *transaction;
a4c653df 665 struct strbuf err = STRBUF_INIT;
8b5157e4 666
c0fe4e8b
NTND
667 if (ref_type(refname) == REF_TYPE_PSEUDOREF) {
668 assert(refs == get_main_ref_store());
2616a5e5 669 return delete_pseudoref(refname, old_oid);
c0fe4e8b 670 }
d48744d1 671
c0fe4e8b 672 transaction = ref_store_transaction_begin(refs, &err);
7521cc46 673 if (!transaction ||
89f3bbdd 674 ref_transaction_delete(transaction, refname, old_oid,
755b49ae 675 flags, msg, &err) ||
db7516ab 676 ref_transaction_commit(transaction, &err)) {
7521cc46
RS
677 error("%s", err.buf);
678 ref_transaction_free(transaction);
679 strbuf_release(&err);
c0277d15 680 return 1;
41b625b0 681 }
7bd9bcf3
MH
682 ref_transaction_free(transaction);
683 strbuf_release(&err);
b531394d
BC
684 return 0;
685}
41b625b0 686
c0fe4e8b 687int delete_ref(const char *msg, const char *refname,
2616a5e5 688 const struct object_id *old_oid, unsigned int flags)
c0fe4e8b
NTND
689{
690 return refs_delete_ref(get_main_ref_store(), msg, refname,
2616a5e5 691 old_oid, flags);
c0fe4e8b
NTND
692}
693
4cb77009 694int copy_reflog_msg(char *buf, const char *msg)
0ec29a47
JH
695{
696 char *cp = buf;
697 char c;
698 int wasspace = 1;
8b5157e4 699
0ec29a47
JH
700 *cp++ = '\t';
701 while ((c = *msg++)) {
702 if (wasspace && isspace(c))
703 continue;
704 wasspace = isspace(c);
705 if (wasspace)
706 c = ' ';
707 *cp++ = c;
a4c653df 708 }
0ec29a47
JH
709 while (buf < cp && isspace(cp[-1]))
710 cp--;
711 *cp++ = '\n';
712 return cp - buf;
713}
8b5157e4 714
4cb77009 715int should_autocreate_reflog(const char *refname)
4e2bef57 716{
341fb286
CW
717 switch (log_all_ref_updates) {
718 case LOG_REFS_ALWAYS:
719 return 1;
720 case LOG_REFS_NORMAL:
721 return starts_with(refname, "refs/heads/") ||
722 starts_with(refname, "refs/remotes/") ||
723 starts_with(refname, "refs/notes/") ||
724 !strcmp(refname, "HEAD");
725 default:
4e2bef57 726 return 0;
341fb286 727 }
4e2bef57
DT
728}
729
e7e0f26e 730int is_branch(const char *refname)
c3b0dec5 731{
59556548 732 return !strcmp(refname, "HEAD") || starts_with(refname, "refs/heads/");
41b625b0
NP
733}
734
4207ed28
RS
735struct read_ref_at_cb {
736 const char *refname;
dddbad72 737 timestamp_t at_time;
4207ed28
RS
738 int cnt;
739 int reccnt;
8eb36d94 740 struct object_id *oid;
4207ed28
RS
741 int found_it;
742
8eb36d94 743 struct object_id ooid;
744 struct object_id noid;
4207ed28 745 int tz;
dddbad72 746 timestamp_t date;
4207ed28 747 char **msg;
dddbad72 748 timestamp_t *cutoff_time;
4207ed28
RS
749 int *cutoff_tz;
750 int *cutoff_cnt;
751};
752
9461d272 753static int read_ref_at_ent(struct object_id *ooid, struct object_id *noid,
dddbad72 754 const char *email, timestamp_t timestamp, int tz,
4207ed28
RS
755 const char *message, void *cb_data)
756{
757 struct read_ref_at_cb *cb = cb_data;
758
759 cb->reccnt++;
760 cb->tz = tz;
761 cb->date = timestamp;
762
763 if (timestamp <= cb->at_time || cb->cnt == 0) {
764 if (cb->msg)
765 *cb->msg = xstrdup(message);
766 if (cb->cutoff_time)
767 *cb->cutoff_time = timestamp;
768 if (cb->cutoff_tz)
769 *cb->cutoff_tz = tz;
770 if (cb->cutoff_cnt)
771 *cb->cutoff_cnt = cb->reccnt - 1;
772 /*
773 * we have not yet updated cb->[n|o]sha1 so they still
774 * hold the values for the previous record.
775 */
8eb36d94 776 if (!is_null_oid(&cb->ooid)) {
777 oidcpy(cb->oid, noid);
778 if (oidcmp(&cb->ooid, noid))
4207ed28 779 warning("Log for ref %s has gap after %s.",
a5481a6c 780 cb->refname, show_date(cb->date, cb->tz, DATE_MODE(RFC2822)));
4207ed28
RS
781 }
782 else if (cb->date == cb->at_time)
8eb36d94 783 oidcpy(cb->oid, noid);
784 else if (oidcmp(noid, cb->oid))
4207ed28
RS
785 warning("Log for ref %s unexpectedly ended on %s.",
786 cb->refname, show_date(cb->date, cb->tz,
a5481a6c 787 DATE_MODE(RFC2822)));
8eb36d94 788 oidcpy(&cb->ooid, ooid);
789 oidcpy(&cb->noid, noid);
4207ed28
RS
790 cb->found_it = 1;
791 return 1;
792 }
8eb36d94 793 oidcpy(&cb->ooid, ooid);
794 oidcpy(&cb->noid, noid);
4207ed28
RS
795 if (cb->cnt > 0)
796 cb->cnt--;
797 return 0;
798}
799
9461d272 800static int read_ref_at_ent_oldest(struct object_id *ooid, struct object_id *noid,
dddbad72 801 const char *email, timestamp_t timestamp,
4207ed28
RS
802 int tz, const char *message, void *cb_data)
803{
804 struct read_ref_at_cb *cb = cb_data;
805
806 if (cb->msg)
807 *cb->msg = xstrdup(message);
808 if (cb->cutoff_time)
809 *cb->cutoff_time = timestamp;
810 if (cb->cutoff_tz)
811 *cb->cutoff_tz = tz;
812 if (cb->cutoff_cnt)
813 *cb->cutoff_cnt = cb->reccnt;
8eb36d94 814 oidcpy(cb->oid, ooid);
815 if (is_null_oid(cb->oid))
816 oidcpy(cb->oid, noid);
4207ed28
RS
817 /* We just want the first entry */
818 return 1;
16d7cc90
JH
819}
820
dddbad72 821int read_ref_at(const char *refname, unsigned int flags, timestamp_t at_time, int cnt,
8eb36d94 822 struct object_id *oid, char **msg,
dddbad72 823 timestamp_t *cutoff_time, int *cutoff_tz, int *cutoff_cnt)
d556fae2 824{
4207ed28 825 struct read_ref_at_cb cb;
d556fae2 826
4207ed28
RS
827 memset(&cb, 0, sizeof(cb));
828 cb.refname = refname;
829 cb.at_time = at_time;
830 cb.cnt = cnt;
831 cb.msg = msg;
832 cb.cutoff_time = cutoff_time;
833 cb.cutoff_tz = cutoff_tz;
834 cb.cutoff_cnt = cutoff_cnt;
8eb36d94 835 cb.oid = oid;
4207ed28
RS
836
837 for_each_reflog_ent_reverse(refname, read_ref_at_ent, &cb);
838
c41a87dd 839 if (!cb.reccnt) {
321c89bf 840 if (flags & GET_OID_QUIETLY)
c41a87dd
DA
841 exit(128);
842 else
843 die("Log for %s is empty.", refname);
844 }
4207ed28
RS
845 if (cb.found_it)
846 return 0;
847
848 for_each_reflog_ent(refname, read_ref_at_ent_oldest, &cb);
d556fae2 849
16d7cc90 850 return 1;
d556fae2 851}
2ff81662 852
c0fe4e8b
NTND
853struct ref_transaction *ref_store_transaction_begin(struct ref_store *refs,
854 struct strbuf *err)
caa4046c 855{
c0fe4e8b 856 struct ref_transaction *tr;
5a603b04
JN
857 assert(err);
858
c0fe4e8b
NTND
859 tr = xcalloc(1, sizeof(struct ref_transaction));
860 tr->ref_store = refs;
861 return tr;
862}
863
864struct ref_transaction *ref_transaction_begin(struct strbuf *err)
865{
866 return ref_store_transaction_begin(get_main_ref_store(), err);
caa4046c
MH
867}
868
026bd1d3 869void ref_transaction_free(struct ref_transaction *transaction)
caa4046c 870{
43a2dfde 871 size_t i;
caa4046c 872
1b07255c
RS
873 if (!transaction)
874 return;
875
30173b88
MH
876 switch (transaction->state) {
877 case REF_TRANSACTION_OPEN:
878 case REF_TRANSACTION_CLOSED:
879 /* OK */
880 break;
881 case REF_TRANSACTION_PREPARED:
882 die("BUG: free called on a prepared reference transaction");
883 break;
884 default:
885 die("BUG: unexpected reference transaction state");
886 break;
887 }
888
db7516ab
RS
889 for (i = 0; i < transaction->nr; i++) {
890 free(transaction->updates[i]->msg);
88615910 891 free(transaction->updates[i]);
db7516ab 892 }
caa4046c
MH
893 free(transaction->updates);
894 free(transaction);
895}
896
71564516
MH
897struct ref_update *ref_transaction_add_update(
898 struct ref_transaction *transaction,
899 const char *refname, unsigned int flags,
89f3bbdd 900 const struct object_id *new_oid,
901 const struct object_id *old_oid,
71564516 902 const char *msg)
caa4046c 903{
96ffc06f 904 struct ref_update *update;
71564516
MH
905
906 if (transaction->state != REF_TRANSACTION_OPEN)
907 die("BUG: update called for transaction that is not open");
908
909 if ((flags & REF_ISPRUNING) && !(flags & REF_NODEREF))
910 die("BUG: REF_ISPRUNING set without REF_NODEREF");
911
96ffc06f 912 FLEX_ALLOC_STR(update, refname, refname);
caa4046c
MH
913 ALLOC_GROW(transaction->updates, transaction->nr + 1, transaction->alloc);
914 transaction->updates[transaction->nr++] = update;
71564516
MH
915
916 update->flags = flags;
917
918 if (flags & REF_HAVE_NEW)
89f3bbdd 919 oidcpy(&update->new_oid, new_oid);
71564516 920 if (flags & REF_HAVE_OLD)
89f3bbdd 921 oidcpy(&update->old_oid, old_oid);
13092a91 922 update->msg = xstrdup_or_null(msg);
caa4046c
MH
923 return update;
924}
925
8e34800e
RS
926int ref_transaction_update(struct ref_transaction *transaction,
927 const char *refname,
89f3bbdd 928 const struct object_id *new_oid,
929 const struct object_id *old_oid,
1d147bdf 930 unsigned int flags, const char *msg,
8e34800e 931 struct strbuf *err)
caa4046c 932{
5a603b04
JN
933 assert(err);
934
89f3bbdd 935 if ((new_oid && !is_null_oid(new_oid)) ?
8a679de6
MH
936 check_refname_format(refname, REFNAME_ALLOW_ONELEVEL) :
937 !refname_is_safe(refname)) {
0568c8e9 938 strbuf_addf(err, "refusing to update ref with bad name '%s'",
d0f810f0
RS
939 refname);
940 return -1;
941 }
942
c788c54c
TG
943 flags &= REF_TRANSACTION_UPDATE_ALLOWED_FLAGS;
944
89f3bbdd 945 flags |= (new_oid ? REF_HAVE_NEW : 0) | (old_oid ? REF_HAVE_OLD : 0);
71564516
MH
946
947 ref_transaction_add_update(transaction, refname, flags,
89f3bbdd 948 new_oid, old_oid, msg);
8e34800e 949 return 0;
caa4046c
MH
950}
951
b416af5b
RS
952int ref_transaction_create(struct ref_transaction *transaction,
953 const char *refname,
89f3bbdd 954 const struct object_id *new_oid,
fec14ec3 955 unsigned int flags, const char *msg,
b416af5b 956 struct strbuf *err)
caa4046c 957{
89f3bbdd 958 if (!new_oid || is_null_oid(new_oid))
959 die("BUG: create called without valid new_oid");
960 return ref_transaction_update(transaction, refname, new_oid,
961 &null_oid, flags, msg, err);
caa4046c
MH
962}
963
8c8bdc0d
RS
964int ref_transaction_delete(struct ref_transaction *transaction,
965 const char *refname,
89f3bbdd 966 const struct object_id *old_oid,
fb5a6bb6 967 unsigned int flags, const char *msg,
8c8bdc0d 968 struct strbuf *err)
caa4046c 969{
89f3bbdd 970 if (old_oid && is_null_oid(old_oid))
971 die("BUG: delete called with old_oid set to zeros");
1d147bdf 972 return ref_transaction_update(transaction, refname,
89f3bbdd 973 &null_oid, old_oid,
1d147bdf 974 flags, msg, err);
caa4046c
MH
975}
976
16180334
MH
977int ref_transaction_verify(struct ref_transaction *transaction,
978 const char *refname,
89f3bbdd 979 const struct object_id *old_oid,
16180334
MH
980 unsigned int flags,
981 struct strbuf *err)
982{
89f3bbdd 983 if (!old_oid)
984 die("BUG: verify called with old_oid set to NULL");
16180334 985 return ref_transaction_update(transaction, refname,
89f3bbdd 986 NULL, old_oid,
16180334
MH
987 flags, NULL, err);
988}
989
c0fe4e8b 990int refs_update_ref(struct ref_store *refs, const char *msg,
ae077771 991 const char *refname, const struct object_id *new_oid,
992 const struct object_id *old_oid, unsigned int flags,
c0fe4e8b 993 enum action_on_err onerr)
4738a333 994{
74ec19d4 995 struct ref_transaction *t = NULL;
b4d75ac1 996 struct strbuf err = STRBUF_INIT;
74ec19d4 997 int ret = 0;
b4d75ac1 998
74ec19d4 999 if (ref_type(refname) == REF_TYPE_PSEUDOREF) {
c0fe4e8b 1000 assert(refs == get_main_ref_store());
ae077771 1001 ret = write_pseudoref(refname, new_oid, old_oid, &err);
74ec19d4 1002 } else {
c0fe4e8b 1003 t = ref_store_transaction_begin(refs, &err);
74ec19d4 1004 if (!t ||
89f3bbdd 1005 ref_transaction_update(t, refname, new_oid, old_oid,
74ec19d4
DT
1006 flags, msg, &err) ||
1007 ref_transaction_commit(t, &err)) {
1008 ret = 1;
1009 ref_transaction_free(t);
1010 }
1011 }
1012 if (ret) {
b4d75ac1
RS
1013 const char *str = "update_ref failed for ref '%s': %s";
1014
b4d75ac1
RS
1015 switch (onerr) {
1016 case UPDATE_REFS_MSG_ON_ERR:
1017 error(str, refname, err.buf);
1018 break;
1019 case UPDATE_REFS_DIE_ON_ERR:
1020 die(str, refname, err.buf);
1021 break;
1022 case UPDATE_REFS_QUIET_ON_ERR:
1023 break;
1024 }
1025 strbuf_release(&err);
4738a333 1026 return 1;
b4d75ac1
RS
1027 }
1028 strbuf_release(&err);
74ec19d4
DT
1029 if (t)
1030 ref_transaction_free(t);
b4d75ac1 1031 return 0;
4738a333
BK
1032}
1033
c0fe4e8b 1034int update_ref(const char *msg, const char *refname,
ae077771 1035 const struct object_id *new_oid,
1036 const struct object_id *old_oid,
c0fe4e8b
NTND
1037 unsigned int flags, enum action_on_err onerr)
1038{
ae077771 1039 return refs_update_ref(get_main_ref_store(), msg, refname, new_oid,
1040 old_oid, flags, onerr);
c0fe4e8b
NTND
1041}
1042
dfefa935 1043char *shorten_unambiguous_ref(const char *refname, int strict)
7c2b3029
JK
1044{
1045 int i;
1046 static char **scanf_fmts;
1047 static int nr_rules;
1048 char *short_name;
6cd4a898 1049 struct strbuf resolved_buf = STRBUF_INIT;
7c2b3029 1050
7c2b3029 1051 if (!nr_rules) {
4346663a
MH
1052 /*
1053 * Pre-generate scanf formats from ref_rev_parse_rules[].
1054 * Generate a format suitable for scanf from a
1055 * ref_rev_parse_rules rule by interpolating "%s" at the
1056 * location of the "%.*s".
1057 */
7c2b3029 1058 size_t total_len = 0;
84d5633f 1059 size_t offset = 0;
7c2b3029
JK
1060
1061 /* the rule list is NULL terminated, count them first */
a4165851 1062 for (nr_rules = 0; ref_rev_parse_rules[nr_rules]; nr_rules++)
7902fe03
MH
1063 /* -2 for strlen("%.*s") - strlen("%s"); +1 for NUL */
1064 total_len += strlen(ref_rev_parse_rules[nr_rules]) - 2 + 1;
7c2b3029 1065
50492f7b 1066 scanf_fmts = xmalloc(st_add(st_mult(sizeof(char *), nr_rules), total_len));
7c2b3029 1067
84d5633f 1068 offset = 0;
7c2b3029 1069 for (i = 0; i < nr_rules; i++) {
4346663a 1070 assert(offset < total_len);
84d5633f 1071 scanf_fmts[i] = (char *)&scanf_fmts[nr_rules] + offset;
4346663a
MH
1072 offset += snprintf(scanf_fmts[i], total_len - offset,
1073 ref_rev_parse_rules[i], 2, "%s") + 1;
7c2b3029
JK
1074 }
1075 }
1076
1077 /* bail out if there are no rules */
1078 if (!nr_rules)
dfefa935 1079 return xstrdup(refname);
7c2b3029 1080
dfefa935
MH
1081 /* buffer for scanf result, at most refname must fit */
1082 short_name = xstrdup(refname);
7c2b3029
JK
1083
1084 /* skip first rule, it will always match */
1085 for (i = nr_rules - 1; i > 0 ; --i) {
1086 int j;
6e7b3309 1087 int rules_to_fail = i;
7c2b3029
JK
1088 int short_name_len;
1089
dfefa935 1090 if (1 != sscanf(refname, scanf_fmts[i], short_name))
7c2b3029
JK
1091 continue;
1092
1093 short_name_len = strlen(short_name);
1094
6e7b3309
BW
1095 /*
1096 * in strict mode, all (except the matched one) rules
1097 * must fail to resolve to a valid non-ambiguous ref
1098 */
1099 if (strict)
1100 rules_to_fail = nr_rules;
1101
7c2b3029
JK
1102 /*
1103 * check if the short name resolves to a valid ref,
1104 * but use only rules prior to the matched one
1105 */
6e7b3309 1106 for (j = 0; j < rules_to_fail; j++) {
7c2b3029 1107 const char *rule = ref_rev_parse_rules[j];
7c2b3029 1108
6e7b3309
BW
1109 /* skip matched rule */
1110 if (i == j)
1111 continue;
1112
7c2b3029
JK
1113 /*
1114 * the short name is ambiguous, if it resolves
1115 * (with this previous rule) to a valid ref
1116 * read_ref() returns 0 on success
1117 */
6cd4a898
JK
1118 strbuf_reset(&resolved_buf);
1119 strbuf_addf(&resolved_buf, rule,
1120 short_name_len, short_name);
1121 if (ref_exists(resolved_buf.buf))
7c2b3029
JK
1122 break;
1123 }
1124
1125 /*
1126 * short name is non-ambiguous if all previous rules
1127 * haven't resolved to a valid ref
1128 */
6cd4a898
JK
1129 if (j == rules_to_fail) {
1130 strbuf_release(&resolved_buf);
7c2b3029 1131 return short_name;
6cd4a898 1132 }
7c2b3029
JK
1133 }
1134
6cd4a898 1135 strbuf_release(&resolved_buf);
7c2b3029 1136 free(short_name);
dfefa935 1137 return xstrdup(refname);
7c2b3029 1138}
daebaa78
JH
1139
1140static struct string_list *hide_refs;
1141
1142int parse_hide_refs_config(const char *var, const char *value, const char *section)
1143{
ad8c7cda 1144 const char *key;
daebaa78 1145 if (!strcmp("transfer.hiderefs", var) ||
ad8c7cda
JK
1146 (!parse_config_key(var, section, NULL, NULL, &key) &&
1147 !strcmp(key, "hiderefs"))) {
daebaa78
JH
1148 char *ref;
1149 int len;
1150
1151 if (!value)
1152 return config_error_nonbool(var);
1153 ref = xstrdup(value);
1154 len = strlen(ref);
1155 while (len && ref[len - 1] == '/')
1156 ref[--len] = '\0';
1157 if (!hide_refs) {
1158 hide_refs = xcalloc(1, sizeof(*hide_refs));
1159 hide_refs->strdup_strings = 1;
1160 }
1161 string_list_append(hide_refs, ref);
1162 }
1163 return 0;
1164}
1165
78a766ab 1166int ref_is_hidden(const char *refname, const char *refname_full)
daebaa78 1167{
2bc31d16 1168 int i;
daebaa78
JH
1169
1170 if (!hide_refs)
1171 return 0;
2bc31d16
JK
1172 for (i = hide_refs->nr - 1; i >= 0; i--) {
1173 const char *match = hide_refs->items[i].string;
78a766ab 1174 const char *subject;
2bc31d16 1175 int neg = 0;
7a40a95e 1176 const char *p;
2bc31d16
JK
1177
1178 if (*match == '!') {
1179 neg = 1;
1180 match++;
1181 }
1182
78a766ab
LF
1183 if (*match == '^') {
1184 subject = refname_full;
1185 match++;
1186 } else {
1187 subject = refname;
1188 }
1189
1190 /* refname can be NULL when namespaces are used. */
7a40a95e
CC
1191 if (subject &&
1192 skip_prefix(subject, match, &p) &&
1193 (!*p || *p == '/'))
2bc31d16 1194 return !neg;
daebaa78
JH
1195 }
1196 return 0;
1197}
fa5b1830 1198
0845122c
DT
1199const char *find_descendant_ref(const char *dirname,
1200 const struct string_list *extras,
1201 const struct string_list *skip)
fa5b1830 1202{
0845122c 1203 int pos;
fa5b1830 1204
0845122c
DT
1205 if (!extras)
1206 return NULL;
fa5b1830
MH
1207
1208 /*
0845122c
DT
1209 * Look at the place where dirname would be inserted into
1210 * extras. If there is an entry at that position that starts
1211 * with dirname (remember, dirname includes the trailing
1212 * slash) and is not in skip, then we have a conflict.
fa5b1830 1213 */
0845122c
DT
1214 for (pos = string_list_find_insert_index(extras, dirname, 0);
1215 pos < extras->nr; pos++) {
1216 const char *extra_refname = extras->items[pos].string;
fa5b1830 1217
0845122c
DT
1218 if (!starts_with(extra_refname, dirname))
1219 break;
1220
1221 if (!skip || !string_list_has_string(skip, extra_refname))
1222 return extra_refname;
fa5b1830 1223 }
0845122c
DT
1224 return NULL;
1225}
fa5b1830 1226
7d2df051
NTND
1227int refs_rename_ref_available(struct ref_store *refs,
1228 const char *old_refname,
1229 const char *new_refname)
0845122c
DT
1230{
1231 struct string_list skip = STRING_LIST_INIT_NODUP;
1232 struct strbuf err = STRBUF_INIT;
ff3a299c 1233 int ok;
fa5b1830 1234
ff3a299c 1235 string_list_insert(&skip, old_refname);
7d2df051
NTND
1236 ok = !refs_verify_refname_available(refs, new_refname,
1237 NULL, &skip, &err);
ff3a299c 1238 if (!ok)
0845122c
DT
1239 error("%s", err.buf);
1240
1241 string_list_clear(&skip, 0);
1242 strbuf_release(&err);
ff3a299c 1243 return ok;
fa5b1830 1244}
2bf68ed5 1245
62f0b399 1246int refs_head_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
2bf68ed5
DT
1247{
1248 struct object_id oid;
1249 int flag;
1250
62f0b399 1251 if (!refs_read_ref_full(refs, "HEAD", RESOLVE_REF_READING,
34c290a6 1252 &oid, &flag))
2bf68ed5
DT
1253 return fn("HEAD", &oid, flag, cb_data);
1254
1255 return 0;
1256}
1257
1258int head_ref(each_ref_fn fn, void *cb_data)
1259{
62f0b399 1260 return refs_head_ref(get_main_ref_store(), fn, cb_data);
2bf68ed5 1261}
93770590 1262
e121b9cb
MH
1263struct ref_iterator *refs_ref_iterator_begin(
1264 struct ref_store *refs,
1265 const char *prefix, int trim, int flags)
1266{
1267 struct ref_iterator *iter;
1268
0a0865b8
MH
1269 if (ref_paranoia < 0)
1270 ref_paranoia = git_env_bool("GIT_REF_PARANOIA", 0);
1271 if (ref_paranoia)
1272 flags |= DO_FOR_EACH_INCLUDE_BROKEN;
1273
e121b9cb 1274 iter = refs->be->iterator_begin(refs, prefix, flags);
c7599718
MH
1275
1276 /*
1277 * `iterator_begin()` already takes care of prefix, but we
1278 * might need to do some trimming:
1279 */
1280 if (trim)
1281 iter = prefix_ref_iterator_begin(iter, "", trim);
e121b9cb 1282
8738a8a4
MH
1283 /* Sanity check for subclasses: */
1284 if (!iter->ordered)
1285 BUG("reference iterator is not ordered");
1286
e121b9cb
MH
1287 return iter;
1288}
1289
4c4de895
MH
1290/*
1291 * Call fn for each reference in the specified submodule for which the
1292 * refname begins with prefix. If trim is non-zero, then trim that
1293 * many characters off the beginning of each refname before passing
1294 * the refname to fn. flags can be DO_FOR_EACH_INCLUDE_BROKEN to
1295 * include broken references in the iteration. If fn ever returns a
1296 * non-zero value, stop the iteration and return that value;
1297 * otherwise, return 0.
1298 */
7d2df051 1299static int do_for_each_ref(struct ref_store *refs, const char *prefix,
4c4de895
MH
1300 each_ref_fn fn, int trim, int flags, void *cb_data)
1301{
1302 struct ref_iterator *iter;
1303
00eebe35
MH
1304 if (!refs)
1305 return 0;
1306
e121b9cb 1307 iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
4c4de895
MH
1308
1309 return do_for_each_ref_iterator(iter, fn, cb_data);
1310}
1311
7d2df051
NTND
1312int refs_for_each_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1313{
1314 return do_for_each_ref(refs, "", fn, 0, 0, cb_data);
1315}
1316
93770590
DT
1317int for_each_ref(each_ref_fn fn, void *cb_data)
1318{
7d2df051 1319 return refs_for_each_ref(get_main_ref_store(), fn, cb_data);
93770590
DT
1320}
1321
7d2df051
NTND
1322int refs_for_each_ref_in(struct ref_store *refs, const char *prefix,
1323 each_ref_fn fn, void *cb_data)
1324{
1325 return do_for_each_ref(refs, prefix, fn, strlen(prefix), 0, cb_data);
93770590
DT
1326}
1327
1328int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
1329{
7d2df051 1330 return refs_for_each_ref_in(get_main_ref_store(), prefix, fn, cb_data);
93770590
DT
1331}
1332
1333int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data, unsigned int broken)
1334{
1335 unsigned int flag = 0;
1336
1337 if (broken)
1338 flag = DO_FOR_EACH_INCLUDE_BROKEN;
7d2df051
NTND
1339 return do_for_each_ref(get_main_ref_store(),
1340 prefix, fn, 0, flag, cb_data);
93770590
DT
1341}
1342
073cf63c
NTND
1343int refs_for_each_fullref_in(struct ref_store *refs, const char *prefix,
1344 each_ref_fn fn, void *cb_data,
1345 unsigned int broken)
03df567f
MH
1346{
1347 unsigned int flag = 0;
1348
1349 if (broken)
1350 flag = DO_FOR_EACH_INCLUDE_BROKEN;
073cf63c 1351 return do_for_each_ref(refs, prefix, fn, 0, flag, cb_data);
03df567f
MH
1352}
1353
93770590
DT
1354int for_each_replace_ref(each_ref_fn fn, void *cb_data)
1355{
7d2df051
NTND
1356 return do_for_each_ref(get_main_ref_store(),
1357 git_replace_ref_base, fn,
1358 strlen(git_replace_ref_base),
006f3f28 1359 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
93770590
DT
1360}
1361
1362int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
1363{
1364 struct strbuf buf = STRBUF_INIT;
1365 int ret;
1366 strbuf_addf(&buf, "%srefs/", get_git_namespace());
7d2df051
NTND
1367 ret = do_for_each_ref(get_main_ref_store(),
1368 buf.buf, fn, 0, 0, cb_data);
93770590
DT
1369 strbuf_release(&buf);
1370 return ret;
1371}
1372
7d2df051 1373int refs_for_each_rawref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
93770590 1374{
7d2df051 1375 return do_for_each_ref(refs, "", fn, 0,
93770590
DT
1376 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
1377}
2d0663b2 1378
7d2df051
NTND
1379int for_each_rawref(each_ref_fn fn, void *cb_data)
1380{
1381 return refs_for_each_rawref(get_main_ref_store(), fn, cb_data);
1382}
1383
470be518 1384int refs_read_raw_ref(struct ref_store *ref_store,
99afe91a 1385 const char *refname, struct object_id *oid,
470be518
MH
1386 struct strbuf *referent, unsigned int *type)
1387{
99afe91a 1388 return ref_store->be->read_raw_ref(ref_store, refname, oid, referent, type);
470be518
MH
1389}
1390
2d0663b2 1391/* This function needs to return a meaningful errno on failure */
7d2df051 1392const char *refs_resolve_ref_unsafe(struct ref_store *refs,
3c0cb0cb
MH
1393 const char *refname,
1394 int resolve_flags,
49e61479 1395 struct object_id *oid, int *flags)
2d0663b2
DT
1396{
1397 static struct strbuf sb_refname = STRBUF_INIT;
54fad661 1398 struct object_id unused_oid;
2d0663b2
DT
1399 int unused_flags;
1400 int symref_count;
1401
49e61479 1402 if (!oid)
1403 oid = &unused_oid;
2d0663b2
DT
1404 if (!flags)
1405 flags = &unused_flags;
1406
1407 *flags = 0;
1408
1409 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1410 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1411 !refname_is_safe(refname)) {
1412 errno = EINVAL;
1413 return NULL;
1414 }
1415
1416 /*
1417 * dwim_ref() uses REF_ISBROKEN to distinguish between
1418 * missing refs and refs that were present but invalid,
1419 * to complain about the latter to stderr.
1420 *
1421 * We don't know whether the ref exists, so don't set
1422 * REF_ISBROKEN yet.
1423 */
1424 *flags |= REF_BAD_NAME;
1425 }
1426
1427 for (symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) {
1428 unsigned int read_flags = 0;
1429
470be518 1430 if (refs_read_raw_ref(refs, refname,
99afe91a 1431 oid, &sb_refname, &read_flags)) {
2d0663b2 1432 *flags |= read_flags;
a1c1d817
JK
1433
1434 /* In reading mode, refs must eventually resolve */
1435 if (resolve_flags & RESOLVE_REF_READING)
1436 return NULL;
1437
1438 /*
1439 * Otherwise a missing ref is OK. But the files backend
1440 * may show errors besides ENOENT if there are
1441 * similarly-named refs.
1442 */
1443 if (errno != ENOENT &&
1444 errno != EISDIR &&
1445 errno != ENOTDIR)
2d0663b2 1446 return NULL;
a1c1d817 1447
49e61479 1448 oidclr(oid);
2d0663b2
DT
1449 if (*flags & REF_BAD_NAME)
1450 *flags |= REF_ISBROKEN;
1451 return refname;
1452 }
1453
1454 *flags |= read_flags;
1455
1456 if (!(read_flags & REF_ISSYMREF)) {
1457 if (*flags & REF_BAD_NAME) {
49e61479 1458 oidclr(oid);
2d0663b2
DT
1459 *flags |= REF_ISBROKEN;
1460 }
1461 return refname;
1462 }
1463
1464 refname = sb_refname.buf;
1465 if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
49e61479 1466 oidclr(oid);
2d0663b2
DT
1467 return refname;
1468 }
1469 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1470 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
1471 !refname_is_safe(refname)) {
1472 errno = EINVAL;
1473 return NULL;
1474 }
1475
1476 *flags |= REF_ISBROKEN | REF_BAD_NAME;
1477 }
1478 }
1479
1480 errno = ELOOP;
1481 return NULL;
1482}
00eebe35 1483
6fb5acfd
DT
1484/* backend functions */
1485int refs_init_db(struct strbuf *err)
1486{
077be78d 1487 struct ref_store *refs = get_main_ref_store();
6fb5acfd
DT
1488
1489 return refs->be->init_db(refs, err);
1490}
1491
bd40dcda 1492const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
49e61479 1493 struct object_id *oid, int *flags)
bd40dcda 1494{
7d2df051 1495 return refs_resolve_ref_unsafe(get_main_ref_store(), refname,
49e61479 1496 resolve_flags, oid, flags);
bd40dcda
MH
1497}
1498
a8355bb7 1499int resolve_gitlink_ref(const char *submodule, const char *refname,
a98e6101 1500 struct object_id *oid)
424dcc76 1501{
424dcc76
MH
1502 struct ref_store *refs;
1503 int flags;
1504
29babbee 1505 refs = get_submodule_ref_store(submodule);
48a8475f 1506
424dcc76
MH
1507 if (!refs)
1508 return -1;
1509
49e61479 1510 if (!refs_resolve_ref_unsafe(refs, refname, 0, oid, &flags) ||
a98e6101 1511 is_null_oid(oid))
424dcc76
MH
1512 return -1;
1513 return 0;
1514}
1515
0c064d90 1516struct ref_store_hash_entry
7d4558c4
MH
1517{
1518 struct hashmap_entry ent; /* must be the first member! */
1519
1520 struct ref_store *refs;
1521
0c064d90
NTND
1522 /* NUL-terminated identifier of the ref store: */
1523 char name[FLEX_ARRAY];
7d4558c4
MH
1524};
1525
7663cdc8
SB
1526static int ref_store_hash_cmp(const void *unused_cmp_data,
1527 const void *entry, const void *entry_or_key,
7d4558c4
MH
1528 const void *keydata)
1529{
0c064d90
NTND
1530 const struct ref_store_hash_entry *e1 = entry, *e2 = entry_or_key;
1531 const char *name = keydata ? keydata : e2->name;
7d4558c4 1532
0c064d90 1533 return strcmp(e1->name, name);
7d4558c4
MH
1534}
1535
0c064d90
NTND
1536static struct ref_store_hash_entry *alloc_ref_store_hash_entry(
1537 const char *name, struct ref_store *refs)
7d4558c4 1538{
0c064d90 1539 struct ref_store_hash_entry *entry;
7d4558c4 1540
0c064d90
NTND
1541 FLEX_ALLOC_STR(entry, name, name);
1542 hashmap_entry_init(entry, strhash(name));
7d4558c4
MH
1543 entry->refs = refs;
1544 return entry;
1545}
1546
00eebe35
MH
1547/* A pointer to the ref_store for the main repository: */
1548static struct ref_store *main_ref_store;
1549
7d4558c4
MH
1550/* A hashmap of ref_stores, stored by submodule name: */
1551static struct hashmap submodule_ref_stores;
00eebe35 1552
17eff96b
NTND
1553/* A hashmap of ref_stores, stored by worktree id: */
1554static struct hashmap worktree_ref_stores;
1555
c468da4e 1556/*
0c064d90
NTND
1557 * Look up a ref store by name. If that ref_store hasn't been
1558 * registered yet, return NULL.
c468da4e 1559 */
0c064d90
NTND
1560static struct ref_store *lookup_ref_store_map(struct hashmap *map,
1561 const char *name)
00eebe35 1562{
0c064d90 1563 struct ref_store_hash_entry *entry;
00eebe35 1564
0c064d90 1565 if (!map->tablesize)
7d4558c4
MH
1566 /* It's initialized on demand in register_ref_store(). */
1567 return NULL;
620a66b9 1568
0c064d90 1569 entry = hashmap_get_from_hash(map, strhash(name), name);
7d4558c4 1570 return entry ? entry->refs : NULL;
00eebe35
MH
1571}
1572
c468da4e
MH
1573/*
1574 * Create, record, and return a ref_store instance for the specified
5d0bc90e 1575 * gitdir.
c468da4e 1576 */
9e7ec634
NTND
1577static struct ref_store *ref_store_init(const char *gitdir,
1578 unsigned int flags)
00eebe35
MH
1579{
1580 const char *be_name = "files";
1581 struct ref_storage_be *be = find_ref_storage_backend(be_name);
ba88add5 1582 struct ref_store *refs;
00eebe35
MH
1583
1584 if (!be)
1585 die("BUG: reference backend %s is unknown", be_name);
1586
9e7ec634 1587 refs = be->init(gitdir, flags);
ba88add5 1588 return refs;
00eebe35
MH
1589}
1590
077be78d 1591struct ref_store *get_main_ref_store(void)
24c8407e
NTND
1592{
1593 if (main_ref_store)
1594 return main_ref_store;
1595
0d8a814d 1596 main_ref_store = ref_store_init(get_git_dir(), REF_STORE_ALL_CAPS);
378dc910
NTND
1597 return main_ref_store;
1598}
1599
1600/*
0c064d90
NTND
1601 * Associate a ref store with a name. It is a fatal error to call this
1602 * function twice for the same name.
378dc910 1603 */
0c064d90
NTND
1604static void register_ref_store_map(struct hashmap *map,
1605 const char *type,
1606 struct ref_store *refs,
1607 const char *name)
378dc910 1608{
0c064d90 1609 if (!map->tablesize)
7663cdc8 1610 hashmap_init(map, ref_store_hash_cmp, NULL, 0);
378dc910 1611
0c064d90
NTND
1612 if (hashmap_put(map, alloc_ref_store_hash_entry(name, refs)))
1613 die("BUG: %s ref_store '%s' initialized twice", type, name);
24c8407e
NTND
1614}
1615
18d0002d 1616struct ref_store *get_submodule_ref_store(const char *submodule)
00eebe35 1617{
126c9e05 1618 struct strbuf submodule_sb = STRBUF_INIT;
00eebe35 1619 struct ref_store *refs;
29babbee
NTND
1620 char *to_free = NULL;
1621 size_t len;
00eebe35 1622
82a150f2
NTND
1623 if (!submodule)
1624 return NULL;
1625
873ea90d
NTND
1626 len = strlen(submodule);
1627 while (len && is_dir_sep(submodule[len - 1]))
1628 len--;
1629 if (!len)
1630 return NULL;
00eebe35 1631
29babbee
NTND
1632 if (submodule[len])
1633 /* We need to strip off one or more trailing slashes */
1634 submodule = to_free = xmemdupz(submodule, len);
00eebe35 1635
0c064d90 1636 refs = lookup_ref_store_map(&submodule_ref_stores, submodule);
126c9e05 1637 if (refs)
2c616c17 1638 goto done;
00eebe35 1639
126c9e05 1640 strbuf_addstr(&submodule_sb, submodule);
2c616c17
NTND
1641 if (!is_nonbare_repository_dir(&submodule_sb))
1642 goto done;
00eebe35 1643
2c616c17
NTND
1644 if (submodule_to_gitdir(&submodule_sb, submodule))
1645 goto done;
00eebe35 1646
9e7ec634
NTND
1647 /* assume that add_submodule_odb() has been called */
1648 refs = ref_store_init(submodule_sb.buf,
1649 REF_STORE_READ | REF_STORE_ODB);
0c064d90
NTND
1650 register_ref_store_map(&submodule_ref_stores, "submodule",
1651 refs, submodule);
5d0bc90e 1652
2c616c17 1653done:
5d0bc90e 1654 strbuf_release(&submodule_sb);
29babbee
NTND
1655 free(to_free);
1656
00eebe35
MH
1657 return refs;
1658}
1659
17eff96b
NTND
1660struct ref_store *get_worktree_ref_store(const struct worktree *wt)
1661{
1662 struct ref_store *refs;
1663 const char *id;
1664
1665 if (wt->is_current)
1666 return get_main_ref_store();
1667
1668 id = wt->id ? wt->id : "/";
1669 refs = lookup_ref_store_map(&worktree_ref_stores, id);
1670 if (refs)
1671 return refs;
1672
1673 if (wt->id)
1674 refs = ref_store_init(git_common_path("worktrees/%s", wt->id),
1675 REF_STORE_ALL_CAPS);
1676 else
1677 refs = ref_store_init(get_git_common_dir(),
1678 REF_STORE_ALL_CAPS);
1679
1680 if (refs)
1681 register_ref_store_map(&worktree_ref_stores, "worktree",
1682 refs, id);
1683 return refs;
1684}
1685
620a66b9 1686void base_ref_store_init(struct ref_store *refs,
fbfd0a29 1687 const struct ref_storage_be *be)
00eebe35 1688{
620a66b9 1689 refs->be = be;
00eebe35 1690}
127b42a1
RS
1691
1692/* backend functions */
7d2df051 1693int refs_pack_refs(struct ref_store *refs, unsigned int flags)
8231527e 1694{
8231527e
MH
1695 return refs->be->pack_refs(refs, flags);
1696}
1697
7d2df051 1698int refs_peel_ref(struct ref_store *refs, const char *refname,
b420d909 1699 struct object_id *oid)
7d2df051 1700{
ba1c052f 1701 int flag;
34c290a6 1702 struct object_id base;
ba1c052f
MH
1703
1704 if (current_ref_iter && current_ref_iter->refname == refname) {
1705 struct object_id peeled;
1706
1707 if (ref_iterator_peel(current_ref_iter, &peeled))
1708 return -1;
b420d909 1709 oidcpy(oid, &peeled);
ba1c052f
MH
1710 return 0;
1711 }
1712
1713 if (refs_read_ref_full(refs, refname,
34c290a6 1714 RESOLVE_REF_READING, &base, &flag))
ba1c052f
MH
1715 return -1;
1716
ac2ed0d7 1717 return peel_object(&base, oid);
8231527e
MH
1718}
1719
b420d909 1720int peel_ref(const char *refname, struct object_id *oid)
bd427cf2 1721{
b420d909 1722 return refs_peel_ref(get_main_ref_store(), refname, oid);
7d2df051 1723}
bd427cf2 1724
7d2df051
NTND
1725int refs_create_symref(struct ref_store *refs,
1726 const char *ref_target,
1727 const char *refs_heads_master,
1728 const char *logmsg)
1729{
1730 return refs->be->create_symref(refs, ref_target,
1731 refs_heads_master,
1732 logmsg);
bd427cf2
MH
1733}
1734
284689ba
MH
1735int create_symref(const char *ref_target, const char *refs_heads_master,
1736 const char *logmsg)
1737{
7d2df051
NTND
1738 return refs_create_symref(get_main_ref_store(), ref_target,
1739 refs_heads_master, logmsg);
284689ba
MH
1740}
1741
2ced105c
MH
1742int ref_update_reject_duplicates(struct string_list *refnames,
1743 struct strbuf *err)
1744{
a552e50e 1745 size_t i, n = refnames->nr;
2ced105c
MH
1746
1747 assert(err);
1748
8556f8d6
MH
1749 for (i = 1; i < n; i++) {
1750 int cmp = strcmp(refnames->items[i - 1].string,
1751 refnames->items[i].string);
1752
1753 if (!cmp) {
2ced105c
MH
1754 strbuf_addf(err,
1755 "multiple updates for ref '%s' not allowed.",
1756 refnames->items[i].string);
1757 return 1;
8556f8d6
MH
1758 } else if (cmp > 0) {
1759 die("BUG: ref_update_reject_duplicates() received unsorted list");
2ced105c 1760 }
8556f8d6 1761 }
2ced105c
MH
1762 return 0;
1763}
1764
30173b88
MH
1765int ref_transaction_prepare(struct ref_transaction *transaction,
1766 struct strbuf *err)
127b42a1 1767{
c0fe4e8b 1768 struct ref_store *refs = transaction->ref_store;
127b42a1 1769
8d4240d3
MH
1770 switch (transaction->state) {
1771 case REF_TRANSACTION_OPEN:
1772 /* Good. */
1773 break;
30173b88
MH
1774 case REF_TRANSACTION_PREPARED:
1775 die("BUG: prepare called twice on reference transaction");
1776 break;
8d4240d3
MH
1777 case REF_TRANSACTION_CLOSED:
1778 die("BUG: prepare called on a closed reference transaction");
1779 break;
1780 default:
1781 die("BUG: unexpected reference transaction state");
1782 break;
1783 }
1784
d8f4481c
JK
1785 if (getenv(GIT_QUARANTINE_ENVIRONMENT)) {
1786 strbuf_addstr(err,
1787 _("ref updates forbidden inside quarantine environment"));
1788 return -1;
1789 }
1790
30173b88
MH
1791 return refs->be->transaction_prepare(refs, transaction, err);
1792}
1793
1794int ref_transaction_abort(struct ref_transaction *transaction,
1795 struct strbuf *err)
1796{
1797 struct ref_store *refs = transaction->ref_store;
1798 int ret = 0;
1799
1800 switch (transaction->state) {
1801 case REF_TRANSACTION_OPEN:
1802 /* No need to abort explicitly. */
1803 break;
1804 case REF_TRANSACTION_PREPARED:
1805 ret = refs->be->transaction_abort(refs, transaction, err);
1806 break;
1807 case REF_TRANSACTION_CLOSED:
1808 die("BUG: abort called on a closed reference transaction");
1809 break;
1810 default:
1811 die("BUG: unexpected reference transaction state");
1812 break;
1813 }
1814
1815 ref_transaction_free(transaction);
1816 return ret;
1817}
1818
1819int ref_transaction_commit(struct ref_transaction *transaction,
1820 struct strbuf *err)
1821{
1822 struct ref_store *refs = transaction->ref_store;
1823 int ret;
1824
1825 switch (transaction->state) {
1826 case REF_TRANSACTION_OPEN:
1827 /* Need to prepare first. */
1828 ret = ref_transaction_prepare(transaction, err);
1829 if (ret)
1830 return ret;
1831 break;
1832 case REF_TRANSACTION_PREPARED:
1833 /* Fall through to finish. */
1834 break;
1835 case REF_TRANSACTION_CLOSED:
1836 die("BUG: commit called on a closed reference transaction");
1837 break;
1838 default:
1839 die("BUG: unexpected reference transaction state");
1840 break;
1841 }
1842
1843 return refs->be->transaction_finish(refs, transaction, err);
127b42a1 1844}
62665823 1845
7d2df051
NTND
1846int refs_verify_refname_available(struct ref_store *refs,
1847 const char *refname,
b05855b5 1848 const struct string_list *extras,
7d2df051
NTND
1849 const struct string_list *skip,
1850 struct strbuf *err)
62665823 1851{
b05855b5
MH
1852 const char *slash;
1853 const char *extra_refname;
1854 struct strbuf dirname = STRBUF_INIT;
1855 struct strbuf referent = STRBUF_INIT;
1856 struct object_id oid;
1857 unsigned int type;
1858 struct ref_iterator *iter;
1859 int ok;
1860 int ret = -1;
1861
1862 /*
1863 * For the sake of comments in this function, suppose that
1864 * refname is "refs/foo/bar".
1865 */
1866
1867 assert(err);
1868
1869 strbuf_grow(&dirname, strlen(refname) + 1);
1870 for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
1871 /* Expand dirname to the new prefix, not including the trailing slash: */
1872 strbuf_add(&dirname, refname + dirname.len, slash - refname - dirname.len);
1873
1874 /*
1875 * We are still at a leading dir of the refname (e.g.,
1876 * "refs/foo"; if there is a reference with that name,
1877 * it is a conflict, *unless* it is in skip.
1878 */
1879 if (skip && string_list_has_string(skip, dirname.buf))
1880 continue;
1881
99afe91a 1882 if (!refs_read_raw_ref(refs, dirname.buf, &oid, &referent, &type)) {
b05855b5
MH
1883 strbuf_addf(err, "'%s' exists; cannot create '%s'",
1884 dirname.buf, refname);
1885 goto cleanup;
1886 }
1887
1888 if (extras && string_list_has_string(extras, dirname.buf)) {
1889 strbuf_addf(err, "cannot process '%s' and '%s' at the same time",
1890 refname, dirname.buf);
1891 goto cleanup;
1892 }
1893 }
1894
1895 /*
1896 * We are at the leaf of our refname (e.g., "refs/foo/bar").
1897 * There is no point in searching for a reference with that
1898 * name, because a refname isn't considered to conflict with
1899 * itself. But we still need to check for references whose
1900 * names are in the "refs/foo/bar/" namespace, because they
1901 * *do* conflict.
1902 */
1903 strbuf_addstr(&dirname, refname + dirname.len);
1904 strbuf_addch(&dirname, '/');
1905
1906 iter = refs_ref_iterator_begin(refs, dirname.buf, 0,
1907 DO_FOR_EACH_INCLUDE_BROKEN);
1908 while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
1909 if (skip &&
1910 string_list_has_string(skip, iter->refname))
1911 continue;
1912
1913 strbuf_addf(err, "'%s' exists; cannot create '%s'",
1914 iter->refname, refname);
1915 ref_iterator_abort(iter);
1916 goto cleanup;
1917 }
1918
1919 if (ok != ITER_DONE)
1920 die("BUG: error while iterating over references");
1921
1922 extra_refname = find_descendant_ref(dirname.buf, extras, skip);
1923 if (extra_refname)
1924 strbuf_addf(err, "cannot process '%s' and '%s' at the same time",
1925 refname, extra_refname);
1926 else
1927 ret = 0;
1928
1929cleanup:
1930 strbuf_release(&referent);
1931 strbuf_release(&dirname);
1932 return ret;
62665823 1933}
e3688bd6 1934
7d2df051 1935int refs_for_each_reflog(struct ref_store *refs, each_ref_fn fn, void *cb_data)
e3688bd6 1936{
e3688bd6
DT
1937 struct ref_iterator *iter;
1938
1939 iter = refs->be->reflog_iterator_begin(refs);
1940
1941 return do_for_each_ref_iterator(iter, fn, cb_data);
1942}
1943
7d2df051 1944int for_each_reflog(each_ref_fn fn, void *cb_data)
e3688bd6 1945{
7d2df051
NTND
1946 return refs_for_each_reflog(get_main_ref_store(), fn, cb_data);
1947}
e3688bd6 1948
7d2df051
NTND
1949int refs_for_each_reflog_ent_reverse(struct ref_store *refs,
1950 const char *refname,
1951 each_reflog_ent_fn fn,
1952 void *cb_data)
1953{
e3688bd6
DT
1954 return refs->be->for_each_reflog_ent_reverse(refs, refname,
1955 fn, cb_data);
1956}
1957
7d2df051
NTND
1958int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn,
1959 void *cb_data)
1960{
1961 return refs_for_each_reflog_ent_reverse(get_main_ref_store(),
1962 refname, fn, cb_data);
1963}
1964
1965int refs_for_each_reflog_ent(struct ref_store *refs, const char *refname,
1966 each_reflog_ent_fn fn, void *cb_data)
1967{
1968 return refs->be->for_each_reflog_ent(refs, refname, fn, cb_data);
1969}
1970
e3688bd6
DT
1971int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn,
1972 void *cb_data)
1973{
7d2df051
NTND
1974 return refs_for_each_reflog_ent(get_main_ref_store(), refname,
1975 fn, cb_data);
1976}
e3688bd6 1977
7d2df051
NTND
1978int refs_reflog_exists(struct ref_store *refs, const char *refname)
1979{
1980 return refs->be->reflog_exists(refs, refname);
e3688bd6
DT
1981}
1982
1983int reflog_exists(const char *refname)
1984{
7d2df051
NTND
1985 return refs_reflog_exists(get_main_ref_store(), refname);
1986}
e3688bd6 1987
7d2df051
NTND
1988int refs_create_reflog(struct ref_store *refs, const char *refname,
1989 int force_create, struct strbuf *err)
1990{
1991 return refs->be->create_reflog(refs, refname, force_create, err);
e3688bd6
DT
1992}
1993
1994int safe_create_reflog(const char *refname, int force_create,
1995 struct strbuf *err)
1996{
7d2df051
NTND
1997 return refs_create_reflog(get_main_ref_store(), refname,
1998 force_create, err);
1999}
e3688bd6 2000
7d2df051
NTND
2001int refs_delete_reflog(struct ref_store *refs, const char *refname)
2002{
2003 return refs->be->delete_reflog(refs, refname);
e3688bd6
DT
2004}
2005
2006int delete_reflog(const char *refname)
2007{
7d2df051
NTND
2008 return refs_delete_reflog(get_main_ref_store(), refname);
2009}
e3688bd6 2010
7d2df051 2011int refs_reflog_expire(struct ref_store *refs,
0155f710 2012 const char *refname, const struct object_id *oid,
7d2df051
NTND
2013 unsigned int flags,
2014 reflog_expiry_prepare_fn prepare_fn,
2015 reflog_expiry_should_prune_fn should_prune_fn,
2016 reflog_expiry_cleanup_fn cleanup_fn,
2017 void *policy_cb_data)
2018{
0155f710 2019 return refs->be->reflog_expire(refs, refname, oid, flags,
7d2df051
NTND
2020 prepare_fn, should_prune_fn,
2021 cleanup_fn, policy_cb_data);
e3688bd6
DT
2022}
2023
0155f710 2024int reflog_expire(const char *refname, const struct object_id *oid,
e3688bd6
DT
2025 unsigned int flags,
2026 reflog_expiry_prepare_fn prepare_fn,
2027 reflog_expiry_should_prune_fn should_prune_fn,
2028 reflog_expiry_cleanup_fn cleanup_fn,
2029 void *policy_cb_data)
2030{
7d2df051 2031 return refs_reflog_expire(get_main_ref_store(),
0155f710 2032 refname, oid, flags,
7d2df051
NTND
2033 prepare_fn, should_prune_fn,
2034 cleanup_fn, policy_cb_data);
e3688bd6 2035}
fc681463
DT
2036
2037int initial_ref_transaction_commit(struct ref_transaction *transaction,
2038 struct strbuf *err)
2039{
c0fe4e8b 2040 struct ref_store *refs = transaction->ref_store;
fc681463
DT
2041
2042 return refs->be->initial_transaction_commit(refs, transaction, err);
2043}
a27dcf89 2044
64da4199
MH
2045int refs_delete_refs(struct ref_store *refs, const char *msg,
2046 struct string_list *refnames, unsigned int flags)
a27dcf89 2047{
64da4199 2048 return refs->be->delete_refs(refs, msg, refnames, flags);
a27dcf89 2049}
9b6b40d9 2050
64da4199
MH
2051int delete_refs(const char *msg, struct string_list *refnames,
2052 unsigned int flags)
9b6b40d9 2053{
64da4199 2054 return refs_delete_refs(get_main_ref_store(), msg, refnames, flags);
7d2df051 2055}
9b6b40d9 2056
7d2df051
NTND
2057int refs_rename_ref(struct ref_store *refs, const char *oldref,
2058 const char *newref, const char *logmsg)
2059{
9b6b40d9
DT
2060 return refs->be->rename_ref(refs, oldref, newref, logmsg);
2061}
7d2df051
NTND
2062
2063int rename_ref(const char *oldref, const char *newref, const char *logmsg)
2064{
2065 return refs_rename_ref(get_main_ref_store(), oldref, newref, logmsg);
2066}
52d59cc6
SD
2067
2068int refs_copy_existing_ref(struct ref_store *refs, const char *oldref,
2069 const char *newref, const char *logmsg)
2070{
2071 return refs->be->copy_ref(refs, oldref, newref, logmsg);
2072}
2073
2074int copy_existing_ref(const char *oldref, const char *newref, const char *logmsg)
2075{
2076 return refs_copy_existing_ref(get_main_ref_store(), oldref, newref, logmsg);
2077}