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