[PATCH 00/26] Clean up update-refs --stdin and implement ref_transaction
- From
Michael Haggerty <mhagger@alum.mit.edu>
- Date
- Mar 10, 2014, 12:46 UTC
- Message-ID
- <1394455603-2968-1-git-send-email-mhagger@alum.mit.edu>
I just sent an email to the list [1] describing how I want to decouple reference-handling code from the rest of Git, and implement pluggable reference storage backends. This patch series is the first movement in that direction.
update_refs() and "update-ref --stdin" implement the beginning of transactions for git references, by allowing a group of reference changes to be done in an all-or-nothing fashion. The main point of this patch series is to increase the abstraction level of the API for dealing with reference transactions, by moving the handling of the transaction to refs.c. The new API for dealing with reference transactions is
ref_transaction *transaction = create_ref_transaction();
queue_create_ref(transaction, refname, new_sha1, ...);
queue_update_ref(transaction, refname, new_sha1, old_sha1, ...);
queue_delete_ref(transaction, refname, old_sha1, ...);
...
if (commit_ref_transaction(transaction, msg, ...))
die(...);When implementing this I found a number of minor problems in the implementation of "git update-ref --stdin", not to mention that it used "struct ref_update" all the way up and down its parser call stack. So most of the commits in this series are actually cleanups in builtin/update-ref.c. I also spend some time making the error messages emitted by that command more uniform.
Then, in just a couple of commits, the ref_transaction abstraction is introduced, update-ref is changed to use it, and update_refs() is removed from the refs API (it was only used by this one caller).
Finally, now that refs.c owns the data structures for dealing with transactions, it is possible to make a few simplifications. More changes in this neighborhood will be coming in future patches.
[1] http://article.gmane.org/gmane.comp.version-control.git/243726
Michael Haggerty (26):
t1400: Fix name and expected result of one test
t1400: Provide sensible input to the command
t1400: Pass a legitimate <newvalue> to update command
parse_arg(): Really test that argument is properly terminated
t1400: Add some more tests involving quoted arguments
refs.h: Rename the action_on_err constants
update_refs(): Fix constness
update-ref --stdin: Read the whole input at once
parse_cmd_verify(): Copy old_sha1 instead of evaluating <oldvalue>
twice
update-ref.c: Extract a new function, parse_refname()
update-ref --stdin: Improve error messages for invalid values
update-ref --stdin: Make error messages more consistent
update-ref --stdin: Simplify error messages for missing oldvalues
update-ref.c: Extract a new function, parse_next_sha1()
update-ref --stdin: Improve the error message for unexpected EOF
update-ref --stdin: Harmonize error messages
refs: Add a concept of a reference transaction
update-ref --stdin: Reimplement using reference transactions
refs: Remove API function update_refs()
struct ref_update: Rename field "ref_name" to "refname"
struct ref_update: Store refname as a FLEX_ARRAY.
commit_ref_transaction(): Introduce temporary variables
struct ref_update: Add a lock member
struct ref_update: Add type field
commit_ref_transaction(): Also free the ref_transaction
commit_ref_transaction(): Work with transaction->updates in placebuiltin/checkout.c | 2 +- builtin/clone.c | 9 +- builtin/merge.c | 6 +- builtin/notes.c | 6 +- builtin/reset.c | 6 +- builtin/update-ref.c | 402 +++++++++++++++++++-------------- contrib/examples/builtin-fetch--tool.c | 3 +- notes-cache.c | 2 +- notes-utils.c | 3 +- refs.c | 184 +++++++++++---- refs.h | 93 ++++++-- t/t1400-update-ref.sh | 86 ++++--- 12 files changed, 524 insertions(+), 278 deletions(-)
-- 1.9.0