Experimental implementation of liquid-hg

Arne Babenhauserheide arne_bab at yahoo.de
Wed Jan 19 11:34:18 CST 2011


Hi, 

(Please excuse the out-of-thread reply, my kmail2 is broken so this reply
comes from emacs message-mode)

I thought about what I would want to do with liquid: 

1. Simplest case: An easy way to amend commits. 
2. More complex case: Keep a volatile history from which I select the good
parts later on. 

The first is simple: Liquefy the commit, change it, freeze it. The
second is a bit harder. 

I don’t want my changesets to appear in repositories of people who are
not happy with ugly history. My volatile history could have 20 heads,
all from experiments, but I might only want to publish one of them, and
maybe put some others into an experimental branch. 

A normal user should not have any change in behaviour: He simply should
not get or see liquid changesets. Otherwise we would repeat the git index
mistake (pushing the index into the face of every user). 

I see two sets of commands which allows that: 

Additional
----------

Liquids as additonal layer, only visible to those who use them. A
seperate volatile cooperation layer.

- push and pull by default do not transfer liquid changesets.
- push/pull --liquid transfer the liquid changesets in liquid form. 
- push --freeze freezes the changesets before transfering them. There’s
  no way to pull liquid changesets and freeze them in one step (that
  would mean accidental publishing if you push later on). 
- commit --liquid creates a liquid changeset. Any commit to a liquid
  changeset is liquid (make it easy to work on liquids).
- liquefy liquefies a changeset and all its children. 
- vaporize <rev> removes a liquid revision and all its children (but
  keeps backups like strip; a condensate :) )
- vaporize --all vaporizes all liquid changesets. Do this after freezing
  all liquid stuff you want to publish to get rid of broken
  experiments but keep the clean clone. 
- freeze <rev> freezes the revision and all its ancestors. 
- freeze --collapse <rev|revset> collapses the revision(s) and all its liquid
  ancestors into a single frozen revision. All of these revisions which
  have no other children (which don’t get collapsed) are vaporized.


Integral
--------

Liquids as integral part in every repository, pushed, pulled and creating
additional heads as people experiment, but not disturbing normal
users. An experimenting layer for those who want it. 
It works like the “additional” scheme except for the following changes: 

- push and pull always transfer liquids. Push doesn’t abort if
  additional heads are liquid.
- update by default ignores liquids, except if it explicitely gets a
  liquid revision. tip is never liquid.
- update --liquid updates to the latest liquid revision.
- log only shows liquids if it gets the --liquid argument.


Notes
=====

The one-off commit of a new user should not be liquid, else I’d have to
explain to the newbe why he has to add the --freeze flag to the
push. This behaviour should not change when I add an extension. 

When I work on liquids, they should not be published or removed by accident ⇒
explicit freeze and vaporize. 



More information about the Mercurial mailing list