RFC: dealing with dead, anonymous feature branches

Gilles Moris gilles.moris at free.fr
Sun May 9 11:33:49 CDT 2010


On Saturday 08 May 2010 10:10:33 pm Martin Geisler wrote:
> Gilles Moris <gilles.moris at free.fr> writes:
> > On Saturday 08 May 2010 10:32:04 am Martin Geisler wrote:
> >> > I am more concerned the close-branch behavior itself. May be I am
> >> > stupid, but I have hard time to understand the logic behind the
> >> > current implementation. [...]
> >>
> >> No, I agree with you and your requirements. They sound like the way I
> >> have also imagined closed heads to work.
> >>
> >> So I'm suggesting something stronger than you: dead heads behave like
> >> "Gilles-style" closed heads and they are not pushed or pulled.
> >
> > I agree that push/pull can be considered orthogonal, and actually your
> > idea is very neat. But my fears are:
> >
> > - from user's perspective, comments or bug report like this:
> > "Hey guys, I've found a bug in Mercurial. Pull does not work. I try to
> > pull a nice feature that Bob attempted at one point of time, I can see
> > it's there but pull does not work on his repo."
> >
> > May be it's just a matter of better advertising closed heads and of
> > education. But we should be prepared to that.
>
> Yeah, there will be the problem of how to discover or re-find the dead
> heads since I think they should be skipped in 'hg log' by default (not
> hidden from other parts of Mercurial, just hidden in by default in the
> various log viewers).
>

You lost me: if just cloning will trim those dead heads, do we really need to 
also hide dead heads from logs. Just mark them as 'closed' should be 
sufficient, isn't it ?

> But then again, with an option to 'hg log', 'hg grep', etc. for showing
> dead changesets, then I don't think the problem is all that big.
>
> Jan had some ideas for building a cache that would be used to track if a
> changeset is considered dead or alive. A changeset is alive when it is
> the ancestor of a head that is alive. So figuring out if revision 1 is
> alive could take a while with 100,000 changesets (hi Greg! :-)
>

To make all changeset belonging to dead branch would be quite consuming. I can 
see 3 levels of implementation:
1- Mark as "dead/closed" changeset with extra having close=1. This will 
clearly identify dead/closed heads for "hg heads --closed". I'll send a patch 
for that.
2- Avoid to mark as "dead/closed" those changesets if they are reopened, i.e. 
they have a non closed child in the same branch. This requires scanning 
children which takes time. Caching children could help. This would avoid 
false positive.
3- Mark all changesets of dead branches as dead/closed. But this requires more 
topological analysis.

> > - internally, added complexity on the push/pull changeset discovery
> > algorithm. But may be it's peanuts compared to the logic already in
> > place. I don't know enough to evaluate.
>
> I also don't know the algorithm and the capabilities in detail.
>
> > Anyway, it's worth digging as dangling heads has been a longstanding
> > concern.
>
> Indeed -- in some sense one can just leave the dangling heads there, but
> Mercurial is currently made in such a way that it's an uphill fight to
> have multiple heads.
>
> So I basically think we need a way to say to Mercurial: "yes, I know
> there is an extra head, but I've marked it as dead/closed -- please stop
> bothering me" :-)
>

Actually, I was wrong yesterday: after testing more, "hg heads", "hg 
branches", "hg update", "hg merge" seems to work OK in presence of closed 
heads: they are not reported or used for default merge/update.

So the situation is far better than I thought originally, and may just need 
some polishing. I've made a few patches yesterday that I'll try to send.

> Excluding the dead heads from push/pull will furthermore solve the
> problem people have when they have made a mess and don't want to push it
> anywhere. Just today a guy came by on IRC who had managed to commit the
> same change at three different places in his history. Now Mercurial
> (wisely) told him that he would create multiple heads on push and he was
> very confused... It would have been great to tell him to do
>
>   hg update first-troublesome-head
>   hg commit --mark-dead (or --kill, --murder, etc :-)
>   hg update second-troublesome-head
>   hg commit --mark-dead
>   hg push
>

As I've just said, it seems that "--close-branch" seems to be working. Do you 
intend to have another option here. Or just rename the option ?

> Instead I tried to get him to make a good clone with 'hg clone -r', but
> he said his repository was too big... he just wanted to get rid of the
> extra heads. Strip would have been an option, but marking them as dead
> would have been even nicer.

Regards.
Gilles.




More information about the Mercurial-devel mailing list