docs: update sharing guide based (mostly) on marmoute's review
- don't claim certain scenarios are more/less common, just
simple/advanced
- mention code review as a multiple-developer scenario (not described
in detail yet!)
- suggest "hg config --edit --local" instead of "cat >> .hg/hgrc"
- use -q less often (and show resulting output)
- edit some section headers to be consistent with user guide
(example numbers; "amend" instead of "amending")
(These are just the small changes; big changes are yet to come.)
Test script based on sharing.rst: ensure that all scenarios in that
document work as advertised.
Setting things up
$ cat >> $HGRCPATH <<EOF
> [alias]
> shortlog = log --template '{rev}:{node|short} {phase} {desc|firstline}\n'
> [extensions]
> rebase =
> EOF
$ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
$ hg init public
$ hg clone public test-repo
updating to branch default
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg clone test-repo dev-repo
updating to branch default
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cat >> test-repo/.hg/hgrc <<EOF
> [phases]
> publish = false
> EOF
To start things off, let's make one public, immutable changeset::
$ cd test-repo
$ echo 'my new project' > file1
$ hg add file1
$ hg commit -m'create new project'
$ hg push
pushing to $TESTTMP/public
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
and pull that into the development repository::
$ cd ../dev-repo
$ hg pull -u
pulling from $TESTTMP/test-repo
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
pull obsolescence markers
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
Let's commit a preliminary change and push it to ``test-repo`` for
testing. ::
$ echo 'fix fix fix' > file1
$ hg commit -m'prelim change'
$ hg push -q ../test-repo
Figure SG01 (roughly)
$ hg shortlog -G
@ 1:f6490818a721 draft prelim change
|
o 0:0dc9c9f6ab91 public create new project
Now let's switch to test-repo to test our change and amend::
$ cd ../test-repo
$ hg update -q
$ echo 'Fix fix fix.' > file1
$ hg amend -m'fix bug 37'
Figure SG02
$ hg shortlog --hidden -G
@ 3:60ffde5765c5 draft fix bug 37
|
| x 2:2a039763c0f4 draft temporary amend commit for f6490818a721
| |
| x 1:f6490818a721 draft prelim change
|/
o 0:0dc9c9f6ab91 public create new project
Pull into dev-repo: obsolescence markers are transferred, but not
the new obsolete changeset.
$ cd ../dev-repo
$ hg pull -q -u
Figure SG03
$ hg shortlog --hidden -G
@ 2:60ffde5765c5 draft fix bug 37
|
| x 1:f6490818a721 draft prelim change
|/
o 0:0dc9c9f6ab91 public create new project
Amend again in dev-repo
$ echo 'Fix, fix, and fix.' > file1
$ hg amend
$ hg push -q
Figure SG04 (dev-repo)
$ hg shortlog --hidden -G
@ 4:de6151c48e1c draft fix bug 37
|
| x 3:ad19d3570adb draft temporary amend commit for 60ffde5765c5
| |
| x 2:60ffde5765c5 draft fix bug 37
|/
| x 1:f6490818a721 draft prelim change
|/
o 0:0dc9c9f6ab91 public create new project
Figure SG04 (test-repo)
$ cd ../test-repo
$ hg update
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg shortlog --hidden -G
@ 4:de6151c48e1c draft fix bug 37
|
| x 3:60ffde5765c5 draft fix bug 37
|/
| x 2:2a039763c0f4 draft temporary amend commit for f6490818a721
| |
| x 1:f6490818a721 draft prelim change
|/
o 0:0dc9c9f6ab91 public create new project
This bug fix is finished. We can push it to the public repository.
$ hg push
pushing to $TESTTMP/public (glob)
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
pushing 4 obsolescence markers (* bytes) (glob)
4 obsolescence markers added
Figure SG05
$ hg -R ../public shortlog -G
o 1:de6151c48e1c public fix bug 37
|
o 0:0dc9c9f6ab91 public create new project
Oops, still have draft changesets in dev-repo.
$ cd ../dev-repo
$ hg shortlog -r 'draft()'
4:de6151c48e1c draft fix bug 37
$ hg pull -q -u
$ hg shortlog -r 'draft()'
Sharing by Alice and Bob to demonstrate bumped and divergent changesets.
First, setup repos for them.
$ cd ..
$ hg clone public alice
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg clone public bob
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cat >> alice/.hg/hgrc <<EOF
> [phases]
> publish = false
> EOF
$ cp alice/.hg/hgrc bob/.hg/hgrc
Alice commits a bug fix.
$ cd alice
$ echo 'fix' > file2
$ hg commit -A -u alice -m 'fix bug 15'
adding file2
Bob pulls and amends Alice's fix.
$ cd ../bob
$ hg pull -u ../alice
pulling from ../alice
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
pull obsolescence markers
0 obsolescence markers added
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ echo 'Fix.' > file2
$ hg amend -A -u bob -m 'fix bug 15 (amended)'
Figure SG06: Bob's repository after amending Alice's fix.
(Nothing new here; we could have seen this in the user guide.
$ hg --hidden shortlog -G
@ 4:fe884dfac355 draft fix bug 15 (amended)
|
| x 3:0376cac226f8 draft temporary amend commit for e011baf925da
| |
| x 2:e011baf925da draft fix bug 15
|/
o 1:de6151c48e1c public fix bug 37
|
o 0:0dc9c9f6ab91 public create new project
But in the meantime, Alice decides the fix is just fine and publishes it.
$ cd ../alice
$ hg push
pushing to $TESTTMP/public
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
pushing 4 obsolescence markers (369 bytes)
0 obsolescence markers added
Which means that Bob now has an formerly obsolete changeset that is
also public (2:6e83). As soon as he pulls its phase change, he's got
trouble: the successors of that formerly obsolete changeset are
bumped.
$ cd ../bob
$ hg --hidden shortlog -r 'obsolete()'
2:e011baf925da draft fix bug 15
3:0376cac226f8 draft temporary amend commit for e011baf925da
$ hg pull -q -u
1 new bumped changesets
$ hg --hidden shortlog -r 'obsolete()'
3:0376cac226f8 draft temporary amend commit for e011baf925da
$ hg shortlog -r 'bumped()'
4:fe884dfac355 draft fix bug 15 (amended)
Figure SG07: Bob's repo with one bumped changeset (rev 4:c02d)
$ hg --hidden shortlog -G
@ 4:fe884dfac355 draft fix bug 15 (amended)
|
| x 3:0376cac226f8 draft temporary amend commit for e011baf925da
| |
| o 2:e011baf925da public fix bug 15
|/
o 1:de6151c48e1c public fix bug 37
|
o 0:0dc9c9f6ab91 public create new project
Bob gets out of trouble by evolving the repository.
$ hg evolve --all
recreate:[4] fix bug 15 (amended)
atop:[2] fix bug 15
computing new diff
committed as 227d860d9ad0
working directory is now at 227d860d9ad0
Figure SG08
$ hg --hidden shortlog -G
@ 5:227d860d9ad0 draft bumped update to e011baf925da:
|
| x 4:fe884dfac355 draft fix bug 15 (amended)
| |
+---x 3:0376cac226f8 draft temporary amend commit for e011baf925da
| |
o | 2:e011baf925da public fix bug 15
|/
o 1:de6151c48e1c public fix bug 37
|
o 0:0dc9c9f6ab91 public create new project
Throw away Bob's messy repo and start over.
$ cd ..
$ rm -rf bob
$ cp -rp alice bob
Bob commits a pretty good fix that both he and Alice will amend,
leading to divergence.
$ cd bob
$ echo 'pretty good fix' >> file1
$ hg commit -u bob -m 'fix bug 24 (v1)'
Alice pulls Bob's fix and improves it.
$ cd ../alice
$ hg pull -u ../bob
pulling from ../bob
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
pull obsolescence markers
0 obsolescence markers added
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ echo 'better (alice)' >> file1
$ hg amend -u alice -m 'fix bug 24 (v2 by alice)'
Likewise, Bob amends his own fix. Now we have an obsolete changeset
with two successors, although the successors are in different repos.
$ cd ../bob
$ echo 'better (bob)' >> file1
$ hg amend -u bob -m 'fix bug 24 (v2 by bob)'
Bob pulls from Alice's repo and discovers the trouble: divergent changesets!
$ hg pull -q -u ../alice
not updating: not a linear update
(merge or update --check to force update)
2 new divergent changesets
$ hg shortlog -r 'divergent()'
5:fc16901f4d7a draft fix bug 24 (v2 by bob)
6:694fd0f6b503 draft fix bug 24 (v2 by alice)
Figure SG09
$ hg --hidden shortlog -G
o 6:694fd0f6b503 draft fix bug 24 (v2 by alice)
|
| @ 5:fc16901f4d7a draft fix bug 24 (v2 by bob)
|/
| x 4:162612d3335b draft temporary amend commit for fe81d904ed08
| |
| x 3:fe81d904ed08 draft fix bug 24 (v1)
|/
o 2:e011baf925da public fix bug 15
|
o 1:de6151c48e1c public fix bug 37
|
o 0:0dc9c9f6ab91 public create new project
Merge the trouble away.
$ hg merge --tool internal:local
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg commit -m merge
$ hg shortlog -G
@ 7:b1d30ba26e44 draft merge
|\
| o 6:694fd0f6b503 draft fix bug 24 (v2 by alice)
| |
o | 5:fc16901f4d7a draft fix bug 24 (v2 by bob)
|/
o 2:e011baf925da public fix bug 15
|
o 1:de6151c48e1c public fix bug 37
|
o 0:0dc9c9f6ab91 public create new project
$ hg log -q -r 'divergent()'
5:fc16901f4d7a
6:694fd0f6b503
# XXX hg evolve does not solve this trouble! bug in evolve?
#Evolve the trouble away.
# $ hg evolve --all --tool=internal:local
# merge:[5] fix bug 24 (v2 by bob)
# with: [6] fix bug 24 (v2 by alice)
# base: [3] fix bug 24 (v1)
# 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
# $ hg status
# $ hg shortlog -G
# o 6:694fd0f6b503 draft fix bug 24 (v2 by alice)
# |
# | @ 5:fc16901f4d7a draft fix bug 24 (v2 by bob)
# |/
# o 2:e011baf925da public fix bug 15
# |
# o 1:de6151c48e1c public fix bug 37
# |
# o 0:0dc9c9f6ab91 public create new project
#
# $ hg --hidden shortlog -G