Coverage Report

Created: 2026-10-17 07:15

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/git/refs/reftable-backend.c
Line
Count
Source
1
#include "../git-compat-util.h"
2
#include "../abspath.h"
3
#include "../chdir-notify.h"
4
#include "../config.h"
5
#include "../date.h"
6
#include "../dir.h"
7
#include "../environment.h"
8
#include "../fsck.h"
9
#include "../gettext.h"
10
#include "../hash.h"
11
#include "../hex.h"
12
#include "../ident.h"
13
#include "../iterator.h"
14
#include "../parse.h"
15
#include "../path.h"
16
#include "../refs.h"
17
#include "../reftable/reftable-basics.h"
18
#include "../reftable/reftable-error.h"
19
#include "../reftable/reftable-fsck.h"
20
#include "../reftable/reftable-iterator.h"
21
#include "../reftable/reftable-record.h"
22
#include "../reftable/reftable-stack.h"
23
#include "../repo-settings.h"
24
#include "../setup.h"
25
#include "../strmap.h"
26
#include "../trace2.h"
27
#include "../worktree.h"
28
#include "../write-or-die.h"
29
#include "refs-internal.h"
30
31
/*
32
 * Used as a flag in ref_update::flags when the ref_update was via an
33
 * update to HEAD.
34
 */
35
0
#define REF_UPDATE_VIA_HEAD (1 << 8)
36
37
struct reftable_backend {
38
  struct reftable_stack *stack;
39
  struct reftable_iterator it;
40
};
41
42
static void reftable_backend_on_reload(void *payload)
43
0
{
44
0
  struct reftable_backend *be = payload;
45
0
  reftable_iterator_destroy(&be->it);
46
0
}
47
48
static int reftable_backend_init(struct reftable_backend *be,
49
         const char *path,
50
         const struct reftable_stack_options *_opts)
51
0
{
52
0
  struct reftable_stack_options opts = *_opts;
53
0
  opts.on_reload = reftable_backend_on_reload;
54
0
  opts.on_reload_payload = be;
55
0
  return reftable_new_stack(&be->stack, path, &opts);
56
0
}
57
58
static void reftable_backend_release(struct reftable_backend *be)
59
0
{
60
0
  reftable_stack_destroy(be->stack);
61
0
  be->stack = NULL;
62
0
  reftable_iterator_destroy(&be->it);
63
0
}
64
65
static int reftable_backend_read_ref(struct reftable_backend *be,
66
             const char *refname,
67
             struct object_id *oid,
68
             struct strbuf *referent,
69
             unsigned int *type)
70
0
{
71
0
  struct reftable_ref_record ref = {0};
72
0
  int ret;
73
74
0
  if (!be->it.ops) {
75
0
    ret = reftable_stack_init_ref_iterator(be->stack, &be->it);
76
0
    if (ret)
77
0
      goto done;
78
0
  }
79
80
0
  ret = reftable_iterator_seek_ref(&be->it, refname);
81
0
  if (ret)
82
0
    goto done;
83
84
0
  ret = reftable_iterator_next_ref(&be->it, &ref);
85
0
  if (ret)
86
0
    goto done;
87
88
0
  if (strcmp(ref.refname, refname) ||
89
0
      reftable_ref_record_is_deletion(&ref)) {
90
0
    ret = 1;
91
0
    goto done;
92
0
  }
93
94
0
  if (ref.value_type == REFTABLE_REF_SYMREF) {
95
0
    strbuf_reset(referent);
96
0
    strbuf_addstr(referent, ref.value.symref);
97
0
    *type |= REF_ISSYMREF;
98
0
  } else if (reftable_ref_record_val1(&ref)) {
99
0
    unsigned int hash_id;
100
101
0
    switch (reftable_stack_hash_id(be->stack)) {
102
0
    case REFTABLE_HASH_SHA1:
103
0
      hash_id = GIT_HASH_SHA1;
104
0
      break;
105
0
    case REFTABLE_HASH_SHA256:
106
0
      hash_id = GIT_HASH_SHA256;
107
0
      break;
108
0
    default:
109
0
      BUG("unhandled hash ID %d", reftable_stack_hash_id(be->stack));
110
0
    }
111
112
0
    oidread(oid, reftable_ref_record_val1(&ref),
113
0
      &hash_algos[hash_id]);
114
0
  } else {
115
0
    BUG("unhandled reference value type %d", ref.value_type);
116
0
  }
117
118
0
done:
119
0
  assert(ret != REFTABLE_API_ERROR);
120
0
  reftable_ref_record_release(&ref);
121
0
  return ret;
122
0
}
123
124
struct reftable_ref_store {
125
  struct ref_store base;
126
127
  /*
128
   * The main backend refers to the common dir and thus contains common
129
   * refs as well as refs of the main repository.
130
   */
131
  struct reftable_backend main_backend;
132
  /*
133
   * The worktree backend refers to the gitdir in case the refdb is opened
134
   * via a worktree. It thus contains the per-worktree refs.
135
   */
136
  struct reftable_backend worktree_backend;
137
  /*
138
   * Map of worktree backends by their respective worktree names. The map
139
   * is populated lazily when we try to resolve `worktrees/$worktree` refs.
140
   */
141
  struct strmap worktree_backends;
142
  struct reftable_stack_options stack_options;
143
144
  /*
145
   * Options used when writing to or compacting the reftable stacks.
146
   * These are parsed from the configuration lazily on first use via
147
   * `reftable_be_write_options()` so that we don't have to access the
148
   * configuration when initializing the ref store. Do not access these
149
   * fields directly, but use the accessor instead.
150
   */
151
  struct reftable_be_write_options {
152
    struct reftable_write_options opts;
153
    enum log_refs_config log_all_ref_updates;
154
    bool initialized;
155
  } write_opts_lazy_loaded;
156
157
  unsigned int store_flags;
158
  int err;
159
};
160
161
/*
162
 * Downcast ref_store to reftable_ref_store. Die if ref_store is not a
163
 * reftable_ref_store. required_flags is compared with ref_store's store_flags
164
 * to ensure the ref_store has all required capabilities. "caller" is used in
165
 * any necessary error messages.
166
 */
167
static struct reftable_ref_store *reftable_be_downcast(struct ref_store *ref_store,
168
                   unsigned int required_flags,
169
                   const char *caller)
170
0
{
171
0
  struct reftable_ref_store *refs;
172
173
0
  if (ref_store->be != &refs_be_reftable)
174
0
    BUG("ref_store is type \"%s\" not \"reftables\" in %s",
175
0
        ref_store->be->name, caller);
176
177
0
  refs = (struct reftable_ref_store *)ref_store;
178
179
0
  if ((refs->store_flags & required_flags) != required_flags)
180
0
    BUG("operation %s requires abilities 0x%x, but only have 0x%x",
181
0
        caller, required_flags, refs->store_flags);
182
183
0
  return refs;
184
0
}
185
186
static int backend_for_worktree(struct reftable_backend **out,
187
        struct reftable_ref_store *store,
188
        const char *worktree_name)
189
0
{
190
0
  struct strbuf worktree_dir = STRBUF_INIT;
191
0
  int ret;
192
193
0
  *out = strmap_get(&store->worktree_backends, worktree_name);
194
0
  if (*out) {
195
0
    ret = 0;
196
0
    goto out;
197
0
  }
198
199
0
  strbuf_addf(&worktree_dir, "%s/worktrees/%s/reftable",
200
0
        store->base.repo->commondir, worktree_name);
201
202
0
  CALLOC_ARRAY(*out, 1);
203
0
  store->err = ret = reftable_backend_init(*out, worktree_dir.buf,
204
0
             &store->stack_options);
205
0
  if (ret < 0) {
206
0
    free(*out);
207
0
    goto out;
208
0
  }
209
210
0
  strmap_put(&store->worktree_backends, worktree_name, *out);
211
212
0
out:
213
0
  strbuf_release(&worktree_dir);
214
0
  return ret;
215
0
}
216
217
/*
218
 * Some refs are global to the repository (refs/heads/{*}), while others are
219
 * local to the worktree (eg. HEAD, refs/bisect/{*}). We solve this by having
220
 * multiple separate databases (ie. multiple reftable/ directories), one for
221
 * the shared refs, one for the current worktree refs, and one for each
222
 * additional worktree. For reading, we merge the view of both the shared and
223
 * the current worktree's refs, when necessary.
224
 *
225
 * This function also optionally assigns the rewritten reference name that is
226
 * local to the stack. This translation is required when using worktree refs
227
 * like `worktrees/$worktree/refs/heads/foo` as worktree stacks will store
228
 * those references in their normalized form.
229
 */
230
static int backend_for(struct reftable_backend **out,
231
           struct reftable_ref_store *store,
232
           const char *refname,
233
           const char **rewritten_ref,
234
           int reload)
235
0
{
236
0
  const char *wtname;
237
0
  int wtname_len;
238
0
  int ret;
239
240
0
  if (!refname) {
241
0
    *out = &store->main_backend;
242
0
    ret = 0;
243
0
    goto out;
244
0
  }
245
246
0
  switch (parse_worktree_ref(refname, &wtname, &wtname_len, rewritten_ref)) {
247
0
  case REF_WORKTREE_OTHER: {
248
0
    static struct strbuf wtname_buf = STRBUF_INIT;
249
250
    /*
251
     * We're using a static buffer here so that we don't need to
252
     * allocate the worktree name whenever we look up a reference.
253
     * This could be avoided if the strmap interface knew how to
254
     * handle keys with a length.
255
     */
256
0
    strbuf_reset(&wtname_buf);
257
0
    strbuf_add(&wtname_buf, wtname, wtname_len);
258
259
    /*
260
     * There is an edge case here: when the worktree references the
261
     * current worktree, then we set up the stack once via
262
     * `worktree_backends` and once via `worktree_backend`. This is
263
     * wasteful, but in the reading case it shouldn't matter. And
264
     * in the writing case we would notice that the stack is locked
265
     * already and error out when trying to write a reference via
266
     * both stacks.
267
     */
268
0
    ret = backend_for_worktree(out, store, wtname_buf.buf);
269
270
0
    goto out;
271
0
  }
272
0
  case REF_WORKTREE_CURRENT:
273
    /*
274
     * If there is no worktree stack then we're currently in the
275
     * main worktree. We thus return the main stack in that case.
276
     */
277
0
    if (!store->worktree_backend.stack)
278
0
      *out = &store->main_backend;
279
0
    else
280
0
      *out = &store->worktree_backend;
281
0
    ret = 0;
282
0
    goto out;
283
0
  case REF_WORKTREE_MAIN:
284
0
  case REF_WORKTREE_SHARED:
285
0
    *out = &store->main_backend;
286
0
    ret = 0;
287
0
    goto out;
288
0
  default:
289
0
    BUG("unhandled worktree reference type");
290
0
  }
291
292
0
out:
293
0
  if (reload && !ret)
294
0
    ret = reftable_stack_reload((*out)->stack);
295
0
  return ret;
296
0
}
297
298
static void fill_reftable_log_record(struct reftable_log_record *log, const struct ident_split *split)
299
0
{
300
0
  const char *tz_begin;
301
0
  int sign = 1;
302
303
0
  reftable_log_record_release(log);
304
0
  log->value_type = REFTABLE_LOG_UPDATE;
305
0
  log->value.update.name =
306
0
    xstrndup(split->name_begin, split->name_end - split->name_begin);
307
0
  log->value.update.email =
308
0
    xstrndup(split->mail_begin, split->mail_end - split->mail_begin);
309
0
  log->value.update.time = atol(split->date_begin);
310
311
0
  tz_begin = split->tz_begin;
312
0
  if (*tz_begin == '-') {
313
0
    sign = -1;
314
0
    tz_begin++;
315
0
  }
316
0
  if (*tz_begin == '+') {
317
0
    sign = 1;
318
0
    tz_begin++;
319
0
  }
320
321
0
  log->value.update.tz_offset = tz_to_minutes(sign * atoi(tz_begin));
322
0
}
323
324
static int reftable_be_config(const char *var, const char *value,
325
            const struct config_context *ctx,
326
            void *payload)
327
0
{
328
0
  struct reftable_ref_store *refs = payload;
329
0
  struct reftable_be_write_options *opts = &refs->write_opts_lazy_loaded;
330
331
0
  if (!strcmp(var, "reftable.blocksize")) {
332
0
    unsigned long block_size = git_config_ulong(var, value, ctx->kvi);
333
0
    if (block_size > 16777215)
334
0
      die("reftable block size cannot exceed 16MB");
335
0
    opts->opts.block_size = block_size;
336
0
  } else if (!strcmp(var, "reftable.restartinterval")) {
337
0
    unsigned long restart_interval = git_config_ulong(var, value, ctx->kvi);
338
0
    if (restart_interval > UINT16_MAX)
339
0
      die("reftable block size cannot exceed %u", (unsigned)UINT16_MAX);
340
0
    opts->opts.restart_interval = restart_interval;
341
0
  } else if (!strcmp(var, "reftable.indexobjects")) {
342
0
    opts->opts.skip_index_objects = !git_config_bool(var, value);
343
0
  } else if (!strcmp(var, "reftable.geometricfactor")) {
344
0
    unsigned long factor = git_config_ulong(var, value, ctx->kvi);
345
0
    if (factor > UINT8_MAX)
346
0
      die("reftable geometric factor cannot exceed %u", (unsigned)UINT8_MAX);
347
0
    opts->opts.auto_compaction_factor = factor;
348
0
  } else if (!strcmp(var, "reftable.locktimeout")) {
349
0
    int64_t lock_timeout = git_config_int64(var, value, ctx->kvi);
350
0
    if (lock_timeout > LONG_MAX)
351
0
      die("reftable lock timeout cannot exceed %"PRIdMAX, (intmax_t)LONG_MAX);
352
0
    if (lock_timeout < 0 && lock_timeout != -1)
353
0
      die("reftable lock timeout does not support negative values other than -1");
354
0
    opts->opts.lock_timeout_ms = lock_timeout;
355
0
  } else if (!strcmp(var, "core.logallrefupdates")) {
356
0
    opts->log_all_ref_updates = refs_parse_log_all_ref_updates_config(value);
357
0
  }
358
359
0
  return 0;
360
0
}
361
362
static const struct reftable_be_write_options *reftable_be_write_options(struct reftable_ref_store *refs)
363
0
{
364
0
  struct reftable_be_write_options *opts = &refs->write_opts_lazy_loaded;
365
0
  mode_t mask;
366
367
0
  if (opts->initialized)
368
0
    return opts;
369
370
0
  mask = umask(0);
371
0
  umask(mask);
372
373
0
  opts->opts.default_permissions = calc_shared_perm(refs->base.repo, 0666 & ~mask);
374
0
  opts->opts.disable_auto_compact =
375
0
    !git_env_bool("GIT_TEST_REFTABLE_AUTOCOMPACTION", 1);
376
0
  opts->opts.lock_timeout_ms = 100;
377
0
  opts->log_all_ref_updates = LOG_REFS_UNSET;
378
379
0
  repo_config(refs->base.repo, reftable_be_config, refs);
380
381
  /*
382
   * It is somewhat unfortunate that we have to mirror the default block
383
   * size of the reftable library here. But given that the write options
384
   * wouldn't be updated by the library here, and given that we require
385
   * the proper block size to trim reflog message so that they fit, we
386
   * must set up a proper value here.
387
   */
388
0
  if (!opts->opts.block_size)
389
0
    opts->opts.block_size = 4096;
390
391
0
  opts->initialized = true;
392
0
  return opts;
393
0
}
394
395
static void reftable_be_reparent(const char *old_cwd,
396
         const char *new_cwd,
397
         void *payload)
