Re: [RFC] xl command for visualizing recent history
- From
- Phillip Wood <phillip.wood123@gmail.com>
- Date
- Oct 31, 2019, 20:04 UTC
- Message-ID
- <b0169b2b-0d8a-ee27-d0f4-6c7a6df55b5d@gmail.com>
- In-Reply-To
- <nycvar.QRO.7.76.6.1910310851300.46@tvgsbejvaqbjf.bet>
Hi
On 31/10/2019 08:26, Johannes Schindelin wrote:
Show 13 quoted lines
> Hi, > > On Wed, 30 Oct 2019, Emily Shaffer wrote: > >> On Mon, Oct 28, 2019 at 05:30:23PM -0700, Matthew DeVore wrote: >>> From: Matthew DeVore <matvore@gmail.com> >>> [...] > > In addition, I would think that the introduction of ephemeral refs > should deserve its own patch. Such ephemeral refs might come in handy > for more things than just `xl` (or whatever better name we find). > > The design of such ephemeral refs is thoroughly interesting, too.
I agree the ephemeral refs are interesting and could be really useful
> One very obvious question is whether you want these refs to be > worktree-specific or not. I would tend to answer "yes" to that question.
If we go for a per-terminal namespace as you suggest below I'm not sure if we want/need them to be per worktree as well. I don't have a clear idea how I'd want to use ephemeral refs if I changed worktree but kept working in the same terminal.
Show 6 quoted lines
> Further, another obvious question is what to do with those refs after a > while. They are _clearly_ intended to be ephemeral, i.e. they should > just vanish after a reasonably short time. Which raises the question: > what is "reasonably short" in this context? We would probably want to > come up with a good default and then offer a config setting to change > it.
Maybe keep them around for a couple of days? Even that might be longer than we need.
Show 11 quoted lines
> Another important aspect is the naming. The naming schema you chose > (`h/<counter>`) is short-and-sweet, and might very well be in use > already, for totally different purposes. It would be a really good idea > to open that schema to allow for avoiding clashes with already-existing > refs. > > A better alternative might be to choose a naming schema that cannot > clash with existing refs because it would not make for valid ref names. > I had a look at the ref name validation, and `^<counter>` might be a > better naming schema to begin with: `^1` is not a valid ref name, for > example.
That's an interesting idea, it's short and wont tread on anyone's toes.
Show 15 quoted lines
> Side note: why `h/`? I really tried to think about possible motivations > and came up empty. > > Another aspect that I think should be considered: why limit these > ephemeral refs to `git xl`? I cannot count how often I look through > some `git log <complicated-options> -- <sophisticated-magic-refspecs>` > to find a certain commit and then need to reference it. I usually move > my hand to move the mouse pointer and double click, then Shift-Insert > (which is awkward on this here keyboard because Insert is Fn+Delete, so > I cannot do that with one hand), and I usually wish for some better way. > > A better way might be to introduce an option for generating and > displaying such ephemeral refs, in my case it would be good to have a > config setting to do that automatically for every `git log` call that > uses the pager, i.e. is interactive.
Having them as a feature of the rev listing machinery rather than specific to a particular command sounds like a good way to go.
Show 5 quoted lines
> Finally, I could imagine that in this context, we would love to have > refs that are purely intended for interactive use, and therefore it > would make sense to try to bind them to the process ID of the process > calling `git`, i.e. the interactive shell. That way, when I have two > terminal windows, they would "own" their separate ephemeral refs.
I like that idea, though I think it should probably be based around getsid() rather than getppid() (I'm not sure how that translates to windows)
Best Wishes
Phillip
Show 37 quoted lines
>>> The test cases show non-trivial output which can be used to get an idea >>> for what the command is good for, though it doesn't capture the >>> coloring. >>> >>> The primary goals of this command are: >>> >>> a) deduce what the user wants to see based on what they haven't pushed >>> upstream yet >>> b) show the active branches spatially rather than as a linear list (as >>> in "git branch") >>> c) allow the user to easily refer to commits that appeared in the >>> output >>> >>> I considered making the h/# tags stable across invocations such that a >>> particular hash will only be tagged with a different number if ~100 >>> other hashes are tagged since the hash was last tagged. I didn't >>> actually implement it this way, instead opting for always re-numbering >>> the hashes on each invocation. This means the hash number is >>> predictable based on the position the hash appears in the output, which >>> is probably better that encouraging users to memorize hash numbers (or >>> use them in scripts!). >> >> If you're worried about folks using something like this in a script (and >> I would be, given that it's dynamically assigning nicknames to hashes) >> then you probably ought to mark it as a porcelain command in >> command-list.txt. > > I would like to caution against targeting scripts with this. It is too > easy for two concurrently running scripts to stumble over each other. > > Scripts should use safer methods that already exist, like grabbing the > hash while looking for a specific pattern (`sed`'s hold space comes to > mind). > > Ciao, > Dscho >