branch: operate on branch names in local string space where possible
Previously, branch names were ideally manipulated as UTF-8 strings,
because they were stored as UTF-8 in the dirstate and the changelog
and could not be safely converted to the local encoding and back.
However, only about 80% of branch name code was actually using the
right encoding conventions. This patch uses the localstr addition to
allow working on branch names as local strings, which simplifies
handling so that the previously incorrect code becomes correct.
$ branchcache=.hg/branchheads.cache
$ hg init t
$ cd t
$ hg branches
$ echo foo > a
$ hg add a
$ hg ci -m "initial"
$ hg branch foo
marked working directory as branch foo
$ hg branch
foo
$ hg ci -m "add branch name"
$ hg branch bar
marked working directory as branch bar
$ hg ci -m "change branch name"
Branch shadowing:
$ hg branch default
abort: a branch of the same name already exists (use 'hg update' to switch to it)
[255]
$ hg branch -f default
marked working directory as branch default
$ hg ci -m "clear branch name"
created new head
There should be only one default branch head
$ hg heads .
changeset: 3:9d567d0b51f9
tag: tip
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: clear branch name
$ hg co foo
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg branch
foo
$ echo bleah > a
$ hg ci -m "modify a branch"
$ hg merge default
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg branch
foo
$ hg ci -m "merge"
$ hg log
changeset: 5:dc140083783b
branch: foo
tag: tip
parent: 4:98d14f698afe
parent: 3:9d567d0b51f9
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: merge
changeset: 4:98d14f698afe
branch: foo
parent: 1:0079f24813e2
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: modify a branch
changeset: 3:9d567d0b51f9
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: clear branch name
changeset: 2:ed2bbf4e0102
branch: bar
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: change branch name
changeset: 1:0079f24813e2
branch: foo
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: add branch name
changeset: 0:db01e8ea3388
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: initial
$ hg branches
foo 5:dc140083783b
default 3:9d567d0b51f9 (inactive)
bar 2:ed2bbf4e0102 (inactive)
$ hg branches -q
foo
default
bar
Test for invalid branch cache:
$ hg rollback
rolling back to revision 4 (undo commit)
$ cp $branchcache .hg/bc-invalid
$ hg log -r foo
changeset: 4:98d14f698afe
branch: foo
tag: tip
parent: 1:0079f24813e2
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: modify a branch
$ cp .hg/bc-invalid $branchcache
$ hg --debug log -r foo
invalidating branch cache (tip differs)
changeset: 4:98d14f698afeaff8cb612dcf215ce95e639effc3
branch: foo
tag: tip
parent: 1:0079f24813e2b73a891577c243684c5066347bc8
parent: -1:0000000000000000000000000000000000000000
manifest: 4:d01b250baaa05909152f7ae07d7a649deea0df9a
user: test
date: Thu Jan 01 00:00:00 1970 +0000
files: a
extra: branch=foo
description:
modify a branch
$ rm $branchcache
$ echo corrupted > $branchcache
$ hg log -qr foo
4:98d14f698afe
$ cat $branchcache
98d14f698afeaff8cb612dcf215ce95e639effc3 4
9d567d0b51f9e2068b054e1948e1a927f99b5874 default
98d14f698afeaff8cb612dcf215ce95e639effc3 foo
ed2bbf4e01029020711be82ca905283e883f0e11 bar
Push should update the branch cache:
$ hg init ../target
Pushing just rev 0:
$ hg push -qr 0 ../target
$ cat ../target/$branchcache
db01e8ea3388fd3c7c94e1436ea2bd6a53d581c5 0
db01e8ea3388fd3c7c94e1436ea2bd6a53d581c5 default
Pushing everything:
$ hg push -qf ../target
$ cat ../target/$branchcache
98d14f698afeaff8cb612dcf215ce95e639effc3 4
9d567d0b51f9e2068b054e1948e1a927f99b5874 default
98d14f698afeaff8cb612dcf215ce95e639effc3 foo
ed2bbf4e01029020711be82ca905283e883f0e11 bar
Update with no arguments: tipmost revision of the current branch:
$ hg up -q -C 0
$ hg up -q
$ hg id
9d567d0b51f9
$ hg up -q 1
$ hg up -q
$ hg id
98d14f698afe (foo) tip
$ hg branch foobar
marked working directory as branch foobar
$ hg up
abort: branch foobar not found
[255]
Fastforward merge:
$ hg branch ff
marked working directory as branch ff
$ echo ff > ff
$ hg ci -Am'fast forward'
adding ff
$ hg up foo
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg merge ff
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg branch
foo
$ hg commit -m'Merge ff into foo'
$ hg parents
changeset: 6:917eb54e1b4b
branch: foo
tag: tip
parent: 4:98d14f698afe
parent: 5:6683a60370cb
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: Merge ff into foo
$ hg manifest
a
ff
Test merging, add 3 default heads and one test head:
$ cd ..
$ hg init merges
$ cd merges
$ echo a > a
$ hg ci -Ama
adding a
$ echo b > b
$ hg ci -Amb
adding b
$ hg up 0
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ echo c > c
$ hg ci -Amc
adding c
created new head
$ hg up 0
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ echo d > d
$ hg ci -Amd
adding d
created new head
$ hg up 0
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg branch test
marked working directory as branch test
$ echo e >> e
$ hg ci -Ame
adding e
$ hg log
changeset: 4:3a1e01ed1df4
branch: test
tag: tip
parent: 0:cb9a9f314b8b
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: e
changeset: 3:980f7dc84c29
parent: 0:cb9a9f314b8b
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: d
changeset: 2:d36c0562f908
parent: 0:cb9a9f314b8b
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: c
changeset: 1:d2ae7f538514
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: b
changeset: 0:cb9a9f314b8b
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: a
Implicit merge with test branch as parent:
$ hg merge
abort: branch 'test' has one head - please merge with an explicit rev
(run 'hg heads' to see all heads)
[255]
$ hg up -C default
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
Implicit merge with default branch as parent:
$ hg merge
abort: branch 'default' has 3 heads - please merge with an explicit rev
(run 'hg heads .' to see heads)
[255]
3 branch heads, explicit merge required:
$ hg merge 2
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg ci -m merge
2 branch heads, implicit merge works:
$ hg merge
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)