398
0
{
399
0
  struct reftable_ref_store *refs = payload;
400
0
  char *tmp;
401
402
0
  tmp = reparent_relative_path(old_cwd, new_cwd, refs->base.gitdir);
403
0
  free(refs->base.gitdir);
404
0
  refs->base.gitdir = tmp;
405
0
}
406
407
static struct ref_store *reftable_be_init(struct repository *repo,
408
            const char *payload,
409
            const char *gitdir,
410
            const struct ref_store_init_options *opts)
411
0
{
412
0
  struct reftable_ref_store *refs = xcalloc(1, sizeof(*refs));
413
0
  struct strbuf ref_common_dir = STRBUF_INIT;
414
0
  struct strbuf refdir = STRBUF_INIT;
415
0
  struct strbuf path = STRBUF_INIT;
416
0
  bool is_worktree;
417
418
0
  refs_compute_filesystem_location(gitdir, payload, &is_worktree, &refdir,
419
0
           &ref_common_dir);
420
421
0
  base_ref_store_init(&refs->base, repo, refdir.buf, &refs_be_reftable);
422
0
  strmap_init(&refs->worktree_backends);
423
0
  refs->store_flags = opts->access_flags;
424
425
0
  switch (repo->hash_algo->format_id) {
426
0
  case GIT_SHA1_FORMAT_ID:
427
0
    refs->stack_options.hash_id = REFTABLE_HASH_SHA1;
428
0
    break;
429
0
  case GIT_SHA256_FORMAT_ID:
430
0
    refs->stack_options.hash_id = REFTABLE_HASH_SHA256;
431
0
    break;
432
0
  default:
433
0
    BUG("unknown hash algorithm %d", repo->hash_algo->format_id);
434
0
  }
435
436
  /*
437
   * Set up the main reftable stack that is hosted in GIT_COMMON_DIR.
438
   * This stack contains both the shared and the main worktree refs.
439
   */
440
0
  strbuf_addbuf(&path, &ref_common_dir);
441
0
  if (!is_worktree) {
442
0
    strbuf_reset(&path);
443
0
    strbuf_realpath(&path, ref_common_dir.buf, 0);
444
0
  }
445
0
  strbuf_addstr(&path, "/reftable");
446
0
  refs->err = reftable_backend_init(&refs->main_backend, path.buf,
447
0
            &refs->stack_options);
448
0
  if (refs->err)
449
0
    goto done;
450
451
  /*
452
   * If we're in a worktree we also need to set up the worktree reftable
453
   * stack that is contained in the per-worktree GIT_DIR.
454
   *
455
   * Ideally, we would also add the stack to our worktree stack map. But
456
   * we have no way to figure out the worktree name here and thus can't
457
   * do it efficiently.
458
   */
459
0
  if (is_worktree) {
460
0
    strbuf_addstr(&refdir, "/reftable");
461
462
0
    refs->err = reftable_backend_init(&refs->worktree_backend, refdir.buf,
463
0
              &refs->stack_options);
464
0
    if (refs->err)
465
0
      goto done;
466
0
  }
467
468
0
  chdir_notify_register(reftable_be_reparent, refs);
469
470
0
done:
471
0
  assert(refs->err != REFTABLE_API_ERROR);
472
0
  strbuf_release(&ref_common_dir);
473
0
  strbuf_release(&refdir);
474
0
  strbuf_release(&path);
475
0
  return &refs->base;
476
0
}
477
478
static void reftable_be_release(struct ref_store *ref_store)
479
0
{
480
0
  struct reftable_ref_store *refs = reftable_be_downcast(ref_store, 0, "release");
481
0
  struct strmap_entry *entry;
482
0
  struct hashmap_iter iter;
483
484
0
  if (refs->main_backend.stack)
485
0
    reftable_backend_release(&refs->main_backend);
486
0
  if (refs->worktree_backend.stack)
487
0
    reftable_backend_release(&refs->worktree_backend);
488
489
0
  strmap_for_each_entry(&refs->worktree_backends, &iter, entry) {
490
0
    struct reftable_backend *be = entry->value;
491
0
    reftable_backend_release(be);
492
0
    free(be);
493
0
  }
494
0
  strmap_clear(&refs->worktree_backends, 0);
495
0
  chdir_notify_unregister(reftable_be_reparent, refs);
496
0
}
497
498
static int reftable_be_create_on_disk(struct ref_store *ref_store,
499
              int flags UNUSED,
500
              struct strbuf *err UNUSED)
501
0
{
502
0
  struct reftable_ref_store *refs =
503
0
    reftable_be_downcast(ref_store, REF_STORE_WRITE, "create");
504
0
  struct strbuf sb = STRBUF_INIT;
505
506
0
  strbuf_addf(&sb, "%s/reftable", refs->base.gitdir);
507
0
  safe_create_dir(ref_store->repo, sb.buf, 1);
508
0
  strbuf_reset(&sb);
509
510
0
  strbuf_release(&sb);
511
0
  return 0;
512
0
}
513
514
static int reftable_be_remove_on_disk(struct ref_store *ref_store,
515
              struct strbuf *err)
516
0
{
517
0
  struct reftable_ref_store *refs =
518
0
    reftable_be_downcast(ref_store, REF_STORE_WRITE, "remove");
519
0
  struct strbuf sb = STRBUF_INIT;
520
0
  int ret = 0;
521
522
  /*
523
   * Release the ref store such that all stacks are closed. This is
524
   * required so that the "tables.list" file is not open anymore, which
525
   * would otherwise make it impossible to remove the file on Windows.
526
   */
527
0
  reftable_be_release(ref_store);
528
529
0
  strbuf_addf(&sb, "%s/reftable", refs->base.gitdir);
530
0
  if (remove_dir_recursively(&sb, 0) < 0) {
531
0
    strbuf_addf(err, "could not delete reftables: %s",
532
0
          strerror(errno));
533
0
    ret = -1;
534
0
  }
535
536
0
  strbuf_release(&sb);
537
0
  return ret;
538
0
}
539
540
struct reftable_ref_iterator {
541
  struct ref_iterator base;
542
  struct reftable_ref_store *refs;
543
  struct reftable_iterator iter;
544
  struct reftable_ref_record ref;
545
  struct object_id oid;
546
  struct object_id peeled_oid;
547
548
  char *prefix;
549
  size_t prefix_len;
550
  char **exclude_patterns;
551
  size_t exclude_patterns_index;
552
  size_t exclude_patterns_strlen;
553
  unsigned int flags;
554
  int err;
555
};
556
557
/*
558
 * Handle exclude patterns. Returns either `1`, which tells the caller that the
559
 * current reference shall not be shown. Or `0`, which indicates that it should
560
 * be shown.
561
 */
562
static int should_exclude_current_ref(struct reftable_ref_iterator *iter)
563
0
{
564
0
  while (iter->exclude_patterns[iter->exclude_patterns_index]) {
565
0
    const char *pattern = iter->exclude_patterns[iter->exclude_patterns_index];
566
0
    char *ref_after_pattern;
567
0
    int cmp;
568
569
    /*
570
     * Lazily cache the pattern length so that we don't have to
571
     * recompute it every time this function is called.
572
     */
573
0
    if (!iter->exclude_patterns_strlen)
574
0
      iter->exclude_patterns_strlen = strlen(pattern);
575
576
    /*
577
     * When the reference name is lexicographically bigger than the
578
     * current exclude pattern we know that it won't ever match any
579
     * of the following references, either. We thus advance to the
580
     * next pattern and re-check whether it matches.
581
     *
582
     * Otherwise, if it's smaller, then we do not have a match and
583
     * thus want to show the current reference.
584
     */
585
0
    cmp = strncmp(iter->ref.refname, pattern,
586
0
            iter->exclude_patterns_strlen);
587
0
    if (cmp > 0) {
588
0
      iter->exclude_patterns_index++;
589
0
      iter->exclude_patterns_strlen = 0;
590
0
      continue;
591
0
    }
592
0
    if (cmp < 0)
593
0
      return 0;
594
595
    /*
596
     * The reference shares a prefix with the exclude pattern and
597
     * shall thus be omitted. We skip all references that match the
598
     * pattern by seeking to the first reference after the block of
599
     * matches.
600
     *
601
     * This is done by appending the highest possible character to
602
     * the pattern. Consequently, all references that have the
603
     * pattern as prefix and whose suffix starts with anything in
604
     * the range [0x00, 0xfe] are skipped. And given that 0xff is a
605
     * non-printable character that shouldn't ever be in a ref name,
606
     * we'd not yield any such record, either.
607
     *
608
     * Note that the seeked-to reference may also be excluded. This
609
     * is not handled here though, but the caller is expected to
610
     * loop and re-verify the next reference for us.
611
     */
612
0
    ref_after_pattern = xstrfmt("%s%c", pattern, 0xff);
613
0
    iter->err = reftable_iterator_seek_ref(&iter->iter, ref_after_pattern);
614
0
    iter->exclude_patterns_index++;
615
0
    iter->exclude_patterns_strlen = 0;
616
0
    trace2_counter_add(TRACE2_COUNTER_ID_REFTABLE_RESEEKS, 1);
617
618
0
    free(ref_after_pattern);
619
0
    return 1;
620
0
  }
621
622
0
  return 0;
623
0
}
624
625
static int reftable_ref_iterator_advance(struct ref_iterator *ref_iterator)
626
0
{
627
0
  struct reftable_ref_iterator *iter =
628
0
    (struct reftable_ref_iterator *)ref_iterator;
629
0
  struct reftable_ref_store *refs = iter->refs;
630
0
  const char *referent = NULL;
631
632
0
  while (!iter->err) {
633
0
    int flags = 0;
634
635
0
    iter->err = reftable_iterator_next_ref(&iter->iter, &iter->ref);
636
0
    if (iter->err)
637
0
      break;
638
639
    /*
640
     * The files backend only lists references contained in "refs/" unless
641
     * the root refs are to be included. We emulate the same behaviour here.
642
     */
643
0
    if (!starts_with(iter->ref.refname, "refs/") &&
644
0
        !(iter->flags & REFS_FOR_EACH_INCLUDE_ROOT_REFS &&
645
0
          is_root_ref(iter->ref.refname))) {
646
0
      continue;
647
0
    }
648
649
0
    if (iter->prefix_len &&
650
0
        strncmp(iter->prefix, iter->ref.refname, iter->prefix_len)) {
651
0
      iter->err = 1;
652
0
      break;
653
0
    }
654
655
0
    if (iter->ref.value_type == REFTABLE_REF_DELETION)
656
0
      continue;
657
658
0
    if (iter->exclude_patterns && should_exclude_current_ref(iter))
659
0
      continue;
660
661
0
    if (iter->flags & REFS_FOR_EACH_PER_WORKTREE_ONLY &&
662
0
        parse_worktree_ref(iter->ref.refname, NULL, NULL, NULL) !=
663
0
          REF_WORKTREE_CURRENT)
664
0
      continue;
665
666
0
    switch (iter->ref.value_type) {
667
0
    case REFTABLE_REF_VAL1:
668
0
      oidread(&iter->oid, iter->ref.value.val1,
669
0
        refs->base.repo->hash_algo);
670
0
      break;
671
0
    case REFTABLE_REF_VAL2:
672
0
      oidread(&iter->oid, iter->ref.value.val2.value,
673
0
        refs->base.repo->hash_algo);
674
0
      oidread(&iter->peeled_oid, iter->ref.value.val2.target_value,
675
0
        refs->base.repo->hash_algo);
676
0
      break;
677
0
    case REFTABLE_REF_SYMREF:
678
0
      referent = refs_resolve_ref_unsafe(&iter->refs->base,
679
0
                 iter->ref.refname,
680
0
                 RESOLVE_REF_READING,
681
0
                 &iter->oid, &flags);
682
0
      if (!referent)
683
0
        oidclr(&iter->oid, refs->base.repo->hash_algo);
684
0
      break;
685
0
    default:
686
0
      BUG("unhandled reference value type %d", iter->ref.value_type);
687
0
    }
688
689
0
    if (is_null_oid(&iter->oid))
690
0
      flags |= REF_ISBROKEN;
691
692
0
    if (check_refname_format(iter->ref.refname, REFNAME_ALLOW_ONELEVEL)) {
693
0
      if (!refname_is_safe(iter->ref.refname))
694
0
        die(_("refname is dangerous: %s"), iter->ref.refname);
695
0
      oidclr(&iter->oid, refs->base.repo->hash_algo);
696
0
      flags |= REF_BAD_NAME | REF_ISBROKEN;
697
0
    }
698
699
0
    if (iter->flags & REFS_FOR_EACH_OMIT_DANGLING_SYMREFS &&
700
0
        flags & REF_ISSYMREF &&
701
0
        flags & REF_ISBROKEN)
702
0
      continue;
703
704
0
    if (!(iter->flags & REFS_FOR_EACH_INCLUDE_BROKEN) &&
705
0
        !ref_resolves_to_object(iter->ref.refname, refs->base.repo,
706
0
              &iter->oid, flags))
707
0
        continue;
708
709
0
    memset(&iter->base.ref, 0, sizeof(iter->base.ref));
710
0
    iter->base.ref.name = iter->ref.refname;
711
0
    iter->base.ref.target = referent;
712
0
    iter->base.ref.oid = &iter->oid;
713
0
    if (iter->ref.value_type == REFTABLE_REF_VAL2)
714
0
      iter->base.ref.peeled_oid = &iter->peeled_oid;
715
0
    iter->base.ref.flags = flags;
716
717
0
    break;
718
0
  }
719
720
0
  if (iter->err > 0)
721
0
    return ITER_DONE;
722
0
  if (iter->err < 0)
723
0
    return ITER_ERROR;
724
0
  return ITER_OK;
725
0
}
726
727
static int reftable_ref_iterator_seek(struct ref_iterator *ref_iterator,
728
              const char *refname, unsigned int flags)
