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