Differences between revisions 27 and 28
Revision 27 as of 2012-06-18 11:51:22
Size: 8214
Editor: abuehl
Comment: Removing rather arrogant sentence. There surely have been quite a number of attempts at improving the tests now.
Revision 28 as of 2012-06-18 11:53:06
Size: 6368
Editor: abuehl
Comment: Removing rejected and now defunct patch
Deletions are marked like this. Additions are marked like this.
Line 119: Line 119:
If you don't care about the tests involving other tools like Perforce, git, etc. and you happen to have installed them and they are causing troubles (for example, an installed Perforce causes the testsuite to hang forever), it's easiest to patch tests/hghave:

{{{
diff --git a/tests/hghave b/tests/hghave
--- a/tests/hghave
+++ b/tests/hghave
@@ -126,9 +126,13 @@
         return False

 def has_gettext():
+ if os.name == 'nt':
+ return False # msgfmt.exe crashes on Windows
     return matchoutput('msgfmt --version', 'GNU gettext-tools')

 def has_git():
+ if os.name == 'nt':
+ return False # causes troubles on Windows
     return matchoutput('git --version 2>&1', r'^git version')

 def has_docutils():
@@ -145,16 +149,24 @@
     return (int(m.group(1)), int(m.group(2)))

 def has_svn15():
+ if os.name == 'nt':
+ return False # causes troubles on Windows
     return getsvnversion() >= (1, 5)

 def has_svn13():
+ if os.name == 'nt':
+ return False # causes troubles on Windows
     return getsvnversion() >= (1, 3)

 def has_svn():
+ if os.name == 'nt':
+ return False # causes troubles on Windows
     return matchoutput('svn --version 2>&1', r'^svn, version') and \
         matchoutput('svnadmin --version 2>&1', r'^svnadmin, version')

 def has_svn_bindings():
+ if os.name == 'nt':
+ return False # causes troubles on Windows
     try:
         import svn.core
         version = svn.core.SVN_VER_MAJOR, svn.core.SVN_VER_MINOR
@@ -165,6 +177,8 @@
         return False

 def has_p4():
+ if os.name == 'nt':
+ return False # causes troubles on Windows
     return (matchoutput('p4 -V', r'Rev\. P4/') and
             matchoutput('p4d -V', r'Rev\. P4D/'))
}}}
This will skip the tests involving these tools.

Hackable Mercurial for Windows

An approach to easily hack on the Mercurial source on Windows.

1. What is the Hackable package?

Compiling Mercurial is a significant barrier to testing and developing Mercurial on Windows. This package attempts to minimize that barrier by including:

  • a private copy of Python (32-bit)
  • complete Mercurial history
  • pre-compiled extensions (32-bit MinGW GCC)
  • an hg.exe wrapper to add to your path
  • in-place editable source checked out and ready to go

2. Downloading and using

The package can be found here. Simply download, unzip, and run the included hg.exe. This package will not interfere with your existing Mercurial or Python installation.

<!> There is usually no need to download new copies between releases, simply pull and update.

/!\ This package includes no global configuration, so if you're not already using Mercurial, you will need to configure your username and merge tools.

3. How it's built and how to build your own from scratch

Needed components:

  • Python MSI installer, versions 2.4 - 2.7
  • Mercurial source release (see Download)

  • MinGW mingw-get tool

  • The exemaker launcher (binary available here)

Steps:

  • Download all the needed components
  • Install Python with msiexec /i python-2.6.6.msi /qb

  • Unpack the mingw-get tool into c:\MinGW and add c:\MinGW\bin to your path

  • Install the gcc compiler with mingw-get gcc

  • Unpack Mercurial source into c:\hg

  • Copy the Python install from c:\Python26 to c:\hg\hg-python26

  • Edit c:\hg\hg-python26\Lib\distutils\cygwinccompiler.py to remove all references to -mno-cygwin (thanks, GCC!)

  • Build Mercurial extensions in c:\hg with hg-python26\python setup.py build_ext -i --compiler=mingw32

  • Copy the c:\hg\hg to c:\hg\hg.py and change the #! line to '#!hg-python/python.exe'

  • Unpack exemaker and copy exemaker.exe to c:\hg\hg.exe

