]> git.ipfire.org Git - thirdparty/git.git/blame - refs.c
git-compat-util.h: use "UNUSED", not "UNUSED(var)"
[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"
67541597 12#include "run-command.h"
5e3aba33 13#include "hook.h"
cbd53a21 14#include "object-store.h"
cf0adba7
JH
15#include "object.h"
16#include "tag.h"
5d0bc90e 17#include "submodule.h"
17eff96b 18#include "worktree.h"
dbbcd44f 19#include "strvec.h"
23a3f0cb 20#include "repository.h"
67541597 21#include "sigchain.h"
88c7b4c3 22#include "date.h"
3581d793 23
3dce444f
RS
24/*
25 * List of all available backends
26 */
27static struct ref_storage_be *refs_backends = &refs_be_files;
28
29static struct ref_storage_be *find_ref_storage_backend(const char *name)
30{
31 struct ref_storage_be *be;
32 for (be = refs_backends; be; be = be->next)
33 if (!strcmp(be->name, name))
34 return be;
35 return NULL;
36}
37
bc5fd6d3 38/*
dde8a902
DT
39 * How to handle various characters in refnames:
40 * 0: An acceptable character for refs
5e650228
JH
41 * 1: End-of-component
42 * 2: ., look for a preceding . to reject .. in refs
43 * 3: {, look for a preceding @ to reject @{ in refs
53a8555e 44 * 4: A bad character: ASCII control characters, and
cd377f45
JK
45 * ":", "?", "[", "\", "^", "~", SP, or TAB
46 * 5: *, reject unless REFNAME_REFSPEC_PATTERN is set
dde8a902
DT
47 */
48static unsigned char refname_disposition[256] = {
5e650228
JH
49 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
50 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
cd377f45 51 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 2, 1,
5e650228 52 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4,
dde8a902 53 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5e650228
JH
54 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 0,
55 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 4, 4
dde8a902
DT
57};
58
59/*
60 * Try to read one refname component from the front of refname.
61 * Return the length of the component found, or -1 if the component is
62 * not legal. It is legal if it is something reasonable to have under
63 * ".git/refs/"; We do not like it if:
bc5fd6d3 64 *
1de16aec 65 * - it begins with ".", or
bc5fd6d3 66 * - it has double dots "..", or
53a8555e 67 * - it has ASCII control characters, or
cd377f45
JK
68 * - it has ":", "?", "[", "\", "^", "~", SP, or TAB anywhere, or
69 * - it has "*" anywhere unless REFNAME_REFSPEC_PATTERN is set, or
53a8555e
JK
70 * - it ends with a "/", or
71 * - it ends with ".lock", or
72 * - it contains a "@{" portion
1de16aec
NTND
73 *
74 * When sanitized is not NULL, instead of rejecting the input refname
75 * as an error, try to come up with a usable replacement for the input
76 * refname in it.
bc5fd6d3 77 */
1de16aec
NTND
78static int check_refname_component(const char *refname, int *flags,
79 struct strbuf *sanitized)
bc5fd6d3
MH
80{
81 const char *cp;
82 char last = '\0';
1de16aec
NTND
83 size_t component_start = 0; /* garbage - not a reasonable initial value */
84
85 if (sanitized)
86 component_start = sanitized->len;
bc5fd6d3
MH
87
88 for (cp = refname; ; cp++) {
dde8a902
DT
89 int ch = *cp & 255;
90 unsigned char disp = refname_disposition[ch];
1de16aec
NTND
91
92 if (sanitized && disp != 1)
93 strbuf_addch(sanitized, ch);
94
dde8a902 95 switch (disp) {
5e650228 96 case 1:
dde8a902 97 goto out;
5e650228 98 case 2:
1de16aec
NTND
99 if (last == '.') { /* Refname contains "..". */
100 if (sanitized)
101 /* collapse ".." to single "." */
102 strbuf_setlen(sanitized, sanitized->len - 1);
103 else
104 return -1;
105 }
dde8a902 106 break;
5e650228 107 case 3:
1de16aec
NTND
108 if (last == '@') { /* Refname contains "@{". */
109 if (sanitized)
110 sanitized->buf[sanitized->len-1] = '-';
111 else
112 return -1;
113 }
bc5fd6d3 114 break;
5e650228 115 case 4:
1de16aec
NTND
116 /* forbidden char */
117 if (sanitized)
118 sanitized->buf[sanitized->len-1] = '-';
119 else
120 return -1;
121 break;
cd377f45 122 case 5:
1de16aec
NTND
123 if (!(*flags & REFNAME_REFSPEC_PATTERN)) {
124 /* refspec can't be a pattern */
125 if (sanitized)
126 sanitized->buf[sanitized->len-1] = '-';
127 else
128 return -1;
129 }
cd377f45
JK
130
131 /*
132 * Unset the pattern flag so that we only accept
133 * a single asterisk for one side of refspec.
134 */
135 *flags &= ~ REFNAME_REFSPEC_PATTERN;
136 break;
dde8a902 137 }
bc5fd6d3
MH
138 last = ch;
139 }
dde8a902 140out:
bc5fd6d3 141 if (cp == refname)
dac529e4 142 return 0; /* Component has zero length. */
1de16aec
NTND
143
144 if (refname[0] == '.') { /* Component starts with '.'. */
145 if (sanitized)
146 sanitized->buf[component_start] = '-';
147 else
148 return -1;
149 }
7108ad23 150 if (cp - refname >= LOCK_SUFFIX_LEN &&
1de16aec
NTND
151 !memcmp(cp - LOCK_SUFFIX_LEN, LOCK_SUFFIX, LOCK_SUFFIX_LEN)) {
152 if (!sanitized)
153 return -1;
154 /* Refname ends with ".lock". */
155 while (strbuf_strip_suffix(sanitized, LOCK_SUFFIX)) {
156 /* try again in case we have .lock.lock */
157 }
158 }
bc5fd6d3
MH
159 return cp - refname;
160}
161
1de16aec
NTND
162static int check_or_sanitize_refname(const char *refname, int flags,
163 struct strbuf *sanitized)
bc5fd6d3
MH
164{
165 int component_len, component_count = 0;
166
1de16aec 167 if (!strcmp(refname, "@")) {
9ba89f48 168 /* Refname is a single character '@'. */
1de16aec
NTND
169 if (sanitized)
170 strbuf_addch(sanitized, '-');
171 else
172 return -1;
173 }
9ba89f48 174
bc5fd6d3 175 while (1) {
1de16aec
NTND
176 if (sanitized && sanitized->len)
177 strbuf_complete(sanitized, '/');
178
bc5fd6d3 179 /* We are at the start of a path component. */
1de16aec
NTND
180 component_len = check_refname_component(refname, &flags,
181 sanitized);
182 if (sanitized && component_len == 0)
183 ; /* OK, omit empty component */
184 else if (component_len <= 0)
cd377f45
JK
185 return -1;
186
bc5fd6d3
MH
187 component_count++;
188 if (refname[component_len] == '\0')
189 break;
190 /* Skip to next component. */
191 refname += component_len + 1;
192 }
193
1de16aec
NTND
194 if (refname[component_len - 1] == '.') {
195 /* Refname ends with '.'. */
196 if (sanitized)
197 ; /* omit ending dot */
198 else
199 return -1;
200 }
bc5fd6d3
MH
201 if (!(flags & REFNAME_ALLOW_ONELEVEL) && component_count < 2)
202 return -1; /* Refname has only one component. */
203 return 0;
204}
205
1de16aec
NTND
206int check_refname_format(const char *refname, int flags)
207{
208 return check_or_sanitize_refname(refname, flags, NULL);
209}
210
211void sanitize_refname_component(const char *refname, struct strbuf *out)
212{
213 if (check_or_sanitize_refname(refname, REFNAME_ALLOW_ONELEVEL, out))
214 BUG("sanitizing refname '%s' check returned error", refname);
215}
216
4cb77009 217int refname_is_safe(const char *refname)
d0f810f0 218{
39950fef
MH
219 const char *rest;
220
221 if (skip_prefix(refname, "refs/", &rest)) {
d0f810f0
RS
222 char *buf;
223 int result;
e40f3557
MH
224 size_t restlen = strlen(rest);
225
226 /* rest must not be empty, or start or end with "/" */
227 if (!restlen || *rest == '/' || rest[restlen - 1] == '/')
228 return 0;
d0f810f0 229
d0f810f0
RS
230 /*
231 * Does the refname try to escape refs/?
232 * For example: refs/foo/../bar is safe but refs/foo/../../bar
233 * is not.
234 */
e40f3557
MH
235 buf = xmallocz(restlen);
236 result = !normalize_path_copy(buf, rest) && !strcmp(buf, rest);
d0f810f0
RS
237 free(buf);
238 return result;
239 }
35db25c6
MH
240
241 do {
d0f810f0
RS
242 if (!isupper(*refname) && *refname != '_')
243 return 0;
244 refname++;
35db25c6 245 } while (*refname);
d0f810f0
RS
246 return 1;
247}
248
67be7c5a
MH
249/*
250 * Return true if refname, which has the specified oid and flags, can
251 * be resolved to an object in the database. If the referred-to object
252 * does not exist, emit a warning and return false.
253 */
254int ref_resolves_to_object(const char *refname,
9bc45a28 255 struct repository *repo,
67be7c5a
MH
256 const struct object_id *oid,
257 unsigned int flags)
258{
259 if (flags & REF_ISBROKEN)
260 return 0;
9bc45a28 261 if (!repo_has_object_file(repo, oid)) {
661558f0 262 error(_("%s does not point to a valid object!"), refname);
67be7c5a
MH
263 return 0;
264 }
265 return 1;
266}
267
7d2df051
NTND
268char *refs_resolve_refdup(struct ref_store *refs,
269 const char *refname, int resolve_flags,
0f2dc722 270 struct object_id *oid, int *flags)
7d2df051
NTND
271{
272 const char *result;
273
274 result = refs_resolve_ref_unsafe(refs, refname, resolve_flags,
ce14de03 275 oid, flags);
7d2df051
NTND
276 return xstrdup_or_null(result);
277}
278
7bd9bcf3 279char *resolve_refdup(const char *refname, int resolve_flags,
0f2dc722 280 struct object_id *oid, int *flags)
e1e22e37 281{
23a3f0cb 282 return refs_resolve_refdup(get_main_ref_store(the_repository),
7d2df051 283 refname, resolve_flags,
0f2dc722 284 oid, flags);
cddc4258
MH
285}
286
7bd9bcf3
MH
287/* The argument to filter_refs */
288struct ref_filter {
289 const char *pattern;
9ab9b5df 290 const char *prefix;
7bd9bcf3
MH
291 each_ref_fn *fn;
292 void *cb_data;
293};
432ad41e 294
76887df0 295int read_ref_full(const char *refname, int resolve_flags, struct object_id *oid, int *flags)
732134ed 296{
76887df0
ÆAB
297 struct ref_store *refs = get_main_ref_store(the_repository);
298
f1da24ca 299 if (refs_resolve_ref_unsafe(refs, refname, resolve_flags,
ce14de03 300 oid, flags))
7bd9bcf3
MH
301 return 0;
302 return -1;
732134ed
MH
303}
304
34c290a6 305int read_ref(const char *refname, struct object_id *oid)
cddc4258 306{
34c290a6 307 return read_ref_full(refname, RESOLVE_REF_READING, oid, NULL);
c774aab9
JP
308}
309
3f9f1acc 310int refs_ref_exists(struct ref_store *refs, const char *refname)
b3cd33d0 311{
f1da24ca 312 return !!refs_resolve_ref_unsafe(refs, refname, RESOLVE_REF_READING,
ce14de03 313 NULL, NULL);
b3cd33d0
NTND
314}
315
7bd9bcf3 316int ref_exists(const char *refname)
bc5fd6d3 317{
b3cd33d0 318 return refs_ref_exists(get_main_ref_store(the_repository), refname);
bc5fd6d3
MH
319}
320
7bd9bcf3
MH
321static int filter_refs(const char *refname, const struct object_id *oid,
322 int flags, void *data)
432ad41e 323{
7bd9bcf3
MH
324 struct ref_filter *filter = (struct ref_filter *)data;
325
55d34269 326 if (wildmatch(filter->pattern, refname, 0))
7bd9bcf3 327 return 0;
9ab9b5df
RA
328 if (filter->prefix)
329 skip_prefix(refname, filter->prefix, &refname);
7bd9bcf3 330 return filter->fn(refname, oid, flags, filter->cb_data);
432ad41e
MH
331}
332
ac2ed0d7 333enum peel_status peel_object(const struct object_id *name, struct object_id *oid)
c774aab9 334{
45a187cc 335 struct object *o = lookup_unknown_object(the_repository, name);
c774aab9 336
7bd9bcf3 337 if (o->type == OBJ_NONE) {
0df8e965 338 int type = oid_object_info(the_repository, name, NULL);
6da43d93 339 if (type < 0 || !object_as_type(o, type, 0))
7bd9bcf3
MH
340 return PEEL_INVALID;
341 }
bc5fd6d3 342
7bd9bcf3
MH
343 if (o->type != OBJ_TAG)
344 return PEEL_NON_TAG;
e1980c9d 345
7bd9bcf3
MH
346 o = deref_tag_noverify(o);
347 if (!o)
348 return PEEL_INVALID;
349
ac2ed0d7 350 oidcpy(oid, &o->oid);
7bd9bcf3 351 return PEEL_PEELED;
e1980c9d
JH
352}
353
7bd9bcf3
MH
354struct warn_if_dangling_data {
355 FILE *fp;
356 const char *refname;
357 const struct string_list *refnames;
358 const char *msg_fmt;
359};
bc5fd6d3 360
63e14ee2 361static int warn_if_dangling_symref(const char *refname,
5cf88fd8 362 const struct object_id *oid UNUSED,
7bd9bcf3
MH
363 int flags, void *cb_data)
364{
365 struct warn_if_dangling_data *d = cb_data;
366 const char *resolves_to;
bc5fd6d3 367
7bd9bcf3
MH
368 if (!(flags & REF_ISSYMREF))
369 return 0;
bc5fd6d3 370
744c040b 371 resolves_to = resolve_ref_unsafe(refname, 0, NULL, NULL);
7bd9bcf3
MH
372 if (!resolves_to
373 || (d->refname
374 ? strcmp(resolves_to, d->refname)
375 : !string_list_has_string(d->refnames, resolves_to))) {
376 return 0;
377 }
bc5fd6d3 378
7bd9bcf3
MH
379 fprintf(d->fp, d->msg_fmt, refname);
380 fputc('\n', d->fp);
381 return 0;
bc5fd6d3
MH
382}
383
7bd9bcf3 384void warn_dangling_symref(FILE *fp, const char *msg_fmt, const char *refname)
f348ac92 385{
7bd9bcf3
MH
386 struct warn_if_dangling_data data;
387
388 data.fp = fp;
389 data.refname = refname;
390 data.refnames = NULL;
391 data.msg_fmt = msg_fmt;
392 for_each_rawref(warn_if_dangling_symref, &data);
f348ac92
MH
393}
394
7bd9bcf3 395void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct string_list *refnames)
432ad41e 396{
7bd9bcf3 397 struct warn_if_dangling_data data;
432ad41e 398
7bd9bcf3
MH
399 data.fp = fp;
400 data.refname = NULL;
401 data.refnames = refnames;
402 data.msg_fmt = msg_fmt;
403 for_each_rawref(warn_if_dangling_symref, &data);
432ad41e
MH
404}
405
7d2df051
NTND
406int refs_for_each_tag_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
407{
408 return refs_for_each_ref_in(refs, "refs/tags/", fn, cb_data);
409}
410
7bd9bcf3 411int for_each_tag_ref(each_ref_fn fn, void *cb_data)
432ad41e 412{
23a3f0cb 413 return refs_for_each_tag_ref(get_main_ref_store(the_repository), fn, cb_data);
432ad41e
MH
414}
415
7d2df051
NTND
416int refs_for_each_branch_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
417{
418 return refs_for_each_ref_in(refs, "refs/heads/", fn, cb_data);
432ad41e
MH
419}
420
7bd9bcf3 421int for_each_branch_ref(each_ref_fn fn, void *cb_data)
432ad41e 422{
23a3f0cb 423 return refs_for_each_branch_ref(get_main_ref_store(the_repository), fn, cb_data);
432ad41e
MH
424}
425
7d2df051
NTND
426int refs_for_each_remote_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
427{
428 return refs_for_each_ref_in(refs, "refs/remotes/", fn, cb_data);
202a56a9 429}
432ad41e 430
7bd9bcf3 431int for_each_remote_ref(each_ref_fn fn, void *cb_data)
e9c4c111 432{
23a3f0cb 433 return refs_for_each_remote_ref(get_main_ref_store(the_repository), fn, cb_data);
202a56a9
MH
434}
435
7bd9bcf3
MH
436int head_ref_namespaced(each_ref_fn fn, void *cb_data)
437{
438 struct strbuf buf = STRBUF_INIT;
439 int ret = 0;
440 struct object_id oid;
441 int flag;
c774aab9 442
7bd9bcf3 443 strbuf_addf(&buf, "%sHEAD", get_git_namespace());
34c290a6 444 if (!read_ref_full(buf.buf, RESOLVE_REF_READING, &oid, &flag))
7bd9bcf3
MH
445 ret = fn(buf.buf, &oid, flag, cb_data);
446 strbuf_release(&buf);
c774aab9 447
7bd9bcf3 448 return ret;
e9c4c111 449}
c774aab9 450
65516f58
RA
451void normalize_glob_ref(struct string_list_item *item, const char *prefix,
452 const char *pattern)
453{
454 struct strbuf normalized_pattern = STRBUF_INIT;
455
456 if (*pattern == '/')
457 BUG("pattern must not start with '/'");
458
459 if (prefix) {
460 strbuf_addstr(&normalized_pattern, prefix);
461 }
462 else if (!starts_with(pattern, "refs/"))
463 strbuf_addstr(&normalized_pattern, "refs/");
464 strbuf_addstr(&normalized_pattern, pattern);
465 strbuf_strip_suffix(&normalized_pattern, "/");
466
467 item->string = strbuf_detach(&normalized_pattern, NULL);
468 item->util = has_glob_specials(pattern) ? NULL : item->string;
469 strbuf_release(&normalized_pattern);
470}
471
7bd9bcf3
MH
472int for_each_glob_ref_in(each_ref_fn fn, const char *pattern,
473 const char *prefix, void *cb_data)
662428f4 474{
7bd9bcf3
MH
475 struct strbuf real_pattern = STRBUF_INIT;
476 struct ref_filter filter;
477 int ret;
d08bae7e 478
59556548 479 if (!prefix && !starts_with(pattern, "refs/"))
d08bae7e 480 strbuf_addstr(&real_pattern, "refs/");
b09fe971
IL
481 else if (prefix)
482 strbuf_addstr(&real_pattern, prefix);
d08bae7e
IL
483 strbuf_addstr(&real_pattern, pattern);
484
894a9d33 485 if (!has_glob_specials(pattern)) {
9517e6b8 486 /* Append implied '/' '*' if not present. */
00b6c178 487 strbuf_complete(&real_pattern, '/');
d08bae7e
IL
488 /* No need to check for '*', there is none. */
489 strbuf_addch(&real_pattern, '*');
490 }
491
492 filter.pattern = real_pattern.buf;
9ab9b5df 493 filter.prefix = prefix;
d08bae7e
IL
494 filter.fn = fn;
495 filter.cb_data = cb_data;
496 ret = for_each_ref(filter_refs, &filter);
497
498 strbuf_release(&real_pattern);
499 return ret;
500}
501
b09fe971
IL
502int for_each_glob_ref(each_ref_fn fn, const char *pattern, void *cb_data)
503{
504 return for_each_glob_ref_in(fn, pattern, NULL, cb_data);
505}
506
4577e483 507const char *prettify_refname(const char *name)
a9c37a72 508{
3e5b36c6
SG
509 if (skip_prefix(name, "refs/heads/", &name) ||
510 skip_prefix(name, "refs/tags/", &name) ||
511 skip_prefix(name, "refs/remotes/", &name))
512 ; /* nothing */
513 return name;
a9c37a72
DB
514}
515
54457fe5 516static const char *ref_rev_parse_rules[] = {
79803322
SP
517 "%.*s",
518 "refs/%.*s",
519 "refs/tags/%.*s",
520 "refs/heads/%.*s",
521 "refs/remotes/%.*s",
522 "refs/remotes/%.*s/HEAD",
523 NULL
524};
525
60650a48
JH
526#define NUM_REV_PARSE_RULES (ARRAY_SIZE(ref_rev_parse_rules) - 1)
527
528/*
529 * Is it possible that the caller meant full_name with abbrev_name?
530 * If so return a non-zero value to signal "yes"; the magnitude of
531 * the returned value gives the precedence used for disambiguation.
532 *
533 * If abbrev_name cannot mean full_name, return 0.
534 */
54457fe5 535int refname_match(const char *abbrev_name, const char *full_name)
79803322
SP
536{
537 const char **p;
538 const int abbrev_name_len = strlen(abbrev_name);
60650a48 539 const int num_rules = NUM_REV_PARSE_RULES;
79803322 540
60650a48
JH
541 for (p = ref_rev_parse_rules; *p; p++)
542 if (!strcmp(full_name, mkpath(*p, abbrev_name_len, abbrev_name)))
543 return &ref_rev_parse_rules[num_rules] - p;
79803322
SP
544
545 return 0;
546}
547
b4be7410
BW
548/*
549 * Given a 'prefix' expand it by the rules in 'ref_rev_parse_rules' and add
550 * the results to 'prefixes'
551 */
c972bf4c 552void expand_ref_prefix(struct strvec *prefixes, const char *prefix)
b4be7410
BW
553{
554 const char **p;
555 int len = strlen(prefix);
556
557 for (p = ref_rev_parse_rules; *p; p++)
c972bf4c 558 strvec_pushf(prefixes, *p, len, prefix);
b4be7410
BW
559}
560
675704c7
JS
561static const char default_branch_name_advice[] = N_(
562"Using '%s' as the name for the initial branch. This default branch name\n"
563"is subject to change. To configure the initial branch name to use in all\n"
564"of your new repositories, which will suppress this warning, call:\n"
565"\n"
566"\tgit config --global init.defaultBranch <name>\n"
567"\n"
568"Names commonly chosen instead of 'master' are 'main', 'trunk' and\n"
569"'development'. The just-created branch can be renamed via this command:\n"
570"\n"
571"\tgit branch -m <name>\n"
572);
573
cc0f13c5 574char *repo_default_branch_name(struct repository *r, int quiet)
8747ebb7
DGW
575{
576 const char *config_key = "init.defaultbranch";
577 const char *config_display_key = "init.defaultBranch";
578 char *ret = NULL, *full_ref;
704fed9e 579 const char *env = getenv("GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME");
8747ebb7 580
704fed9e
JS
581 if (env && *env)
582 ret = xstrdup(env);
583 else if (repo_config_get_string(r, config_key, &ret) < 0)
8747ebb7
DGW
584 die(_("could not retrieve `%s`"), config_display_key);
585
675704c7 586 if (!ret) {
8747ebb7 587 ret = xstrdup("master");
675704c7
JS
588 if (!quiet)
589 advise(_(default_branch_name_advice), ret);
590 }
8747ebb7
DGW
591
592 full_ref = xstrfmt("refs/heads/%s", ret);
593 if (check_refname_format(full_ref, 0))
594 die(_("invalid branch name: %s = %s"), config_display_key, ret);
595 free(full_ref);
596
597 return ret;
598}
599
cc0f13c5 600const char *git_default_branch_name(int quiet)
8747ebb7
DGW
601{
602 static char *ret;
603
604 if (!ret)
cc0f13c5 605 ret = repo_default_branch_name(the_repository, quiet);
8747ebb7
DGW
606
607 return ret;
608}
609
ff74f7f1
JH
610/*
611 * *string and *len will only be substituted, and *string returned (for
612 * later free()ing) if the string passed in is a magic short-hand form
613 * to name a branch.
614 */
8f56e9d4 615static char *substitute_branch_name(struct repository *r,
f24c30e0
JT
616 const char **string, int *len,
617 int nonfatal_dangling_mark)
ff74f7f1
JH
618{
619 struct strbuf buf = STRBUF_INIT;
f24c30e0
JT
620 struct interpret_branch_name_options options = {
621 .nonfatal_dangling_mark = nonfatal_dangling_mark
622 };
a4f66a78 623 int ret = repo_interpret_branch_name(r, *string, *len, &buf, &options);
ff74f7f1
JH
624
625 if (ret == *len) {
626 size_t size;
627 *string = strbuf_detach(&buf, &size);
628 *len = size;
629 return (char *)*string;
630 }
631
632 return NULL;
633}
634
d8984c53 635int repo_dwim_ref(struct repository *r, const char *str, int len,
f24c30e0 636 struct object_id *oid, char **ref, int nonfatal_dangling_mark)
ff74f7f1 637{
f24c30e0
JT
638 char *last_branch = substitute_branch_name(r, &str, &len,
639 nonfatal_dangling_mark);
d8984c53 640 int refs_found = expand_ref(r, str, len, oid, ref);
41da7111
NTND
641 free(last_branch);
642 return refs_found;
643}
644
0b1dbf53
NTND
645int expand_ref(struct repository *repo, const char *str, int len,
646 struct object_id *oid, char **ref)
41da7111 647{
ff74f7f1
JH
648 const char **p, *r;
649 int refs_found = 0;
6cd4a898 650 struct strbuf fullref = STRBUF_INIT;
ff74f7f1
JH
651
652 *ref = NULL;
653 for (p = ref_rev_parse_rules; *p; p++) {
cca5fa64 654 struct object_id oid_from_ref;
655 struct object_id *this_result;
ff74f7f1 656 int flag;
6582bd31 657 struct ref_store *refs = get_main_ref_store(repo);
ff74f7f1 658
cca5fa64 659 this_result = refs_found ? &oid_from_ref : oid;
6cd4a898
JK
660 strbuf_reset(&fullref);
661 strbuf_addf(&fullref, *p, len, str);
f1da24ca 662 r = refs_resolve_ref_unsafe(refs, fullref.buf,
6582bd31 663 RESOLVE_REF_READING,
ce14de03 664 this_result, &flag);
ff74f7f1
JH
665 if (r) {
666 if (!refs_found++)
667 *ref = xstrdup(r);
668 if (!warn_ambiguous_refs)
669 break;
6cd4a898 670 } else if ((flag & REF_ISSYMREF) && strcmp(fullref.buf, "HEAD")) {
661558f0 671 warning(_("ignoring dangling symref %s"), fullref.buf);
6cd4a898 672 } else if ((flag & REF_ISBROKEN) && strchr(fullref.buf, '/')) {
661558f0 673 warning(_("ignoring broken ref %s"), fullref.buf);
55956350 674 }
ff74f7f1 675 }
6cd4a898 676 strbuf_release(&fullref);
ff74f7f1
JH
677 return refs_found;
678}
679
56700903
NTND
680int repo_dwim_log(struct repository *r, const char *str, int len,
681 struct object_id *oid, char **log)
ff74f7f1 682{
56700903 683 struct ref_store *refs = get_main_ref_store(r);
f24c30e0 684 char *last_branch = substitute_branch_name(r, &str, &len, 0);
ff74f7f1
JH
685 const char **p;
686 int logs_found = 0;
6cd4a898 687 struct strbuf path = STRBUF_INIT;
ff74f7f1
JH
688
689 *log = NULL;
690 for (p = ref_rev_parse_rules; *p; p++) {
334dc52f 691 struct object_id hash;
ff74f7f1
JH
692 const char *ref, *it;
693
6cd4a898
JK
694 strbuf_reset(&path);
695 strbuf_addf(&path, *p, len, str);
56700903
NTND
696 ref = refs_resolve_ref_unsafe(refs, path.buf,
697 RESOLVE_REF_READING,
ce14de03 698 oid ? &hash : NULL, NULL);
ff74f7f1
JH
699 if (!ref)
700 continue;
56700903 701 if (refs_reflog_exists(refs, path.buf))
6cd4a898 702 it = path.buf;
56700903
NTND
703 else if (strcmp(ref, path.buf) &&
704 refs_reflog_exists(refs, ref))
ff74f7f1
JH
705 it = ref;
706 else
707 continue;
708 if (!logs_found++) {
709 *log = xstrdup(it);
6f45ec88
ÆAB
710 if (oid)
711 oidcpy(oid, &hash);
ff74f7f1 712 }
7bd9bcf3
MH
713 if (!warn_ambiguous_refs)
714 break;
c0277d15 715 }
6cd4a898 716 strbuf_release(&path);
7bd9bcf3
MH
717 free(last_branch);
718 return logs_found;
2ddb5d17
BK
719}
720
56700903
NTND
721int dwim_log(const char *str, int len, struct object_id *oid, char **log)
722{
723 return repo_dwim_log(the_repository, str, len, oid, log);
724}
725
266b1827
DT
726static int is_per_worktree_ref(const char *refname)
727{
55dd8b91
HWN
728 return starts_with(refname, "refs/worktree/") ||
729 starts_with(refname, "refs/bisect/") ||
730 starts_with(refname, "refs/rewritten/");
266b1827
DT
731}
732
733static int is_pseudoref_syntax(const char *refname)
734{
735 const char *c;
736
737 for (c = refname; *c; c++) {
738 if (!isupper(*c) && *c != '-' && *c != '_')
739 return 0;
740 }
741
742 return 1;
743}
744
3a3b9d8c
NTND
745static int is_main_pseudoref_syntax(const char *refname)
746{
747 return skip_prefix(refname, "main-worktree/", &refname) &&
748 *refname &&
749 is_pseudoref_syntax(refname);
750}
751
752static int is_other_pseudoref_syntax(const char *refname)
753{
754 if (!skip_prefix(refname, "worktrees/", &refname))
755 return 0;
756 refname = strchr(refname, '/');
757 if (!refname || !refname[1])
758 return 0;
759 return is_pseudoref_syntax(refname + 1);
760}
761
266b1827
DT
762enum ref_type ref_type(const char *refname)
763{
764 if (is_per_worktree_ref(refname))
765 return REF_TYPE_PER_WORKTREE;
766 if (is_pseudoref_syntax(refname))
767 return REF_TYPE_PSEUDOREF;
3a3b9d8c
NTND
768 if (is_main_pseudoref_syntax(refname))
769 return REF_TYPE_MAIN_PSEUDOREF;
770 if (is_other_pseudoref_syntax(refname))
771 return REF_TYPE_OTHER_PSEUDOREF;
5c79f74f 772 return REF_TYPE_NORMAL;
266b1827
DT
773}
774
4ff0f01c
MH
775long get_files_ref_lock_timeout_ms(void)
776{
777 static int configured = 0;
778
779 /* The default timeout is 100 ms: */
780 static int timeout_ms = 100;
781
782 if (!configured) {
783 git_config_get_int("core.filesreflocktimeout", &timeout_ms);
784 configured = 1;
785 }
786
787 return timeout_ms;
788}
789
c0fe4e8b
NTND
790int refs_delete_ref(struct ref_store *refs, const char *msg,
791 const char *refname,
2616a5e5 792 const struct object_id *old_oid,
c0fe4e8b 793 unsigned int flags)
41b625b0 794{
7521cc46 795 struct ref_transaction *transaction;
a4c653df 796 struct strbuf err = STRBUF_INIT;
8b5157e4 797
c6da34a6 798 transaction = ref_store_transaction_begin(refs, &err);
7521cc46 799 if (!transaction ||
89f3bbdd 800 ref_transaction_delete(transaction, refname, old_oid,
755b49ae 801 flags, msg, &err) ||
db7516ab 802 ref_transaction_commit(transaction, &err)) {
7521cc46
RS
803 error("%s", err.buf);
804 ref_transaction_free(transaction);
805 strbuf_release(&err);
c0277d15 806 return 1;
41b625b0 807 }
7bd9bcf3
MH
808 ref_transaction_free(transaction);
809 strbuf_release(&err);
b531394d
BC
810 return 0;
811}
41b625b0 812
c0fe4e8b 813int delete_ref(const char *msg, const char *refname,
2616a5e5 814 const struct object_id *old_oid, unsigned int flags)
c0fe4e8b 815{
23a3f0cb 816 return refs_delete_ref(get_main_ref_store(the_repository), msg, refname,
2616a5e5 817 old_oid, flags);
c0fe4e8b
NTND
818}
819
523fa69c 820static void copy_reflog_msg(struct strbuf *sb, const char *msg)
0ec29a47 821{
0ec29a47
JH
822 char c;
823 int wasspace = 1;
8b5157e4 824
0ec29a47
JH
825 while ((c = *msg++)) {
826 if (wasspace && isspace(c))
827 continue;
828 wasspace = isspace(c);
829 if (wasspace)
830 c = ' ';
80a6c207 831 strbuf_addch(sb, c);
a4c653df 832 }
80a6c207 833 strbuf_rtrim(sb);
0ec29a47 834}
8b5157e4 835
523fa69c
JH
836static char *normalize_reflog_message(const char *msg)
837{
838 struct strbuf sb = STRBUF_INIT;
839
840 if (msg && *msg)
841 copy_reflog_msg(&sb, msg);
842 return strbuf_detach(&sb, NULL);
843}
844
4cb77009 845int should_autocreate_reflog(const char *refname)
4e2bef57 846{
341fb286
CW
847 switch (log_all_ref_updates) {
848 case LOG_REFS_ALWAYS:
849 return 1;
850 case LOG_REFS_NORMAL:
851 return starts_with(refname, "refs/heads/") ||
852 starts_with(refname, "refs/remotes/") ||
853 starts_with(refname, "refs/notes/") ||
854 !strcmp(refname, "HEAD");
855 default:
4e2bef57 856 return 0;
341fb286 857 }
4e2bef57
DT
858}
859
e7e0f26e 860int is_branch(const char *refname)
c3b0dec5 861{
59556548 862 return !strcmp(refname, "HEAD") || starts_with(refname, "refs/heads/");
41b625b0
NP
863}
864
4207ed28
RS
865struct read_ref_at_cb {
866 const char *refname;
dddbad72 867 timestamp_t at_time;
4207ed28
RS
868 int cnt;
869 int reccnt;
8eb36d94 870 struct object_id *oid;
4207ed28
RS
871 int found_it;
872
8eb36d94 873 struct object_id ooid;
874 struct object_id noid;
4207ed28 875 int tz;
dddbad72 876 timestamp_t date;
4207ed28 877 char **msg;
dddbad72 878 timestamp_t *cutoff_time;
4207ed28
RS
879 int *cutoff_tz;
880 int *cutoff_cnt;
881};
882
95c2a718
DL
883static void set_read_ref_cutoffs(struct read_ref_at_cb *cb,
884 timestamp_t timestamp, int tz, const char *message)
885{
886 if (cb->msg)
887 *cb->msg = xstrdup(message);
888 if (cb->cutoff_time)
889 *cb->cutoff_time = timestamp;
890 if (cb->cutoff_tz)
891 *cb->cutoff_tz = tz;
892 if (cb->cutoff_cnt)
893 *cb->cutoff_cnt = cb->reccnt;
894}
895
9461d272 896static int read_ref_at_ent(struct object_id *ooid, struct object_id *noid,
5cf88fd8 897 const char *email UNUSED,
c006e9fa
JK
898 timestamp_t timestamp, int tz,
899 const char *message, void *cb_data)
4207ed28
RS
900{
901 struct read_ref_at_cb *cb = cb_data;
6436a202 902 int reached_count;
4207ed28 903
4207ed28
RS
904 cb->tz = tz;
905 cb->date = timestamp;
906
6436a202
DL
907 /*
908 * It is not possible for cb->cnt == 0 on the first iteration because
909 * that special case is handled in read_ref_at().
910 */
911 if (cb->cnt > 0)
912 cb->cnt--;
913 reached_count = cb->cnt == 0 && !is_null_oid(ooid);
914 if (timestamp <= cb->at_time || reached_count) {
95c2a718 915 set_read_ref_cutoffs(cb, timestamp, tz, message);
4207ed28 916 /*
78fb4579 917 * we have not yet updated cb->[n|o]oid so they still
4207ed28
RS
918 * hold the values for the previous record.
919 */
6436a202
DL
920 if (!is_null_oid(&cb->ooid) && !oideq(&cb->ooid, noid))
921 warning(_("log for ref %s has gap after %s"),
a5481a6c 922 cb->refname, show_date(cb->date, cb->tz, DATE_MODE(RFC2822)));
6436a202
DL
923 if (reached_count)
924 oidcpy(cb->oid, ooid);
925 else if (!is_null_oid(&cb->ooid) || cb->date == cb->at_time)
8eb36d94 926 oidcpy(cb->oid, noid);
9001dc2a 927 else if (!oideq(noid, cb->oid))
661558f0 928 warning(_("log for ref %s unexpectedly ended on %s"),
4207ed28 929 cb->refname, show_date(cb->date, cb->tz,
a5481a6c 930 DATE_MODE(RFC2822)));
4207ed28 931 cb->found_it = 1;
4207ed28 932 }
95c2a718 933 cb->reccnt++;
8eb36d94 934 oidcpy(&cb->ooid, ooid);
935 oidcpy(&cb->noid, noid);
6436a202
DL
936 return cb->found_it;
937}
938
5cf88fd8 939static int read_ref_at_ent_newest(struct object_id *ooid UNUSED,
63e14ee2 940 struct object_id *noid,
5cf88fd8 941 const char *email UNUSED,
63e14ee2
JK
942 timestamp_t timestamp, int tz,
943 const char *message, void *cb_data)
6436a202
DL
944{
945 struct read_ref_at_cb *cb = cb_data;
946
947 set_read_ref_cutoffs(cb, timestamp, tz, message);
948 oidcpy(cb->oid, noid);
949 /* We just want the first entry */
950 return 1;
4207ed28
RS
951}
952
9461d272 953static int read_ref_at_ent_oldest(struct object_id *ooid, struct object_id *noid,
5cf88fd8 954 const char *email UNUSED,
c006e9fa
JK
955 timestamp_t timestamp, int tz,
956 const char *message, void *cb_data)
4207ed28
RS
957{
958 struct read_ref_at_cb *cb = cb_data;
959
95c2a718 960 set_read_ref_cutoffs(cb, timestamp, tz, message);
8eb36d94 961 oidcpy(cb->oid, ooid);
962 if (is_null_oid(cb->oid))
963 oidcpy(cb->oid, noid);
4207ed28
RS
964 /* We just want the first entry */
965 return 1;
16d7cc90
JH
966}
967
7fdff474
NTND
968int read_ref_at(struct ref_store *refs, const char *refname,
969 unsigned int flags, timestamp_t at_time, int cnt,
8eb36d94 970 struct object_id *oid, char **msg,
dddbad72 971 timestamp_t *cutoff_time, int *cutoff_tz, int *cutoff_cnt)
d556fae2 972{
4207ed28 973 struct read_ref_at_cb cb;
d556fae2 974
4207ed28
RS
975 memset(&cb, 0, sizeof(cb));
976 cb.refname = refname;
977 cb.at_time = at_time;
978 cb.cnt = cnt;
979 cb.msg = msg;
980 cb.cutoff_time = cutoff_time;
981 cb.cutoff_tz = cutoff_tz;
982 cb.cutoff_cnt = cutoff_cnt;
8eb36d94 983 cb.oid = oid;
4207ed28 984
6436a202
DL
985 if (cb.cnt == 0) {
986 refs_for_each_reflog_ent_reverse(refs, refname, read_ref_at_ent_newest, &cb);
987 return 0;
988 }
989
7fdff474 990 refs_for_each_reflog_ent_reverse(refs, refname, read_ref_at_ent, &cb);
4207ed28 991
c41a87dd 992 if (!cb.reccnt) {
321c89bf 993 if (flags & GET_OID_QUIETLY)
c41a87dd
DA
994 exit(128);
995 else
661558f0 996 die(_("log for %s is empty"), refname);
c41a87dd 997 }
4207ed28
RS
998 if (cb.found_it)
999 return 0;
1000
7fdff474 1001 refs_for_each_reflog_ent(refs, refname, read_ref_at_ent_oldest, &cb);
d556fae2 1002
16d7cc90 1003 return 1;
d556fae2 1004}
2ff81662 1005
c0fe4e8b
NTND
1006struct ref_transaction *ref_store_transaction_begin(struct ref_store *refs,
1007 struct strbuf *err)
caa4046c 1008{
c0fe4e8b 1009 struct ref_transaction *tr;
5a603b04
JN
1010 assert(err);
1011
ca56dadb 1012 CALLOC_ARRAY(tr, 1);
c0fe4e8b
NTND
1013 tr->ref_store = refs;
1014 return tr;
1015}
1016
1017struct ref_transaction *ref_transaction_begin(struct strbuf *err)
1018{
c6da34a6 1019 return ref_store_transaction_begin(get_main_ref_store(the_repository), err);
caa4046c
MH
1020}
1021
026bd1d3 1022void ref_transaction_free(struct ref_transaction *transaction)
caa4046c 1023{
43a2dfde 1024 size_t i;
caa4046c 1025
1b07255c
RS
1026 if (!transaction)
1027 return;
1028
30173b88
MH
1029 switch (transaction->state) {
1030 case REF_TRANSACTION_OPEN:
1031 case REF_TRANSACTION_CLOSED:
1032 /* OK */
1033 break;
1034 case REF_TRANSACTION_PREPARED:
033abf97 1035 BUG("free called on a prepared reference transaction");
30173b88
MH
1036 break;
1037 default:
033abf97 1038 BUG("unexpected reference transaction state");
30173b88
MH
1039 break;
1040 }
1041
db7516ab
RS
1042 for (i = 0; i < transaction->nr; i++) {
1043 free(transaction->updates[i]->msg);
88615910 1044 free(transaction->updates[i]);
db7516ab 1045 }
caa4046c
MH
1046 free(transaction->updates);
1047 free(transaction);
1048}
1049
71564516
MH
1050struct ref_update *ref_transaction_add_update(
1051 struct ref_transaction *transaction,
1052 const char *refname, unsigned int flags,
89f3bbdd 1053 const struct object_id *new_oid,
1054 const struct object_id *old_oid,
71564516 1055 const char *msg)
caa4046c 1056{
96ffc06f 1057 struct ref_update *update;
71564516
MH
1058
1059 if (transaction->state != REF_TRANSACTION_OPEN)
033abf97 1060 BUG("update called for transaction that is not open");
71564516 1061
96ffc06f 1062 FLEX_ALLOC_STR(update, refname, refname);
caa4046c
MH
1063 ALLOC_GROW(transaction->updates, transaction->nr + 1, transaction->alloc);
1064 transaction->updates[transaction->nr++] = update;
71564516
MH
1065
1066 update->flags = flags;
1067
1068 if (flags & REF_HAVE_NEW)
89f3bbdd 1069 oidcpy(&update->new_oid, new_oid);
71564516 1070 if (flags & REF_HAVE_OLD)
89f3bbdd 1071 oidcpy(&update->old_oid, old_oid);
523fa69c 1072 update->msg = normalize_reflog_message(msg);
caa4046c
MH
1073 return update;
1074}
1075
8e34800e
RS
1076int ref_transaction_update(struct ref_transaction *transaction,
1077 const char *refname,
89f3bbdd 1078 const struct object_id *new_oid,
1079 const struct object_id *old_oid,
1d147bdf 1080 unsigned int flags, const char *msg,
8e34800e 1081 struct strbuf *err)
caa4046c 1082{
5a603b04
JN
1083 assert(err);
1084
3c966c7b
HWN
1085 if (!(flags & REF_SKIP_REFNAME_VERIFICATION) &&
1086 ((new_oid && !is_null_oid(new_oid)) ?
1087 check_refname_format(refname, REFNAME_ALLOW_ONELEVEL) :
1088 !refname_is_safe(refname))) {
661558f0 1089 strbuf_addf(err, _("refusing to update ref with bad name '%s'"),
d0f810f0
RS
1090 refname);
1091 return -1;
1092 }
1093
a9bbbcec
MH
1094 if (flags & ~REF_TRANSACTION_UPDATE_ALLOWED_FLAGS)
1095 BUG("illegal flags 0x%x passed to ref_transaction_update()", flags);
c788c54c 1096
49f1eb3b
JK
1097 /*
1098 * Clear flags outside the allowed set; this should be a noop because
1099 * of the BUG() check above, but it works around a -Wnonnull warning
1100 * with some versions of "gcc -O3".
1101 */
1102 flags &= REF_TRANSACTION_UPDATE_ALLOWED_FLAGS;
1103
89f3bbdd 1104 flags |= (new_oid ? REF_HAVE_NEW : 0) | (old_oid ? REF_HAVE_OLD : 0);
71564516
MH
1105
1106 ref_transaction_add_update(transaction, refname, flags,
89f3bbdd 1107 new_oid, old_oid, msg);
8e34800e 1108 return 0;
caa4046c
MH
1109}
1110
b416af5b
RS
1111int ref_transaction_create(struct ref_transaction *transaction,
1112 const char *refname,
89f3bbdd 1113 const struct object_id *new_oid,
fec14ec3 1114 unsigned int flags, const char *msg,
b416af5b 1115 struct strbuf *err)
caa4046c 1116{
d097a23b
DS
1117 if (!new_oid || is_null_oid(new_oid)) {
1118 strbuf_addf(err, "'%s' has a null OID", refname);
1119 return 1;
1120 }
89f3bbdd 1121 return ref_transaction_update(transaction, refname, new_oid,
14228447 1122 null_oid(), flags, msg, err);
caa4046c
MH
1123}
1124
8c8bdc0d
RS
1125int ref_transaction_delete(struct ref_transaction *transaction,
1126 const char *refname,
89f3bbdd 1127 const struct object_id *old_oid,
fb5a6bb6 1128 unsigned int flags, const char *msg,
8c8bdc0d 1129 struct strbuf *err)
caa4046c 1130{
89f3bbdd 1131 if (old_oid && is_null_oid(old_oid))
033abf97 1132 BUG("delete called with old_oid set to zeros");
1d147bdf 1133 return ref_transaction_update(transaction, refname,
14228447 1134 null_oid(), old_oid,
1d147bdf 1135 flags, msg, err);
caa4046c
MH
1136}
1137
16180334
MH
1138int ref_transaction_verify(struct ref_transaction *transaction,
1139 const char *refname,
89f3bbdd 1140 const struct object_id *old_oid,
16180334
MH
1141 unsigned int flags,
1142 struct strbuf *err)
1143{
89f3bbdd 1144 if (!old_oid)
033abf97 1145 BUG("verify called with old_oid set to NULL");
16180334 1146 return ref_transaction_update(transaction, refname,
89f3bbdd 1147 NULL, old_oid,
16180334
MH
1148 flags, NULL, err);
1149}
1150
c0fe4e8b 1151int refs_update_ref(struct ref_store *refs, const char *msg,
ae077771 1152 const char *refname, const struct object_id *new_oid,
1153 const struct object_id *old_oid, unsigned int flags,
c0fe4e8b 1154 enum action_on_err onerr)
4738a333 1155{
74ec19d4 1156 struct ref_transaction *t = NULL;
b4d75ac1 1157 struct strbuf err = STRBUF_INIT;
74ec19d4 1158 int ret = 0;
b4d75ac1 1159
c6da34a6 1160 t = ref_store_transaction_begin(refs, &err);
09743417
HWN
1161 if (!t ||
1162 ref_transaction_update(t, refname, new_oid, old_oid, flags, msg,
1163 &err) ||
1164 ref_transaction_commit(t, &err)) {
1165 ret = 1;
1166 ref_transaction_free(t);
74ec19d4
DT
1167 }
1168 if (ret) {
661558f0 1169 const char *str = _("update_ref failed for ref '%s': %s");
b4d75ac1 1170
b4d75ac1
RS
1171 switch (onerr) {
1172 case UPDATE_REFS_MSG_ON_ERR:
1173 error(str, refname, err.buf);
1174 break;
1175 case UPDATE_REFS_DIE_ON_ERR:
1176 die(str, refname, err.buf);
1177 break;
1178 case UPDATE_REFS_QUIET_ON_ERR:
1179 break;
1180 }
1181 strbuf_release(&err);
4738a333 1182 return 1;
b4d75ac1
RS
1183 }
1184 strbuf_release(&err);
74ec19d4
DT
1185 if (t)
1186 ref_transaction_free(t);
b4d75ac1 1187 return 0;
4738a333
BK
1188}
1189
c0fe4e8b 1190int update_ref(const char *msg, const char *refname,
ae077771 1191 const struct object_id *new_oid,
1192 const struct object_id *old_oid,
c0fe4e8b
NTND
1193 unsigned int flags, enum action_on_err onerr)
1194{
23a3f0cb 1195 return refs_update_ref(get_main_ref_store(the_repository), msg, refname, new_oid,
ae077771 1196 old_oid, flags, onerr);
c0fe4e8b
NTND
1197}
1198
546edf37
NTND
1199char *refs_shorten_unambiguous_ref(struct ref_store *refs,
1200 const char *refname, int strict)
7c2b3029
JK
1201{
1202 int i;
1203 static char **scanf_fmts;
1204 static int nr_rules;
1205 char *short_name;
6cd4a898 1206 struct strbuf resolved_buf = STRBUF_INIT;
7c2b3029 1207
7c2b3029 1208 if (!nr_rules) {
4346663a
MH
1209 /*
1210 * Pre-generate scanf formats from ref_rev_parse_rules[].
1211 * Generate a format suitable for scanf from a
1212 * ref_rev_parse_rules rule by interpolating "%s" at the
1213 * location of the "%.*s".
1214 */
7c2b3029 1215 size_t total_len = 0;
84d5633f 1216 size_t offset = 0;
7c2b3029
JK
1217
1218 /* the rule list is NULL terminated, count them first */
a4165851 1219 for (nr_rules = 0; ref_rev_parse_rules[nr_rules]; nr_rules++)
7902fe03
MH
1220 /* -2 for strlen("%.*s") - strlen("%s"); +1 for NUL */
1221 total_len += strlen(ref_rev_parse_rules[nr_rules]) - 2 + 1;
7c2b3029 1222
50492f7b 1223 scanf_fmts = xmalloc(st_add(st_mult(sizeof(char *), nr_rules), total_len));
7c2b3029 1224
84d5633f 1225 offset = 0;
7c2b3029 1226 for (i = 0; i < nr_rules; i++) {
4346663a 1227 assert(offset < total_len);
84d5633f 1228 scanf_fmts[i] = (char *)&scanf_fmts[nr_rules] + offset;
bf4baf1f
JK
1229 offset += xsnprintf(scanf_fmts[i], total_len - offset,
1230 ref_rev_parse_rules[i], 2, "%s") + 1;
7c2b3029
JK
1231 }
1232 }
1233
1234 /* bail out if there are no rules */
1235 if (!nr_rules)
dfefa935 1236 return xstrdup(refname);
7c2b3029 1237
dfefa935
MH
1238 /* buffer for scanf result, at most refname must fit */
1239 short_name = xstrdup(refname);
7c2b3029
JK
1240
1241 /* skip first rule, it will always match */
1242 for (i = nr_rules - 1; i > 0 ; --i) {
1243 int j;
6e7b3309 1244 int rules_to_fail = i;
7c2b3029
JK
1245 int short_name_len;
1246
dfefa935 1247 if (1 != sscanf(refname, scanf_fmts[i], short_name))
7c2b3029
JK
1248 continue;
1249
1250 short_name_len = strlen(short_name);
1251
6e7b3309
BW
1252 /*
1253 * in strict mode, all (except the matched one) rules
1254 * must fail to resolve to a valid non-ambiguous ref
1255 */
1256 if (strict)
1257 rules_to_fail = nr_rules;
1258
7c2b3029
JK
1259 /*
1260 * check if the short name resolves to a valid ref,
1261 * but use only rules prior to the matched one
1262 */
6e7b3309 1263 for (j = 0; j < rules_to_fail; j++) {
7c2b3029 1264 const char *rule = ref_rev_parse_rules[j];
7c2b3029 1265
6e7b3309
BW
1266 /* skip matched rule */
1267 if (i == j)
1268 continue;
1269
7c2b3029
JK
1270 /*
1271 * the short name is ambiguous, if it resolves
1272 * (with this previous rule) to a valid ref
1273 * read_ref() returns 0 on success
1274 */
6cd4a898
JK
1275 strbuf_reset(&resolved_buf);
1276 strbuf_addf(&resolved_buf, rule,
1277 short_name_len, short_name);
546edf37 1278 if (refs_ref_exists(refs, resolved_buf.buf))
7c2b3029
JK
1279 break;
1280 }
1281
1282 /*
1283 * short name is non-ambiguous if all previous rules
1284 * haven't resolved to a valid ref
1285 */
6cd4a898
JK
1286 if (j == rules_to_fail) {
1287 strbuf_release(&resolved_buf);
7c2b3029 1288 return short_name;
6cd4a898 1289 }
7c2b3029
JK
1290 }
1291
6cd4a898 1292 strbuf_release(&resolved_buf);
7c2b3029 1293 free(short_name);
dfefa935 1294 return xstrdup(refname);
7c2b3029 1295}
daebaa78 1296
546edf37
NTND
1297char *shorten_unambiguous_ref(const char *refname, int strict)
1298{
1299 return refs_shorten_unambiguous_ref(get_main_ref_store(the_repository),
1300 refname, strict);
1301}
1302
daebaa78
JH
1303static struct string_list *hide_refs;
1304
1305int parse_hide_refs_config(const char *var, const char *value, const char *section)
1306{
ad8c7cda 1307 const char *key;
daebaa78 1308 if (!strcmp("transfer.hiderefs", var) ||
ad8c7cda
JK
1309 (!parse_config_key(var, section, NULL, NULL, &key) &&
1310 !strcmp(key, "hiderefs"))) {
daebaa78
JH
1311 char *ref;
1312 int len;
1313
1314 if (!value)
1315 return config_error_nonbool(var);
1316 ref = xstrdup(value);
1317 len = strlen(ref);
1318 while (len && ref[len - 1] == '/')
1319 ref[--len] = '\0';
1320 if (!hide_refs) {
ca56dadb 1321 CALLOC_ARRAY(hide_refs, 1);
daebaa78
JH
1322 hide_refs->strdup_strings = 1;
1323 }
1324 string_list_append(hide_refs, ref);
1325 }
1326 return 0;
1327}
1328
78a766ab 1329int ref_is_hidden(const char *refname, const char *refname_full)
daebaa78 1330{
2bc31d16 1331 int i;
daebaa78
JH
1332
1333 if (!hide_refs)
1334 return 0;
2bc31d16
JK
1335 for (i = hide_refs->nr - 1; i >= 0; i--) {
1336 const char *match = hide_refs->items[i].string;
78a766ab 1337 const char *subject;
2bc31d16 1338 int neg = 0;
7a40a95e 1339 const char *p;
2bc31d16
JK
1340
1341 if (*match == '!') {
1342 neg = 1;
1343 match++;
1344 }
1345
78a766ab
LF
1346 if (*match == '^') {
1347 subject = refname_full;
1348 match++;
1349 } else {
1350 subject = refname;
1351 }
1352
1353 /* refname can be NULL when namespaces are used. */
7a40a95e
CC
1354 if (subject &&
1355 skip_prefix(subject, match, &p) &&
1356 (!*p || *p == '/'))
2bc31d16 1357 return !neg;
daebaa78
JH
1358 }
1359 return 0;
1360}
fa5b1830 1361
0845122c
DT
1362const char *find_descendant_ref(const char *dirname,
1363 const struct string_list *extras,
1364 const struct string_list *skip)
fa5b1830 1365{
0845122c 1366 int pos;
fa5b1830 1367
0845122c
DT
1368 if (!extras)
1369 return NULL;
fa5b1830
MH
1370
1371 /*
0845122c
DT
1372 * Look at the place where dirname would be inserted into
1373 * extras. If there is an entry at that position that starts
1374 * with dirname (remember, dirname includes the trailing
1375 * slash) and is not in skip, then we have a conflict.
fa5b1830 1376 */
0845122c
DT
1377 for (pos = string_list_find_insert_index(extras, dirname, 0);
1378 pos < extras->nr; pos++) {
1379 const char *extra_refname = extras->items[pos].string;
fa5b1830 1380
0845122c
DT
1381 if (!starts_with(extra_refname, dirname))
1382 break;
1383
1384 if (!skip || !string_list_has_string(skip, extra_refname))
1385 return extra_refname;
fa5b1830 1386 }
0845122c
DT
1387 return NULL;
1388}
fa5b1830 1389
62f0b399 1390int refs_head_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
2bf68ed5
DT
1391{
1392 struct object_id oid;
1393 int flag;
1394
f1da24ca 1395 if (refs_resolve_ref_unsafe(refs, "HEAD", RESOLVE_REF_READING,
ce14de03 1396 &oid, &flag))
2bf68ed5
DT
1397 return fn("HEAD", &oid, flag, cb_data);
1398
1399 return 0;
1400}
1401
1402int head_ref(each_ref_fn fn, void *cb_data)
1403{
23a3f0cb 1404 return refs_head_ref(get_main_ref_store(the_repository), fn, cb_data);
2bf68ed5 1405}
93770590 1406
e121b9cb
MH
1407struct ref_iterator *refs_ref_iterator_begin(
1408 struct ref_store *refs,
9aab952e
JK
1409 const char *prefix, int trim,
1410 enum do_for_each_ref_flags flags)
e121b9cb
MH
1411{
1412 struct ref_iterator *iter;
1413
6d751be4 1414 if (!(flags & DO_FOR_EACH_INCLUDE_BROKEN)) {
5d1f5b8c
JK
1415 static int ref_paranoia = -1;
1416
6d751be4 1417 if (ref_paranoia < 0)
968f12fd 1418 ref_paranoia = git_env_bool("GIT_REF_PARANOIA", 1);
6d751be4
JK
1419 if (ref_paranoia) {
1420 flags |= DO_FOR_EACH_INCLUDE_BROKEN;
1421 flags |= DO_FOR_EACH_OMIT_DANGLING_SYMREFS;
1422 }
1423 }
0a0865b8 1424
e121b9cb 1425 iter = refs->be->iterator_begin(refs, prefix, flags);
c7599718
MH
1426
1427 /*
1428 * `iterator_begin()` already takes care of prefix, but we
1429 * might need to do some trimming:
1430 */
1431 if (trim)
1432 iter = prefix_ref_iterator_begin(iter, "", trim);
e121b9cb 1433
8738a8a4
MH
1434 /* Sanity check for subclasses: */
1435 if (!iter->ordered)
1436 BUG("reference iterator is not ordered");
1437
e121b9cb
MH
1438 return iter;
1439}
1440
4c4de895
MH
1441/*
1442 * Call fn for each reference in the specified submodule for which the
1443 * refname begins with prefix. If trim is non-zero, then trim that
1444 * many characters off the beginning of each refname before passing
1445 * the refname to fn. flags can be DO_FOR_EACH_INCLUDE_BROKEN to
1446 * include broken references in the iteration. If fn ever returns a
1447 * non-zero value, stop the iteration and return that value;
1448 * otherwise, return 0.
1449 */
4a6067cd
SB
1450static int do_for_each_repo_ref(struct repository *r, const char *prefix,
1451 each_repo_ref_fn fn, int trim, int flags,
1452 void *cb_data)
1453{
1454 struct ref_iterator *iter;
1455 struct ref_store *refs = get_main_ref_store(r);
1456
1457 if (!refs)
1458 return 0;
1459
1460 iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
1461
1462 return do_for_each_repo_ref_iterator(r, iter, fn, cb_data);
1463}
1464
1465struct do_for_each_ref_help {
1466 each_ref_fn *fn;
1467 void *cb_data;
1468};
1469
1470static int do_for_each_ref_helper(struct repository *r,
1471 const char *refname,
1472 const struct object_id *oid,
1473 int flags,
1474 void *cb_data)
1475{
1476 struct do_for_each_ref_help *hp = cb_data;
1477
1478 return hp->fn(refname, oid, flags, hp->cb_data);
1479}
1480
7d2df051 1481static int do_for_each_ref(struct ref_store *refs, const char *prefix,
9aab952e
JK
1482 each_ref_fn fn, int trim,
1483 enum do_for_each_ref_flags flags, void *cb_data)
4c4de895
MH
1484{
1485 struct ref_iterator *iter;
4a6067cd 1486 struct do_for_each_ref_help hp = { fn, cb_data };
4c4de895 1487
00eebe35
MH
1488 if (!refs)
1489 return 0;
1490
e121b9cb 1491 iter = refs_ref_iterator_begin(refs, prefix, trim, flags);
4c4de895 1492
4a6067cd
SB
1493 return do_for_each_repo_ref_iterator(the_repository, iter,
1494 do_for_each_ref_helper, &hp);
4c4de895
MH
1495}
1496
7d2df051
NTND
1497int refs_for_each_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
1498{
1499 return do_for_each_ref(refs, "", fn, 0, 0, cb_data);
1500}
1501
93770590
DT
1502int for_each_ref(each_ref_fn fn, void *cb_data)
1503{
23a3f0cb 1504 return refs_for_each_ref(get_main_ref_store(the_repository), fn, cb_data);
93770590
DT
1505}
1506
7d2df051
NTND
1507int refs_for_each_ref_in(struct ref_store *refs, const char *prefix,
1508 each_ref_fn fn, void *cb_data)
1509{
1510 return do_for_each_ref(refs, prefix, fn, strlen(prefix), 0, cb_data);
93770590
DT
1511}
1512
1513int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
1514{
23a3f0cb 1515 return refs_for_each_ref_in(get_main_ref_store(the_repository), prefix, fn, cb_data);
93770590
DT
1516}
1517
67985e4e 1518int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data)
93770590 1519{
23a3f0cb 1520 return do_for_each_ref(get_main_ref_store(the_repository),
67985e4e 1521 prefix, fn, 0, 0, cb_data);
93770590
DT
1522}
1523
073cf63c 1524int refs_for_each_fullref_in(struct ref_store *refs, const char *prefix,
67985e4e 1525 each_ref_fn fn, void *cb_data)
03df567f 1526{
67985e4e 1527 return do_for_each_ref(refs, prefix, fn, 0, 0, cb_data);
03df567f
MH
1528}
1529
212e0f7e 1530int for_each_replace_ref(struct repository *r, each_repo_ref_fn fn, void *cb_data)
93770590 1531{
212e0f7e
SB
1532 return do_for_each_repo_ref(r, git_replace_ref_base, fn,
1533 strlen(git_replace_ref_base),
1534 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
93770590
DT
1535}
1536
1537int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
1538{
1539 struct strbuf buf = STRBUF_INIT;
1540 int ret;
1541 strbuf_addf(&buf, "%srefs/", get_git_namespace());
23a3f0cb 1542 ret = do_for_each_ref(get_main_ref_store(the_repository),
7d2df051 1543 buf.buf, fn, 0, 0, cb_data);
93770590
DT
1544 strbuf_release(&buf);
1545 return ret;
1546}
1547
7d2df051 1548int refs_for_each_rawref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
93770590 1549{
7d2df051 1550 return do_for_each_ref(refs, "", fn, 0,
93770590
DT
1551 DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
1552}
2d0663b2 1553
7d2df051
NTND
1554int for_each_rawref(each_ref_fn fn, void *cb_data)
1555{
23a3f0cb 1556 return refs_for_each_rawref(get_main_ref_store(the_repository), fn, cb_data);
7d2df051
NTND
1557}
1558
16b1985b
TB
1559static int qsort_strcmp(const void *va, const void *vb)
1560{
1561 const char *a = *(const char **)va;
1562 const char *b = *(const char **)vb;
1563
1564 return strcmp(a, b);
1565}
1566
1567static void find_longest_prefixes_1(struct string_list *out,
1568 struct strbuf *prefix,
1569 const char **patterns, size_t nr)
1570{
1571 size_t i;
1572
1573 for (i = 0; i < nr; i++) {
1574 char c = patterns[i][prefix->len];
1575 if (!c || is_glob_special(c)) {
1576 string_list_append(out, prefix->buf);
1577 return;
1578 }
1579 }
1580
1581 i = 0;
1582 while (i < nr) {
1583 size_t end;
1584
1585 /*
1586 * Set "end" to the index of the element _after_ the last one
1587 * in our group.
1588 */
1589 for (end = i + 1; end < nr; end++) {
1590 if (patterns[i][prefix->len] != patterns[end][prefix->len])
1591 break;
1592 }
1593
1594 strbuf_addch(prefix, patterns[i][prefix->len]);
1595 find_longest_prefixes_1(out, prefix, patterns + i, end - i);
1596 strbuf_setlen(prefix, prefix->len - 1);
1597
1598 i = end;
1599 }
1600}
1601
1602static void find_longest_prefixes(struct string_list *out,
1603 const char **patterns)
1604{
1605 struct strvec sorted = STRVEC_INIT;
1606 struct strbuf prefix = STRBUF_INIT;
1607
1608 strvec_pushv(&sorted, patterns);
1609 QSORT(sorted.v, sorted.nr, qsort_strcmp);
1610
1611 find_longest_prefixes_1(out, &prefix, sorted.v, sorted.nr);
1612
1613 strvec_clear(&sorted);
1614 strbuf_release(&prefix);
1615}
1616
1617int for_each_fullref_in_prefixes(const char *namespace,
1618 const char **patterns,
67985e4e 1619 each_ref_fn fn, void *cb_data)
16b1985b
TB
1620{
1621 struct string_list prefixes = STRING_LIST_INIT_DUP;
1622 struct string_list_item *prefix;
1623 struct strbuf buf = STRBUF_INIT;
1624 int ret = 0, namespace_len;
1625
1626 find_longest_prefixes(&prefixes, patterns);
1627
1628 if (namespace)
1629 strbuf_addstr(&buf, namespace);
1630 namespace_len = buf.len;
1631
1632 for_each_string_list_item(prefix, &prefixes) {
1633 strbuf_addstr(&buf, prefix->string);
67985e4e 1634 ret = for_each_fullref_in(buf.buf, fn, cb_data);
16b1985b
TB
1635 if (ret)
1636 break;
1637 strbuf_setlen(&buf, namespace_len);
1638 }
1639
1640 string_list_clear(&prefixes, 0);
1641 strbuf_release(&buf);
1642 return ret;
1643}
1644
e8115302
HWN
1645static int refs_read_special_head(struct ref_store *ref_store,
1646 const char *refname, struct object_id *oid,
df3458e9
HWN
1647 struct strbuf *referent, unsigned int *type,
1648 int *failure_errno)
e8115302
HWN
1649{
1650 struct strbuf full_path = STRBUF_INIT;
1651 struct strbuf content = STRBUF_INIT;
1652 int result = -1;
1653 strbuf_addf(&full_path, "%s/%s", ref_store->gitdir, refname);
1654
1655 if (strbuf_read_file(&content, full_path.buf, 0) < 0)
1656 goto done;
1657
df3458e9
HWN
1658 result = parse_loose_ref_contents(content.buf, oid, referent, type,
1659 failure_errno);
e8115302
HWN
1660
1661done:
1662 strbuf_release(&full_path);
1663 strbuf_release(&content);
1664 return result;
1665}
1666
8b72fea7
HWN
1667int refs_read_raw_ref(struct ref_store *ref_store, const char *refname,
1668 struct object_id *oid, struct strbuf *referent,
1669 unsigned int *type, int *failure_errno)
470be518 1670{
8b72fea7 1671 assert(failure_errno);
e8115302
HWN
1672 if (!strcmp(refname, "FETCH_HEAD") || !strcmp(refname, "MERGE_HEAD")) {
1673 return refs_read_special_head(ref_store, refname, oid, referent,
df3458e9 1674 type, failure_errno);
e8115302
HWN
1675 }
1676
1677 return ref_store->be->read_raw_ref(ref_store, refname, oid, referent,
8b72fea7 1678 type, failure_errno);
470be518
MH
1679}
1680
cd475b3b
PS
1681int refs_read_symbolic_ref(struct ref_store *ref_store, const char *refname,
1682 struct strbuf *referent)
1683{
5b875404 1684 return ref_store->be->read_symbolic_ref(ref_store, refname, referent);
cd475b3b
PS
1685}
1686
7d2df051 1687const char *refs_resolve_ref_unsafe(struct ref_store *refs,
3c0cb0cb
MH
1688 const char *refname,
1689 int resolve_flags,
ef18119d 1690 struct object_id *oid,
ce14de03 1691 int *flags)
2d0663b2
DT
1692{
1693 static struct strbuf sb_refname = STRBUF_INIT;
54fad661 1694 struct object_id unused_oid;
2d0663b2
DT
1695 int unused_flags;
1696 int symref_count;
1697
49e61479 1698 if (!oid)
1699 oid = &unused_oid;
2d0663b2
DT
1700 if (!flags)
1701 flags = &unused_flags;
1702
1703 *flags = 0;
1704
1705 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1706 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
ce14de03 1707 !refname_is_safe(refname))
2d0663b2 1708 return NULL;
2d0663b2
DT
1709
1710 /*
1711 * dwim_ref() uses REF_ISBROKEN to distinguish between
1712 * missing refs and refs that were present but invalid,
1713 * to complain about the latter to stderr.
1714 *
1715 * We don't know whether the ref exists, so don't set
1716 * REF_ISBROKEN yet.
1717 */
1718 *flags |= REF_BAD_NAME;
1719 }
1720
1721 for (symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) {
1722 unsigned int read_flags = 0;
ce14de03 1723 int failure_errno;
2d0663b2 1724
8b72fea7 1725 if (refs_read_raw_ref(refs, refname, oid, &sb_refname,
ce14de03 1726 &read_flags, &failure_errno)) {
2d0663b2 1727 *flags |= read_flags;
a1c1d817
JK
1728
1729 /* In reading mode, refs must eventually resolve */
1730 if (resolve_flags & RESOLVE_REF_READING)
1731 return NULL;
1732
1733 /*
1734 * Otherwise a missing ref is OK. But the files backend
1735 * may show errors besides ENOENT if there are
1736 * similarly-named refs.
1737 */
ce14de03
ÆAB
1738 if (failure_errno != ENOENT &&
1739 failure_errno != EISDIR &&
1740 failure_errno != ENOTDIR)
2d0663b2 1741 return NULL;
a1c1d817 1742
49e61479 1743 oidclr(oid);
2d0663b2
DT
1744 if (*flags & REF_BAD_NAME)
1745 *flags |= REF_ISBROKEN;
1746 return refname;
1747 }
1748
1749 *flags |= read_flags;
1750
1751 if (!(read_flags & REF_ISSYMREF)) {
1752 if (*flags & REF_BAD_NAME) {
49e61479 1753 oidclr(oid);
2d0663b2
DT
1754 *flags |= REF_ISBROKEN;
1755 }
1756 return refname;
1757 }
1758
1759 refname = sb_refname.buf;
1760 if (resolve_flags & RESOLVE_REF_NO_RECURSE) {
49e61479 1761 oidclr(oid);
2d0663b2
DT
1762 return refname;
1763 }
1764 if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) {
1765 if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) ||
ce14de03 1766 !refname_is_safe(refname))
2d0663b2 1767 return NULL;
2d0663b2
DT
1768
1769 *flags |= REF_ISBROKEN | REF_BAD_NAME;
1770 }
1771 }
1772
2d0663b2
DT
1773 return NULL;
1774}
00eebe35 1775
6fb5acfd
DT
1776/* backend functions */
1777int refs_init_db(struct strbuf *err)
1778{
23a3f0cb 1779 struct ref_store *refs = get_main_ref_store(the_repository);
6fb5acfd
DT
1780
1781 return refs->be->init_db(refs, err);
1782}
1783
bd40dcda 1784const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
49e61479 1785 struct object_id *oid, int *flags)
bd40dcda 1786{
23a3f0cb 1787 return refs_resolve_ref_unsafe(get_main_ref_store(the_repository), refname,
ce14de03 1788 resolve_flags, oid, flags);
bd40dcda
MH
1789}
1790
a8355bb7 1791int resolve_gitlink_ref(const char *submodule, const char *refname,
a98e6101 1792 struct object_id *oid)
424dcc76 1793{
424dcc76
MH
1794 struct ref_store *refs;
1795 int flags;
1796
29babbee 1797 refs = get_submodule_ref_store(submodule);
48a8475f 1798
424dcc76
MH
1799 if (!refs)
1800 return -1;
1801
ce14de03
ÆAB
1802 if (!refs_resolve_ref_unsafe(refs, refname, 0, oid, &flags) ||
1803 is_null_oid(oid))
424dcc76
MH
1804 return -1;
1805 return 0;
1806}
1807
0c064d90 1808struct ref_store_hash_entry
7d4558c4 1809{
e2b5038d 1810 struct hashmap_entry ent;
7d4558c4
MH
1811
1812 struct ref_store *refs;
1813
0c064d90
NTND
1814 /* NUL-terminated identifier of the ref store: */
1815 char name[FLEX_ARRAY];
7d4558c4
MH
1816};
1817
5cf88fd8 1818static int ref_store_hash_cmp(const void *cmp_data UNUSED,
939af16e
EW
1819 const struct hashmap_entry *eptr,
1820 const struct hashmap_entry *entry_or_key,
7d4558c4
MH
1821 const void *keydata)
1822{
939af16e
EW
1823 const struct ref_store_hash_entry *e1, *e2;
1824 const char *name;
1825
1826 e1 = container_of(eptr, const struct ref_store_hash_entry, ent);
1827 e2 = container_of(entry_or_key, const struct ref_store_hash_entry, ent);
1828 name = keydata ? keydata : e2->name;
7d4558c4 1829
0c064d90 1830 return strcmp(e1->name, name);
7d4558c4
MH
1831}
1832
0c064d90
NTND
1833static struct ref_store_hash_entry *alloc_ref_store_hash_entry(
1834 const char *name, struct ref_store *refs)
7d4558c4 1835{
0c064d90 1836 struct ref_store_hash_entry *entry;
7d4558c4 1837
0c064d90 1838 FLEX_ALLOC_STR(entry, name, name);
d22245a2 1839 hashmap_entry_init(&entry->ent, strhash(name));
7d4558c4
MH
1840 entry->refs = refs;
1841 return entry;
1842}
1843
7d4558c4
MH
1844/* A hashmap of ref_stores, stored by submodule name: */
1845static struct hashmap submodule_ref_stores;
00eebe35 1846
17eff96b
NTND
1847/* A hashmap of ref_stores, stored by worktree id: */
1848static struct hashmap worktree_ref_stores;
1849
c468da4e 1850/*
0c064d90
NTND
1851 * Look up a ref store by name. If that ref_store hasn't been
1852 * registered yet, return NULL.
c468da4e 1853 */
0c064d90
NTND
1854static struct ref_store *lookup_ref_store_map(struct hashmap *map,
1855 const char *name)
00eebe35 1856{
0c064d90 1857 struct ref_store_hash_entry *entry;
f23a4651 1858 unsigned int hash;
00eebe35 1859
0c064d90 1860 if (!map->tablesize)
7d4558c4
MH
1861 /* It's initialized on demand in register_ref_store(). */
1862 return NULL;
620a66b9 1863
f23a4651
EW
1864 hash = strhash(name);
1865 entry = hashmap_get_entry_from_hash(map, hash, name,
1866 struct ref_store_hash_entry, ent);
7d4558c4 1867 return entry ? entry->refs : NULL;
00eebe35
MH
1868}
1869
c468da4e
MH
1870/*
1871 * Create, record, and return a ref_store instance for the specified
5d0bc90e 1872 * gitdir.
c468da4e 1873 */
34224e14
JT
1874static struct ref_store *ref_store_init(struct repository *repo,
1875 const char *gitdir,
9e7ec634 1876 unsigned int flags)
00eebe35
MH
1877{
1878 const char *be_name = "files";
1879 struct ref_storage_be *be = find_ref_storage_backend(be_name);
ba88add5 1880 struct ref_store *refs;
00eebe35
MH
1881
1882 if (!be)
033abf97 1883 BUG("reference backend %s is unknown", be_name);
00eebe35 1884
34224e14 1885 refs = be->init(repo, gitdir, flags);
ba88add5 1886 return refs;
00eebe35
MH
1887}
1888
64a74161 1889struct ref_store *get_main_ref_store(struct repository *r)
24c8407e 1890{
02204610
JK
1891 if (r->refs_private)
1892 return r->refs_private;
24c8407e 1893
2dc417ab
JK
1894 if (!r->gitdir)
1895 BUG("attempting to get main_ref_store outside of repository");
1896
34224e14 1897 r->refs_private = ref_store_init(r, r->gitdir, REF_STORE_ALL_CAPS);
4441f427 1898 r->refs_private = maybe_debug_wrap_ref_store(r->gitdir, r->refs_private);
02204610 1899 return r->refs_private;
378dc910
NTND
1900}
1901
1902/*
0c064d90
NTND
1903 * Associate a ref store with a name. It is a fatal error to call this
1904 * function twice for the same name.
378dc910 1905 */
0c064d90
NTND
1906static void register_ref_store_map(struct hashmap *map,
1907 const char *type,
1908 struct ref_store *refs,
1909 const char *name)
378dc910 1910{
26b455f2
EW
1911 struct ref_store_hash_entry *entry;
1912
0c064d90 1913 if (!map->tablesize)
7663cdc8 1914 hashmap_init(map, ref_store_hash_cmp, NULL, 0);
378dc910 1915
26b455f2
EW
1916 entry = alloc_ref_store_hash_entry(name, refs);
1917 if (hashmap_put(map, &entry->ent))
033abf97 1918 BUG("%s ref_store '%s' initialized twice", type, name);
24c8407e
NTND
1919}
1920
18d0002d 1921struct ref_store *get_submodule_ref_store(const char *submodule)
00eebe35 1922{
126c9e05 1923 struct strbuf submodule_sb = STRBUF_INIT;
00eebe35 1924 struct ref_store *refs;
29babbee
NTND
1925 char *to_free = NULL;
1926 size_t len;
34224e14 1927 struct repository *subrepo;
00eebe35 1928
82a150f2
NTND
1929 if (!submodule)
1930 return NULL;
1931
873ea90d
NTND
1932 len = strlen(submodule);
1933 while (len && is_dir_sep(submodule[len - 1]))
1934 len--;
1935 if (!len)
1936 return NULL;
00eebe35 1937
29babbee
NTND
1938 if (submodule[len])
1939 /* We need to strip off one or more trailing slashes */
1940 submodule = to_free = xmemdupz(submodule, len);
00eebe35 1941
0c064d90 1942 refs = lookup_ref_store_map(&submodule_ref_stores, submodule);
126c9e05 1943 if (refs)
2c616c17 1944 goto done;
00eebe35 1945
126c9e05 1946 strbuf_addstr(&submodule_sb, submodule);
2c616c17
NTND
1947 if (!is_nonbare_repository_dir(&submodule_sb))
1948 goto done;
00eebe35 1949
2c616c17
NTND
1950 if (submodule_to_gitdir(&submodule_sb, submodule))
1951 goto done;
00eebe35 1952
34224e14
JT
1953 subrepo = xmalloc(sizeof(*subrepo));
1954 /*
1955 * NEEDSWORK: Make get_submodule_ref_store() work with arbitrary
1956 * superprojects other than the_repository. This probably should be
1957 * done by making it take a struct repository * parameter instead of a
1958 * submodule path.
1959 */
1960 if (repo_submodule_init(subrepo, the_repository, submodule,
1961 null_oid())) {
1962 free(subrepo);
1963 goto done;
1964 }
1965 refs = ref_store_init(subrepo, submodule_sb.buf,
9e7ec634 1966 REF_STORE_READ | REF_STORE_ODB);
0c064d90
NTND
1967 register_ref_store_map(&submodule_ref_stores, "submodule",
1968 refs, submodule);
5d0bc90e 1969
2c616c17 1970done:
5d0bc90e 1971 strbuf_release(&submodule_sb);
29babbee
NTND
1972 free(to_free);
1973
00eebe35
MH
1974 return refs;
1975}
1976
17eff96b
NTND
1977struct ref_store *get_worktree_ref_store(const struct worktree *wt)
1978{
1979 struct ref_store *refs;
1980 const char *id;
1981
1982 if (wt->is_current)
23a3f0cb 1983 return get_main_ref_store(the_repository);
17eff96b
NTND
1984
1985 id = wt->id ? wt->id : "/";
1986 refs = lookup_ref_store_map(&worktree_ref_stores, id);
1987 if (refs)
1988 return refs;
1989
1990 if (wt->id)
34224e14
JT
1991 refs = ref_store_init(the_repository,
1992 git_common_path("worktrees/%s", wt->id),
17eff96b
NTND
1993 REF_STORE_ALL_CAPS);
1994 else
34224e14
JT
1995 refs = ref_store_init(the_repository,
1996 get_git_common_dir(),
17eff96b
NTND
1997 REF_STORE_ALL_CAPS);
1998
1999 if (refs)
2000 register_ref_store_map(&worktree_ref_stores, "worktree",
2001 refs, id);
2002 return refs;
2003}
2004
f9f7fd3b
HWN
2005void base_ref_store_init(struct ref_store *refs, struct repository *repo,
2006 const char *path, const struct ref_storage_be *be)
00eebe35 2007{
620a66b9 2008 refs->be = be;
f9f7fd3b
HWN
2009 refs->repo = repo;
2010 refs->gitdir = xstrdup(path);
00eebe35 2011}
127b42a1
RS
2012
2013/* backend functions */
7d2df051 2014int refs_pack_refs(struct ref_store *refs, unsigned int flags)
8231527e 2015{
8231527e
MH
2016 return refs->be->pack_refs(refs, flags);
2017}
2018
36a31792 2019int peel_iterated_oid(const struct object_id *base, struct object_id *peeled)
7d2df051 2020{
36a31792
JK
2021 if (current_ref_iter &&
2022 (current_ref_iter->oid == base ||
2023 oideq(current_ref_iter->oid, base)))
2024 return ref_iterator_peel(current_ref_iter, peeled);
ba1c052f 2025
617480d7 2026 return peel_object(base, peeled) ? -1 : 0;
7d2df051 2027}
bd427cf2 2028
7d2df051
NTND
2029int refs_create_symref(struct ref_store *refs,
2030 const char *ref_target,
2031 const char *refs_heads_master,
2032 const char *logmsg)
2033{
523fa69c
JH
2034 char *msg;
2035 int retval;
2036
2037 msg = normalize_reflog_message(logmsg);
2038 retval = refs->be->create_symref(refs, ref_target, refs_heads_master,
2039 msg);
2040 free(msg);
2041 return retval;
bd427cf2
MH
2042}
2043
284689ba
MH
2044int create_symref(const char *ref_target, const char *refs_heads_master,
2045 const char *logmsg)
2046{
23a3f0cb 2047 return refs_create_symref(get_main_ref_store(the_repository), ref_target,
7d2df051 2048 refs_heads_master, logmsg);
284689ba
MH
2049}
2050
2ced105c
MH
2051int ref_update_reject_duplicates(struct string_list *refnames,
2052 struct strbuf *err)
2053{
a552e50e 2054 size_t i, n = refnames->nr;
2ced105c
MH
2055
2056 assert(err);
2057
8556f8d6
MH
2058 for (i = 1; i < n; i++) {
2059 int cmp = strcmp(refnames->items[i - 1].string,
2060 refnames->items[i].string);
2061
2062 if (!cmp) {
2ced105c 2063 strbuf_addf(err,
661558f0 2064 _("multiple updates for ref '%s' not allowed"),
2ced105c
MH
2065 refnames->items[i].string);
2066 return 1;
8556f8d6 2067 } else if (cmp > 0) {
033abf97 2068 BUG("ref_update_reject_duplicates() received unsorted list");
2ced105c 2069 }
8556f8d6 2070 }
2ced105c
MH
2071 return 0;
2072}
2073
67541597
PS
2074static int run_transaction_hook(struct ref_transaction *transaction,
2075 const char *state)
2076{
2077 struct child_process proc = CHILD_PROCESS_INIT;
2078 struct strbuf buf = STRBUF_INIT;
0a0fbbe3 2079 const char *hook;
67541597
PS
2080 int ret = 0, i;
2081
0a0fbbe3 2082 hook = find_hook("reference-transaction");
67541597 2083 if (!hook)
67541597 2084 return ret;
67541597 2085
c972bf4c 2086 strvec_pushl(&proc.args, hook, state, NULL);
67541597
PS
2087 proc.in = -1;
2088 proc.stdout_to_stderr = 1;
2089 proc.trace2_hook_name = "reference-transaction";
2090
2091 ret = start_command(&proc);
2092 if (ret)
2093 return ret;
2094
2095 sigchain_push(SIGPIPE, SIG_IGN);
2096
2097 for (i = 0; i < transaction->nr; i++) {
2098 struct ref_update *update = transaction->updates[i];
2099
2100 strbuf_reset(&buf);
2101 strbuf_addf(&buf, "%s %s %s\n",
2102 oid_to_hex(&update->old_oid),
2103 oid_to_hex(&update->new_oid),
2104 update->refname);
2105
2106 if (write_in_full(proc.in, buf.buf, buf.len) < 0) {
4755d7df
ÆAB
2107 if (errno != EPIPE) {
2108 /* Don't leak errno outside this API */
2109 errno = 0;
67541597 2110 ret = -1;
4755d7df 2111 }
67541597
PS
2112 break;
2113 }
2114 }
2115
2116 close(proc.in);
2117 sigchain_pop(SIGPIPE);
2118 strbuf_release(&buf);
2119
2120 ret |= finish_command(&proc);
2121 return ret;
2122}
2123
30173b88
MH
2124int ref_transaction_prepare(struct ref_transaction *transaction,
2125 struct strbuf *err)
127b42a1 2126{
c0fe4e8b 2127 struct ref_store *refs = transaction->ref_store;
67541597 2128 int ret;
127b42a1 2129
8d4240d3
MH
2130 switch (transaction->state) {
2131 case REF_TRANSACTION_OPEN:
2132 /* Good. */
2133 break;
30173b88 2134 case REF_TRANSACTION_PREPARED:
033abf97 2135 BUG("prepare called twice on reference transaction");
30173b88 2136 break;
8d4240d3 2137 case REF_TRANSACTION_CLOSED:
033abf97 2138 BUG("prepare called on a closed reference transaction");
8d4240d3
MH
2139 break;
2140 default:
033abf97 2141 BUG("unexpected reference transaction state");
8d4240d3
MH
2142 break;
2143 }
2144
ecd81dfc 2145 if (refs->repo->objects->odb->disable_ref_updates) {
d8f4481c
JK
2146 strbuf_addstr(err,
2147 _("ref updates forbidden inside quarantine environment"));
2148 return -1;
2149 }
2150
67541597
PS
2151 ret = refs->be->transaction_prepare(refs, transaction, err);
2152 if (ret)
2153 return ret;
2154
2155 ret = run_transaction_hook(transaction, "prepared");
2156 if (ret) {
2157 ref_transaction_abort(transaction, err);
2158 die(_("ref updates aborted by hook"));
2159 }
2160
2161 return 0;
30173b88
MH
2162}
2163
2164int ref_transaction_abort(struct ref_transaction *transaction,
2165 struct strbuf *err)
2166{
2167 struct ref_store *refs = transaction->ref_store;
2168 int ret = 0;
2169
2170 switch (transaction->state) {
2171 case REF_TRANSACTION_OPEN:
2172 /* No need to abort explicitly. */
2173 break;
2174 case REF_TRANSACTION_PREPARED:
2175 ret = refs->be->transaction_abort(refs, transaction, err);
2176 break;
2177 case REF_TRANSACTION_CLOSED:
033abf97 2178 BUG("abort called on a closed reference transaction");
30173b88
MH
2179 break;
2180 default:
033abf97 2181 BUG("unexpected reference transaction state");
30173b88
MH
2182 break;
2183 }
2184
67541597
PS
2185 run_transaction_hook(transaction, "aborted");
2186
30173b88
MH
2187 ref_transaction_free(transaction);
2188 return ret;
2189}
2190
2191int ref_transaction_commit(struct ref_transaction *transaction,
2192 struct strbuf *err)
2193{
2194 struct ref_store *refs = transaction->ref_store;
2195 int ret;
2196
2197 switch (transaction->state) {
2198 case REF_TRANSACTION_OPEN:
2199 /* Need to prepare first. */
2200 ret = ref_transaction_prepare(transaction, err);
2201 if (ret)
2202 return ret;
2203 break;
2204 case REF_TRANSACTION_PREPARED:
2205 /* Fall through to finish. */
2206 break;
2207 case REF_TRANSACTION_CLOSED:
033abf97 2208 BUG("commit called on a closed reference transaction");
30173b88
MH
2209 break;
2210 default:
033abf97 2211 BUG("unexpected reference transaction state");
30173b88
MH
2212 break;
2213 }
2214
67541597
PS
2215 ret = refs->be->transaction_finish(refs, transaction, err);
2216 if (!ret)
2217 run_transaction_hook(transaction, "committed");
2218 return ret;
127b42a1 2219}
62665823 2220
7d2df051
NTND
2221int refs_verify_refname_available(struct ref_store *refs,
2222 const char *refname,
b05855b5 2223 const struct string_list *extras,
7d2df051
NTND
2224 const struct string_list *skip,
2225 struct strbuf *err)
62665823 2226{
b05855b5
MH
2227 const char *slash;
2228 const char *extra_refname;
2229 struct strbuf dirname = STRBUF_INIT;
2230 struct strbuf referent = STRBUF_INIT;
2231 struct object_id oid;
2232 unsigned int type;
2233 struct ref_iterator *iter;
2234 int ok;
2235 int ret = -1;
2236
2237 /*
2238 * For the sake of comments in this function, suppose that
2239 * refname is "refs/foo/bar".
2240 */
2241
2242 assert(err);
2243
2244 strbuf_grow(&dirname, strlen(refname) + 1);
2245 for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
8b72fea7
HWN
2246 /*
2247 * Just saying "Is a directory" when we e.g. can't
2248 * lock some multi-level ref isn't very informative,
2249 * the user won't be told *what* is a directory, so
2250 * let's not use strerror() below.
2251 */
2252 int ignore_errno;
b05855b5
MH
2253 /* Expand dirname to the new prefix, not including the trailing slash: */
2254 strbuf_add(&dirname, refname + dirname.len, slash - refname - dirname.len);
2255
2256 /*
2257 * We are still at a leading dir of the refname (e.g.,
2258 * "refs/foo"; if there is a reference with that name,
2259 * it is a conflict, *unless* it is in skip.
2260 */
2261 if (skip && string_list_has_string(skip, dirname.buf))
2262 continue;
2263
8b72fea7
HWN
2264 if (!refs_read_raw_ref(refs, dirname.buf, &oid, &referent,
2265 &type, &ignore_errno)) {
661558f0 2266 strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
b05855b5
MH
2267 dirname.buf, refname);
2268 goto cleanup;
2269 }
2270
2271 if (extras && string_list_has_string(extras, dirname.buf)) {
661558f0 2272 strbuf_addf(err, _("cannot process '%s' and '%s' at the same time"),
b05855b5
MH
2273 refname, dirname.buf);
2274 goto cleanup;
2275 }
2276 }
2277
2278 /*
2279 * We are at the leaf of our refname (e.g., "refs/foo/bar").
2280 * There is no point in searching for a reference with that
2281 * name, because a refname isn't considered to conflict with
2282 * itself. But we still need to check for references whose
2283 * names are in the "refs/foo/bar/" namespace, because they
2284 * *do* conflict.
2285 */
2286 strbuf_addstr(&dirname, refname + dirname.len);
2287 strbuf_addch(&dirname, '/');
2288
2289 iter = refs_ref_iterator_begin(refs, dirname.buf, 0,
2290 DO_FOR_EACH_INCLUDE_BROKEN);
2291 while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
2292 if (skip &&
2293 string_list_has_string(skip, iter->refname))
2294 continue;
2295
661558f0 2296 strbuf_addf(err, _("'%s' exists; cannot create '%s'"),
b05855b5
MH
2297 iter->refname, refname);
2298 ref_iterator_abort(iter);
2299 goto cleanup;
2300 }
2301
2302 if (ok != ITER_DONE)
033abf97 2303 BUG("error while iterating over references");
b05855b5
MH
2304
2305 extra_refname = find_descendant_ref(dirname.buf, extras, skip);
2306 if (extra_refname)
661558f0 2307 strbuf_addf(err, _("cannot process '%s' and '%s' at the same time"),
b05855b5
MH
2308 refname, extra_refname);
2309 else
2310 ret = 0;
2311
2312cleanup:
2313 strbuf_release(&referent);
2314 strbuf_release(&dirname);
2315 return ret;
62665823 2316}
e3688bd6 2317
7d2df051 2318int refs_for_each_reflog(struct ref_store *refs, each_ref_fn fn, void *cb_data)
e3688bd6 2319{
e3688bd6 2320 struct ref_iterator *iter;
4a6067cd 2321 struct do_for_each_ref_help hp = { fn, cb_data };
e3688bd6
DT
2322
2323 iter = refs->be->reflog_iterator_begin(refs);
2324
4a6067cd
SB
2325 return do_for_each_repo_ref_iterator(the_repository, iter,
2326 do_for_each_ref_helper, &hp);
e3688bd6
DT
2327}
2328
7d2df051 2329int for_each_reflog(each_ref_fn fn, void *cb_data)
e3688bd6 2330{
23a3f0cb 2331 return refs_for_each_reflog(get_main_ref_store(the_repository), fn, cb_data);
7d2df051 2332}
e3688bd6 2333
7d2df051
NTND
2334int refs_for_each_reflog_ent_reverse(struct ref_store *refs,
2335 const char *refname,
2336 each_reflog_ent_fn fn,
2337 void *cb_data)
2338{
e3688bd6
DT
2339 return refs->be->for_each_reflog_ent_reverse(refs, refname,
2340 fn, cb_data);
2341}
2342
7d2df051
NTND
2343int for_each_reflog_ent_reverse(const char *refname, each_reflog_ent_fn fn,
2344 void *cb_data)
2345{
23a3f0cb 2346 return refs_for_each_reflog_ent_reverse(get_main_ref_store(the_repository),
7d2df051
NTND
2347 refname, fn, cb_data);
2348}
2349
2350int refs_for_each_reflog_ent(struct ref_store *refs, const char *refname,
2351 each_reflog_ent_fn fn, void *cb_data)
2352{
2353 return refs->be->for_each_reflog_ent(refs, refname, fn, cb_data);
2354}
2355
e3688bd6
DT
2356int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn,
2357 void *cb_data)
2358{
23a3f0cb 2359 return refs_for_each_reflog_ent(get_main_ref_store(the_repository), refname,
7d2df051
NTND
2360 fn, cb_data);
2361}
e3688bd6 2362
7d2df051
NTND
2363int refs_reflog_exists(struct ref_store *refs, const char *refname)
2364{
2365 return refs->be->reflog_exists(refs, refname);
e3688bd6
DT
2366}
2367
2368int reflog_exists(const char *refname)
2369{
23a3f0cb 2370 return refs_reflog_exists(get_main_ref_store(the_repository), refname);
7d2df051 2371}
e3688bd6 2372
7d2df051 2373int refs_create_reflog(struct ref_store *refs, const char *refname,
7b089120 2374 struct strbuf *err)
7d2df051 2375{
7b089120 2376 return refs->be->create_reflog(refs, refname, err);
e3688bd6
DT
2377}
2378
7b089120 2379int safe_create_reflog(const char *refname, struct strbuf *err)
e3688bd6 2380{
23a3f0cb 2381 return refs_create_reflog(get_main_ref_store(the_repository), refname,
7b089120 2382 err);
7d2df051 2383}
e3688bd6 2384
7d2df051
NTND
2385int refs_delete_reflog(struct ref_store *refs, const char *refname)
2386{
2387 return refs->be->delete_reflog(refs, refname);
e3688bd6
DT
2388}
2389
2390int delete_reflog(const char *refname)
2391{
23a3f0cb 2392 return refs_delete_reflog(get_main_ref_store(the_repository), refname);
7d2df051 2393}
e3688bd6 2394
7d2df051 2395int refs_reflog_expire(struct ref_store *refs,
cc40b5ce 2396 const char *refname,
7d2df051
NTND
2397 unsigned int flags,
2398 reflog_expiry_prepare_fn prepare_fn,
2399 reflog_expiry_should_prune_fn should_prune_fn,
2400 reflog_expiry_cleanup_fn cleanup_fn,
2401 void *policy_cb_data)
2402{
cc40b5ce 2403 return refs->be->reflog_expire(refs, refname, flags,
7d2df051
NTND
2404 prepare_fn, should_prune_fn,
2405 cleanup_fn, policy_cb_data);
e3688bd6
DT
2406}
2407
cc40b5ce 2408int reflog_expire(const char *refname,
e3688bd6
DT
2409 unsigned int flags,
2410 reflog_expiry_prepare_fn prepare_fn,
2411 reflog_expiry_should_prune_fn should_prune_fn,
2412 reflog_expiry_cleanup_fn cleanup_fn,
2413 void *policy_cb_data)
2414{
23a3f0cb 2415 return refs_reflog_expire(get_main_ref_store(the_repository),
cc40b5ce 2416 refname, flags,
7d2df051
NTND
2417 prepare_fn, should_prune_fn,
2418 cleanup_fn, policy_cb_data);
e3688bd6 2419}
fc681463
DT
2420
2421int initial_ref_transaction_commit(struct ref_transaction *transaction,
2422 struct strbuf *err)
2423{
c0fe4e8b 2424 struct ref_store *refs = transaction->ref_store;
fc681463
DT
2425
2426 return refs->be->initial_transaction_commit(refs, transaction, err);
2427}
a27dcf89 2428
4f2ba2d0
PS
2429void ref_transaction_for_each_queued_update(struct ref_transaction *transaction,
2430 ref_transaction_for_each_queued_update_fn cb,
2431 void *cb_data)
2432{
2433 int i;
2434
2435 for (i = 0; i < transaction->nr; i++) {
2436 struct ref_update *update = transaction->updates[i];
2437
2438 cb(update->refname,
2439 (update->flags & REF_HAVE_OLD) ? &update->old_oid : NULL,
2440 (update->flags & REF_HAVE_NEW) ? &update->new_oid : NULL,
2441 cb_data);
2442 }
2443}
2444
523fa69c 2445int refs_delete_refs(struct ref_store *refs, const char *logmsg,
64da4199 2446 struct string_list *refnames, unsigned int flags)
a27dcf89 2447{
523fa69c
JH
2448 char *msg;
2449 int retval;
2450
2451 msg = normalize_reflog_message(logmsg);
2452 retval = refs->be->delete_refs(refs, msg, refnames, flags);
2453 free(msg);
2454 return retval;
a27dcf89 2455}
9b6b40d9 2456
64da4199
MH
2457int delete_refs(const char *msg, struct string_list *refnames,
2458 unsigned int flags)
9b6b40d9 2459{
23a3f0cb 2460 return refs_delete_refs(get_main_ref_store(the_repository), msg, refnames, flags);
7d2df051 2461}
9b6b40d9 2462
7d2df051
NTND
2463int refs_rename_ref(struct ref_store *refs, const char *oldref,
2464 const char *newref, const char *logmsg)
2465{
523fa69c
JH
2466 char *msg;
2467 int retval;
2468
2469 msg = normalize_reflog_message(logmsg);
2470 retval = refs->be->rename_ref(refs, oldref, newref, msg);
2471 free(msg);
2472 return retval;
9b6b40d9 2473}
7d2df051
NTND
2474
2475int rename_ref(const char *oldref, const char *newref, const char *logmsg)
2476{
23a3f0cb 2477 return refs_rename_ref(get_main_ref_store(the_repository), oldref, newref, logmsg);
7d2df051 2478}
52d59cc6
SD
2479
2480int refs_copy_existing_ref(struct ref_store *refs, const char *oldref,
2481 const char *newref, const char *logmsg)
2482{
523fa69c
JH
2483 char *msg;
2484 int retval;
2485
2486 msg = normalize_reflog_message(logmsg);
2487 retval = refs->be->copy_ref(refs, oldref, newref, msg);
2488 free(msg);
2489 return retval;
52d59cc6
SD
2490}
2491
2492int copy_existing_ref(const char *oldref, const char *newref, const char *logmsg)
2493{
23a3f0cb 2494 return refs_copy_existing_ref(get_main_ref_store(the_repository), oldref, newref, logmsg);
52d59cc6 2495}