Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: [PATCH v3] Add code to Mercurial VCS backend to show topic if there is any.
Manuel Jacob wrote on Sun, 21 Jun 2020 13:17 +0200:
> On 2020-06-20 12:43, Daniel Shahaf wrote:
> > Manuel Jacob wrote on Sat, 20 Jun 2020 01:31 +0200:
> >> "Topics" is an experimental concept in Mercurial that augments the
> >> current branching concept (called "named branches").
> >>
> >> For more information, see the not always up-to-date Mercurial Wiki
> >> page
> >> https://www.mercurial-scm.org/wiki/TopicPlan.
> >> ---
> >> Functions/VCS_Info/Backends/VCS_INFO_get_data_hg | 10 +++++++++-
> >> 1 file changed, 9 insertions(+), 1 deletion(-)
> >>
> >> diff --git a/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg
> >> b/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg
> >> index cd5ef321d..deeb331a0 100644
> >> --- a/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg
> >> +++ b/Functions/VCS_Info/Backends/VCS_INFO_get_data_hg
> >> @@ -5,7 +5,7 @@
> >>
> >> setopt localoptions extendedglob NO_shwordsplit
> >>
> >> -local hgbase bmfile branchfile rebasefile dirstatefile mqseriesfile \
> >> +local hgbase bmfile branchfile topicfile rebasefile dirstatefile
> >> mqseriesfile \
> >> curbmfile curbm \
> >> mqstatusfile mqguardsfile patchdir mergedir \
> >> r_csetid r_lrev r_branch i_bmhash i_bmname \
> >> @@ -27,6 +27,7 @@ mergedir="${hgbase}/.hg/merge/"
> >> bmfile="${hgbase}/.hg/bookmarks"
> >> curbmfile="${hgbase}/.hg/bookmarks.current"
> >> branchfile="${hgbase}/.hg/branch"
> >> +topicfile="${hgbase}/.hg/topic"
> >> rebasefile="${hgbase}/.hg/rebasestate"
> >> dirstatefile="${hgbase}/.hg/dirstate"
> >> mqstatusfile="${patchdir}/status" # currently applied patches
> >> @@ -69,6 +70,13 @@ fi
> >> # If we still don't know the branch it's safe to assume default
> >> [[ -n ${r_branch} ]] || r_branch="default"
> >>
> >> +# Show topic if there is any (the UI for this experimental concept is
> >> not yet
> >> +# final, but for a long time the convention has been to join the
> >> branch name
> >> +# and the topic name by a colon)
> >> +if [[ -f ${topicfile} && -r ${topicfile} && -s ${topicfile} ]] ; then
> >> + r_branch=${r_branch}:$(head -n 1 ${topicfile})
> >> +fi
> >
> > I'm happy to read the file directly, despite experimentality, given the
> > discussion elsethread that you'll propose a corresponding unit test to
> > the upstream maintainers.
> >
> > Using $(head) forks, and we try to avoid forks because they're
> > expensive
> > on some platforms. In this case, you could use «IFS= read -r REPLY
> > <$topicfile» instead. (The construct «$(<foo)», just above the hunk
> > context, is special-cased to not fork.)
>
> Is there anything special about `REPLY`? It seems to be a convention.
> Could I also use e.g. TOPIC?
Yes, $REPLY is merely a convention (see zshparam(1)). You could use
$topic (lowercase) instead; $TOPIC (uppercase) would not be idiomatic.
> > As written, existing set-branch-format hooks would see the
> > ${hook_com[branch]}
> > input argument set to strings such as "default:mytopic". Would this
> > behaviour be expected, or would people rather expect
> > ${hook_com[branch]}
> > to be set to strings such as "default" even when .hg/topic exists, and
> > to have a new ${hook_com[foo]} key whose value would be "mytopic" (or
> > possibly "default:mytopic")? This would affect the API to hooks but
> > would not affect the final output.
>
> If the topic extension is enabled, the meaning of places using branch
> names is changed.
> When determining how many heads a branch has (e.g. when warning that
> another head will be created), each "branch:topic" (or simply "branch"
> if there’s no topic) is considered separately.
> When specifying a revision, "branch:topic" refers to the head of the
> branch with branch name "branch" and topic name "topic", while "branch"
> refers to the headmost revision with branch name "branch" but no topic.
>
> An example:
>
> B C
> |/
> A
>
> Assume that all three changesets have the "branch" field set to
> "develop". B has topic "feature1" and C has topic "feature2".
>
> * "develop" refers to A
> * "develop:feature1" refers to B
> * "develop:feature2" refers to C
>
> If the user updated to B, but the prompt shows "develop" (this is
> currently the case), it would be misleading. I don’t know all
> possibilities in which the hooks use `${hook_com[branch]}`, but I’d
> expect that including the topic would be correct in more cases than not
> including it.
>
Thanks for the walkthrough. Agreed. Might want to state on
Doc/Zsh/contrib.yo:1331 that in the hg backend the topic is included,
then.
> > Similarly, as written, the %b expando in "formats", "actionformats",
> > and
> > "branchformat" will always be replaced with a string such as
> > "default:mytopic". If someone wants to change the format,¹ they won't
> > be able to achieve that using zstyle settings alone; they'd have to
> > write an appropriate vcs_info hook in their zshrc. What do you think
> > of, say, making the topic name available as a separate expando in
> > branchformat? Again, this would not affect the default output, but
> > make
> > customizations easier to implement.
> >
> > ¹ Use-cases for changing the format include: colouring "default" and
> > "mytopic" differently (compare «zstyle '*' branchformat '%B%b%%b
> > %U%r%u'»
> > when the get-revision style is set); changing the colon to a space for
> > readability or copypasteability; and perhaps even eliding the topic
> > name entirely(?).
>
> For the reasons stated above, the topic name should be included. The
> colon should also stay because the combined "branch:topic" can be passed
> as a revision identifier to various places. Coloring branch and topic
> differently wouldn’t be "wrong", but since the "branch:topic" mostly
> makes sense together, personally I’d like to have it in the same
> appearance.
I see: if "branch:topic" mostly appears as an atomic unit, it makes
sense that most people will want to color it atomically.
>
That's all, I think. I don't foresee any blocks to merging v4 when you
post it.
Cheers,
Daniel
Messages sorted by:
Reverse Date,
Date,
Thread,
Author