I propose this patch series as an alternative to Ronnie's "reflog
transactions" series.
Both alternatives have been discussed exhaustively on the list [1,2].
My opinion is that there is no need to allow arbitrary reflog changes
via the ref_transaction API, because just about the only things we
want to do are
* Append an entry to a reflog when a reference is updated. This should
(and is already) done as a side effect of the reference update.
* Expire or delete old reflog entries based on relatively complicated
logic, possibly repairing the remaining entries so as to preserve
the continuity of the reflog chain.
This patch series shows that the latter can be done with a single,
fairly simple, purpose-made function, expire_reflog(), in the
references API. The policy for what reflog entries should be expired
is specified by the caller via three callback functions that don't
have to know anything about how reflogs are stored. The locking,
iteration, repair, and writing is implemented within the references
module, in a function that can easily be swapped out when pluggable
reference backends are implemented.
The remaining reflog operations (enabling/disabling reflogs for a
reference, renaming the reflog when a reference is renamed) are not
especially difficult but will be brought into the same framework in a
future patch series.
The first few patches and the last few are taken from Ronnie's and
Stefan's work. I chose *not* to rename the ref_transaction functions
for obvious reasons. A couple of the later patches from their series
would make sense but are not duplicated here.
This branch is also available on GitHub:
https://github.com/mhagger/git.git, branch reflog-expire-api-v1
Michael
[1] http://thread.gmane.org/gmane.comp.version-control.git/259712/focus=259770
[2] http://thread.gmane.org/gmane.comp.version-control.git/260731/focus=260767
Michael Haggerty (17):
expire_reflog(): remove unused parameter
expire_reflog(): rename "ref" parameter to "refname"
expire_reflog(): exit early if the reference has no reflog
expire_reflog(): use a lock_file for rewriting the reflog file
Extract function should_expire_reflog_ent()
expire_reflog(): extract two policy-related functions
expire_reflog(): add a "flags" argument
expire_reflog(): move dry_run to flags argument
expire_reflog(): move updateref to flags argument
Rename expire_reflog_cb to expire_reflog_policy_cb
struct expire_reflog_cb: a new callback data type
expire_reflog(): pass flags through to expire_reflog_ent()
expire_reflog(): move verbose to flags argument
expire_reflog(): move rewrite to flags argument
Move newlog and last_kept_sha1 to "struct expire_reflog_cb"
expire_reflog(): treat the policy callback data as opaque
reflog_expire(): new function in the reference API
Ronnie Sahlberg (5):
refs.c: make ref_transaction_create a wrapper for
ref_transaction_update
refs.c: make ref_transaction_delete a wrapper for
ref_transaction_update
refs.c: add a function to append a reflog entry to a fd
refs.c: remove unlock_ref/close_ref/commit_ref from the refs api
lock_any_ref_for_update(): inline function
Stefan Beller (1):
refs.c: don't expose the internal struct ref_lock in the header file
builtin/reflog.c | 259 ++++++++++++++++++++++---------------------------------
refs.c | 251 +++++++++++++++++++++++++++++++++++------------------
refs.h | 74 ++++++++++------
3 files changed, 319 insertions(+), 265 deletions(-)
--
2.1.3
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html