While thinking about some how some server-side branch management
services might work, I came across a need to update multiple refs
locked with verified old values simultaneously. For example, to
transfer ownership of some commits by rewinding a branch and creating
a new branch at the original head, one must lock both refs.
Otherwise, depending on the order of updates another process could
create the new branch after we've rewound the original, or add commits
to the original after we've created the new branch.
This series teaches update-ref a new --stdin option to read update and
delete instructions from lines of standard input, lock all refs up
front with verified old values, and then perform the modifications.
This is still work in progress, but it is ready for comments and
feedback. The series is based on master as of v1.8.4.
Notable unfinished work:
* I propose a format for stdin lines in the last commit of the series
as a proof-of-concept but I invite suggestions of better formats.
The format must be able to specify updates and deletes with optional
old values and optional no-deref.
* No tests for new features, though existing tests pass for me.
* No check for duplicate refs in input. Currently a duplicate ref
will result in a failure message like:
fatal: Unable to create '....lock': File exists.
If no other git process is currently running, this probably means a
git process crashed in this repository earlier. Make sure no other git
process is running and remove the file manually to continue.
Instead we should reject duplicate ref names up front. I would
appreciate suggestions about an efficient data structure already
available in Git to perform this lookup.
I welcome feedback on the approach, interface, and implementation.
Brad King (7):
reset: rename update_refs to reset_refs
refs: report ref type from lock_any_ref_for_update
refs: factor update_ref steps into helpers
refs: factor delete_ref loose ref step into a helper
refs: add function to repack without multiple refs
refs: add update_refs for multiple simultaneous updates
update-ref: support multiple simultaneous updates
Documentation/git-update-ref.txt | 19 ++++-
branch.c | 2 +-
builtin/commit.c | 2 +-
builtin/fetch.c | 2 +-
builtin/receive-pack.c | 2 +-
builtin/reflog.c | 2 +-
builtin/replace.c | 2 +-
builtin/reset.c | 4 +-
builtin/tag.c | 2 +-
builtin/update-ref.c | 93 ++++++++++++++++++++++-
fast-import.c | 2 +-
refs.c | 150 ++++++++++++++++++++++++++++++++------
refs.h | 13 +++-
sequencer.c | 2 +-
14 files changed, 262 insertions(+), 35 deletions(-)
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html