All of lore.kernel.org
 help / color / mirror / Atom feed
From: Derrick Stolee <derrickstolee@github.com>
To: Elijah Newren <newren@gmail.com>,
	Derrick Stolee via GitGitGadget <gitgitgadget@gmail.com>
Cc: Git Mailing List <git@vger.kernel.org>,
	Junio C Hamano <gitster@pobox.com>,
	Johannes Schindelin <johannes.schindelin@gmx.de>,
	Taylor Blau <me@ttaylorr.com>,
	Jeff Hostetler <git@jeffhostetler.com>,
	Phillip Wood <phillip.wood123@gmail.com>
Subject: Re: [PATCH v3 7/8] rebase: update refs from 'update-ref' commands
Date: Mon, 4 Jul 2022 07:05:03 -0600	[thread overview]
Message-ID: <5002269d-5cab-3ba4-b99e-dca0c3615118@github.com> (raw)
In-Reply-To: <CABPp-BG++8LAwyH6P-QDj5Lu6-cevOBOjpdY7QsSdwiT0w9URA@mail.gmail.com>

On 7/1/22 5:18 PM, Elijah Newren wrote:
> On Tue, Jun 28, 2022 at 6:26 AM Derrick Stolee via GitGitGadget

>> Not only do we update the file when the sequencer reaches these
>> 'update-ref' commands, we then update the refs themselves at the end of
>> the rebase sequence. If the rebase is aborted before this final step,
>> then the refs are not updated.
> 
> Why update with each update-ref command?  Couldn't the values be
> stored in memory and only written when we hit a conflict?

I think that is a natural way to optimize the feature. I didn't
look into that option as it seemed more error-prone to me. I'd
be happy to be wrong here if an easy tweak makes this possible.

