[Rivet] HG transition

David Grellscheid david.grellscheid at durham.ac.uk
Sun Jun 9 23:03:55 BST 2013


Hi Frank,

>> New features should _not_ get added there, instead development happens
>
> I'm confused now. I thought if I want to add a new analysis I would
> simply clone that "trunk", implement my changes locally (potentially
> with intermediate local commits) and when I'm finished pull and merge
> any updates and then push my stuff back.

Correct. With "features" I meant structural changes to the core of 
Rivet. New analyses that are completely standalone are OK direct to 
trunk with the workflow you describe. If you need to coordinate with 
another author, you could push to a temporary branch in 'private' first.

> Maybe just for clarification if I misunderstood the workflow, or as a
> basis for the wiki page:
>
> (0. Clone the repo -- just once at the beginning)
> $ hg clone ssh://login.hepforge.org//hepforge/hg/rivet/public/rivet
> $ cd rivet

Yes. The path is automatically encoded in rivet/.hg/hgrc as "default = 
ssh://login.hepforge.org//hepforge/hg/rivet/public/rivet",
so that pull/push operations do not need an explicit destination.

>
> 1. Implement one new feature
> $ hg pull
> $ hg update
> $   # develop first part of change
> $ hg commit -m "first part of my change"
> $   # develop second part of change
> $ hg commit -m "second part of my change"

Yes.

>
> 2. Get updates from central repo
> $ hg pull
> $ hg merge
> $ hg commit -m "merge"
>

Yes.

> 3. Push to central repo
> $ hg push

Correct. Push/pull can come from any repo path. You can either 
explicitly specify the target, or use shortcuts that you can add by hand 
to .hg/hgrc. This is useful when you're on a branch and want to track 
trunk as the branch develops. hgrc would then have

[paths]
default = ..../branchrepo
trunk = ..../trunkrepo

Then you can regularly do

4. Track trunk in branch repo
hg pull trunk
hg merge
hg ci -m'merge'
hg push  # implies "default"

This keeps 'branch' up-to-date with developments on trunk.

>> on individual branches in
>>
>> hg clone ssh://login.hepforge.org//hepforge/hg/yoda/private/...
>> hg clone ssh://login.hepforge.org//hepforge/hg/rivet/private/...
>
> How does one create such a private branch (or is it called
> repository)?
They're all separate repositories. Even your hg clone makes a new repo, 
and they are all equal. commit/update talks to the repo underneath your 
working dir, while pull/push coordinates with other repo clones.

The most space-efficient way to create private clones on hepforge is to 
ssh into login.hepforge.org, then do the following (clone on the local 
filesystem uses hardlinking as long as files are unchanged):

5. Create new branch repo in hepforge
umask 002
cd /hepforge/hg/rivet/
hg clone public/rivet private/foobar

In principle, one can also clone via ssh to a new location in private, 
but then without the space savings.

 > And how are they merged back into the mainline?

Just as above, but you push to trunk instead of default:

6. Merge branch repo back to trunk
cd privaterepo-workdir
hg pull trunk
hg merge
hg ci -m'merged'
hg out trunk # check what will be pushed, maybe use -r to select
hg push trunk # be SURE of this, it's hard to undo, -r applies here, too
         ^^^^^

Once you understand the difference between (2.), (4.) and (6.), you've 
got it! You can create a couple of local clones on your own machine and 
experiment with all the different features. I also found 
http://hginit.com/ very useful.

See you,

   David


More information about the Rivet mailing list