summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--refs/refs-internal.h7
-rw-r--r--refs/reftable-backend.c13
2 files changed, 18 insertions, 2 deletions
diff --git a/refs/refs-internal.h b/refs/refs-internal.h
index 0fd95cdacd..f5c733d099 100644
--- a/refs/refs-internal.h
+++ b/refs/refs-internal.h
@@ -116,6 +116,13 @@ struct ref_update {
char *committer_info;
/*
+ * The index overrides the default sort algorithm. This is needed
+ * when migrating reflogs and we want to ensure we carry over the
+ * same order.
+ */
+ unsigned int index;
+
+ /*
* If this ref_update was split off of a symref update via
* split_symref_update(), then this member points at that
* update. This is used for two purposes:
diff --git a/refs/reftable-backend.c b/refs/reftable-backend.c
index e882602487..c008f20be7 100644
--- a/refs/reftable-backend.c
+++ b/refs/reftable-backend.c
@@ -1279,8 +1279,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)