729
0
{
730
0
  struct reftable_ref_iterator *iter =
731
0
    (struct reftable_ref_iterator *)ref_iterator;
732
733
  /* Unset any previously set prefix */
734
0
  FREE_AND_NULL(iter->prefix);
735
0
  iter->prefix_len = 0;
736
737
0
  if (flags & REF_ITERATOR_SEEK_SET_PREFIX) {
738
0
    iter->prefix = xstrdup_or_null(refname);
739
0
    iter->prefix_len = refname ? strlen(refname) : 0;
740
0
  }
741
0
  iter->err = reftable_iterator_seek_ref(&iter->iter, refname);
742
743
0
  return iter->err;
744
0
}
745
746
static void reftable_ref_iterator_release(struct ref_iterator *ref_iterator)
747
0
{
748
0
  struct reftable_ref_iterator *iter =
749
0
    (struct reftable_ref_iterator *)ref_iterator;
750
0
  reftable_ref_record_release(&iter->ref);
751
0
  reftable_iterator_destroy(&iter->iter);
752
0
  if (iter->exclude_patterns) {
753
0
    for (size_t i = 0; iter->exclude_patterns[i]; i++)
754
0
      free(iter->exclude_patterns[i]);
755
0
    free(iter->exclude_patterns);
756
0
  }
757
0
  free(iter->prefix);
758
0
}
759
760
static struct ref_iterator_vtable reftable_ref_iterator_vtable = {
761
  .advance = reftable_ref_iterator_advance,
762
  .seek = reftable_ref_iterator_seek,
763
  .release = reftable_ref_iterator_release,
764
};
765
766
static int qsort_strcmp(const void *va, const void *vb)
767
0
{
768
0
  const char *a = *(const char **)va;
769
0
  const char *b = *(const char **)vb;
770
0
  return strcmp(a, b);
771
0
}
772
773
static char **filter_exclude_patterns(const char **exclude_patterns)
774
0
{
775
0
  size_t filtered_size = 0, filtered_alloc = 0;
776
0
  char **filtered = NULL;
777
778
0
  if (!exclude_patterns)
779
0
    return NULL;
780
781
0
  for (size_t i = 0; ; i++) {
782
0
    const char *exclude_pattern = exclude_patterns[i];
783
0
    int has_glob = 0;
784
785
0
    if (!exclude_pattern)
786
0
      break;
787
788
0
    for (const char *p = exclude_pattern; *p; p++) {
789
0
      has_glob = is_glob_special(*p);
790
0
      if (has_glob)
791
0
        break;
792
0
    }
793
0
    if (has_glob)
794
0
      continue;
795
796
0
    ALLOC_GROW(filtered, filtered_size + 1, filtered_alloc);
797
0
    filtered[filtered_size++] = xstrdup(exclude_pattern);
798
0
  }
799
800
0
  if (filtered_size) {
801
0
    QSORT(filtered, filtered_size, qsort_strcmp);
802
0
    ALLOC_GROW(filtered, filtered_size + 1, filtered_alloc);
803
0
    filtered[filtered_size++] = NULL;
804
0
  }
805
806
0
  return filtered;
807
0
}
808
809
static struct reftable_ref_iterator *ref_iterator_for_stack(struct reftable_ref_store *refs,
810
                  struct reftable_stack *stack,
811
                  const char *prefix,
812
                  const char **exclude_patterns,
813
                  int flags)
814
0
{
815
0
  struct reftable_ref_iterator *iter;
816
0
  int ret;
817
818
0
  iter = xcalloc(1, sizeof(*iter));
819
0
  base_ref_iterator_init(&iter->base, &reftable_ref_iterator_vtable);
820
0
  iter->base.ref.oid = &iter->oid;
821
0
  iter->flags = flags;
822
0
  iter->refs = refs;
823
0
  iter->exclude_patterns = filter_exclude_patterns(exclude_patterns);
824
825
0
  ret = refs->err;
826
0
  if (ret)
827
0
    goto done;
828
829
0
  ret = reftable_stack_reload(stack);
830
0
  if (ret)
831
0
    goto done;
832
833
0
  ret = reftable_stack_init_ref_iterator(stack, &iter->iter);
834
0
  if (ret)
835
0
    goto done;
836
837
0
  ret = reftable_ref_iterator_seek(&iter->base, prefix,
838
0
           REF_ITERATOR_SEEK_SET_PREFIX);
839
0
  if (ret)
840
0
    goto done;
841
842
0
done:
843
0
  iter->err = ret;
844
0
  return iter;
845
0
}
846
847
static struct ref_iterator *reftable_be_iterator_begin(struct ref_store *ref_store,
848
                   const char *prefix,
849
                   const char **exclude_patterns,
850
                   unsigned int flags)
851
0
{
852
0
  struct reftable_ref_iterator *main_iter, *worktree_iter;
853
0
  struct reftable_ref_store *refs;
854
0
  unsigned int required_flags = REF_STORE_READ;
855
856
0
  if (!(flags & REFS_FOR_EACH_INCLUDE_BROKEN))
857
0
    required_flags |= REF_STORE_ODB;
858
0
  refs = reftable_be_downcast(ref_store, required_flags, "ref_iterator_begin");
859
860
0
  main_iter = ref_iterator_for_stack(refs, refs->main_backend.stack, prefix,
861
0
             exclude_patterns, flags);
862
863
  /*
864
   * The worktree stack is only set when we're in an actual worktree
865
   * right now. If we aren't, then we return the common reftable
866
   * iterator, only.
867
   */
868
0
  if (!refs->worktree_backend.stack)
869
0
    return &main_iter->base;
870
871
  /*
872
   * Otherwise we merge both the common and the per-worktree refs into a
873
   * single iterator.
874
   */
875
0
  worktree_iter = ref_iterator_for_stack(refs, refs->worktree_backend.stack, prefix,
876
0
                 exclude_patterns, flags);
877
0
  return merge_ref_iterator_begin(&worktree_iter->base, &main_iter->base,
878
0
          ref_iterator_select, NULL);
879
0
}
880
881
static int reftable_be_read_raw_ref(struct ref_store *ref_store,
882
            const char *refname,
883
            struct object_id *oid,
884
            struct strbuf *referent,
885
            unsigned int *type,
886
            int *failure_errno)
887
0
{
888
0
  struct reftable_ref_store *refs =
889
0
    reftable_be_downcast(ref_store, REF_STORE_READ, "read_raw_ref");
890
0
  struct reftable_backend *be;
891
0
  int ret;
892
893
0
  if (refs->err < 0)
894
0
    return refs->err;
895
896
0
  ret = backend_for(&be, refs, refname, &refname, 1);
897
0
  if (ret)
898
0
    return ret;
899
900
0
  ret = reftable_backend_read_ref(be, refname, oid, referent, type);
901
0
  if (ret < 0)
902
0
    return ret;
903
0
  if (ret > 0) {
904
0
    *failure_errno = ENOENT;
905
0
    return -1;
906
0
  }
907
908
0
  return 0;
909
0
}
910
911
static int reftable_be_read_symbolic_ref(struct ref_store *ref_store,
912
           const char *refname,
913
           struct strbuf *referent)
914
0
{
915
0
  struct reftable_ref_store *refs =
916
0
    reftable_be_downcast(ref_store, REF_STORE_READ, "read_symbolic_ref");
917
0
  struct reftable_backend *be;
918
0
  struct object_id oid;
919
0
  unsigned int type = 0;
920
0
  int ret;
921
922
0
  ret = backend_for(&be, refs, refname, &refname, 1);
923
0
  if (ret)
924
0
    return ret;
925
926
0
  ret = reftable_backend_read_ref(be, refname, &oid, referent, &type);
927
0
  if (ret)
928
0
    ret = -1;
929
0
  else if (type == REF_ISSYMREF)
930
0
    ; /* happy */
931
0
  else
932
0
    ret = NOT_A_SYMREF;
933
0
  return ret;
934
0
}
935
936
struct reftable_transaction_update {
937
  struct ref_update *update;
938
  struct object_id current_oid;
939
};
940
941
struct write_transaction_table_arg {
942
  struct reftable_ref_store *refs;
943
  struct reftable_backend *be;
944
  struct reftable_addition *addition;
945
  struct reftable_transaction_update *updates;
946
  size_t updates_nr;
947
  size_t updates_alloc;
948
  size_t updates_expected;
949
  uint64_t max_index;
950
};
951
952
struct reftable_transaction_data {
953
  struct write_transaction_table_arg *args;
954
  size_t args_nr, args_alloc;
955
};
956
957
static void free_transaction_data(struct reftable_transaction_data *tx_data)
958
0
{
959
0
  if (!tx_data)
960
0
    return;
961
0
  for (size_t i = 0; i < tx_data->args_nr; i++) {
962
0
    reftable_addition_destroy(tx_data->args[i].addition);
963
0
    free(tx_data->args[i].updates);
964
0
  }
965
0
  free(tx_data->args);
966
0
  free(tx_data);
967
0
}
968
969
/*
970
 * Prepare transaction update for the given reference update. This will cause
971
 * us to lock the corresponding reftable stack for concurrent modification.
972
 */
973
static int prepare_transaction_update(struct write_transaction_table_arg **out,
974
              struct reftable_ref_store *refs,
975
              struct reftable_transaction_data *tx_data,
976
              struct ref_update *update,
977
              struct strbuf *err)
978
0
{
979
0
  struct write_transaction_table_arg *arg = NULL;
980
0
  struct reftable_backend *be;
981
0
  size_t i;
982
0
  int ret;
983
984
  /*
985
   * This function gets called in a loop, and we don't want to repeatedly
986
   * reload the stack for every single ref update. Instead, we manually
987
   * reload further down in the case where we haven't yet prepared the
988
   * specific `reftable_backend`.
989
   */
990
0
  ret = backend_for(&be, refs, update->refname, NULL, 0);
991
0
  if (ret)
992
0
    return ret;
993
994
  /*
995
   * Search for a preexisting stack update. If there is one then we add
996
   * the update to it, otherwise we set up a new stack update.
997
   */
998
0
  for (i = 0; !arg && i < tx_data->args_nr; i++)
999
0
    if (tx_data->args[i].be == be)
1000
0
      arg = &tx_data->args[i];
1001
1002
0
  if (!arg) {
1003
0
    struct reftable_addition *addition;
1004
1005
0
    ret = reftable_stack_addition_new(&addition, be->stack,
1006
0
              &reftable_be_write_options(refs)->opts);
1007
0
    if (ret) {
1008
0
      if (ret == REFTABLE_LOCK_ERROR)
1009
0
        strbuf_addstr(err, "cannot lock references");
1010
0
      return ret;
1011
0
    }
1012
1013
0
    ALLOC_GROW(tx_data->args, tx_data->args_nr + 1,
1014
0
         tx_data->args_alloc);
1015
0
    arg = &tx_data->args[tx_data->args_nr++];
1016
0
    arg->refs = refs;
1017
0
    arg->be = be;
1018
0
    arg->addition = addition;
1019
0
    arg->updates = NULL;
1020
0
    arg->updates_nr = 0;
1021
0
    arg->updates_alloc = 0;
1022
0
    arg->updates_expected = 0;
1023
0
    arg->max_index = 0;
1024
0
  }
1025
1026
0
  arg->updates_expected++;
1027
1028
0
  if (out)
1029
0
    *out = arg;
1030
1031
0
  return 0;
1032
0
}
1033
1034
/*
1035
 * Queue a reference update for the correct stack. We potentially need to
1036
 * handle multiple stack updates in a single transaction when it spans across
1037
 * multiple worktrees.
1038
 */
1039
static int queue_transaction_update(struct reftable_ref_store *refs,
1040
            struct reftable_transaction_data *tx_data,
1041
            struct ref_update *update,
1042
            struct object_id *current_oid,
1043
            struct strbuf *err)
1044
0
{
1045
0
  struct write_transaction_table_arg *arg = NULL;
1046
0
  int ret;
1047
1048
0
  if (update->backend_data)
1049
0
    BUG("reference update queued more than once");
1050
1051
0
  ret = prepare_transaction_update(&arg, refs, tx_data, update, err);
1052
0
  if (ret < 0)
1053
0
    return ret;
1054
1055
0
  ALLOC_GROW(arg->updates, arg->updates_nr + 1,
1056
0
       arg->updates_alloc);
1057
0
  arg->updates[arg->updates_nr].update = update;
1058
0
  oidcpy(&arg->updates[arg->updates_nr].current_oid, current_oid);
1059
0
  update->backend_data = &arg->updates[arg->updates_nr++];
1060
1061
0
  return 0;
1062
0
}
1063
1064
static enum ref_transaction_error prepare_single_update(struct reftable_ref_store *refs,
1065
              struct reftable_transaction_data *tx_data,
1066
              struct ref_transaction *transaction,
1067
              struct reftable_backend *be,
1068
              struct ref_update *u,
1069
              size_t update_idx,
1070
              struct string_list *refnames_to_check,
1071
              unsigned int head_type,
1072
              struct strbuf *head_referent,
1073
              struct strbuf *referent,
1074
              struct strbuf *err)
