Re: [PATCH v2] fast-export: fix surprising behavior with --first-parent
- From
Elijah Newren <newren@gmail.com>
- Date
- Dec 14, 2021, 00:31 UTC
- Message-ID
- <CABPp-BHwk25XK7qT4C8KELWXObc_W2DCXusPfLSMUuUKmeCUxw@mail.gmail.com>
- In-Reply-To
- <b87ec8f9-dd0d-c7b8-1c2a-edfd3d015930@unity3d.com>
On Mon, Dec 13, 2021 at 7:09 AM William Sprent <williams@unity3d.com> wrote:
Show 20 quoted lines
> > > However, given that it's unsafe to set revs.reverse=1 earlier, now > > that I think about it, isn't it also unsafe to set revs.topo_order > > where it is? Someone could override it by passing --date-order to > > fast-export. (It's okay if you want to leave fixing that to someone > > else, just thought I'd mention it while reviewing.) > > > > I couldn't tell you for sure if the topo_order placement is safe. I at > least don't see any place where topo_order itself can be toggled off in > revision.c. I'm sure there exists at least one rev-list argument which > will cause unexpected behaviour, though. > > I agree that it would be nice to have the traversal order options be > assigned in the same place. I guess we have three options: > > > 1. Put the reverse assignment to the top (together with topo_order), > allowing the user to disable it with --reverse, which will cause odd > behaviour.
I'd call it broken rather than merely odd; more on this below.
> 2. Put the reverse assignment to the top and throw an error if the > user passes the --reverse option.
Might be a reasonable longer term solution if someone wants to dive into all the non-sensical options and mark them as such. But I agree that it's slightly odd only picking one specific one when we know there's likely a pile of them here.
> 3. Keep the reverse assignment at the bottom, silently ignoring any > --reverse option.
"silently ignored" or "dismissed with prejudice"? :-)
Show 11 quoted lines
> I don't think any of the three options are particularly good. The first > one for obvious reasons. The second seems inconsistent to me as we would > only error on --reverse but not any of the other "nonsensical" rev-list > args. However, silently ignoring certain arguments does also not make > for a good user experience. > > I think that it might be a good idea to move up the 'reverse' assignment > and then add a paragraph to the man page for git-fast-export explaining > that some arguments, in particular the ones that change the ordering of > commits and the ones that change how commits are displayed (such as > --graph), may have no or unexpected effects.
I'd rather choose option #3, like builtin/add.c does with max_count. In part this is because...
Show 21 quoted lines
> I've tried writing a snippet in git-fast-export.txt, which I could include
> in the next version, if you think it seems like a reasonable approach:
>
> diff --git a/Documentation/git-fast-export.txt b/Documentation/git-fast-export.txt
> index 1978dbdc6a..34875ef01d 100644
> --- a/Documentation/git-fast-export.txt
> +++ b/Documentation/git-fast-export.txt
> @@ -157,16 +157,21 @@ by keeping the marks the same across runs.
> [<git-rev-list-args>...]::
> A list of arguments, acceptable to 'git rev-parse' and
> 'git rev-list', that specifies the specific objects and references
> to export. For example, `master~10..master` causes the
> current master reference to be exported along with all objects
> added since its 10th ancestor commit and (unless the
> --reference-excluded-parents option is specified) all files
> common to master{tilde}9 and master{tilde}10.
> ++
> +Arguments to `git rev-list` which change the _order_ in which commits are
> +traversed, such as '--reverse', as well as arguments which control how commits
> +are displayed, such as '--graph', may either have no effect or have an
> +unexpected effect on which commits are exported.After your patch, --reverse won't have an unexpected effect on _which_ commits are exported, it would instead have an unexpected effect on _how_ commits are exported (turning _every_ commit into a root commit). I'd rather just go with your option #3.
Show 22 quoted lines
> >> + > >> + git fast-export main -- --first-parent >first-parent-export && > >> + git fast-export main -- --first-parent --reverse >first-parent-reverse-export && > >> + > >> + git init import && > >> + git -C import fast-import <first-parent-export && > >> + > >> + git -C import rev-list --format="%ad%B" --topo-order --all --no-commit-header >actual && > > > > Same simplifications as above here: > > git -C import log --format="%ad %s" --topo-order --all >actual && > > > > However, is there a reason you're using "--all" instead of "main"? > > Although main is the only branch, which makes either output the same > > thing, it'd be easier for folks reading to catch the equivalence if it > > was clear you were now listing information about the same branch. > > > > I guess the intent is to be completely sure that only four commits were > exported, and no other refs made it into the new repository. I don't feel > too strongly about it, but I think it is a slightly stronger test than > leaving out the '--all'.
Fair enough, '--all' works for me with that explanation.