Merge branch 'kn/reflog-migration'
"git refs migrate" learned to also migrate the reflog data across backends. * kn/reflog-migration: refs: mark invalid refname message for translation refs: add support for migrating reflogs refs: allow multiple reflog entries for the same refname refs: introduce the `ref_transaction_update_reflog` function refs: add `committer_info` to `ref_transaction_add_update()` refs: extract out refname verification in transactions refs/files: add count field to ref_lock refs: add `index` field to `struct ref_udpate` refs: include committer info in `ref_update` struct
This commit is contained in:
@ -1091,8 +1091,9 @@ static int reftable_be_transaction_prepare(struct ref_store *ref_store,
|
||||
if (ret)
|
||||
goto done;
|
||||
|
||||
string_list_append(&affected_refnames,
|
||||
transaction->updates[i]->refname);
|
||||
if (!(transaction->updates[i]->flags & REF_LOG_ONLY))
|
||||
string_list_append(&affected_refnames,
|
||||
transaction->updates[i]->refname);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1202,7 +1203,8 @@ static int reftable_be_transaction_prepare(struct ref_store *ref_store,
|
||||
new_update = ref_transaction_add_update(
|
||||
transaction, "HEAD",
|
||||
u->flags | REF_LOG_ONLY | REF_NO_DEREF,
|
||||
&u->new_oid, &u->old_oid, NULL, NULL, u->msg);
|
||||
&u->new_oid, &u->old_oid, NULL, NULL, NULL,
|
||||
u->msg);
|
||||
string_list_insert(&affected_refnames, new_update->refname);
|
||||
}
|
||||
|
||||
@ -1285,7 +1287,8 @@ static int reftable_be_transaction_prepare(struct ref_store *ref_store,
|
||||
transaction, referent.buf, new_flags,
|
||||
u->new_target ? NULL : &u->new_oid,
|
||||
u->old_target ? NULL : &u->old_oid,
|
||||
u->new_target, u->old_target, u->msg);
|
||||
u->new_target, u->old_target,
|
||||
u->committer_info, u->msg);
|
||||
|
||||
new_update->parent_update = u;
|
||||
|
||||
@ -1405,8 +1408,17 @@ static int reftable_be_transaction_abort(struct ref_store *ref_store UNUSED,
|
||||
|
||||
static int transaction_update_cmp(const void *a, const void *b)
|
||||
{
|
||||
return strcmp(((struct reftable_transaction_update *)a)->update->refname,
|
||||
((struct reftable_transaction_update *)b)->update->refname);
|
||||
struct reftable_transaction_update *update_a = (struct reftable_transaction_update *)a;
|
||||
struct reftable_transaction_update *update_b = (struct reftable_transaction_update *)b;
|
||||
|
||||
/*
|
||||
* If there is an index set, it should take preference (default is 0).
|
||||
* This ensures that updates with indexes are sorted amongst themselves.
|
||||
*/
|
||||
if (update_a->update->index || update_b->update->index)
|
||||
return update_a->update->index - update_b->update->index;
|
||||
|
||||
return strcmp(update_a->update->refname, update_b->update->refname);
|
||||
}
|
||||
|
||||
static int write_transaction_table(struct reftable_writer *writer, void *cb_data)
|
||||
@ -1416,6 +1428,7 @@ static int write_transaction_table(struct reftable_writer *writer, void *cb_data
|
||||
struct reftable_log_record *logs = NULL;
|
||||
struct ident_split committer_ident = {0};
|
||||
size_t logs_nr = 0, logs_alloc = 0, i;
|
||||
uint64_t max_update_index = ts;
|
||||
const char *committer_info;
|
||||
int ret = 0;
|
||||
|
||||
@ -1505,12 +1518,34 @@ static int write_transaction_table(struct reftable_writer *writer, void *cb_data
|
||||
}
|
||||
|
||||
if (create_reflog) {
|
||||
struct ident_split c;
|
||||
|
||||
ALLOC_GROW(logs, logs_nr + 1, logs_alloc);
|
||||
log = &logs[logs_nr++];
|
||||
memset(log, 0, sizeof(*log));
|
||||
|
||||
fill_reftable_log_record(log, &committer_ident);
|
||||
log->update_index = ts;
|
||||
if (u->committer_info) {
|
||||
if (split_ident_line(&c, u->committer_info,
|
||||
strlen(u->committer_info)))
|
||||
BUG("failed splitting committer info");
|
||||
} else {
|
||||
c = committer_ident;
|
||||
}
|
||||
|
||||
fill_reftable_log_record(log, &c);
|
||||
|
||||
/*
|
||||
* Updates are sorted by the writer. So updates for the same
|
||||
* refname need to contain different update indices.
|
||||
*/
|
||||
log->update_index = ts + u->index;
|
||||
|
||||
/*
|
||||
* Note the max update_index so the limit can be set later on.
|
||||
*/
|
||||
if (log->update_index > max_update_index)
|
||||
max_update_index = log->update_index;
|
||||
|
||||
log->refname = xstrdup(u->refname);
|
||||
memcpy(log->value.update.new_hash,
|
||||
u->new_oid.hash, GIT_MAX_RAWSZ);
|
||||
@ -1574,6 +1609,8 @@ static int write_transaction_table(struct reftable_writer *writer, void *cb_data
|
||||
* and log blocks.
|
||||
*/
|
||||
if (logs) {
|
||||
reftable_writer_set_limits(writer, ts, max_update_index);
|
||||
|
||||
ret = reftable_writer_add_logs(writer, logs, logs_nr);
|
||||
if (ret < 0)
|
||||
goto done;
|
||||
|
Reference in New Issue
Block a user