1075
0
{
1076
0
  enum ref_transaction_error ret = 0;
1077
0
  struct object_id current_oid = {0};
1078
0
  const char *rewritten_ref;
1079
1080
  /*
1081
   * There is no need to reload the respective backends here as
1082
   * we have already reloaded them when preparing the transaction
1083
   * update. And given that the stacks have been locked there
1084
   * shouldn't have been any concurrent modifications of the
1085
   * stack.
1086
   */
1087
0
  ret = backend_for(&be, refs, u->refname, &rewritten_ref, 0);
1088
0
  if (ret)
1089
0
    return REF_TRANSACTION_ERROR_GENERIC;
1090
1091
0
  if (u->flags & REF_LOG_USE_PROVIDED_OIDS) {
1092
0
    if (!(u->flags & REF_HAVE_OLD) ||
1093
0
        !(u->flags & REF_HAVE_NEW) ||
1094
0
        !(u->flags & REF_LOG_ONLY)) {
1095
0
      strbuf_addf(err, _("trying to write reflog for '%s' "
1096
0
             "with incomplete values"), u->refname);
1097
0
      return REF_TRANSACTION_ERROR_GENERIC;
1098
0
    }
1099
1100
0
    if (queue_transaction_update(refs, tx_data, u, &u->old_oid, err))
1101
0
      return REF_TRANSACTION_ERROR_GENERIC;
1102
0
    return 0;
1103
0
  }
1104
1105
  /*
1106
   * When we update the reference that HEAD points to we enqueue
1107
   * a second log-only update for HEAD so that its reflog is
1108
   * updated accordingly.
1109
   */
1110
0
  if (head_type == REF_ISSYMREF &&
1111
0
      !(u->flags & REF_LOG_ONLY) &&
1112
0
      !(u->flags & REF_UPDATE_VIA_HEAD) &&
1113
0
      !strcmp(rewritten_ref, head_referent->buf)) {
1114
    /*
1115
     * First make sure that HEAD is not already in the
1116
     * transaction. This check is O(lg N) in the transaction
1117
     * size, but it happens at most once per transaction.
1118
     */
1119
0
    if (string_list_has_string(&transaction->refnames, "HEAD")) {
1120
      /* An entry already existed */
1121
0
      strbuf_addf(err,
1122
0
            _("multiple updates for 'HEAD' (including one "
1123
0
              "via its referent '%s') are not allowed"),
1124
0
            u->refname);
1125
0
      return REF_TRANSACTION_ERROR_NAME_CONFLICT;
1126
0
    }
1127
1128
0
    ref_transaction_add_update(
1129
0
      transaction, "HEAD",
1130
0
      u->flags | REF_LOG_ONLY | REF_NO_DEREF,
1131
0
      &u->new_oid, &u->old_oid, &u->peeled, NULL, NULL,
1132
0
      NULL, u->msg);
1133
0
  }
1134
1135
0
  ret = reftable_backend_read_ref(be, rewritten_ref,
1136
0
          &current_oid, referent, &u->type);
1137
0
  if (ret < 0)
1138
0
    return REF_TRANSACTION_ERROR_GENERIC;
1139
0
  if (ret > 0 && !ref_update_expects_existing_old_ref(u)) {
1140
0
    struct string_list_item *item;
1141
    /*
1142
     * The reference does not exist, and we either have no
1143
     * old object ID or expect the reference to not exist.
1144
     * We can thus skip below safety checks as well as the
1145
     * symref splitting. But we do want to verify that
1146
     * there is no conflicting reference here so that we
1147
     * can output a proper error message instead of failing
1148
     * at a later point.
1149
     */
1150
0
    item = string_list_append(refnames_to_check, u->refname);
1151
0
    item->util = xmalloc(sizeof(update_idx));
1152
0
    memcpy(item->util, &update_idx, sizeof(update_idx));
1153
1154
    /*
1155
     * There is no need to write the reference deletion
1156
     * when the reference in question doesn't exist.
1157
     */
1158
0
    if ((u->flags & REF_HAVE_NEW) && !ref_update_has_null_new_value(u)) {
1159
0
      ret = queue_transaction_update(refs, tx_data, u,
1160
0
                   &current_oid, err);
1161
0
      if (ret)
1162
0
        return REF_TRANSACTION_ERROR_GENERIC;
1163
0
    }
1164
1165
0
    return 0;
1166
0
  }
1167
0
  if (ret > 0) {
1168
    /* The reference does not exist, but we expected it to. */
1169
0
    strbuf_addf(err, _("cannot lock ref '%s': "
1170
0
           "unable to resolve reference '%s'"),
1171
0
          ref_update_original_update_refname(u), u->refname);
1172
0
    return REF_TRANSACTION_ERROR_NONEXISTENT_REF;
1173
0
  }
1174
1175
0
  if (u->type & REF_ISSYMREF) {
1176
    /*
1177
     * The reftable stack is locked at this point already,
1178
     * so it is safe to call `refs_resolve_ref_unsafe()`
1179
     * here without causing races.
1180
     */
1181
0
    const char *resolved = refs_resolve_ref_unsafe(&refs->base, u->refname, 0,
1182
0
                     &current_oid, NULL);
1183
1184
0
    if (u->flags & REF_NO_DEREF) {
1185
0
      if (u->flags & REF_HAVE_OLD && !resolved) {
1186
0
        strbuf_addf(err, _("cannot lock ref '%s': "
1187
0
               "error reading reference"), u->refname);
1188
0
        return REF_TRANSACTION_ERROR_GENERIC;
1189
0
      }
1190
0
    } else {
1191
0
      struct ref_update *new_update;
1192
0
      int new_flags;
1193
1194
0
      new_flags = u->flags;
1195
0
      if (!strcmp(rewritten_ref, "HEAD"))
1196
0
        new_flags |= REF_UPDATE_VIA_HEAD;
1197
1198
0
      if (string_list_has_string(&transaction->refnames, referent->buf)) {
1199
0
        strbuf_addf(err,
1200
0
              _("multiple updates for '%s' (including one "
1201
0
                "via symref '%s') are not allowed"),
1202
0
              referent->buf, u->refname);
1203
0
        return REF_TRANSACTION_ERROR_NAME_CONFLICT;
1204
0
      }
1205
1206
      /*
1207
       * If we are updating a symref (eg. HEAD), we should also
1208
       * update the branch that the symref points to.
1209
       *
1210
       * This is generic functionality, and would be better
1211
       * done in refs.c, but the current implementation is
1212
       * intertwined with the locking in files-backend.c.
1213
       */
1214
0
      new_update = ref_transaction_add_update(
1215
0
        transaction, referent->buf, new_flags,
1216
0
        u->new_target ? NULL : &u->new_oid,
1217
0
        u->old_target ? NULL : &u->old_oid,
1218
0
        &u->peeled, u->new_target, u->old_target,
1219
0
        u->committer_info, u->msg);
1220
1221
0
      new_update->parent_update = u;
1222
1223
      /* Change the symbolic ref update to log only. */
1224
0
      u->flags |= REF_LOG_ONLY | REF_NO_DEREF;
1225
0
    }
1226
0
  }
1227
1228
  /*
1229
   * Verify that the old object matches our expectations. Note
1230
   * that the error messages here do not make a lot of sense in
1231
   * the context of the reftable backend as we never lock
1232
   * individual refs. But the error messages match what the files
1233
   * backend returns, which keeps our tests happy.
1234
   */
1235
0
  if (u->old_target) {
1236
0
    if (!(u->type & REF_ISSYMREF)) {
1237
0
      strbuf_addf(err, _("cannot lock ref '%s': "
1238
0
             "expected symref with target '%s': "
1239
0
             "but is a regular ref"),
1240
0
            ref_update_original_update_refname(u),
1241
0
            u->old_target);
1242
0
      return REF_TRANSACTION_ERROR_EXPECTED_SYMREF;
1243
0
    }
1244
1245
0
    ret = ref_update_check_old_target(referent->buf, u, err);
1246
0
    if (ret)
1247
0
      return ret;
1248
0
  } else if ((u->flags & (REF_LOG_ONLY | REF_HAVE_OLD)) == REF_HAVE_OLD) {
1249
0
    if (oideq(&current_oid, &u->old_oid)) {
1250
      /*
1251
       * Normally matching the expected old oid is enough. Either we
1252
       * found the ref at the expected state, or we are creating and
1253
       * expect the null oid (and likewise found nothing).
1254
       *
1255
       * But there is one exception for the null oid: if we found a
1256
       * symref pointing to nothing we'll also get the null oid. In
1257
       * regular recursive mode, that's good (we'll write to what the
1258
       * symref points to, which doesn't exist). But in no-deref
1259
       * mode, it means we'll clobber the symref, even though the
1260
       * caller asked for this to be a creation event. So flag
1261
       * that case to preserve the dangling symref.
1262
       *
1263
       * Everything else is OK and we can fall through to the
1264
       * end of the conditional chain.
1265
       */
1266
0
      if ((u->flags & REF_NO_DEREF) &&
1267
0
          referent->len &&
1268
0
          is_null_oid(&u->old_oid)) {
1269
0
        strbuf_addf(err, _("cannot lock ref '%s': "
1270
0
              "dangling symref already exists"),
1271
0
              ref_update_original_update_refname(u));
1272
0
        return REF_TRANSACTION_ERROR_CREATE_EXISTS;
1273
0
      }
1274
0
    } else if (is_null_oid(&u->old_oid)) {
1275
0
      strbuf_addf(err, _("cannot lock ref '%s': "
1276
0
             "reference already exists"),
1277
0
            ref_update_original_update_refname(u));
1278
0
      return REF_TRANSACTION_ERROR_CREATE_EXISTS;
1279
0
    } else if (is_null_oid(&current_oid)) {
1280
0
      strbuf_addf(err, _("cannot lock ref '%s': "
1281
0
             "reference is missing but expected %s"),
1282
0
            ref_update_original_update_refname(u),
1283
0
            oid_to_hex(&u->old_oid));
1284
0
      return REF_TRANSACTION_ERROR_NONEXISTENT_REF;
1285
0
    } else {
1286
0
      strbuf_addf(err, _("cannot lock ref '%s': "
1287
0
             "is at %s but expected %s"),
1288
0
            ref_update_original_update_refname(u),
1289
0
            oid_to_hex(&current_oid),
1290
0
            oid_to_hex(&u->old_oid));
1291
0
      return REF_TRANSACTION_ERROR_INCORRECT_OLD_VALUE;
1292
0
    }
1293
0
  }
1294
1295
  /*
1296
   * If all of the following conditions are true:
1297
   *
1298
   *   - We're not about to write a symref.
1299
   *   - We're not about to write a log-only entry.
1300
   *   - Old and new object ID are different.
1301
   *
1302
   * Then we're essentially doing a no-op update that can be
1303
   * skipped. This is not only for the sake of efficiency, but
1304
   * also skips writing unneeded reflog entries.
1305
   */
1306
0
  if ((u->type & REF_ISSYMREF) ||
1307
0
      (u->flags & REF_LOG_ONLY) ||
1308
0
      (u->flags & REF_HAVE_NEW && !oideq(&current_oid, &u->new_oid)))
1309
0
    if (queue_transaction_update(refs, tx_data, u, &current_oid, err))
1310
0
      return REF_TRANSACTION_ERROR_GENERIC;
1311
1312
0
  return 0;
1313
0
}
1314
1315
static int reftable_be_transaction_prepare(struct ref_store *ref_store,
1316
             struct ref_transaction *transaction,
1317
             struct strbuf *err)
1318
0
{
1319
0
  struct reftable_ref_store *refs =
1320
0
    reftable_be_downcast(ref_store, REF_STORE_WRITE|REF_STORE_MAIN, "ref_transaction_prepare");
1321
0
  struct strbuf referent = STRBUF_INIT, head_referent = STRBUF_INIT;
1322
0
  struct string_list refnames_to_check = STRING_LIST_INIT_NODUP;
1323
0
  struct reftable_transaction_data *tx_data = NULL;
1324
0
  struct reftable_backend *be;
1325
0
  struct object_id head_oid;
1326
0
  unsigned int head_type = 0;
1327
0
  size_t i;
1328
0
  int ret;
1329
1330
0
  ret = refs->err;
1331
0
  if (ret < 0)
1332
0
    goto done;
1333
1334
0
  tx_data = xcalloc(1, sizeof(*tx_data));
1335
1336
  /*
1337
   * Preprocess all updates. For one we check that there are no duplicate
1338
   * reference updates in this transaction. Second, we lock all stacks
1339
   * that will be modified during the transaction.
1340
   */
1341
0
  for (i = 0; i < transaction->nr; i++) {
1342
0
    ret = prepare_transaction_update(NULL, refs, tx_data,
1343
0
             transaction->updates[i], err);
1344
0
    if (ret)
1345
0
      goto done;
1346
0
  }
1347
1348
  /*
1349
   * Now that we have counted updates per stack we can preallocate their
1350
   * arrays. This avoids having to reallocate many times.
1351
   */
1352
0
  for (i = 0; i < tx_data->args_nr; i++) {
1353
0
    CALLOC_ARRAY(tx_data->args[i].updates, tx_data->args[i].updates_expected);
1354
0
    tx_data->args[i].updates_alloc = tx_data->args[i].updates_expected;
1355
0
  }
1356
1357
  /*
1358
   * TODO: it's dubious whether we should reload the stack that "HEAD"
1359
   * belongs to or not. In theory, it may happen that we only modify
1360
   * stacks which are _not_ part of the "HEAD" stack. In that case we
1361
   * wouldn't have prepared any transaction for its stack and would not
1362
   * have reloaded it, which may mean that it is stale.
1363
   *
1364
   * On the other hand, reloading that stack without locking it feels
1365
   * wrong, too, as the value of "HEAD" could be modified concurrently at
1366
   * any point in time.
1367
   */
1368
0
  ret = backend_for(&be, refs, "HEAD", NULL, 0);
1369
0
  if (ret)
1370
0
    goto done;
1371
1372
0
  ret = reftable_backend_read_ref(be, "HEAD", &head_oid,
1373
0
          &head_referent, &head_type);
1374
0
  if (ret < 0)
1375
0
    goto done;
1376
0
  ret = 0;
1377
1378
0
  for (i = 0; i < transaction->nr; i++) {
1379
0
    ret = prepare_single_update(refs, tx_data, transaction, be,
1380
0
              transaction->updates[i], i,
1381
0
              &refnames_to_check, head_type,
1382
0
              &head_referent, &referent, err);
1383
0
    if (ret) {
1384
0
      if (ref_transaction_maybe_set_rejected(transaction, i,
1385
0
                     ret, err)) {
1386
0
        ret = 0;
1387
0
        continue;
1388
0
      }
1389
0
      goto done;
1390
0
    }
1391
0
  }
1392
1393
0
  ret = refs_verify_refnames_available(ref_store, &refnames_to_check,
1394
0
               &transaction->refnames, NULL,
1395
0
               transaction,
1396
0
               transaction->flags & REF_TRANSACTION_FLAG_INITIAL,
1397
0
               err);
1398
0
  if (ret < 0)
1399
0
    goto done;
1400
1401
0
  transaction->backend_data = tx_data;
1402
0
  transaction->state = REF_TRANSACTION_PREPARED;
1403
1404
0
done:
1405
0
  if (ret < 0) {
1406
0
    free_transaction_data(tx_data);
1407
0
    transaction->state = REF_TRANSACTION_CLOSED;
1408
0
    if (!err->len)
1409
0
      strbuf_addf(err, _("reftable: transaction prepare: %s"),
1410
0
            reftable_error_str(ret));
1411
0
  }
1412
0
  strbuf_release(&referent);
1413
0
  strbuf_release(&head_referent);
1414
0
  string_list_clear(&refnames_to_check, 1);
1415
1416
0
  return ret;
1417
0
}
1418
1419
static int reftable_be_transaction_abort(struct ref_store *ref_store UNUSED,
1420
           struct ref_transaction *transaction,
1421
           struct strbuf *err UNUSED)
