py2exe: add workaround to allow bundling of hgext3rd.* extensions
py2exe doesn't know how to handle namespace packages *at all*, so it treats
them like normal packages. As a result, if we try and bundle hgext3rd.evolve
in a py2exe build, it won't work if we install evolve into the virtualenv. In
order to work around this, tortoisehg installs hgext3rd.evolve etc into its
staged hg directory, since it doesn't use a virtualenv. As a workaround for us,
we'll just allow any extra packages users want bundled are part of hg during
the pseudo-install phase that py2exe uses. I'm not happy about this, but it
*works*.
As a sample of how you'd make an MSI with evolve bundled:
import os
import shutil
import subprocess
import tempfile
def stage_evolve(version):
"""Stage evolve for inclusion in py2exe binary."""
with tempfile.TemporaryDirectory() as temp:
evolve = os.path.join(temp, "evolve")
subprocess.check_call([
"hg.exe",
"clone",
"https://www.mercurial-scm.org/repo/evolve/",
"--update",
version,
evolve,
])
dest = os.path.join('..', 'hgext3rd', 'evolve')
if os.path.exists(dest):
shutil.rmtree(dest)
shutil.copytree(os.path.join(evolve, "hgext3rd", "evolve"), dest)
def main():
stage_evolve('tip')
print("\0")
print("hgext3rd")
print("hgext3rd.evolve")
print("hgext3rd.evolve.hack")
print("hgext3rd.evolve.thirdparty")
if __name__ == "__main__":
main()
is a script you can pass to the wix/build.py as --extra-packages-script,
and the resulting .msi will have an hg binary with evolve baked in. users
will still need to enable evolve in their hgrc, so you'd probably also
want to bundle configs in your msi for an enterprise environment, but that's
already easy to do with the support for extra features and wxs files in the
wix build process.
Differential Revision: https://phab.mercurial-scm.org/D6189
Testing narrow clones when changesets modifying a matching file exist on
multiple branches
$ . "$TESTDIR/narrow-library.sh"
$ hg init master
$ cd master
$ cat >> .hg/hgrc <<EOF
> [narrow]
> serveellipses=True
> EOF
$ hg branch default
marked working directory as branch default
(branches are permanent and global, did you want a bookmark?)
$ for x in `$TESTDIR/seq.py 10`; do
> echo $x > "f$x"
> hg add "f$x"
> hg commit -m "Add $x"
> done
$ hg branch release-v1
marked working directory as branch release-v1
(branches are permanent and global, did you want a bookmark?)
$ hg commit -m "Start release for v1"
$ hg update default
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ for x in `$TESTDIR/seq.py 10`; do
> echo "$x v2" > "f$x"
> hg commit -m "Update $x to v2"
> done
$ hg update release-v1
10 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg branch release-v1
marked working directory as branch release-v1
$ for x in `$TESTDIR/seq.py 1 5`; do
> echo "$x v1 hotfix" > "f$x"
> hg commit -m "Hotfix $x in v1"
> done
$ hg update default
10 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg branch release-v2
marked working directory as branch release-v2
$ hg commit -m "Start release for v2"
$ hg update default
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg branch default
marked working directory as branch default
$ for x in `$TESTDIR/seq.py 10`; do
> echo "$x v3" > "f$x"
> hg commit -m "Update $x to v3"
> done
$ hg update release-v2
10 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg branch release-v2
marked working directory as branch release-v2
$ for x in `$TESTDIR/seq.py 4 9`; do
> echo "$x v2 hotfix" > "f$x"
> hg commit -m "Hotfix $x in v2"
> done
$ hg heads -T '{rev} <- {p1rev} ({branch}): {desc}\n'
42 <- 41 (release-v2): Hotfix 9 in v2
36 <- 35 (default): Update 10 to v3
25 <- 24 (release-v1): Hotfix 5 in v1
$ cd ..
We now have 3 branches: default, which has v3 of all files, release-v1 which
has v1 of all files, and release-v2 with v2 of all files.
Narrow clone which should get all branches
$ hg clone --narrow ssh://user@dummy/master narrow --include "f5"
requesting all changes
adding changesets
adding manifests
adding file changes
added 12 changesets with 5 changes to 1 files (+2 heads)
new changesets *:* (glob)
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cd narrow
$ hg log -G -T "{if(ellipsis, '...')}{node|short} ({branch}): {desc}\n"
o ...031f516143fe (release-v2): Hotfix 9 in v2
|
o 9cd7f7bb9ca1 (release-v2): Hotfix 5 in v2
|
o ...37bbc88f3ef0 (release-v2): Hotfix 4 in v2
|
| @ ...dae2f368ca07 (default): Update 10 to v3
| |
| o 9c224e89cb31 (default): Update 5 to v3
| |
| o ...04fb59c7c9dc (default): Update 4 to v3
|/
| o b2253e82401f (release-v1): Hotfix 5 in v1
| |
| o ...960ac37d74fd (release-v1): Hotfix 4 in v1
| |
o | 986298e3f347 (default): Update 5 to v2
| |
o | ...75d539c667ec (default): Update 4 to v2
|/
o 04c71bd5707f (default): Add 5
|
o ...881b3891d041 (default): Add 4
Narrow clone the first file, hitting edge condition where unaligned
changeset and manifest revnums cross branches.
$ hg clone --narrow ssh://user@dummy/master narrow --include "f1"
requesting all changes
adding changesets
adding manifests
adding file changes
added 10 changesets with 4 changes to 1 files (+2 heads)
new changesets *:* (glob)
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cd narrow
$ hg log -G -T "{if(ellipsis, '...')}{node|short} ({branch}): {desc}\n"
o ...031f516143fe (release-v2): Hotfix 9 in v2
|
| @ ...dae2f368ca07 (default): Update 10 to v3
| |
| o 1f5d184b8e96 (default): Update 1 to v3
|/
| o ...b2253e82401f (release-v1): Hotfix 5 in v1
| |
| o 133502f6b7e5 (release-v1): Hotfix 1 in v1
| |
o | ...79165c83d644 (default): Update 10 to v2
| |
o | c7b7a5f2f088 (default): Update 1 to v2
| |
| o ...f0531a3db7a9 (release-v1): Start release for v1
|/
o ...6a3f0f0abef3 (default): Add 10
|
o e012ac15eaaa (default): Add 1