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