1422
0
{
1423
0
  struct reftable_transaction_data *tx_data = transaction->backend_data;
1424
0
  free_transaction_data(tx_data);
1425
0
  transaction->state = REF_TRANSACTION_CLOSED;
1426
0
  return 0;
1427
0
}
1428
1429
static int transaction_update_cmp(const void *a, const void *b)
1430
0
{
1431
0
  struct reftable_transaction_update *update_a = (struct reftable_transaction_update *)a;
1432
0
  struct reftable_transaction_update *update_b = (struct reftable_transaction_update *)b;
1433
1434
  /*
1435
   * If there is an index set, it should take preference (default is 0).
1436
   * This ensures that updates with indexes are sorted amongst themselves.
1437
   */
1438
0
  if (update_a->update->index || update_b->update->index)
1439
0
    return update_a->update->index - update_b->update->index;
1440
1441
0
  return strcmp(update_a->update->refname, update_b->update->refname);
1442
0
}
1443
1444
static int should_write_log(struct reftable_ref_store *refs, const char *refname)
1445
0
{
1446
0
  enum log_refs_config log_refs_cfg = reftable_be_write_options(refs)->log_all_ref_updates;
1447
0
  if (log_refs_cfg == LOG_REFS_UNSET)
1448
0
    log_refs_cfg = is_bare_repository(refs->base.repo) ? LOG_REFS_NONE : LOG_REFS_NORMAL;
1449
1450
0
  switch (log_refs_cfg) {
1451
0
  case LOG_REFS_NONE:
1452
0
    return refs_reflog_exists(&refs->base, refname);
1453
0
  case LOG_REFS_ALWAYS:
1454
0
    return 1;
1455
0
  case LOG_REFS_NORMAL:
1456
0
    if (should_autocreate_reflog(log_refs_cfg, refname))
1457
0
      return 1;
1458
0
    return refs_reflog_exists(&refs->base, refname);
1459
0
  default:
1460
0
    BUG("unhandled core.logAllRefUpdates value %d", log_refs_cfg);
1461
0
  }
1462
0
}
1463
1464
static int write_transaction_table(struct reftable_writer *writer, void *cb_data)
1465
0
{
1466
0
  struct write_transaction_table_arg *arg = cb_data;
1467
0
  uint64_t ts = reftable_stack_next_update_index(arg->be->stack);
1468
0
  struct reftable_log_record *logs = NULL;
1469
0
  struct ident_split committer_ident = {0};
1470
0
  size_t logs_nr = 0, logs_alloc = 0, i;
1471
0
  const char *committer_info;
1472
0
  int ret = 0;
1473
1474
0
  committer_info = git_committer_info(0);
1475
0
  if (split_ident_line(&committer_ident, committer_info, strlen(committer_info)))
1476
0
    BUG("failed splitting committer info");
1477
1478
0
  QSORT(arg->updates, arg->updates_nr, transaction_update_cmp);
1479
1480
  /*
1481
   * During reflog migration, we add indexes for a single reflog with
1482
   * multiple entries. Each entry will contain a different update_index,
1483
   * so set the limits accordingly.
1484
   */
1485
0
  ret = reftable_writer_set_limits(writer, ts, ts + arg->max_index);
1486
0
  if (ret < 0)
1487
0
    goto done;
1488
1489
0
  for (i = 0; i < arg->updates_nr; i++) {
1490
0
    struct reftable_transaction_update *tx_update = &arg->updates[i];
1491
0
    struct ref_update *u = tx_update->update;
1492
1493
0
    if (u->rejection_err)
1494
0
      continue;
1495
1496
    /*
1497
     * Write a reflog entry when updating a ref to point to
1498
     * something new in either of the following cases:
1499
     *
1500
     * - The reference is about to be deleted. We always want to
1501
     *   delete the reflog in that case.
1502
     * - REF_FORCE_CREATE_REFLOG is set, asking us to always create
1503
     *   the reflog entry.
1504
     * - `core.logAllRefUpdates` tells us to create the reflog for
1505
     *   the given ref.
1506
     */
1507
0
    if ((u->flags & REF_HAVE_NEW) &&
1508
0
        !(u->type & REF_ISSYMREF) &&
1509
0
        ref_update_has_null_new_value(u)) {
1510
0
      struct reftable_log_record log = {0};
1511
0
      struct reftable_iterator it = {0};
1512
1513
0
      ret = reftable_stack_init_log_iterator(arg->be->stack, &it);
1514
0
      if (ret < 0)
1515
0
        goto done;
1516
1517
      /*
1518
       * When deleting refs we also delete all reflog entries
1519
       * with them. While it is not strictly required to
1520
       * delete reflogs together with their refs, this
1521
       * matches the behaviour of the files backend.
1522
       *
1523
       * Unfortunately, we have no better way than to delete
1524
       * all reflog entries one by one.
1525
       */
1526
0
      ret = reftable_iterator_seek_log(&it, u->refname);
1527
0
      while (ret == 0) {
1528
0
        struct reftable_log_record *tombstone;
1529
1530
0
        ret = reftable_iterator_next_log(&it, &log);
1531
0
        if (ret < 0)
1532
0
          break;
1533
0
        if (ret > 0 || strcmp(log.refname, u->refname)) {
1534
0
          ret = 0;
1535
0
          break;
1536
0
        }
1537
0
        if (reftable_log_record_is_deletion(&log))
1538
0
          continue;
1539
1540
0
        ALLOC_GROW(logs, logs_nr + 1, logs_alloc);
1541
0
        tombstone = &logs[logs_nr++];
1542
0
        tombstone->refname = xstrdup(u->refname);
1543
0
        tombstone->value_type = REFTABLE_LOG_DELETION;
1544
0
        tombstone->update_index = log.update_index;
1545
0
      }
1546
1547
0
      reftable_log_record_release(&log);
1548
0
      reftable_iterator_destroy(&it);
1549
1550
0
      if (ret)
1551
0
        goto done;
1552
0
    } else if (!(u->flags & REF_SKIP_CREATE_REFLOG) &&
1553
0
         (u->flags & REF_HAVE_NEW) &&
1554
0
         (u->flags & REF_FORCE_CREATE_REFLOG ||
1555
0
          should_write_log(arg->refs, u->refname))) {
1556
0
      struct reftable_log_record *log;
1557
0
      int create_reflog = 1;
1558
1559
0
      if (u->new_target) {
1560
0
        if (!refs_resolve_ref_unsafe(&arg->refs->base, u->new_target,
1561
0
                   RESOLVE_REF_READING, &u->new_oid, NULL)) {
1562
          /*
1563
           * TODO: currently we skip creating reflogs for dangling
1564
           * symref updates. It would be nice to capture this as
1565
           * zero oid updates however.
1566
           */
1567
0
          create_reflog = 0;
1568
0
        }
1569
0
      }
1570
1571
0
      if (create_reflog) {
1572
0
        struct ident_split c;
1573
1574
0
        ALLOC_GROW(logs, logs_nr + 1, logs_alloc);
1575
0
        log = &logs[logs_nr++];
1576
0
        memset(log, 0, sizeof(*log));
1577
1578
0
        if (u->committer_info) {
1579
0
          if (split_ident_line(&c, u->committer_info,
1580
0
                   strlen(u->committer_info)))
1581
0
            BUG("failed splitting committer info");
1582
0
        } else {
1583
0
          c = committer_ident;
1584
0
        }
1585
1586
0
        fill_reftable_log_record(log, &c);
1587
1588
        /*
1589
         * Updates are sorted by the writer. So updates for the same
1590
         * refname need to contain different update indices.
1591
         */
1592
0
        log->update_index = ts + u->index;
1593
1594
0
        log->refname = xstrdup(u->refname);
1595
0
        memcpy(log->value.update.new_hash,
1596
0
               u->new_oid.hash, GIT_MAX_RAWSZ);
1597
0
        memcpy(log->value.update.old_hash,
1598
0
               tx_update->current_oid.hash, GIT_MAX_RAWSZ);
1599
0
        log->value.update.message =
1600
0
          xstrndup(u->msg, reftable_be_write_options(arg->refs)->opts.block_size / 2);
1601
0
      }
1602
0
    }
1603
1604
0
    if (u->flags & REF_LOG_ONLY)
1605
0
      continue;
1606
1607
0
    if (u->new_target) {
1608
0
      struct reftable_ref_record ref = {
1609
0
        .refname = (char *)u->refname,
1610
0
        .value_type = REFTABLE_REF_SYMREF,
1611
0
        .value.symref = (char *)u->new_target,
1612
0
        .update_index = ts,
1613
0
      };
1614
1615
0
      ret = reftable_writer_add_ref(writer, &ref);
1616
0
      if (ret < 0)
1617
0
        goto done;
1618
0
    } else if ((u->flags & REF_HAVE_NEW) && ref_update_has_null_new_value(u)) {
1619
0
      struct reftable_ref_record ref = {
1620
0
        .refname = (char *)u->refname,
1621
0
        .update_index = ts,
1622
0
        .value_type = REFTABLE_REF_DELETION,
1623
0
      };
1624
1625
0
      ret = reftable_writer_add_ref(writer, &ref);
1626
0
      if (ret < 0)
1627
0
        goto done;
1628
0
    } else if (u->flags & REF_HAVE_NEW) {
1629
0
      struct reftable_ref_record ref = {0};
1630
1631
0
      ref.refname = (char *)u->refname;
1632
0
      ref.update_index = ts;
1633
1634
0
      if (u->flags & REF_HAVE_PEELED) {
1635
0
        ref.value_type = REFTABLE_REF_VAL2;
1636
0
        memcpy(ref.value.val2.target_value, u->peeled.hash, GIT_MAX_RAWSZ);
1637
0
        memcpy(ref.value.val2.value, u->new_oid.hash, GIT_MAX_RAWSZ);
1638
0
      } else if (!is_null_oid(&u->new_oid)) {
1639
0
        ref.value_type = REFTABLE_REF_VAL1;
1640
0
        memcpy(ref.value.val1, u->new_oid.hash, GIT_MAX_RAWSZ);
1641
0
      }
1642
1643
0
      ret = reftable_writer_add_ref(writer, &ref);
1644
0
      if (ret < 0)
1645
0
        goto done;
1646
0
    }
1647
0
  }
1648
1649
  /*
1650
   * Logs are written at the end so that we do not have intermixed ref
1651
   * and log blocks.
1652
   */
1653
0
  if (logs) {
1654
0
    ret = reftable_writer_add_logs(writer, logs, logs_nr);
1655
0
    if (ret < 0)
1656
0
      goto done;
1657
0
  }
1658
1659
0
done:
1660
0
  assert(ret != REFTABLE_API_ERROR);
1661
0
  for (i = 0; i < logs_nr; i++)
1662
0
    reftable_log_record_release(&logs[i]);
1663
0
  free(logs);
1664
0
  return ret;
1665
0
}
1666
1667
static int reftable_be_transaction_finish(struct ref_store *ref_store UNUSED,
1668
            struct ref_transaction *transaction,
1669
            struct strbuf *err)
1670
0
{
1671
0
  struct reftable_transaction_data *tx_data = transaction->backend_data;
1672
0
  int ret = 0;
1673
1674
0
  for (size_t i = 0; i < tx_data->args_nr; i++) {
1675
0
    tx_data->args[i].max_index = transaction->max_index;
1676
1677
0
    ret = reftable_addition_add(tx_data->args[i].addition,
1678
0
              write_transaction_table, &tx_data->args[i]);
1679
0
    if (ret < 0)
1680
0
      goto done;
1681
1682
0
    ret = reftable_addition_commit(tx_data->args[i].addition);
1683
0
    if (ret < 0)
1684
0
      goto done;
1685
0
  }
1686
1687
0
done:
1688
0
  assert(ret != REFTABLE_API_ERROR);
1689
0
  free_transaction_data(tx_data);
1690
0
  transaction->state = REF_TRANSACTION_CLOSED;
1691
1692
0
  if (ret) {
1693
0
    strbuf_addf(err, _("reftable: transaction failure: %s"),
1694
0
          reftable_error_str(ret));
1695
0
    return -1;
1696
0
  }
1697
0
  return ret;
1698
0
}
1699
1700
static int reftable_be_optimize(struct ref_store *ref_store,
1701
        struct refs_optimize_opts *opts)
1702
0
{
1703
0
  struct reftable_ref_store *refs =
1704
0
    reftable_be_downcast(ref_store, REF_STORE_WRITE | REF_STORE_ODB, "optimize_refs");
1705
0
  struct reftable_stack *stack;
1706
0
  int ret;
1707
1708
0
  if (refs->err)
1709
0
    return refs->err;
1710
1711
0
  stack = refs->worktree_backend.stack;
1712
0
  if (!stack)
1713
0
    stack = refs->main_backend.stack;
1714
1715
0
  if (opts->flags & REFS_OPTIMIZE_AUTO)
1716
0
    ret = reftable_stack_auto_compact(stack, &reftable_be_write_options(refs)->opts);
1717
0
  else
1718
0
    ret = reftable_stack_compact_all(stack, &reftable_be_write_options(refs)->opts, NULL);
1719
0
  if (ret < 0) {
1720
0
    ret = error(_("unable to compact stack: %s"),
1721
0
          reftable_error_str(ret));
1722
0
    goto out;
1723
0
  }
1724
1725
0
  ret = reftable_stack_clean(stack);
1726
0
  if (ret)
1727
0
    goto out;
1728
1729
0
out:
1730
0
  return ret;
1731
0
}
1732
1733
static int reftable_be_optimize_required(struct ref_store *ref_store,
1734
           struct refs_optimize_opts *opts,
1735
           bool *required)
