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