Coverage Report

Created: 2023-11-19 07:08

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