1736
0
{
1737
0
  struct reftable_ref_store *refs = reftable_be_downcast(ref_store, REF_STORE_READ,
1738
0
                     "optimize_refs_required");
1739
0
  struct reftable_stack *stack;
1740
0
  bool use_heuristics = false;
1741
1742
0
  if (refs->err)
1743
0
    return refs->err;
1744
1745
0
  stack = refs->worktree_backend.stack;
1746
0
  if (!stack)
1747
0
    stack = refs->main_backend.stack;
1748
1749
0
  if (opts->flags & REFS_OPTIMIZE_AUTO)
1750
0
    use_heuristics = true;
1751
1752
0
  return reftable_stack_compaction_required(stack, &reftable_be_write_options(refs)->opts,
1753
0
              use_heuristics, required);
1754
0
}
1755
1756
struct write_create_symref_arg {
1757
  struct reftable_ref_store *refs;
1758
  struct reftable_stack *stack;
1759
  struct strbuf *err;
1760
  const char *refname;
1761
  const char *target;
1762
  const char *logmsg;
1763
};
1764
1765
struct write_copy_arg {
1766
  struct reftable_ref_store *refs;
1767
  struct reftable_backend *be;
1768
  const char *oldname;
1769
  const char *newname;
1770
  const char *logmsg;
1771
  int delete_old;
1772
};
1773
1774
static int write_copy_table(struct reftable_writer *writer, void *cb_data)
1775
0
{
1776
0
  struct write_copy_arg *arg = cb_data;
1777
0
  uint64_t deletion_ts, creation_ts;
1778
0
  struct reftable_ref_record old_ref = {0}, refs[2] = {0};
1779
0
  struct reftable_log_record old_log = {0}, *logs = NULL;
1780
0
  struct reftable_iterator it = {0};
1781
0
  struct string_list skip = STRING_LIST_INIT_NODUP;
1782
0
  struct ident_split committer_ident = {0};
1783
0
  struct strbuf errbuf = STRBUF_INIT;
1784
0
  size_t logs_nr = 0, logs_alloc = 0, i;
1785
0
  const char *committer_info;
1786
0
  int ret;
1787
1788
0
  committer_info = git_committer_info(0);
1789
0
  if (split_ident_line(&committer_ident, committer_info, strlen(committer_info)))
1790
0
    BUG("failed splitting committer info");
1791
1792
0
  if (reftable_stack_read_ref(arg->be->stack, arg->oldname, &old_ref)) {
1793
0
    ret = error(_("refname %s not found"), arg->oldname);
1794
0
    goto done;
1795
0
  }
1796
0
  if (old_ref.value_type == REFTABLE_REF_SYMREF) {
1797
0
    ret = error(_("refname %s is a symbolic ref, copying it is not supported"),
1798
0
          arg->oldname);
1799
0
    goto done;
1800
0
  }
1801
1802
  /*
1803
   * There's nothing to do in case the old and new name are the same, so
1804
   * we exit early in that case.
1805
   */
1806
0
  if (!strcmp(arg->oldname, arg->newname)) {
1807
0
    ret = 0;
1808
0
    goto done;
1809
0
  }
1810
1811
  /*
1812
   * Verify that the new refname is available.
1813
   */
1814
0
  if (arg->delete_old)
1815
0
    string_list_insert(&skip, arg->oldname);
1816
0
  ret = refs_verify_refname_available(&arg->refs->base, arg->newname,
1817
0
              NULL, &skip, 0, &errbuf);
1818
0
  if (ret < 0) {
1819
0
    error("%s", errbuf.buf);
1820
0
    goto done;
1821
0
  }
1822
1823
  /*
1824
   * When deleting the old reference we have to use two update indices:
1825
   * once to delete the old ref and its reflog, and once to create the
1826
   * new ref and its reflog. They need to be staged with two separate
1827
   * indices because the new reflog needs to encode both the deletion of
1828
   * the old branch and the creation of the new branch, and we cannot do
1829
   * two changes to a reflog in a single update.
1830
   */
1831
0
  deletion_ts = creation_ts = reftable_stack_next_update_index(arg->be->stack);
1832
0
  if (arg->delete_old)
1833
0
    creation_ts++;
1834
0
  ret = reftable_writer_set_limits(writer, deletion_ts, creation_ts);
1835
0
  if (ret < 0)
1836
0
    goto done;
1837
1838
  /*
1839
   * Add the new reference. If this is a rename then we also delete the
1840
   * old reference.
1841
   */
1842
0
  refs[0] = old_ref;
1843
0
  refs[0].refname = xstrdup(arg->newname);
1844
0
  refs[0].update_index = creation_ts;
1845
0
  if (arg->delete_old) {
1846
0
    refs[1].refname = xstrdup(arg->oldname);
1847
0
    refs[1].value_type = REFTABLE_REF_DELETION;
1848
0
    refs[1].update_index = deletion_ts;
1849
0
  }
1850
0
  ret = reftable_writer_add_refs(writer, refs, arg->delete_old ? 2 : 1);
1851
0
  if (ret < 0)
1852
0
    goto done;
1853
1854
  /*
1855
   * When deleting the old branch we need to create a reflog entry on the
1856
   * new branch name that indicates that the old branch has been deleted
1857
   * and then recreated. This is a tad weird, but matches what the files
1858
   * backend does.
1859
   */
1860
0
  if (arg->delete_old) {
1861
0
    struct strbuf head_referent = STRBUF_INIT;
1862
0
    struct object_id head_oid;
1863
0
    int append_head_reflog;
1864
0
    unsigned head_type = 0;
1865
1866
0
    ALLOC_GROW(logs, logs_nr + 1, logs_alloc);
1867
0
    memset(&logs[logs_nr], 0, sizeof(logs[logs_nr]));
1868
0
    fill_reftable_log_record(&logs[logs_nr], &committer_ident);
1869
0
    logs[logs_nr].refname = xstrdup(arg->newname);
1870
0
    logs[logs_nr].update_index = deletion_ts;
1871
0
    logs[logs_nr].value.update.message =
1872
0
      xstrndup(arg->logmsg, reftable_be_write_options(arg->refs)->opts.block_size / 2);
1873
0
    memcpy(logs[logs_nr].value.update.old_hash, old_ref.value.val1, GIT_MAX_RAWSZ);
1874
0
    logs_nr++;
1875
1876
0
    ret = reftable_backend_read_ref(arg->be, "HEAD", &head_oid,
1877
0
            &head_referent, &head_type);
1878
0
    if (ret < 0)
1879
0
      goto done;
1880
0
    append_head_reflog = (head_type & REF_ISSYMREF) && !strcmp(head_referent.buf, arg->oldname);
1881
0
    strbuf_release(&head_referent);
1882
1883
    /*
1884
     * The files backend uses `refs_delete_ref()` to delete the old
1885
     * branch name, which will append a reflog entry for HEAD in
1886
     * case it points to the old branch.
1887
     */
1888
0
    if (append_head_reflog) {
1889
0
      ALLOC_GROW(logs, logs_nr + 1, logs_alloc);
1890
0
      logs[logs_nr] = logs[logs_nr - 1];
1891
0
      logs[logs_nr].refname = xstrdup("HEAD");
1892
0
      logs[logs_nr].value.update.name =
1893
0
        xstrdup(logs[logs_nr].value.update.name);
1894
0
      logs[logs_nr].value.update.email =
1895
0
        xstrdup(logs[logs_nr].value.update.email);
1896
0
      logs[logs_nr].value.update.message =
1897
0
        xstrdup(logs[logs_nr].value.update.message);
1898
0
      logs_nr++;
1899
0
    }
1900
0
  }
1901
1902
  /*
1903
   * Create the reflog entry for the newly created branch.
1904
   */
1905
0
  ALLOC_GROW(logs, logs_nr + 1, logs_alloc);
1906
0
  memset(&logs[logs_nr], 0, sizeof(logs[logs_nr]));
1907
0
  fill_reftable_log_record(&logs[logs_nr], &committer_ident);
1908
0
  logs[logs_nr].refname = xstrdup(arg->newname);
1909
0
  logs[logs_nr].update_index = creation_ts;
1910
0
  logs[logs_nr].value.update.message =
1911
0
    xstrndup(arg->logmsg, reftable_be_write_options(arg->refs)->opts.block_size / 2);
1912
0
  memcpy(logs[logs_nr].value.update.new_hash, old_ref.value.val1, GIT_MAX_RAWSZ);
1913
0
  logs_nr++;
1914
1915
  /*
1916
   * In addition to writing the reflog entry for the new branch, we also
1917
   * copy over all log entries from the old reflog. Last but not least,
1918
   * when renaming we also have to delete all the old reflog entries.
1919
   */
1920
0
  ret = reftable_stack_init_log_iterator(arg->be->stack, &it);
1921
0
  if (ret < 0)
1922
0
    goto done;
1923
1924
0
  ret = reftable_iterator_seek_log(&it, arg->oldname);
1925
0
  if (ret < 0)
1926
0
    goto done;
1927
1928
0
  while (1) {
1929
0
    ret = reftable_iterator_next_log(&it, &old_log);
1930
0
    if (ret < 0)
1931
0
      goto done;
1932
0
    if (ret > 0 || strcmp(old_log.refname, arg->oldname)) {
1933
0
      ret = 0;
1934
0
      break;
1935
0
    }
1936
0
    if (reftable_log_record_is_deletion(&old_log))
1937
0
      continue;
1938
1939
0
    free(old_log.refname);
1940
1941
    /*
1942
     * Copy over the old reflog entry with the new refname.
1943
     */
1944
0
    ALLOC_GROW(logs, logs_nr + 1, logs_alloc);
1945
0
    logs[logs_nr] = old_log;
1946
0
    logs[logs_nr].refname = xstrdup(arg->newname);
1947
0
    logs_nr++;
1948
1949
    /*
1950
     * Delete the old reflog entry in case we are renaming.
1951
     */
1952
0
    if (arg->delete_old) {
1953
0
      ALLOC_GROW(logs, logs_nr + 1, logs_alloc);
1954
0
      memset(&logs[logs_nr], 0, sizeof(logs[logs_nr]));
1955
0
      logs[logs_nr].refname = xstrdup(arg->oldname);
1956
0
      logs[logs_nr].value_type = REFTABLE_LOG_DELETION;
1957
0
      logs[logs_nr].update_index = old_log.update_index;
1958
0
      logs_nr++;
1959
0
    }
1960
1961
    /*
1962
     * Transfer ownership of the log record we're iterating over to
1963
     * the array of log records. Otherwise, the pointers would get
1964
     * free'd or reallocated by the iterator.
1965
     */
1966
0
    memset(&old_log, 0, sizeof(old_log));
1967
0
  }
1968
1969
0
  ret = reftable_writer_add_logs(writer, logs, logs_nr);
1970
0
  if (ret < 0)
1971
0
    goto done;
1972
1973
0
done:
1974
0
  assert(ret != REFTABLE_API_ERROR);
1975
0
  reftable_iterator_destroy(&it);
1976
0
  string_list_clear(&skip, 0);
1977
0
  strbuf_release(&errbuf);
1978
0
  for (i = 0; i < logs_nr; i++)
1979
0
    reftable_log_record_release(&logs[i]);
1980
0
  free(logs);
1981
0
  for (i = 0; i < ARRAY_SIZE(refs); i++)
1982
0
    reftable_ref_record_release(&refs[i]);
1983
0
  reftable_ref_record_release(&old_ref);
1984
0
  reftable_log_record_release(&old_log);
1985
0
  return ret;
1986
0
}
1987
1988
static int reftable_be_rename_ref(struct ref_store *ref_store,
1989
          const char *oldrefname,
1990
          const char *newrefname,
1991
          const char *logmsg)
1992
0
{
1993
0
  struct reftable_ref_store *refs =
1994
0
    reftable_be_downcast(ref_store, REF_STORE_WRITE, "rename_ref");
1995
0
  struct write_copy_arg arg = {
1996
0
    .refs = refs,
1997
0
    .oldname = oldrefname,
1998
0
    .newname = newrefname,
1999
0
    .logmsg = logmsg,
2000
0
    .delete_old = 1,
2001
0
  };
2002
0
  int ret;
2003
2004
0
  ret = refs->err;
2005
0
  if (ret < 0)
2006
0
    goto done;
2007
2008
0
  ret = backend_for(&arg.be, refs, newrefname, &newrefname, 1);
2009
0
  if (ret)
2010
0
    goto done;
2011
0
  ret = reftable_stack_add(arg.be->stack, &write_copy_table, &arg,
2012
0
         &reftable_be_write_options(refs)->opts);
2013
2014
0
done:
2015
0
  assert(ret != REFTABLE_API_ERROR);
2016
0
  return ret;
2017
0
}
2018
2019
static int reftable_be_copy_ref(struct ref_store *ref_store,
2020
        const char *oldrefname,
2021
        const char *newrefname,
2022
        const char *logmsg)
2023
0
{
2024
0
  struct reftable_ref_store *refs =
2025
0
    reftable_be_downcast(ref_store, REF_STORE_WRITE, "copy_ref");
2026
0
  struct write_copy_arg arg = {
2027
0
    .refs = refs,
2028
0
    .oldname = oldrefname,
2029
0
    .newname = newrefname,
2030
0
    .logmsg = logmsg,
2031
0
  };
2032
0
  int ret;
2033
2034
0
  ret = refs->err;
2035
0
  if (ret < 0)
2036
0
    goto done;
2037
2038
0
  ret = backend_for(&arg.be, refs, newrefname, &newrefname, 1);
2039
0
  if (ret)
2040
0
    goto done;
2041
0
  ret = reftable_stack_add(arg.be->stack, &write_copy_table, &arg,
2042
0
         &reftable_be_write_options(refs)->opts);
2043
2044
0
done:
2045
0
  assert(ret != REFTABLE_API_ERROR);
2046
0
  return ret;
2047
0
}
2048
2049
struct reftable_reflog_iterator {
2050
  struct ref_iterator base;
2051
  struct reftable_ref_store *refs;
2052
  struct reftable_iterator iter;
2053
  struct reftable_log_record log;
2054
  struct strbuf last_name;
2055
  int err;
2056
};
2057
2058
static int reftable_reflog_iterator_advance(struct ref_iterator *ref_iterator)
2059
0
{
2060
0
  struct reftable_reflog_iterator *iter =
2061
0
    (struct reftable_reflog_iterator *)ref_iterator;
2062
2063
0
  while (!iter->err) {
2064
0
    iter->err = reftable_iterator_next_log(&iter->iter, &iter->log);
2065
0
    if (iter->err)
2066
0
      break;
2067
2068
0
    if (reftable_log_record_is_deletion(&iter->log))
2069
0
      continue;
2070
2071
    /*
2072
     * We want the refnames that we have reflogs for, so we skip if
2073
     * we've already produced this name. This could be faster by
2074
     * seeking directly to reflog@update_index==0.
2075
     */
2076
0
    if (!strcmp(iter->log.refname, iter->last_name.buf))
2077
0
      continue;
2078
2079
0
    if (check_refname_format(iter->log.refname,
2080
0
           REFNAME_ALLOW_ONELEVEL))
2081
0
      continue;
2082
2083
0
    strbuf_reset(&iter->last_name);
2084
0
    strbuf_addstr(&iter->last_name, iter->log.refname);
2085
0
    iter->base.ref.name = iter->log.refname;
2086
2087
0
    break;
2088
0
  }
2089
2090
0
  if (iter->err > 0)
2091
0
    return ITER_DONE;
2092
0
  if (iter->err < 0)
2093
0
    return ITER_ERROR;
2094
0
  return ITER_OK;
2095
0
}
2096
2097
static int reftable_reflog_iterator_seek(struct ref_iterator *ref_iterator UNUSED,
2098
           const char *refname UNUSED,
2099
           unsigned int flags UNUSED)
2100
0
{
2101
0
  BUG("reftable reflog iterator cannot be seeked");
2102
0
  return -1;
2103
0
}
2104
2105
static void reftable_reflog_iterator_release(struct ref_iterator *ref_iterator)
2106
0
{
2107
0
  struct reftable_reflog_iterator *iter =
2108
0
    (struct reftable_reflog_iterator *)ref_iterator;
2109
0
  reftable_log_record_release(&iter->log);
2110
0
  reftable_iterator_destroy(&iter->iter);
2111
0
  strbuf_release(&iter->last_name);
2112
0
}
2113
2114
static struct ref_iterator_vtable reftable_reflog_iterator_vtable = {
2115
  .advance = reftable_reflog_iterator_advance,
2116
  .seek = reftable_reflog_iterator_seek,
2117
  .release = reftable_reflog_iterator_release,
2118
};
2119
2120
static struct reftable_reflog_iterator *reflog_iterator_for_stack(struct reftable_ref_store *refs,
2121
                  struct reftable_stack *stack)
2122
0
{
2123
0
  struct reftable_reflog_iterator *iter;
2124
0
  int ret;
2125
2126
0
  iter = xcalloc(1, sizeof(*iter));
2127
0
  base_ref_iterator_init(&iter->base, &reftable_reflog_iterator_vtable);
2128
0
  strbuf_init(&iter->last_name, 0);
2129
0
  iter->refs = refs;
2130
2131
0
  ret = refs->err;
2132
0
  if (ret)
2133
0
    goto done;
2134
2135
0
  ret = reftable_stack_reload(stack);
2136
0
  if (ret < 0)
2137
0
    goto done;
2138
2139
0
  ret = reftable_stack_init_log_iterator(stack, &iter->iter);
2140
0
  if (ret < 0)
2141
0
    goto done;
2142
2143
0
  ret = reftable_iterator_seek_log(&iter->iter, "");
2144
0
  if (ret < 0)
2145
0
    goto done;
2146
2147
0
done:
2148
0
  iter->err = ret;
2149
0
  return iter;
2150
0
}
2151
2152
static struct ref_iterator *reftable_be_reflog_iterator_begin(struct ref_store *ref_store)
2153
0
{
2154
0
  struct reftable_ref_store *refs =
2155
0
    reftable_be_downcast(ref_store, REF_STORE_READ, "reflog_iterator_begin");
2156
0
  struct reftable_reflog_iterator *main_iter, *worktree_iter;
2157
2158
0
  main_iter = reflog_iterator_for_stack(refs, refs->main_backend.stack);
2159
0
  if (!refs->worktree_backend.stack)
2160
0
    return &main_iter->base;
2161
2162
0
  worktree_iter = reflog_iterator_for_stack(refs, refs->worktree_backend.stack);
2163
2164
0
  return merge_ref_iterator_begin(&worktree_iter->base, &main_iter->base,
2165
0
          ref_iterator_select, NULL);
2166
0
}
2167
2168
static int yield_log_record(struct reftable_ref_store *refs,
2169
          struct reftable_log_record *log,
2170
          each_reflog_ent_fn fn,
2171
          void *cb_data)