4. Running the test suite under MSYS

Most of the test suite can now be run on windows too. Writing tests and debugging failures might however require both knowledge of the traditional unix environment and of the windows environment.

The tests that can’t be run on windows will automatically be skipped, so no test failures should be seen. The tests are run automatically by the hg buildbot.

Creating a hg-winhack package and running the test suite requires almost the same environment. The following instructions will thus contain a lot of duplication of the instructions given above, and the instructions could perhaps be merged. (The “hackable” mentioned above might not work in development branches.)

4.1. Install MinGW/MSYS environment

  • Install MinGW/MSYS with 'mingw-get-inst-*.exe' from http://sourceforge.net/projects/mingw/files/latest/download

  • Install some mandatory extra packages: c:\MinGW\bin\mingw-get install msys-base msys-coreutils gcc

  • Install some optional extra packages: c:\MinGW\bin\mingw-get install msys-rxvt msys-vim msys-wget msys-unzip msys-zip msys-openssh

  • Launch a console/terminal with: c:\MinGW\msys\1.0\msys.bat --rxvt and enjoy having a decent shell

  • Put 'c:/MinGW/bin' in '$PATH' ... or 'mount c:/MinGW /mingw'

4.2. Build hg-winhack

# create build directory
hg clone http://selenic.com/hg hg-winhack   # bootstrap Mercurial somehow
cd hg-winhack
# install python
wget http://python.org/ftp/python/2.7.2/python-2.7.2.msi
msiexec //i python-2.7.2.msi //qb   # avoid MSYS magic mangling of '/i'
cp -ar c:/Python27 hg-python27   # python can and should now be uninstalled again
sed -i 's,-mno-cygwin, ,g' hg-python27/Lib/distutils/cygwinccompiler.py
# build Mercurial extensions
hg-python27/python setup.py build_ext -i --compiler=mingw32
# create hg.exe launcher
sed 's,^#!/usr/bin/env python,#!hg-python27/python27.dll,g' hg > hg.py
rm hg
wget http://effbot.org/media/downloads/exemaker-1.2-20041012.zip -O exemaker.zip
unzip -j exemaker.zip '*/exemaker.exe'
rm exemaker.zip
mv exemaker.exe hg.exe
# prepare localizations - this will fail after it has done what we need
make local
# zip it and ship it ... or continue running the test suite
cd ..
zip -r hg-winhack-x.x.zip hg-winhack/

Note that this will leave you with both a hg.exe which can be used from windows and a hg.py which might be picked up if you have python with a .py installed.

/!\ This version of exemaker will interpret the relative python path as relative to the current working directory. A new version from timeless should fix that.

4.3. Run the test suite

cd hg-winhack/tests
export TMPDIR=c:/tmp   # to avoid path that contains ~ which in general would require escaping
PATH="`pwd`/../hg-python27:/mingw/bin:/bin" ./run-tests.py --local

PATH can be extended so other non-msys tools (such as git/svn/p4?) can be found.

4.4. Alternative: Building the C extensions with Microsoft compiler

Get and install the gratis "Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1" from microsoft.com. It contains both the x86 and x64 Microsoft C/C++ compiler.

To build Mercurial in a MSYS shell simply do:

make local

This then allows to run the testsuite with:

cd tests
python run-tests.py --local

4.5. Run tests involving Git

If you have Git installed on your Windows box, hg-winhack will incorrectly detect that git command is available, and will try to run Git-related tests. It will fail to do so, because it cannot run "git.cmd" from shell.

  • If you don't want to run Git tests, edit hghave file to return False instead of return matchoutput('git --version 2>&1', r'^git version')

  • If you prefer Git tests to be executed, find your Git installation folder, enter cmd folder and create git file (no extension) with the following contents:

#!/bin/sh
"$COMSPEC" //C git.cmd "$@"

5. See also


CategoryDeveloper

HackableMercurial (last edited 2018-12-05 04:34:18 by MattHarbison)