From: Junio C Hamano <gitster@pobox.com>
To: David Turner <dturner@twopensource.com>
Cc: Johannes Sixt <j6t@kdbg.org>, git@vger.kernel.org, mhagger@alum.mit.edu
Subject: Re: [PATCH v7 2/8] cherry-pick: treat CHERRY_PICK_HEAD and REVERT_HEAD as refs
Date: Thu, 09 Jul 2015 15:06:39 -0700 [thread overview]
Message-ID: <xmqqbnflugsw.fsf@gitster.dls.corp.google.com> (raw)
In-Reply-To: <1436478800.4542.61.camel@twopensource.com> (David Turner's message of "Thu, 09 Jul 2015 17:53:20 -0400")
David Turner <dturner@twopensource.com> writes:
> OK, here's my current best idea:
>
> 1. A "pseudoref" is an all-caps file in $GIT_DIR/ that always contains
> at least a SHA1. CHERRY_PICK_HEAD and REVERT_HEAD are examples. Because
> HEAD might be a symbolic ref, it is not a pseudoref.
>
> Refs backends do not manage pseudorefs. Instead, when a pseudoref (an
> all-caps ref containing no slashes) is requested (e.g. git rev-parse
> FETCH_HEAD) the generic refs code checks for the existence of that
> file and if it exists, returns immediately without hitting the backend.
> The generic code will refuse to allow updates to pseudorefs.
>
> 2. The pluggable refs backend manages all refs other than HEAD.
>
> 3. The "files" backend always manages HEAD. This allows for a reflog
> and for HEAD to be a symbolic ref.
>
> The major complication here is ref transactions -- what if there's a
> transaction that wants to update e.g. both HEAD and refs/heads/master?
An update to the current branch (e.g. "git commit") does involve at
least update to the reflog of HEAD, the current branch somewhere in
refs/heads/ and its log, so it is not "what if" but is a norm [*1*].
>
> It may be the case that this never happens; I have not actually audited
> the code to figure it out. If someone knows for sure that it does not
> happen, please say so. But assuming it does happen, here's my idea:
>
> If the refs backend is the files backend, we can simply treat HEAD like
> any other ref.
>
> If the refs backend is different, then the refs code needs to hold a
> files-backend transaction for HEAD, which it will commit immediately
> after the other transaction succeeds. We can stick a pointer to the
> extra transaction in the generic struct ref_transaction, which (as
> Michael Haggerty suggests) specific backends will extend.
>
> A failure to commit either transaction will be reported as a failure,
> and we'll give an additional inconsistent state warning if the main
> transaction succeeds but the HEAD transaction fails.
Yeah, I was thinking along those lines, too. Thanks for clearly
writing it down.
> What do other folks think?
Me too ;-)
[Footnote]
*1* But that is not a complaint; I do not have a better idea myself
either.
next prev parent reply other threads:[~2015-07-09 22:06 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-08 0:55 [PATCH v7 1/8] refs.c: add err arguments to reflog functions David Turner
2015-07-08 0:55 ` [PATCH v7 2/8] cherry-pick: treat CHERRY_PICK_HEAD and REVERT_HEAD as refs David Turner
2015-07-08 17:46 ` Johannes Sixt
2015-07-08 19:16 ` David Turner
2015-07-08 21:14 ` Johannes Sixt
2015-07-08 23:23 ` Junio C Hamano
2015-07-08 23:44 ` David Turner
2015-07-09 5:55 ` Junio C Hamano
2015-07-09 21:53 ` David Turner
2015-07-09 22:06 ` Junio C Hamano [this message]
2015-07-10 4:30 ` Michael Haggerty
2015-07-10 17:59 ` David Turner
2015-07-14 4:33 ` David Turner
2015-07-15 16:24 ` Junio C Hamano
2015-07-15 18:04 ` David Turner
2015-07-08 23:41 ` David Turner
2015-07-08 0:55 ` [PATCH v7 3/8] bisect: treat BISECT_HEAD as a ref David Turner
2015-07-08 0:55 ` [PATCH v7 4/8] refs: Break out check for reflog autocreation David Turner
2015-07-08 0:56 ` [PATCH v7 5/8] refs: new public ref function: safe_create_reflog David Turner
2015-07-08 11:49 ` Michael Haggerty
2015-07-08 0:56 ` [PATCH v7 6/8] git-reflog: add exists command David Turner
2015-07-08 0:56 ` [PATCH v7 7/8] update-ref and tag: add --create-reflog arg David Turner
2015-07-08 13:44 ` Michael Haggerty
2015-07-08 20:21 ` David Turner
2015-07-08 0:56 ` [PATCH v7 8/8] git-stash: use update-ref --create-reflog instead of creating files David Turner
2015-07-08 7:28 ` Junio C Hamano
2015-07-08 7:33 ` Junio C Hamano
2015-07-08 13:50 ` Michael Haggerty
2015-07-08 11:36 ` [PATCH v7 1/8] refs.c: add err arguments to reflog functions Michael Haggerty
2015-07-08 20:01 ` David Turner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqqbnflugsw.fsf@gitster.dls.corp.google.com \
--to=gitster@pobox.com \
--cc=dturner@twopensource.com \
--cc=git@vger.kernel.org \
--cc=j6t@kdbg.org \
--cc=mhagger@alum.mit.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.