2172
0
{
2173
0
  struct object_id old_oid, new_oid;
2174
0
  const char *full_committer;
2175
2176
0
  oidread(&old_oid, log->value.update.old_hash, refs->base.repo->hash_algo);
2177
0
  oidread(&new_oid, log->value.update.new_hash, refs->base.repo->hash_algo);
2178
2179
  /*
2180
   * When both the old object ID and the new object ID are null
2181
   * then this is the reflog existence marker. The caller must
2182
   * not be aware of it.
2183
   */
2184
0
  if (is_null_oid(&old_oid) && is_null_oid(&new_oid))
2185
0
    return 0;
2186
2187
0
  full_committer = fmt_ident(log->value.update.name, log->value.update.email,
2188
0
           WANT_COMMITTER_IDENT, NULL, IDENT_NO_DATE);
2189
0
  return fn(log->refname, &old_oid, &new_oid, full_committer,
2190
0
      log->value.update.time, minutes_to_tz(log->value.update.tz_offset),
2191
0
      log->value.update.message, cb_data);
2192
0
}
2193
2194
static int reftable_be_for_each_reflog_ent_reverse(struct ref_store *ref_store,
2195
               const char *refname,
2196
               each_reflog_ent_fn fn,
2197
               void *cb_data)
2198
0
{
2199
0
  struct reftable_ref_store *refs =
2200
0
    reftable_be_downcast(ref_store, REF_STORE_READ, "for_each_reflog_ent_reverse");
2201
0
  struct reftable_log_record log = {0};
2202
0
  struct reftable_iterator it = {0};
2203
0
  struct reftable_backend *be;
2204
0
  int ret;
2205
2206
0
  if (refs->err < 0)
2207
0
    return refs->err;
2208
2209
  /*
2210
   * TODO: we should adapt this callsite to reload the stack. There is no
2211
   * obvious reason why we shouldn't.
2212
   */
2213
0
  ret = backend_for(&be, refs, refname, &refname, 0);
2214
0
  if (ret)
2215
0
    goto done;
2216
2217
0
  ret = reftable_stack_init_log_iterator(be->stack, &it);
2218
0
  if (ret < 0)
2219
0
    goto done;
2220
2221
0
  ret = reftable_iterator_seek_log(&it, refname);
2222
0
  while (!ret) {
2223
0
    ret = reftable_iterator_next_log(&it, &log);
2224
0
    if (ret < 0)
2225
0
      break;
2226
0
    if (ret > 0 || strcmp(log.refname, refname)) {
2227
0
      ret = 0;
2228
0
      break;
2229
0
    }
2230
0
    if (reftable_log_record_is_deletion(&log))
2231
0
      continue;
2232
2233
0
    ret = yield_log_record(refs, &log, fn, cb_data);
2234
0
    if (ret)
2235
0
      break;
2236
0
  }
2237
2238
0
done:
2239
0
  reftable_log_record_release(&log);
2240
0
  reftable_iterator_destroy(&it);
2241
0
  return ret;
2242
0
}
2243
2244
static int reftable_be_for_each_reflog_ent(struct ref_store *ref_store,
2245
             const char *refname,
2246
             each_reflog_ent_fn fn,
2247
             void *cb_data)
2248
0
{
2249
0
  struct reftable_ref_store *refs =
2250
0
    reftable_be_downcast(ref_store, REF_STORE_READ, "for_each_reflog_ent");
2251
0
  struct reftable_log_record *logs = NULL;
2252
0
  struct reftable_iterator it = {0};
2253
0
  struct reftable_backend *be;
2254
0
  size_t logs_alloc = 0, logs_nr = 0, i;
2255
0
  int ret;
2256
2257
0
  if (refs->err < 0)
2258
0
    return refs->err;
2259
2260
  /*
2261
   * TODO: we should adapt this callsite to reload the stack. There is no
2262
   * obvious reason why we shouldn't.
2263
   */
2264
0
  ret = backend_for(&be, refs, refname, &refname, 0);
2265
0
  if (ret)
2266
0
    goto done;
2267
2268
0
  ret = reftable_stack_init_log_iterator(be->stack, &it);
2269
0
  if (ret < 0)
2270
0
    goto done;
2271
2272
0
  ret = reftable_iterator_seek_log(&it, refname);
2273
0
  while (!ret) {
2274
0
    struct reftable_log_record log = {0};
2275
2276
0
    ret = reftable_iterator_next_log(&it, &log);
2277
0
    if (ret < 0)
2278
0
      goto done;
2279
0
    if (ret > 0 || strcmp(log.refname, refname)) {
2280
0
      reftable_log_record_release(&log);
2281
0
      ret = 0;
2282
0
      break;
2283
0
    }
2284
0
    if (reftable_log_record_is_deletion(&log)) {
2285
0
      reftable_log_record_release(&log);
2286
0
      continue;
2287
0
    }
2288
2289
0
    ALLOC_GROW(logs, logs_nr + 1, logs_alloc);
2290
0
    logs[logs_nr++] = log;
2291
0
  }
2292
2293
0
  for (i = logs_nr; i--;) {
2294
0
    ret = yield_log_record(refs, &logs[i], fn, cb_data);
2295
0
    if (ret)
2296
0
      goto done;
2297
0
  }
2298
2299
0
done:
2300
0
  reftable_iterator_destroy(&it);
2301
0
  for (i = 0; i < logs_nr; i++)
2302
0
    reftable_log_record_release(&logs[i]);
2303
0
  free(logs);
2304
0
  return ret;
2305
0
}
2306
2307
static int reftable_be_reflog_exists(struct ref_store *ref_store,
2308
             const char *refname)
2309
0
{
2310
0
  struct reftable_ref_store *refs =
2311
0
    reftable_be_downcast(ref_store, REF_STORE_READ, "reflog_exists");
2312
0
  struct reftable_log_record log = {0};
2313
0
  struct reftable_iterator it = {0};
2314
0
  struct reftable_backend *be;
2315
0
  int ret;
2316
2317
0
  ret = refs->err;
2318
0
  if (ret < 0)
2319
0
    goto done;
2320
2321
0
  ret = backend_for(&be, refs, refname, &refname, 1);
2322
0
  if (ret < 0)
2323
0
    goto done;
2324
2325
0
  ret = reftable_stack_init_log_iterator(be->stack, &it);
2326
0
  if (ret < 0)
2327
0
    goto done;
2328
2329
0
  ret = reftable_iterator_seek_log(&it, refname);
2330
0
  if (ret < 0)
2331
0
    goto done;
2332
2333
  /*
2334
   * Check whether we get at least one non-deleted log record for the
2335
   * given ref name.  If so, the reflog exists, otherwise it doesn't.
2336
   */
2337
0
  while (1) {
2338
0
    ret = reftable_iterator_next_log(&it, &log);
2339
0
    if (ret < 0)
2340
0
      goto done;
2341
0
    if (ret > 0) {
2342
0
      ret = 0;
2343
0
      goto done;
2344
0
    }
2345
0
    if (strcmp(log.refname, refname)) {
2346
0
      ret = 0;
2347
0
      goto done;
2348
0
    }
2349
0
    if (!reftable_log_record_is_deletion(&log))
2350
0
      break;
2351
0
  }
2352
2353
0
  ret = 1;
2354
2355
0
done:
2356
0
  reftable_iterator_destroy(&it);
2357
0
  reftable_log_record_release(&log);
2358
0
  if (ret < 0)
2359
0
    ret = 0;
2360
0
  return ret;
2361
0
}
2362
2363
struct write_reflog_existence_arg {
2364
  struct reftable_ref_store *refs;
2365
  const char *refname;
2366
  struct reftable_stack *stack;
2367
};
2368
2369
static int write_reflog_existence_table(struct reftable_writer *writer,
2370
          void *cb_data)
2371
0
{
2372
0
  struct write_reflog_existence_arg *arg = cb_data;
2373
0
  uint64_t ts = reftable_stack_next_update_index(arg->stack);
2374
0
  struct reftable_log_record log = {0};
2375
0
  int ret;
2376
2377
0
  ret = reftable_stack_read_log(arg->stack, arg->refname, &log);
2378
0
  if (ret <= 0)
2379
0
    goto done;
2380
2381
0
  ret = reftable_writer_set_limits(writer, ts, ts);
2382
0
  if (ret < 0)
2383
0
    goto done;
2384
2385
  /*
2386
   * The existence entry has both old and new object ID set to the
2387
   * null object ID. Our iterators are aware of this and will not present
2388
   * them to their callers.
2389
   */
2390
0
  log.refname = xstrdup(arg->refname);
2391
0
  log.update_index = ts;
2392
0
  log.value_type = REFTABLE_LOG_UPDATE;
2393
0
  ret = reftable_writer_add_log(writer, &log);
2394
2395
0
done:
2396
0
  assert(ret != REFTABLE_API_ERROR);
2397
0
  reftable_log_record_release(&log);
2398
0
  return ret;
2399
0
}
2400
2401
static int reftable_be_create_reflog(struct ref_store *ref_store,
2402
             const char *refname,
2403
             struct strbuf *errmsg UNUSED)
2404
0
{
2405
0
  struct reftable_ref_store *refs =
2406
0
    reftable_be_downcast(ref_store, REF_STORE_WRITE, "create_reflog");
2407
0
  struct reftable_backend *be;
2408
0
  struct write_reflog_existence_arg arg = {
2409
0
    .refs = refs,
2410
0
    .refname = refname,
2411
0
  };
2412
0
  int ret;
2413
2414
0
  ret = refs->err;
2415
0
  if (ret < 0)
2416
0
    goto done;
2417
2418
0
  ret = backend_for(&be, refs, refname, &refname, 1);
2419
0
  if (ret)
2420
0
    goto done;
2421
0
  arg.stack = be->stack;
2422
2423
0
  ret = reftable_stack_add(be->stack, &write_reflog_existence_table, &arg,
2424
0
         &reftable_be_write_options(refs)->opts);
2425
2426
0
done:
2427
0
  return ret;
2428
0
}
2429
2430
struct write_reflog_delete_arg {
2431
  struct reftable_stack *stack;
2432
  const char *refname;
2433
};
2434
2435
static int write_reflog_delete_table(struct reftable_writer *writer, void *cb_data)
2436
0
{
2437
0
  struct write_reflog_delete_arg *arg = cb_data;
2438
0
  struct reftable_log_record log = {0}, tombstone = {0};
2439
0
  struct reftable_iterator it = {0};
2440
0
  uint64_t ts = reftable_stack_next_update_index(arg->stack);
2441
0
  int ret;
2442
2443
0
  ret = reftable_writer_set_limits(writer, ts, ts);
2444
0
  if (ret < 0)
2445
0
    goto out;
2446
2447
0
  ret = reftable_stack_init_log_iterator(arg->stack, &it);
2448
0
  if (ret < 0)
2449
0
    goto out;
2450
2451
  /*
2452
   * In order to delete a table we need to delete all reflog entries one
2453
   * by one. This is inefficient, but the reftable format does not have a
2454
   * better marker right now.
2455
   */
2456
0
  ret = reftable_iterator_seek_log(&it, arg->refname);
2457
0
  while (ret == 0) {
2458
0
    ret = reftable_iterator_next_log(&it, &log);
2459
0
    if (ret < 0)
2460
0
      break;
2461
0
    if (ret > 0 || strcmp(log.refname, arg->refname)) {
2462
0
      ret = 0;
2463
0
      break;
2464
0
    }
2465
0
    if (reftable_log_record_is_deletion(&log))
2466
0
      continue;
2467
2468
0
    tombstone.refname = (char *)arg->refname;
2469
0
    tombstone.value_type = REFTABLE_LOG_DELETION;
2470
0
    tombstone.update_index = log.update_index;
2471
2472
0
    ret = reftable_writer_add_log(writer, &tombstone);
2473
0
  }
2474
2475
0
out:
2476
0
  reftable_log_record_release(&log);
2477
0
  reftable_iterator_destroy(&it);
2478
0
  return ret;
2479
0
}
2480
2481
static int reftable_be_delete_reflog(struct ref_store *ref_store,
2482
             const char *refname)
2483
0
{
2484
0
  struct reftable_ref_store *refs =
2485
0
    reftable_be_downcast(ref_store, REF_STORE_WRITE, "delete_reflog");
2486
0
  struct reftable_backend *be;
2487
0
  struct write_reflog_delete_arg arg = {
2488
0
    .refname = refname,
2489
0
  };
2490
0
  int ret;
2491
2492
0
  ret = backend_for(&be, refs, refname, &refname, 1);
2493
0
  if (ret)
2494
0
    return ret;
2495
0
  arg.stack = be->stack;
2496
2497
0
  ret = reftable_stack_add(be->stack, &write_reflog_delete_table, &arg,
2498
0
         &reftable_be_write_options(refs)->opts);
2499
2500
0
  assert(ret != REFTABLE_API_ERROR);
2501
0
  return ret;
2502
0
}
2503
2504
struct reflog_expiry_arg {
2505
  struct reftable_ref_store *refs;
2506
  struct reftable_stack *stack;
2507
  struct reftable_log_record *records;
2508
  struct object_id update_oid;
2509
  const char *refname;
2510
  size_t len;
2511
};
2512
2513
static int write_reflog_expiry_table(struct reftable_writer *writer, void *cb_data)
2514
0
{
2515
0
  struct reflog_expiry_arg *arg = cb_data;
2516
0
  uint64_t ts = reftable_stack_next_update_index(arg->stack);
2517
0
  uint64_t live_records = 0;
2518
0
  size_t i;
2519
0
  int ret;
2520
2521
0
  for (i = 0; i < arg->len; i++)
2522
0
    if (arg->records[i].value_type == REFTABLE_LOG_UPDATE)
2523
0
      live_records++;
2524
2525
0
  ret = reftable_writer_set_limits(writer, ts, ts);
2526
0
  if (ret < 0)
2527
0
    return ret;
2528
2529
0
  if (!is_null_oid(&arg->update_oid)) {
2530
0
    struct reftable_ref_record ref = {0};
2531
0
    struct object_id peeled;
2532
2533
0
    ref.refname = (char *)arg->refname;
2534
0
    ref.update_index = ts;
2535
2536
0
    if (!peel_object(arg->refs->base.repo, &arg->update_oid, &peeled, 0)) {
2537
0
      ref.value_type = REFTABLE_REF_VAL2;
2538
0
      memcpy(ref.value.val2.target_value, peeled.hash, GIT_MAX_RAWSZ);
2539
0
      memcpy(ref.value.val2.value, arg->update_oid.hash, GIT_MAX_RAWSZ);
2540
0
    } else {
2541
0
      ref.value_type = REFTABLE_REF_VAL1;
2542
0
      memcpy(ref.value.val1, arg->update_oid.hash, GIT_MAX_RAWSZ);
2543
0
    }
2544
2545
0
    ret = reftable_writer_add_ref(writer, &ref);
2546
0
    if (ret < 0)
2547
0
      return ret;
2548
0
  }
2549
2550
  /*
2551
   * When there are no more entries left in the reflog we empty it
2552
   * completely, but write a placeholder reflog entry that indicates that
2553
   * the reflog still exists.
2554
   */
2555
0
  if (!live_records) {
2556
0
    struct reftable_log_record log = {
2557
0
      .refname = (char *)arg->refname,
2558
0
      .value_type = REFTABLE_LOG_UPDATE,
2559
0
      .update_index = ts,
2560
0
    };
2561
2562
0
    ret = reftable_writer_add_log(writer, &log);
2563
0
    if (ret)
2564
0
      return ret;
2565
0
  }
2566
2567
0
  for (i = 0; i < arg->len; i++) {
2568
0
    ret = reftable_writer_add_log(writer, &arg->records[i]);
2569
0
    if (ret)
2570
0
      return ret;
2571
0
  }
2572
2573
0
  return 0;
2574
0
}
2575
2576
static int reftable_be_reflog_expire(struct ref_store *ref_store,
2577
             const char *refname,
2578
             unsigned int flags,
2579
             reflog_expiry_prepare_fn prepare_fn,
2580
             reflog_expiry_should_prune_fn should_prune_fn,
2581
             reflog_expiry_cleanup_fn cleanup_fn,
2582
             void *policy_cb_data)
