103
static int write_test_ref(struct reftable_writer *wr, void *arg)
104
{
105
struct reftable_ref_record *ref = arg;
106
- reftable_writer_set_limits(wr, ref->update_index, ref->update_index);
106
+ check(!reftable_writer_set_limits(wr, ref->update_index,
107
+ ref->update_index));
108
return reftable_writer_add_ref(wr, ref);
109
}
110
144
{
145
struct write_log_arg *wla = arg;
146
146
- reftable_writer_set_limits(wr, wla->update_index, wla->update_index);
147
+ check(!reftable_writer_set_limits(wr, wla->update_index,
148
+ wla->update_index));
149
return reftable_writer_add_log(wr, wla->log);
150
}
151
963
964
static int write_nothing(struct reftable_writer *wr, void *arg UNUSED)
965
{
964
- reftable_writer_set_limits(wr, 1, 1);
966
+ check(!reftable_writer_set_limits(wr, 1, 1));
967
return 0;
968
}
969
1371
clear_dir(dir);
1372
}
1373
1374
+static int write_limits_after_ref(struct reftable_writer *wr, void *arg)
1375
+{
1376
+ struct reftable_ref_record *ref = arg;
1377
+ check(!reftable_writer_set_limits(wr, ref->update_index, ref->update_index));
1378
+ check(!reftable_writer_add_ref(wr, ref));
1379
+ return reftable_writer_set_limits(wr, ref->update_index, ref->update_index);
1380
+}
1381
+
1382
+static void t_reftable_invalid_limit_updates(void)
1383
+{
1384
+ struct reftable_ref_record ref = {
1385
+ .refname = (char *) "HEAD",
1386
+ .update_index = 1,
1387
+ .value_type = REFTABLE_REF_SYMREF,
1388
+ .value.symref = (char *) "master",
1389
+ };
1390
+ struct reftable_write_options opts = {
1391
+ .default_permissions = 0660,
1392
+ };
1393
+ struct reftable_addition *add = NULL;
1394
+ char *dir = get_tmp_dir(__LINE__);
1395
+ struct reftable_stack *st = NULL;
1396
+ int err;
1397
+
1398
+ err = reftable_new_stack(&st, dir, &opts);
1399
+ check(!err);
1400
+
1401
+ reftable_addition_destroy(add);
1402
+
1403
+ err = reftable_stack_new_addition(&add, st, 0);
1404
+ check(!err);
1405
+
1406
+ /*
1407
+ * write_limits_after_ref also updates the update indexes after adding
1408
+ * the record. This should cause an err to be returned, since the limits
1409
+ * must be set at the start.
1410
+ */
1411
+ err = reftable_addition_add(add, write_limits_after_ref, &ref);
1412
+ check_int(err, ==, REFTABLE_API_ERROR);
1413
+
1414
+ reftable_addition_destroy(add);
1415
+ reftable_stack_destroy(st);
1416
+ clear_dir(dir);
1417
+}
1418
+
1419
int cmd_main(int argc UNUSED, const char *argv[] UNUSED)
1420
{
1421
TEST(t_empty_add(), "empty addition to stack");
1422
TEST(t_read_file(), "read_lines works");
1423
TEST(t_reflog_expire(), "expire reflog entries");
1424
+ TEST(t_reftable_invalid_limit_updates(), "prevent limit updates after adding records");
1425
TEST(t_reftable_stack_add(), "add multiple refs and logs to stack");
1426
TEST(t_reftable_stack_add_one(), "add a single ref record to stack");
1427
TEST(t_reftable_stack_add_performs_auto_compaction(), "addition to stack triggers auto-compaction");