Message ID | 20231010123847.2777056-1-christian.couder@gmail.com (mailing list archive) |
---|---|
Headers | show |
Series | Introduce new `git replay` command | expand |
Hi Christian, On Tue, 10 Oct 2023, Christian Couder wrote: > 6: ec51351889 ! 6: 37d545d5d6 replay: don't simplify history > @@ Metadata > Author: Elijah Newren <newren@gmail.com> > > ## Commit message ## > - replay: don't simplify history > + replay: change rev walking options > > Let's set the rev walking options we need after calling > - setup_revisions() instead of before. This makes it clearer which options > - we need. > + setup_revisions() instead of before. This enforces options we always > + want. > + > + We want the command to work from older commits to newer ones by default, > + but we are Ok with letting users reverse that, using --reverse, if that's > + what they really want. > > Also we don't want history simplification, as we want to deal with all > the commits in the affected range. > > + Helped-by: Johannes Schindelin <Johannes.Schindelin@gmx.de> > Co-authored-by: Christian Couder <chriscool@tuxfamily.org> > Signed-off-by: Elijah Newren <newren@gmail.com> > Signed-off-by: Christian Couder <chriscool@tuxfamily.org> > @@ builtin/replay.c: int cmd_replay(int argc, const char **argv, const char *prefix > } > > + /* requirements/overrides for revs */ > -+ revs.reverse = 1; > ++ revs.reverse = !revs.reverse; > + revs.sort_order = REV_SORT_IN_GRAPH_ORDER; > + revs.topo_order = 1; > + revs.simplify_history = 0; This still overrides a couple of command-line options, _silently_. I would prefer those three assignments to be moved just before the `setup_revisions()` call. Letting users override these settings may not make much sense, but it makes even less sense to pretend to let them override the settings and then just ignore them without warning. (See also https://en.wikipedia.org/wiki/Principle_of_least_astonishment.) Moving these three assignments before the `setup_revisions()` call would neatly remedy that. > 7: cd4ed07d2d = 7: 2943f08926 replay: add an important FIXME comment about gpg signing > 8: e45a55917c = 8: f81962ba41 replay: remove progress and info output > 9: 0587a76cbb = 9: 236747497e replay: remove HEAD related sanity check > 10: d10368e87a = 10: 3374d5be23 replay: make it a minimal server side command > 11: 4e09572c43 ! 11: 197d076a93 replay: use standard revision ranges > @@ Commit message > way as many other Git commands. This makes its interface more > standard and more flexible. > > + This also enables many revision related options accepted and > + eaten by setup_revisions(). If the replay command was a high level > + one or had a high level mode, it would make sense to restrict some > + of the possible options, like those generating non-contiguous > + history, as they could be confusing for most users. > + > Also as the interface of the command is now mostly finalized, > we can add some documentation as well as testcases to make sure > the command will continue to work as designed in the future. > > + We only document the rev-list related options among all the > + revision related options that are now accepted, as the rev-list > + related ones are probably the most useful for now. > + > + Helped-by: Dragan Simic <dsimic@manjaro.org> > + Helped-by: Linus Arver <linusa@google.com> > Co-authored-by: Christian Couder <chriscool@tuxfamily.org> > Signed-off-by: Elijah Newren <newren@gmail.com> > Signed-off-by: Christian Couder <chriscool@tuxfamily.org> > @@ Documentation/git-replay.txt (new) > + > +NAME > +---- > -+git-replay - Replay commits on a different base, without touching working tree > ++git-replay - Replay commits on a new base, works on bare repos too > + > + > +SYNOPSIS As mentioned in https://lore.kernel.org/git/03460733-0219-c648-5757-db1958f8042e@gmx.de/, I would like the `EXPERIMENTAL` label to be shown prominently here. Probably not only the `SYNOPSIS` as I had originally suggested but also in the `NAME`. Otherwise we may end up with the same situation as with the (from my perspective, failed) `git switch`/`git restore` experiment, where we wanted to explore a better user experience than the overloaded `git checkout` command, only to now be stuck with having to maintain backward-compatibility for `git switch`/`git restore` command-line options that were not meant to be set in stone but to be iterated on, instead. A real-life demonstration of [Hyrum's Law](hyrumslaw.com/), if you like. Or, from a different angle, we re-enacted https://xkcd.com/927/ in a way. I'd like to suggest to learn from history and avoid this by tacking on a warning label right at the top of the documentation. We may eventually manage to iterate `git replay` to a point where it is totally capable to supersede `git rebase`, by doing everything the latter does, except better, who knows? But we _do_ need the liberty to make sweeping changes to this new builtin if we want to have a prayer of doing that. And I fear that not even mentioning the EXPERIMENTAL nature right at the top of the manual page would just render us into that undesirable corner. In addition, I am still a bit uneasy with introducing both the manual page and the test script in this commit (see my comments in https://lore.kernel.org/git/03460733-0219-c648-5757-db1958f8042e@gmx.de/). It would be better to uphold our high standard and introduce scaffolds for both files in the first commit, then populate the file contents incrementally in the same the patches that introduce the corresponding options/features/changes. The rest of the interdiff consists mostly of context changes intermixed with a couple of changes that I like. Ciao, Johannes
Hi, On Tue, Oct 10, 2023 at 5:39 AM Christian Couder <christian.couder@gmail.com> wrote: > * Patch 12/15 (replay: disallow revision specific options and > pathspecs) in version 4 has been removed, so there are now only 14 > patches instead of 15 in the series. This follows a suggestion by > Dscho, and goes in the direction Elijah initially wanted before > Derrick Stolee argued for disallowing revision specific options and > pathspecs. That's too strongly worded; and may be misleading. My primary goal in that discussion was that setup_revisions() should not be a disallowed API for future consumers such as git-replay. My secondary thought, at the time, was that although I agreed that setup_revisions() was a problematic API, I didn't think fixing it should be a prerequisite for new features to make use of it. However, your paragraph here could easily be read that I think the setup_revisions() API is fine. I don't. I actually think fixing the setup_revisions() API and preventing not only git-replay but many other commands from accepting non-sensical flags, as suggested by Stolee, is a very good idea. I even brought up the example $ git stash show --graph --relative-date --min-parents=3 --simplify-merges --cherry --show-pulls --unpacked -v -t -8 --format=oneline --abbrev=12 --pretty=fuller --show-notes --encode-email-headers --always --branches --indexed-objects stash@{0} in the thread[1] along with the comment "guess which flags are ignored and which aren't". That's garbage. This digging plus various things Stolee said actually convinced me that perhaps prioritizing fixing the setup_revisions() API over adding new consumers does make sense. But, I don't feel nearly as strong about it as Stolee on prioritization, so I'm not going to object too strongly with this patch being tossed for now. But I do want to note that I actually like Stolee's suggestion that we should fix that API and tighten what many commands accept. [1] https://lore.kernel.org/git/f5dd91a7-ba11-917a-39e2-2737829558cb@github.com/ > * In patch 2/14 (replay: introduce new builtin) the command is now in > the "plumbingmanipulators" category instead of the "mainporcelain" > category. This is more in line with the goal of introducing it as a > plumbing command for now. Thanks to a suggestion from Dscho. I do want to eventually make it a porcelain, but I think it's pretty far from that in its current state, so this is a good change. > * In patch 6/14 (replay: change rev walking options) the commit > message has been improved, including its subject, to better match > and explain what the patch does. This (and multiple other changes I elided) are good; thanks for pushing forward on this. > Also instead of forcing reverse > order we use the reverse order by default but allow it to be changed > using `--reverse`. Thanks to Dscho. I can see why this might sometimes be useful for exclusively linear history, but it seems to open a can of worms and possibly unfixable corner cases for non-linear history. I'd rather not do this, or at least pull it out of this series and let us discuss it in some follow up series. There are some other alternatives that might handle such usecases better. > 6: ec51351889 ! 6: 37d545d5d6 replay: don't simplify history ... > + We want the command to work from older commits to newer ones by default, > + but we are Ok with letting users reverse that, using --reverse, if that's > + what they really want. As noted above, _I_ am not ok with this yet. Given the patch prominently bears my name, the "we" here at a minimum is wrong. I would rather leave this change out for now and discuss it for a follow-on series. > @@ Documentation/git-replay.txt (new) > + > +NAME > +---- > -+git-replay - Replay commits on a different base, without touching working tree > ++git-replay - Replay commits on a new base, works on bare repos too really minor point: "works on" or "works in" or "works with" ?
Hi, On Thu, Oct 26, 2023 at 6:44 AM Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote: > > Hi Christian, > > On Tue, 10 Oct 2023, Christian Couder wrote: > [...] > > + /* requirements/overrides for revs */ > > -+ revs.reverse = 1; > > ++ revs.reverse = !revs.reverse; > > + revs.sort_order = REV_SORT_IN_GRAPH_ORDER; > > + revs.topo_order = 1; > > + revs.simplify_history = 0; > > This still overrides a couple of command-line options, _silently_. I would > prefer those three assignments to be moved just before the > `setup_revisions()` call. > > Letting users override these settings may not make much sense, but it > makes even less sense to pretend to let them override the settings and > then just ignore them without warning. (See also > https://en.wikipedia.org/wiki/Principle_of_least_astonishment.) > > Moving these three assignments before the `setup_revisions()` call would > neatly remedy that. I agree that warnings or error messages would be better. But if we're talking about something short of that, I'd actually argue the opposite of what you do here. I intentionally moved these assignments after setup_revisions(), and in my mind, the purpose in doing so was to satisfy the Principle of Least Astonishment. My experience with git-fast-export, where some settings are made before calling setup_revisions() and then can be overridden, and then do completely hideous things, was much worse to me than just admitting the flags are bad given the various assumptions the tool makes. I have some patches sitting around to fix fast-export that I never got around to upstreaming, but when it came time to implement git-replay, I made sure to fix what I viewed as the bigger problem. [...] > > @@ Documentation/git-replay.txt (new) > > + > > +NAME > > +---- > > -+git-replay - Replay commits on a different base, without touching working tree > > ++git-replay - Replay commits on a new base, works on bare repos too > > + > > + > > +SYNOPSIS > > As mentioned in > https://lore.kernel.org/git/03460733-0219-c648-5757-db1958f8042e@gmx.de/, > I would like the `EXPERIMENTAL` label to be shown prominently here. > Probably not only the `SYNOPSIS` as I had originally suggested but also in > the `NAME`. > > Otherwise we may end up with the same situation as with the (from my > perspective, failed) `git switch`/`git restore` experiment, where we > wanted to explore a better user experience than the overloaded `git > checkout` command, only to now be stuck with having to maintain > backward-compatibility for `git switch`/`git restore` command-line options > that were not meant to be set in stone but to be iterated on, instead. A > real-life demonstration of [Hyrum's Law](hyrumslaw.com/), if you like. Or, > from a different angle, we re-enacted https://xkcd.com/927/ in a way. > > I'd like to suggest to learn from history and avoid this by tacking on a > warning label right at the top of the documentation. We may eventually > manage to iterate `git replay` to a point where it is totally capable to > supersede `git rebase`, by doing everything the latter does, except > better, who knows? But we _do_ need the liberty to make sweeping changes > to this new builtin if we want to have a prayer of doing that. And I fear > that not even mentioning the EXPERIMENTAL nature right at the top of the > manual page would just render us into that undesirable corner. I fully support this. Absolutely, 100%. Thanks both, Elijah
Hi Elijah, On Sat, 28 Oct 2023, Elijah Newren wrote: > On Tue, Oct 10, 2023 at 5:39 AM Christian Couder > <christian.couder@gmail.com> wrote: > > * Patch 12/15 (replay: disallow revision specific options and > > pathspecs) in version 4 has been removed, so there are now only 14 > > patches instead of 15 in the series. This follows a suggestion by > > Dscho, and goes in the direction Elijah initially wanted before > > Derrick Stolee argued for disallowing revision specific options and > > pathspecs. > > [... snipping many parts that I agree with...] > > > Also instead of forcing reverse order we use the reverse order by > > default but allow it to be changed using `--reverse`. Thanks to > > Dscho. > > I can see why this might sometimes be useful for exclusively linear > history, but it seems to open a can of worms and possibly unfixable > corner cases for non-linear history. I'd rather not do this, or at > least pull it out of this series and let us discuss it in some follow > up series. There are some other alternatives that might handle such > usecases better. I find myself wishing for an easy way to reverse commits, if only to switch around the latest two commits while stopped during a rebase. So it would have been nice for me if there had been an easy, worktree-less way to make that happen. I guess this would be going in the direction of reordering commits, though, something we deliberately left for later? Ciao, Johannes
Hi Johannes, On Sun, Oct 29, 2023 at 7:14 AM Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote: > > Hi Elijah, > > On Sat, 28 Oct 2023, Elijah Newren wrote: > > > On Tue, Oct 10, 2023 at 5:39 AM Christian Couder > > <christian.couder@gmail.com> wrote: > > > * Patch 12/15 (replay: disallow revision specific options and > > > pathspecs) in version 4 has been removed, so there are now only 14 > > > patches instead of 15 in the series. This follows a suggestion by > > > Dscho, and goes in the direction Elijah initially wanted before > > > Derrick Stolee argued for disallowing revision specific options and > > > pathspecs. > > > > [... snipping many parts that I agree with...] > > > > > Also instead of forcing reverse order we use the reverse order by > > > default but allow it to be changed using `--reverse`. Thanks to > > > Dscho. > > > > I can see why this might sometimes be useful for exclusively linear > > history, but it seems to open a can of worms and possibly unfixable > > corner cases for non-linear history. I'd rather not do this, or at > > least pull it out of this series and let us discuss it in some follow > > up series. There are some other alternatives that might handle such > > usecases better. > > I find myself wishing for an easy way to reverse commits, if only to > switch around the latest two commits while stopped during a rebase. > > So it would have been nice for me if there had been an easy, worktree-less > way to make that happen. Seems reasonable; we'll definitely want to keep this in mind. > I guess this would be going in the direction of reordering commits, > though, something we deliberately left for later? Yes, I think that's a good framing for it. Thanks, Elijah
Hi Elijah and Dscho, On Mon, Oct 30, 2023 at 6:18 PM Elijah Newren <newren@gmail.com> wrote: > On Sun, Oct 29, 2023 at 7:14 AM Johannes Schindelin > <Johannes.Schindelin@gmx.de> wrote: > > On Sat, 28 Oct 2023, Elijah Newren wrote: > > > I can see why this might sometimes be useful for exclusively linear > > > history, but it seems to open a can of worms and possibly unfixable > > > corner cases for non-linear history. I'd rather not do this, or at > > > least pull it out of this series and let us discuss it in some follow > > > up series. There are some other alternatives that might handle such > > > usecases better. > > > > I find myself wishing for an easy way to reverse commits, if only to > > switch around the latest two commits while stopped during a rebase. > > > > So it would have been nice for me if there had been an easy, worktree-less > > way to make that happen. > > Seems reasonable; we'll definitely want to keep this in mind. > > > I guess this would be going in the direction of reordering commits, > > though, something we deliberately left for later? > > Yes, I think that's a good framing for it. Ok, in the v6 I just sent, a warning() is emitted when `--reverse` is passed and the option has no effect. I agree that handling such options in a better way should be left for later patch series. Thanks both!
On Sun, Oct 29, 2023 at 7:00 AM Elijah Newren <newren@gmail.com> wrote: > On Tue, Oct 10, 2023 at 5:39 AM Christian Couder > <christian.couder@gmail.com> wrote: > > @@ Documentation/git-replay.txt (new) > > + > > +NAME > > +---- > > -+git-replay - Replay commits on a different base, without touching working tree > > ++git-replay - Replay commits on a new base, works on bare repos too > > really minor point: "works on" or "works in" or "works with" ? I have changed it to "works with", I hope it sounds better. Also I forgot to talk about this change in the cover letter, sorry about that.
On Sun, Oct 29, 2023 at 7:02 AM Elijah Newren <newren@gmail.com> wrote: > On Thu, Oct 26, 2023 at 6:44 AM Johannes Schindelin > <Johannes.Schindelin@gmx.de> wrote: > > On Tue, 10 Oct 2023, Christian Couder wrote: > > > [...] > > > + /* requirements/overrides for revs */ > > > -+ revs.reverse = 1; > > > ++ revs.reverse = !revs.reverse; > > > + revs.sort_order = REV_SORT_IN_GRAPH_ORDER; > > > + revs.topo_order = 1; > > > + revs.simplify_history = 0; > > > > This still overrides a couple of command-line options, _silently_. I would > > prefer those three assignments to be moved just before the > > `setup_revisions()` call. > > > > Letting users override these settings may not make much sense, but it > > makes even less sense to pretend to let them override the settings and > > then just ignore them without warning. (See also > > https://en.wikipedia.org/wiki/Principle_of_least_astonishment.) > > > > Moving these three assignments before the `setup_revisions()` call would > > neatly remedy that. > > I agree that warnings or error messages would be better. Ok, a warning() is emitted now in case an command-line option will be overridden. > But if we're talking about something short of that, I'd actually argue > the opposite of what you do here. I intentionally moved these > assignments after setup_revisions(), and in my mind, the purpose in > doing so was to satisfy the Principle of Least Astonishment. My > experience with git-fast-export, where some settings are made before > calling setup_revisions() and then can be overridden, and then do > completely hideous things, was much worse to me than just admitting > the flags are bad given the various assumptions the tool makes. I > have some patches sitting around to fix fast-export that I never got > around to upstreaming, but when it came time to implement git-replay, > I made sure to fix what I viewed as the bigger problem. I hope you will be able to upstream such changes. > [...] > > > @@ Documentation/git-replay.txt (new) > > > + > > > +NAME > > > +---- > > > -+git-replay - Replay commits on a different base, without touching working tree > > > ++git-replay - Replay commits on a new base, works on bare repos too > > > + > > > + > > > +SYNOPSIS > > > > As mentioned in > > https://lore.kernel.org/git/03460733-0219-c648-5757-db1958f8042e@gmx.de/, > > I would like the `EXPERIMENTAL` label to be shown prominently here. > > Probably not only the `SYNOPSIS` as I had originally suggested but also in > > the `NAME`. Ok, I have made changes in the v6 I just sent, so that there is EXPERIMENTAL both in the NAME and SYNOPSIS. > > Otherwise we may end up with the same situation as with the (from my > > perspective, failed) `git switch`/`git restore` experiment, where we > > wanted to explore a better user experience than the overloaded `git > > checkout` command, only to now be stuck with having to maintain > > backward-compatibility for `git switch`/`git restore` command-line options > > that were not meant to be set in stone but to be iterated on, instead. A > > real-life demonstration of [Hyrum's Law](hyrumslaw.com/), if you like. Or, > > from a different angle, we re-enacted https://xkcd.com/927/ in a way. Nit: Hyrum's Law says: "With a sufficient number of users of an API, it does not matter what you promise in the contract: all observable behaviors of your system will be depended on by somebody." The doc is part of the contract, which according to this law doesn't matter. So I don't see why you use this law to suggest a doc change. > > I'd like to suggest to learn from history and avoid this by tacking on a > > warning label right at the top of the documentation. We may eventually > > manage to iterate `git replay` to a point where it is totally capable to > > supersede `git rebase`, by doing everything the latter does, except > > better, who knows? But we _do_ need the liberty to make sweeping changes > > to this new builtin if we want to have a prayer of doing that. And I fear > > that not even mentioning the EXPERIMENTAL nature right at the top of the > > manual page would just render us into that undesirable corner. > > I fully support this. Absolutely, 100%. Ok. Note that as I changed the SYNOPSIS, I also had to change the usage string, so that it matches the SYNOPSIS, otherwise a test would fail. So there is "EXPERIMENTAL" in the usage string too.
Hi Dscho and Elijah, On Thu, Oct 26, 2023 at 3:44 PM Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote: > In addition, I am still a bit uneasy with introducing both the manual page > and the test script in this commit (see my comments in > https://lore.kernel.org/git/03460733-0219-c648-5757-db1958f8042e@gmx.de/). > It would be better to uphold our high standard and introduce scaffolds for > both files in the first commit, then populate the file contents > incrementally in the same the patches that introduce the corresponding > options/features/changes. I have tried to improve on that in the v6 I just sent, but there are many patches implementing changes in behavior that I think weren't worth documenting and testing in `test-tool fast-rebase` (which had no doc and no test) and that aren't worth documenting and testing specifically in `git replay` either. Thanks!
Hi Christian, On Thu, 2 Nov 2023, Christian Couder wrote: > On Sun, Oct 29, 2023 at 7:02 AM Elijah Newren <newren@gmail.com> wrote: > > > On Thu, Oct 26, 2023 at 6:44 AM Johannes Schindelin > > <Johannes.Schindelin@gmx.de> wrote: > > > > > > As mentioned in > > > https://lore.kernel.org/git/03460733-0219-c648-5757-db1958f8042e@gmx.de/, > > > I would like the `EXPERIMENTAL` label to be shown prominently here. > > > Probably not only the `SYNOPSIS` as I had originally suggested but > > > also in the `NAME`. > > Ok, I have made changes in the v6 I just sent, so that there is > EXPERIMENTAL both in the NAME and SYNOPSIS. > > > > Otherwise we may end up with the same situation as with the (from my > > > perspective, failed) `git switch`/`git restore` experiment, where we > > > wanted to explore a better user experience than the overloaded `git > > > checkout` command, only to now be stuck with having to maintain > > > backward-compatibility for `git switch`/`git restore` command-line options > > > that were not meant to be set in stone but to be iterated on, instead. A > > > real-life demonstration of [Hyrum's Law](hyrumslaw.com/), if you like. Or, > > > from a different angle, we re-enacted https://xkcd.com/927/ in a way. > > Nit: Hyrum's Law says: > > "With a sufficient number of users of an API, > it does not matter what you promise in the contract: > all observable behaviors of your system > will be depended on by somebody." > > The doc is part of the contract, which according to this law doesn't > matter. So I don't see why you use this law to suggest a doc change. You're right. In addition to the documentation (where we definitely need to state the experimental nature of the command), we may want to consider adding the `EXPERIMENTAL` label not only to the output of `git replay -h`, but show also a warning for every `git replay` invocation cautioning users against depending on the current command-line options of this command. Ciao, Johannes
Hi Christian, On Thu, 2 Nov 2023, Christian Couder wrote: > On Thu, Oct 26, 2023 at 3:44 PM Johannes Schindelin > <Johannes.Schindelin@gmx.de> wrote: > > > In addition, I am still a bit uneasy with introducing both the manual page > > and the test script in this commit (see my comments in > > https://lore.kernel.org/git/03460733-0219-c648-5757-db1958f8042e@gmx.de/). > > It would be better to uphold our high standard and introduce scaffolds for > > both files in the first commit, then populate the file contents > > incrementally in the same the patches that introduce the corresponding > > options/features/changes. > > I have tried to improve on that in the v6 I just sent, but there are > many patches implementing changes in behavior that I think weren't > worth documenting and testing in `test-tool fast-rebase` (which had no > doc and no test) and that aren't worth documenting and testing > specifically in `git replay` either. Thank you for putting in the effort. I appreciate it very much. Ciao, Johannes