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