>> -static int do_update_ref(struct repository *r, const char *ref_name)
>> +static int write_update_refs_state(struct string_list *refs_to_oids)
>> +{
>> +       int result = 0;
>> +       FILE *fp = NULL;
>> +       struct string_list_item *item;
>> +       char *path = xstrdup(rebase_path_update_refs());
>> +
>> +       if (safe_create_leading_directories(path)) {
>> +               result = error(_("unable to create leading directories of %s"),
>> +                              path);
>> +               goto cleanup;
>> +       }
>> +
>> +       fp = fopen(path, "w");
>> +       if (!fp) {
>> +               result = error_errno(_("could not open '%s' for writing"), path);
>> +               goto cleanup;
>> +       }
>> +
>> +       for_each_string_list_item(item, refs_to_oids)
>> +               fprintf(fp, "%s\n%s\n", item->string, oid_to_hex(item->util));
> 
> Here you are storing the ref and the new oid to move it to.  Any
> reason you don't store the previous oid for the branch?  In
> particular, if someone hits a conflict, needs to resolve, and comes
> back some time much later and these intermediate branches have since
> moved on, should we actually update those branches?  (And, if we do,
> should we at least give a warning?)

The branches don't move forward because other Git processes respect
the update-refs file (this does not take into account third-party
tools that don't know about that file, but we need to start somewhere).

You're right that storing the old value would help us in this case
where another tool updated the ref while we were in the middle of the
rebase. The storage of the null OID is only to prevent writing over a
ref when the user has removed the 'update-ref <ref>' command from the
todo-list. It's probably better to remove the ref from the list when
that happens.

>> +       if (!found) {
>> +               struct object_id oid;
>> +               item = string_list_append(&list, refname);
>> +
>> +               if (!read_ref("HEAD", &oid))
>> +                       item->util = oiddup(&oid);
>> +               else
>> +                       item->util = oiddup(the_hash_algo->null_oid);
> 
> Seems a little unfortunate to not use a cached value from the latest
> commit we picked (and wrote to HEAD) and instead need to re-read HEAD.
> But, I guess sequencer is written to round-trip through files, so
> maybe optimizing this here doesn't make sense given all the other
> places in sequencer where we do lots of file reading and writing.

It's also possible to optimize several things, but I tried to
minimize the amount of change to the existing methods. This is
my first foray into this part of the code, so I don't always know
which information is readily available. I appreciate your attention
here.

Thanks,
-Stolee

  reply	other threads:[~2022-07-04 13:05 UTC|newest]

Thread overview: 144+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-06-03 13:37 [PATCH 0/4] rebase: update branches in multi-part topic Derrick Stolee via GitGitGadget
2022-06-03 13:37 ` [PATCH 1/4] log-tree: create for_each_decoration() Derrick Stolee via GitGitGadget
2022-06-03 17:39   ` Junio C Hamano
2022-06-03 17:58     ` Derrick Stolee
2022-06-03 18:40       ` Junio C Hamano
2022-06-03 13:37 ` [PATCH 2/4] branch: add branch_checked_out() helper Derrick Stolee via GitGitGadget
2022-06-03 18:31   ` Junio C Hamano
2022-06-03 13:37 ` [PATCH 3/4] rebase: add --update-refs option Derrick Stolee via GitGitGadget
2022-06-07 10:25   ` Phillip Wood
2022-06-03 13:37 ` [PATCH 4/4] rebase: add rebase.updateRefs config option Derrick Stolee via GitGitGadget
2022-06-03 16:56 ` [PATCH 0/4] rebase: update branches in multi-part topic Junio C Hamano
2022-06-03 18:27 ` Taylor Blau
2022-06-03 18:52   ` Junio C Hamano
2022-06-03 19:59   ` Jeff Hostetler
2022-06-03 20:03     ` Taylor Blau
2022-06-03 21:23     ` Junio C Hamano
2022-06-04 15:28   ` Phillip Wood
2022-06-06 15:12     ` Derrick Stolee
2022-06-07 10:11       ` Phillip Wood
2022-06-07 19:39         ` Derrick Stolee
2022-06-08 16:03           ` Junio C Hamano
2022-06-06 16:36     ` Junio C Hamano
2022-06-07  6:25 ` Elijah Newren
2022-06-07 20:42 ` [PATCH v2 0/7] " Derrick Stolee via GitGitGadget
2022-06-07 20:42   ` [PATCH v2 1/7] log-tree: create for_each_decoration() Derrick Stolee via GitGitGadget
2022-06-07 20:42   ` [PATCH v2 2/7] branch: add branch_checked_out() helper Derrick Stolee via GitGitGadget
2022-06-07 22:09     ` Junio C Hamano
2022-06-08  2:14       ` Derrick Stolee
2022-06-08  2:43         ` Derrick Stolee
2022-06-08  4:52           ` Junio C Hamano
2022-06-07 20:42   ` [PATCH v2 3/7] sequencer: define array with enum values Derrick Stolee via GitGitGadget
2022-06-07 22:11     ` Junio C Hamano
2022-06-07 20:42   ` [PATCH v2 4/7] sequencer: add update-refs command Derrick Stolee via GitGitGadget
2022-06-07 20:42   ` [PATCH v2 5/7] rebase: add --update-refs option Derrick Stolee via GitGitGadget
2022-06-07 20:42   ` [PATCH v2 6/7] sequencer: implement 'update-refs' command Derrick Stolee via GitGitGadget
2022-06-07 22:23     ` Junio C Hamano
2022-06-07 20:42   ` [PATCH v2 7/7] rebase: add rebase.updateRefs config option Derrick Stolee via GitGitGadget
2022-06-08 14:32   ` [PATCH v2 0/7] rebase: update branches in multi-part topic Phillip Wood
2022-06-08 18:09     ` Derrick Stolee
2022-06-09 10:04       ` Phillip Wood
2022-06-28 13:25   ` [PATCH v3 0/8] " Derrick Stolee via GitGitGadget
2022-06-28 13:25     ` [PATCH v3 1/8] t2407: test branches currently using apply backend Derrick Stolee via GitGitGadget
2022-06-28 20:44       ` Junio C Hamano
2022-06-29 12:54         ` Derrick Stolee
2022-06-30 16:44           ` Junio C Hamano
2022-06-30 17:35             ` Derrick Stolee
2022-06-28 13:25     ` [PATCH v3 2/8] branch: consider refs under 'update-refs' Derrick Stolee via GitGitGadget
2022-06-28 20:48       ` Junio C Hamano
2022-06-29 12:58         ` Derrick Stolee
2022-06-30  9:47           ` Phillip Wood
2022-06-30 16:50             ` Junio C Hamano
2022-06-30 16:49           ` Junio C Hamano
2022-06-30  9:32       ` Phillip Wood
2022-06-30 13:35         ` Derrick Stolee
2022-07-01 13:40           ` Phillip Wood
2022-06-28 13:25     ` [PATCH v3 3/8] rebase-interactive: update 'merge' description Derrick Stolee via GitGitGadget
2022-06-28 21:00       ` Junio C Hamano
2022-06-29 13:02         ` Derrick Stolee
2022-06-30 17:05           ` Junio C Hamano
2022-06-30  9:34       ` Phillip Wood
2022-06-28 13:25     ` [PATCH v3 4/8] sequencer: define array with enum values Derrick Stolee via GitGitGadget
2022-06-28 21:02       ` Junio C Hamano
2022-06-28 13:25     ` [PATCH v3 5/8] sequencer: add update-ref command Derrick Stolee via GitGitGadget
2022-06-30  9:39       ` Phillip Wood
2022-06-28 13:25     ` [PATCH v3 6/8] rebase: add --update-refs option Derrick Stolee via GitGitGadget
2022-06-28 21:09       ` Junio C Hamano
2022-06-29 13:03         ` Derrick Stolee
2022-07-01  9:20       ` Phillip Wood
2022-07-01 21:20       ` Elijah Newren
2022-07-04 12:56         ` Derrick Stolee
2022-07-04 17:57           ` Elijah Newren
2022-07-05 22:22             ` Derrick Stolee
2022-07-08  2:27               ` Elijah Newren
2022-06-28 13:25     ` [PATCH v3 7/8] rebase: update refs from 'update-ref' commands Derrick Stolee via GitGitGadget
2022-06-28 21:15       ` Junio C Hamano
2022-06-29 13:05         ` Derrick Stolee
2022-06-30 17:09           ` Junio C Hamano
2022-06-29 13:06       ` Derrick Stolee
2022-07-01  9:31       ` Phillip Wood
2022-07-01 18:35         ` Junio C Hamano
2022-07-01 23:18       ` Elijah Newren
2022-07-04 13:05         ` Derrick Stolee [this message]
2022-06-28 13:25     ` [PATCH v3 8/8] rebase: add rebase.updateRefs config option Derrick Stolee via GitGitGadget
2022-06-28 21:19     ` [PATCH v3 0/8] rebase: update branches in multi-part topic Junio C Hamano
2022-07-01 13:43     ` Phillip Wood
2022-07-12 13:06     ` [PATCH v4 00/12] " Derrick Stolee via GitGitGadget
2022-07-12 13:06       ` [PATCH v4 01/12] t2407: test bisect and rebase as black-boxes Derrick Stolee via GitGitGadget
2022-07-12 13:06       ` [PATCH v4 02/12] t2407: test branches currently using apply backend Derrick Stolee via GitGitGadget
2022-07-12 13:06       ` [PATCH v4 03/12] branch: consider refs under 'update-refs' Derrick Stolee via GitGitGadget
2022-07-15 15:37         ` Phillip Wood
2022-07-12 13:06       ` [PATCH v4 04/12] rebase-interactive: update 'merge' description Derrick Stolee via GitGitGadget
2022-07-12 13:06       ` [PATCH v4 05/12] sequencer: define array with enum values Derrick Stolee via GitGitGadget
2022-07-12 13:06       ` [PATCH v4 06/12] sequencer: add update-ref command Derrick Stolee via GitGitGadget
2022-07-12 13:07       ` [PATCH v4 07/12] rebase: add --update-refs option Derrick Stolee via GitGitGadget
2022-07-16 19:30         ` Elijah Newren
2022-07-19 15:50           ` Derrick Stolee
2022-07-18  9:05         ` SZEDER Gábor
2022-07-18 16:55           ` Derrick Stolee
2022-07-18 19:35             ` Junio C Hamano
2022-07-19 15:53               ` Derrick Stolee
2022-07-19 16:44                 ` Junio C Hamano
2022-07-19 16:47                   ` Derrick Stolee
2022-07-12 13:07       ` [PATCH v4 08/12] rebase: update refs from 'update-ref' commands Derrick Stolee via GitGitGadget
2022-07-15 13:25         ` Phillip Wood
2022-07-19 16:04           ` Derrick Stolee
2022-07-12 13:07       ` [PATCH v4 09/12] sequencer: rewrite update-refs as user edits todo list Derrick Stolee via GitGitGadget
2022-07-15 10:27         ` Phillip Wood
2022-07-15 13:13           ` Derrick Stolee
2022-07-18 13:09             ` Phillip Wood
2022-07-16 19:20         ` Elijah Newren
2022-07-12 13:07       ` [PATCH v4 10/12] rebase: add rebase.updateRefs config option Derrick Stolee via GitGitGadget
2022-07-12 13:07       ` [PATCH v4 11/12] sequencer: ignore HEAD ref under --update-refs Derrick Stolee via GitGitGadget
2022-07-12 13:07       ` [PATCH v4 12/12] sequencer: notify user of --update-refs activity Derrick Stolee via GitGitGadget
2022-07-15 10:12         ` Phillip Wood
2022-07-15 13:20           ` Derrick Stolee
2022-07-16 20:51             ` Elijah Newren
2022-07-16 22:09         ` Elijah Newren
2022-07-19 16:09           ` Derrick Stolee
2022-07-12 15:37       ` [PATCH v4 00/12] rebase: update branches in multi-part topic Junio C Hamano
2022-07-14 14:50         ` Derrick Stolee
2022-07-14 18:11           ` Junio C Hamano
2022-07-16 21:23             ` Elijah Newren
2022-07-16 20:56           ` Elijah Newren
2022-07-15 15:41       ` Phillip Wood
2022-07-19 18:33       ` [PATCH v5 " Derrick Stolee via GitGitGadget
2022-07-19 18:33         ` [PATCH v5 01/12] t2407: test bisect and rebase as black-boxes Derrick Stolee via GitGitGadget
2022-07-19 18:33         ` [PATCH v5 02/12] t2407: test branches currently using apply backend Derrick Stolee via GitGitGadget
2022-07-19 18:33         ` [PATCH v5 03/12] branch: consider refs under 'update-refs' Derrick Stolee via GitGitGadget
2022-07-19 18:33         ` [PATCH v5 04/12] rebase-interactive: update 'merge' description Derrick Stolee via GitGitGadget
2022-07-19 18:33         ` [PATCH v5 05/12] sequencer: define array with enum values Derrick Stolee via GitGitGadget
2022-07-19 18:33         ` [PATCH v5 06/12] sequencer: add update-ref command Derrick Stolee via GitGitGadget
2022-07-19 18:33         ` [PATCH v5 07/12] rebase: add --update-refs option Derrick Stolee via GitGitGadget
2022-07-19 18:33         ` [PATCH v5 08/12] rebase: update refs from 'update-ref' commands Derrick Stolee via GitGitGadget
2022-07-21 14:03           ` Phillip Wood
2022-07-19 18:33         ` [PATCH v5 09/12] sequencer: rewrite update-refs as user edits todo list Derrick Stolee via GitGitGadget
2022-07-21 14:04           ` Phillip Wood
2022-07-19 18:33         ` [PATCH v5 10/12] rebase: add rebase.updateRefs config option Derrick Stolee via GitGitGadget
2022-07-19 18:33         ` [PATCH v5 11/12] sequencer: ignore HEAD ref under --update-refs Derrick Stolee via GitGitGadget
2022-07-19 18:33         ` [PATCH v5 12/12] sequencer: notify user of --update-refs activity Derrick Stolee via GitGitGadget
2022-07-21  4:35         ` [PATCH v5 00/12] rebase: update branches in multi-part topic Elijah Newren
2022-07-21 12:12           ` Derrick Stolee
2022-07-21 19:43             ` Elijah Newren
2022-07-21 20:05               ` Derrick Stolee
2022-07-21 14:04         ` Phillip Wood

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=5002269d-5cab-3ba4-b99e-dca0c3615118@github.com \
    --to=derrickstolee@github.com \
    --cc=git@jeffhostetler.com \
    --cc=git@vger.kernel.org \
    --cc=gitgitgadget@gmail.com \
    --cc=gitster@pobox.com \
    --cc=johannes.schindelin@gmx.de \
    --cc=me@ttaylorr.com \
    --cc=newren@gmail.com \
    --cc=phillip.wood123@gmail.com \
    /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.