2583
0
{
2584
  /*
2585
   * For log expiry, we write tombstones for every single reflog entry
2586
   * that is to be expired. This means that the entries are still
2587
   * retrievable by delving into the stack, and expiring entries
2588
   * paradoxically takes extra memory. This memory is only reclaimed when
2589
   * compacting the reftable stack.
2590
   *
2591
   * It would be better if the refs backend supported an API that sets a
2592
   * criterion for all refs, passing the criterion to pack_refs().
2593
   *
2594
   * On the plus side, because we do the expiration per ref, we can easily
2595
   * insert the reflog existence dummies.
2596
   */
2597
0
  struct reftable_ref_store *refs =
2598
0
    reftable_be_downcast(ref_store, REF_STORE_WRITE, "reflog_expire");
2599
0
  struct reftable_log_record *logs = NULL;
2600
0
  struct reftable_log_record *rewritten = NULL;
2601
0
  struct reftable_iterator it = {0};
2602
0
  struct reftable_addition *add = NULL;
2603
0
  struct reflog_expiry_arg arg = {0};
2604
0
  struct reftable_backend *be;
2605
0
  struct object_id oid = {0};
2606
0
  struct strbuf referent = STRBUF_INIT;
2607
0
  uint8_t *last_hash = NULL;
2608
0
  size_t logs_nr = 0, logs_alloc = 0, i;
2609
0
  unsigned int type = 0;
2610
0
  int ret;
2611
2612
0
  if (refs->err < 0)
2613
0
    return refs->err;
2614
2615
0
  ret = backend_for(&be, refs, refname, &refname, 1);
2616
0
  if (ret < 0)
2617
0
    goto done;
2618
2619
0
  ret = reftable_stack_addition_new(&add, be->stack,
2620
0
            &reftable_be_write_options(refs)->opts);
2621
0
  if (ret < 0)
2622
0
    goto done;
2623
2624
0
  ret = reftable_stack_init_log_iterator(be->stack, &it);
2625
0
  if (ret < 0)
2626
0
    goto done;
2627
2628
0
  ret = reftable_iterator_seek_log(&it, refname);
2629
0
  if (ret < 0)
2630
0
    goto done;
2631
2632
0
  ret = reftable_backend_read_ref(be, refname, &oid, &referent, &type);
2633
0
  if (ret < 0)
2634
0
    goto done;
2635
0
  prepare_fn(refname, &oid, policy_cb_data);
2636
2637
0
  while (1) {
2638
0
    struct reftable_log_record log = {0};
2639
0
    struct object_id old_oid, new_oid;
2640
2641
0
    ret = reftable_iterator_next_log(&it, &log);
2642
0
    if (ret < 0)
2643
0
      goto done;
2644
0
    if (ret > 0 || strcmp(log.refname, refname)) {
2645
0
      reftable_log_record_release(&log);
2646
0
      break;
2647
0
    }
2648
0
    if (reftable_log_record_is_deletion(&log)) {
2649
0
      reftable_log_record_release(&log);
2650
0
      continue;
2651
0
    }
2652
2653
0
    oidread(&old_oid, log.value.update.old_hash,
2654
0
      ref_store->repo->hash_algo);
2655
0
    oidread(&new_oid, log.value.update.new_hash,
2656
0
      ref_store->repo->hash_algo);
2657
2658
    /*
2659
     * Skip over the reflog existence marker. We will add it back
2660
     * in when there are no live reflog records.
2661
     */
2662
0
    if (is_null_oid(&old_oid) && is_null_oid(&new_oid)) {
2663
0
      reftable_log_record_release(&log);
2664
0
      continue;
2665
0
    }
2666
2667
0
    ALLOC_GROW(logs, logs_nr + 1, logs_alloc);
2668
0
    logs[logs_nr++] = log;
2669
0
  }
2670
2671
  /*
2672
   * We need to rewrite all reflog entries according to the pruning
2673
   * callback function:
2674
   *
2675
   *   - If a reflog entry shall be pruned we mark the record for
2676
   *     deletion.
2677
   *
2678
   *   - Otherwise we may have to rewrite the chain of reflog entries so
2679
   *     that gaps created by just-deleted records get backfilled.
2680
   */
2681
0
  CALLOC_ARRAY(rewritten, logs_nr);
2682
0
  for (i = logs_nr; i--;) {
2683
0
    struct reftable_log_record *dest = &rewritten[i];
2684
0
    struct object_id old_oid, new_oid;
2685
2686
0
    *dest = logs[i];
2687
0
    oidread(&old_oid, logs[i].value.update.old_hash,
2688
0
      ref_store->repo->hash_algo);
2689
0
    oidread(&new_oid, logs[i].value.update.new_hash,
2690
0
      ref_store->repo->hash_algo);
2691
2692
0
    if (should_prune_fn(&old_oid, &new_oid, logs[i].value.update.email,
2693
0
            (timestamp_t)logs[i].value.update.time,
2694
0
            minutes_to_tz(logs[i].value.update.tz_offset),
2695
0
            logs[i].value.update.message,
2696
0
            policy_cb_data)) {
2697
0
      dest->value_type = REFTABLE_LOG_DELETION;
2698
0
    } else {
2699
0
      if ((flags & EXPIRE_REFLOGS_REWRITE) && last_hash)
2700
0
        memcpy(dest->value.update.old_hash, last_hash, GIT_MAX_RAWSZ);
2701
0
      last_hash = logs[i].value.update.new_hash;
2702
0
    }
2703
0
  }
2704
2705
0
  if (flags & EXPIRE_REFLOGS_UPDATE_REF && last_hash && !is_null_oid(&oid))
2706
0
    oidread(&arg.update_oid, last_hash, ref_store->repo->hash_algo);
2707
2708
0
  arg.refs = refs;
2709
0
  arg.records = rewritten;
2710
0
  arg.len = logs_nr;
2711
0
  arg.stack = be->stack;
2712
0
  arg.refname = refname;
2713
2714
0
  ret = reftable_addition_add(add, &write_reflog_expiry_table, &arg);
2715
0
  if (ret < 0)
2716
0
    goto done;
2717
2718
  /*
2719
   * Future improvement: we could skip writing records that were
2720
   * not changed.
2721
   */
2722
0
  if (!(flags & EXPIRE_REFLOGS_DRY_RUN))
2723
0
    ret = reftable_addition_commit(add);
2724
2725
0
done:
2726
0
  if (add)
2727
0
    cleanup_fn(policy_cb_data);
2728
0
  assert(ret != REFTABLE_API_ERROR);
2729
2730
0
  reftable_iterator_destroy(&it);
2731
0
  reftable_addition_destroy(add);
2732
0
  for (i = 0; i < logs_nr; i++)
2733
0
    reftable_log_record_release(&logs[i]);
2734
0
  strbuf_release(&referent);
2735
0
  free(logs);
2736
0
  free(rewritten);
2737
0
  return ret;
2738
0
}
2739
2740
static void reftable_fsck_verbose_handler(const char *msg, void *cb_data)
2741
0
{
2742
0
  struct fsck_options *o = cb_data;
2743
2744
0
  if (o->verbose)
2745
0
    fprintf_ln(stderr, "%s", msg);
2746
0
}
2747
2748
static const enum fsck_msg_id fsck_msg_id_map[] = {
2749
  [REFTABLE_FSCK_ERROR_TABLE_NAME] = FSCK_MSG_BAD_REFTABLE_TABLE_NAME,
2750
};
2751
2752
static int reftable_fsck_error_handler(struct reftable_fsck_info *info,
2753
               void *cb_data)
2754
0
{
2755
0
  struct fsck_ref_report report = { .path = info->path };
2756
0
  struct fsck_options *o = cb_data;
2757
0
  enum fsck_msg_id msg_id;
2758
2759
0
  if (info->error < 0 || info->error >= REFTABLE_FSCK_MAX_VALUE)
2760
0
    BUG("unknown fsck error: %d", (int)info->error);
2761
2762
0
  msg_id = fsck_msg_id_map[info->error];
2763
2764
0
  if (!msg_id)
2765
0
    BUG("fsck_msg_id value missing for reftable error: %d", (int)info->error);
2766
2767
0
  return fsck_report_ref(o, &report, msg_id, "%s", info->msg);
2768
0
}
2769
2770
static int reftable_be_fsck(struct ref_store *ref_store, struct fsck_options *o,
2771
          struct worktree *wt)
2772
0
{
2773
0
  struct reftable_ref_store *refs =
2774
0
    reftable_be_downcast(ref_store, REF_STORE_READ, "fsck");
2775
0
  struct reftable_ref_iterator *iter = NULL;
2776
0
  struct reftable_ref_record ref = { 0 };
2777
0
  struct fsck_ref_report report = { 0 };
2778
0
  struct strbuf refname = STRBUF_INIT;
2779
0
  struct reftable_backend *backend;
2780
0
  int ret, errors = 0;
2781
2782
0
  if (is_main_worktree(wt)) {
2783
0
    backend = &refs->main_backend;
2784
0
  } else {
2785
0
    ret = backend_for_worktree(&backend, refs, wt->id);
2786
0
    if (ret < 0) {
2787
0
      ret = error(_("reftable stack for worktree '%s' is broken"),
2788
0
            wt->id);
2789
0
      goto out;
2790
0
    }
2791
0
  }
2792
2793
0
  errors |= reftable_fsck_check(backend->stack, reftable_fsck_error_handler,
2794
0
              reftable_fsck_verbose_handler, o);
2795
2796
0
  iter = ref_iterator_for_stack(refs, backend->stack, "", NULL, 0);
2797
0
  if (!iter) {
2798
0
    ret = error(_("could not create iterator for worktree '%s'"), wt->id);
2799
0
    goto out;
2800
0
  }
2801
2802
0
  while (1) {
2803
0
    ret = reftable_iterator_next_ref(&iter->iter, &ref);
2804
0
    if (ret > 0)
2805
0
      break;
2806
0
    if (ret < 0) {
2807
0
      ret = error(_("could not read record for worktree '%s'"), wt->id);
2808
0
      goto out;
2809
0
    }
2810
2811
0
    strbuf_reset(&refname);
2812
0
    if (!is_main_worktree(wt))
2813
0
      strbuf_addf(&refname, "worktrees/%s/", wt->id);
2814
0
    strbuf_addstr(&refname, ref.refname);
2815
0
    report.path = refname.buf;
2816
2817
0
    switch (ref.value_type) {
2818
0
    case REFTABLE_REF_DELETION:
2819
0
      continue;
2820
0
    case REFTABLE_REF_VAL1:
2821
0
    case REFTABLE_REF_VAL2: {
2822
0
      struct object_id oid;
2823
0
      unsigned hash_id;
2824
2825
0
      switch (reftable_stack_hash_id(backend->stack)) {
2826
0
      case REFTABLE_HASH_SHA1:
2827
0
        hash_id = GIT_HASH_SHA1;
2828
0
        break;
2829
0
      case REFTABLE_HASH_SHA256:
2830
0
        hash_id = GIT_HASH_SHA256;
2831
0
        break;
2832
0
      default:
2833
0
        BUG("unhandled hash ID %d",
2834
0
            reftable_stack_hash_id(backend->stack));
2835
0
      }
2836
2837
0
      oidread(&oid, reftable_ref_record_val1(&ref),
2838
0
        &hash_algos[hash_id]);
2839
2840
0
      errors |= refs_fsck_ref(ref_store, o, &report, ref.refname, &oid);
2841
0
      break;
2842
0
    }
2843
0
    case REFTABLE_REF_SYMREF:
2844
0
      errors |= refs_fsck_symref(ref_store, o, &report, ref.refname,
2845
0
               ref.value.symref);
2846
0
      break;
2847
0
    default:
2848
0
      BUG("unhandled reference value type %d", ref.value_type);
2849
0
    }
2850
0
  }
2851
2852
0
  ret = errors ? -1 : 0;
2853
2854
0
out:
2855
0
  if (iter)
2856
0
    ref_iterator_free(&iter->base);
2857
0
  reftable_ref_record_release(&ref);
2858
0
  strbuf_release(&refname);
2859
0
  return ret;
2860
0
}
2861
2862
struct ref_storage_be refs_be_reftable = {
2863
  .name = "reftable",
2864
  .init = reftable_be_init,
2865
  .release = reftable_be_release,
2866
  .create_on_disk = reftable_be_create_on_disk,
2867
  .remove_on_disk = reftable_be_remove_on_disk,
2868
2869
  .transaction_prepare = reftable_be_transaction_prepare,
2870
  .transaction_finish = reftable_be_transaction_finish,
2871
  .transaction_abort = reftable_be_transaction_abort,
2872
2873
  .optimize = reftable_be_optimize,
2874
  .optimize_required = reftable_be_optimize_required,
2875
2876
  .rename_ref = reftable_be_rename_ref,
2877
  .copy_ref = reftable_be_copy_ref,
2878
2879
  .iterator_begin = reftable_be_iterator_begin,
2880
  .read_raw_ref = reftable_be_read_raw_ref,
2881
  .read_symbolic_ref = reftable_be_read_symbolic_ref,
2882
2883
  .reflog_iterator_begin = reftable_be_reflog_iterator_begin,
2884
  .for_each_reflog_ent = reftable_be_for_each_reflog_ent,
2885
  .for_each_reflog_ent_reverse = reftable_be_for_each_reflog_ent_reverse,
2886
  .reflog_exists = reftable_be_reflog_exists,
2887
  .create_reflog = reftable_be_create_reflog,
2888
  .delete_reflog = reftable_be_delete_reflog,
2889
  .reflog_expire = reftable_be_reflog_expire,
2890
2891
  .fsck = reftable_be_fsck,
2892
};