changeset 680:21e03596dd93

Towards Win32 deployment
author Chris Cannam
date Fri, 07 Dec 2018 13:41:32 +0000
parents 0329bbd4b57c
children ac7b40a64109
files .appveyor.yml .hgignore deploy/win32/build.bat deploy/win32/easyhg.wxs easyhg.wxs src/mainwindow.cpp
diffstat 6 files changed, 446 insertions(+), 395 deletions(-) [+]
line wrap: on
line diff
--- a/.appveyor.yml	Thu Dec 06 13:54:34 2018 +0000
+++ b/.appveyor.yml	Fri Dec 07 13:41:32 2018 +0000
@@ -6,6 +6,7 @@
   - Release
 
 install:
+  - cinst wget
   - ps: '"[hostfingerprints]" | Out-File -Encoding "ASCII" -Append $env:USERPROFILE\mercurial.ini'
   - ps: '"code.soundsoftware.ac.uk = 66:ef:e2:0e:e3:55:93:9a:33:aa:2a:e9:fe:be:21:c2:a2:8d:4f:f1" | Out-File -Encoding "ASCII" -Append $env:USERPROFILE\mercurial.ini'
   - ps: '"[hostsecurity]" | Out-File -Encoding "ASCII" -Append $env:USERPROFILE\mercurial.ini'
--- a/.hgignore	Thu Dec 06 13:54:34 2018 +0000
+++ b/.hgignore	Fri Dec 07 13:41:32 2018 +0000
@@ -27,3 +27,6 @@
 *.xcodeproj
 *.bak
 *.msi
+easyhg-kdiff3
+mercurial-*-x86
+build_win32
--- a/deploy/win32/build.bat	Thu Dec 06 13:54:34 2018 +0000
+++ b/deploy/win32/build.bat	Fri Dec 07 13:41:32 2018 +0000
@@ -3,24 +3,72 @@
 
 set STARTPWD=%CD%
 
-set QTDIR=C:\Qt\5.11.2\mingw53_32
+set QTDIR=C:\Qt\5.12.0\msvc2017
 if not exist %QTDIR% (
-@   echo Could not find 32-bit Qt
+@   echo Could not find 32-bit Qt using MSVC
 @   exit /b 2
 )
 
+if not exist "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" (
+@   echo "Could not find MSVC vars batch file"
+@   exit /b 2
+)
+
+call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" x86
+
 set ORIGINALPATH=%PATH%
 set PATH=%PATH%;C:\Program Files (x86)\SMLNJ\bin;%QTDIR%\bin;C:\Qt\Tools\QtCreator\bin;C:\Qt\Tools\mingw530_32\bin
 
 cd %STARTPWD%
 
+if not exist easyhg-kdiff3 (
+    hg clone https://code.soundsoftware.ac.uk/hg/easyhg-kdiff3
+)
+set KDIFFDIR=%STARTPWD%\easyhg-kdiff3\kdiff3\src-QT4
+
 mkdir build_win32
 cd build_win32
 
-qmake -spec win32-g++ -r ..\easyhg.pro
+qmake -spec win32-msvc -r -tp vc ..\easyhg.pro
 if %errorlevel% neq 0 exit /b %errorlevel%
 
-mingw32-make
+msbuild EasyMercurial.vcxproj /t:Build /p:Configuration=Release
+if %errorlevel% neq 0 exit /b %errorlevel%
+
+cd %KDIFFDIR%
+
+mkdir build_win32
+cd build_win32
+
+qmake -spec win32-msvc -r -tp vc ..\kdiff3.pro
+if %errorlevel% neq 0 exit /b %errorlevel%
+
+msbuild kdiff3.vcxproj /t:Build /p:Configuration=Release
+if %errorlevel% neq 0 exit /b %errorlevel%
+
+cd %STARTPWD%\build_win32
+
+copy %KDIFFDIR%\build_win32\release\kdiff3.exe .\release
+
+copy %QTDIR%\bin\Qt5Core.dll .\release
+copy %QTDIR%\bin\Qt5Gui.dll .\release
+copy %QTDIR%\bin\Qt5Widgets.dll .\release
+copy %QTDIR%\bin\Qt5Network.dll .\release
+copy %QTDIR%\bin\Qt5PrintSupport.dll .\release
+copy %QTDIR%\plugins\platforms\qminimal.dll .\release
+copy %QTDIR%\plugins\platforms\qwindows.dll .\release
+copy %QTDIR%\plugins\styles\qwindowsvistastyle.dll .\release
+
+cd %STARTPWD%
+
+if not exist mercurial-4.8.0-x86.msi (
+     C:\ProgramData\chocolatey\bin\wget https://bitbucket.org/tortoisehg/files/downloads/mercurial-4.8.0-x86.msi
+)
+if %errorlevel% neq 0 exit /b %errorlevel%
+
+if not exist mercurial-4.8.0-x86 (
+     msiexec /a mercurial-4.8.0-x86.msi /qn TARGETDIR=%STARTPWD%\mercurial-4.8.0-x86
+)
 if %errorlevel% neq 0 exit /b %errorlevel%
 
 set PATH=%ORIGINALPATH%
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deploy/win32/easyhg.wxs	Fri Dec 07 13:41:32 2018 +0000
@@ -0,0 +1,389 @@
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+
+  <Product
+      Name="EasyMercurial" 
+      Id="*"
+      Language="1033"
+      Codepage="1252" 
+      Version="1.3.0" 
+      UpgradeCode="B82DFDA9-B9DE-49BC-93E5-0B96F9DEB04B"
+      Manufacturer="Queen Mary, University of London">
+    
+    <Package
+        Id="*"
+        Keywords="Installer"
+        Description="EasyMercurial Installer" 
+        Comments="Copyright (c) 2012 Queen Mary, University of London and others." 
+        Manufacturer="Queen Mary, University of London" 
+        InstallerVersion="100" 
+        Languages="1033" 
+        Compressed="yes" 
+        SummaryCodepage="1252"/>
+
+    <MajorUpgrade DowngradeErrorMessage="A later version of EasyMercurial is already installed. Setup will now exit."/>
+
+    <Media Id="1" Cabinet="easyhg.cab" EmbedCab="yes" DiskPrompt="CD-ROM #1"/>
+    <Property Id="DiskPrompt" Value="EasyMercurial Installation [1]"/>
+
+    <Directory Id="TARGETDIR" Name="SourceDir">
+      <Directory Id="ProgramFilesFolder" Name="PFiles">
+        <Directory Id="INSTALLDIR" Name="EasyMercurial">
+            
+            <Component
+                Id="MainExecutable"
+                Guid="DC128BA9-25A8-431E-8A88-7E0445E850B9">
+
+              <File
+                  Id="EasyHg"
+                  Name="EasyMercurial.exe"
+                  DiskId="1"
+                  Source="release\EasyMercurial.exe"
+                  KeyPath="yes">
+
+                <Shortcut
+                    Id="EasyHgStartEntry"
+                    Directory="ProgramMenuDir"
+                    Name="EasyMercurial"
+                    WorkingDirectory="INSTALLDIR"
+                    Icon="easyhg.ico"
+                    IconIndex="0"
+                    Advertise="yes"/>
+
+                <Shortcut
+                    Id="EasyHgDesktop"
+                    Directory="DesktopFolder"
+                    Name="EasyMercurial"
+                    WorkingDirectory="INSTALLDIR"
+                    Icon="easyhg.ico"
+                    IconIndex="0"
+                    Advertise="yes"/>
+              </File>
+
+              <File
+                  Id="COPYING"
+                  Name="COPYING"
+                  DiskId="1"
+                  Source="COPYING"/>
+
+              <File
+                  Id="easyhg.ico"
+                  Name="easyhg.ico"
+                  DiskId="1"
+                  Source="easyhg.ico"/>
+            </Component>
+
+            <Component
+                Id="HelperScripts"
+                Guid="971EA788-347E-4CDE-9899-69EEBE117BDD">
+
+              <File
+                  Id="mergebat"
+                  Name="easyhg-merge.bat"
+                  DiskId="1"
+                  Source="easyhg-merge.bat"
+                  KeyPath="yes"/>
+            </Component>		  
+
+            <Component
+                Id="VCLIBS"
+                Guid="2566C8F0-A2AD-40E9-A356-94E887CC1222">
+              <File
+                  Id="MSVCP100"
+                  Name="MSVCP100.dll"
+                  DiskId="1"
+                  Source="c:\windows\system32\MSVCP100.DLL"
+                  KeyPath="yes"/>
+              <File
+                  Id="MSVCR100"
+                  Name="MSVCR100.dll"
+                  DiskId="1"
+                  Source="c:\windows\system32\MSVCR100.DLL"/>
+            </Component>
+
+            <Component
+                Id="Qt4"
+                Guid="04F730AC-B361-45A2-B1CC-9CEB55256117">
+              <File
+                  Id="QtCore"
+                  Name="QtCore4.dll"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\QtCore4.dll"
+		  KeyPath="yes"/>
+              <File
+                  Id="QtGui"
+                  Name="QtGui4.dll"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\QtGui4.dll"/>
+              <File
+                  Id="QtNetwork"
+                  Name="QtNetwork4.dll"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\QtNetwork4.dll"/>
+            </Component>
+
+            <Component
+                Id="hg"
+                Guid="5BBC4080-2EDF-4616-A8CB-F96B9C942C1A">
+
+              <File
+                  Id="hg"
+                  Name="hg.exe"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\hg.exe"
+                  KeyPath="yes"/>
+              <File
+                  Id="pydll"
+                  Name="python27.dll"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\python27.dll"/>
+              <File
+                  Id="hglib"
+                  Name="library.zip"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\library.zip"/>
+              <File
+                  Id="plink"
+                  Name="TortoisePlink.exe"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\TortoisePlink.exe"/>
+              <File
+                  Id="ctypes"
+                  Name="_ctypes.pyd"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\_ctypes.pyd"/>
+              <File
+                  Id="ctypestest"
+                  Name="_ctypes_test.pyd"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\_ctypes_test.pyd"/>
+              <File
+                  Id="elementtree"
+                  Name="_elementtree.pyd"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\_elementtree.pyd"/>
+              <File
+                  Id="hashlib"
+                  Name="_hashlib.pyd"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\_hashlib.pyd"/>
+              <File
+                  Id="socket"
+                  Name="_socket.pyd"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\_socket.pyd"/>
+              <File
+                  Id="ssl"
+                  Name="_ssl.pyd"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\_ssl.pyd"/>
+              <File
+                  Id="winsysloader"
+                  Name="_win32sysloader.pyd"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\_win32sysloader.pyd"/>
+              <File
+                  Id="bz"
+                  Name="bz2.pyd"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\bz2.pyd"/>
+              <File
+                  Id="dulwichobjects"
+                  Name="dulwich._objects.pyd"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\dulwich._objects.pyd"/>
+              <File
+                  Id="dulwichpack"
+                  Name="dulwich._pack.pyd"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\dulwich._pack.pyd"/>
+              <File
+                  Id="libsvncore"
+                  Name="libsvn._core.pyd"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\libsvn._core.pyd"/>
+              <File
+                  Id="libsvnclient"
+                  Name="libsvn._client.pyd"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\libsvn._client.pyd"/>
+              <File
+                  Id="libsvndelta"
+                  Name="libsvn._delta.pyd"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\libsvn._delta.pyd"/>
+              <File
+                  Id="libsvnra"
+                  Name="libsvn._ra.pyd"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\libsvn._ra.pyd"/>
+              <File
+                  Id="libsvnwc"
+                  Name="libsvn._wc.pyd"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\libsvn._wc.pyd"/>
+              <File
+                  Id="mercurialbase"
+                  Name="mercurial.base85.pyd"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\mercurial.base85.pyd"/>
+              <File
+                  Id="mercurialbdiff"
+                  Name="mercurial.bdiff.pyd"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\mercurial.bdiff.pyd"/>
+              <File
+                  Id="mercurialdiffhelpers"
+                  Name="mercurial.diffhelpers.pyd"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\mercurial.diffhelpers.pyd"/>
+              <File
+                  Id="mercurialmpatch"
+                  Name="mercurial.mpatch.pyd"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\mercurial.mpatch.pyd"/>
+              <File
+                  Id="mercurialosutil"
+                  Name="mercurial.osutil.pyd"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\mercurial.osutil.pyd"/>
+              <File
+                  Id="mercurialparsers"
+                  Name="mercurial.parsers.pyd"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\mercurial.parsers.pyd"/>
+              <File
+                  Id="pyexpat"
+                  Name="pyexpat.pyd"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\pyexpat.pyd"/>
+              <File
+                  Id="unicodedata"
+                  Name="unicodedata.pyd"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\unicodedata.pyd"/>
+              <File
+                  Id="QtCorepy"
+                  Name="PyQt4.QtCore.pyd"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\PyQt4.QtCore.pyd" />
+              <File
+                  Id="QtGuipy"
+                  Name="PyQt4.QtGui.pyd"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\PyQt4.QtGui.pyd" />
+            </Component>		  
+
+            <Component
+                Id="sip"
+                Guid="DCCE0979-A0A6-475D-B6CD-3173740593F9">
+              <File
+                  Id="sip"
+                  Name="sip.pyd"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\sip.pyd" />
+            </Component>
+
+            <Component
+                Id="kdiff3"
+                Guid="6BA0CB20-F426-42AB-A95A-615A4FF87752">
+              <File
+                  Id="kdiff3"
+                  Name="kdiff3.exe"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\kdiff3.exe"
+                  KeyPath="yes"/>
+            </Component>		  
+
+	    <Directory Id="Crypto" Name="Crypto">
+	      <Directory Id="Cipher" Name="Cipher">
+		<Component
+		    Id="cryptocipher"
+		    Guid="FB7C7C7E-FC62-4024-9E7E-47034B416286">
+		  <File
+		      Id="cipherinit"
+		      Name="__init__.py"
+		      DiskId="1"
+		      Source="d:\easyhg-bundle-dependencies\Crypto\Cipher\__init__.py" />
+		  <File
+		      Id="cipheraesd"
+		      Name="_AES.pyd"
+		      DiskId="1"
+		      Source="d:\easyhg-bundle-dependencies\Crypto\Cipher\_AES.pyd" />
+		  <File
+		      Id="cipheraes"
+		      Name="AES.py"
+		      DiskId="1"
+		      Source="d:\easyhg-bundle-dependencies\Crypto\Cipher\AES.py" />
+		  <File
+		      Id="cipherblockalgo"
+		      Name="blockalgo.py"
+		      DiskId="1"
+		      Source="d:\easyhg-bundle-dependencies\Crypto\Cipher\blockalgo.py" />
+		</Component>
+	      </Directory>
+	      <Directory Id="Util" Name="Util">
+		
+		<Component
+		    Id="cryptoutil"
+		    Guid="9B5FB64F-B5B3-4E36-A4E6-1EC648470557">
+		  <File
+		      Id="utilinit"
+		      Name="__init__.py"
+		      DiskId="1"
+		      Source="d:\easyhg-bundle-dependencies\Crypto\Util\__init__.py" />
+		  <File
+		      Id="utilpy3compat"
+		      Name="py3compat.py"
+		      DiskId="1"
+		      Source="d:\easyhg-bundle-dependencies\Crypto\Util\py3compat.py" />
+		</Component>
+	      </Directory>
+	      
+	      <Component
+		  Id="crypto"
+		  Guid="AB5D6864-6D47-4C51-A132-5E0EC5BE1EF8">
+		<File
+		    Id="cryptoinit"
+		    Name="__init__.py"
+		    DiskId="1"
+		    Source="d:\easyhg-bundle-dependencies\Crypto\__init__.py" />
+	      </Component>
+
+	    </Directory>
+
+        </Directory>
+      </Directory>
+
+      <Directory Id="ProgramMenuFolder" Name="Programs">
+        <Directory Id="ProgramMenuDir" Name="EasyMercurial">
+          <Component Id="ProgramMenuDir" Guid="2E8BDEA0-A6E4-4607-854D-E317A23A535B">
+            <RemoveFolder Id="ProgramMenuDir" On="uninstall"/>
+            <RegistryValue Root="HKMU" Key="Software\[Manufacturer]\[ProductName]" Type="string" Value="" KeyPath="yes"/>
+          </Component>
+        </Directory>
+      </Directory>
+
+      <Directory Id="DesktopFolder" Name="Desktop"/>
+
+    </Directory>
+
+    <Feature Id="Complete" Level="1">
+      <ComponentRef Id="MainExecutable"/>
+      <ComponentRef Id="VCLIBS"/>
+      <ComponentRef Id="HelperScripts"/>
+      <ComponentRef Id="Qt4"/>
+      <ComponentRef Id="hg"/>
+      <ComponentRef Id="sip"/>
+      <ComponentRef Id="crypto"/>
+      <ComponentRef Id="cryptocipher"/>
+      <ComponentRef Id="cryptoutil"/>
+      <ComponentRef Id="kdiff3"/>
+      <ComponentRef Id="ProgramMenuDir"/>
+    </Feature>
+
+    <Icon
+        Id="easyhg.ico"
+        SourceFile="easyhg.ico"/>
+
+  </Product>
+</Wix>
--- a/easyhg.wxs	Thu Dec 06 13:54:34 2018 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,389 +0,0 @@
-<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
-
-  <Product
-      Name="EasyMercurial" 
-      Id="*"
-      Language="1033"
-      Codepage="1252" 
-      Version="1.3.0" 
-      UpgradeCode="B82DFDA9-B9DE-49BC-93E5-0B96F9DEB04B"
-      Manufacturer="Queen Mary, University of London">
-    
-    <Package
-        Id="*"
-        Keywords="Installer"
-        Description="EasyMercurial Installer" 
-        Comments="Copyright (c) 2012 Queen Mary, University of London and others." 
-        Manufacturer="Queen Mary, University of London" 
-        InstallerVersion="100" 
-        Languages="1033" 
-        Compressed="yes" 
-        SummaryCodepage="1252"/>
-
-    <MajorUpgrade DowngradeErrorMessage="A later version of EasyMercurial is already installed. Setup will now exit."/>
-
-    <Media Id="1" Cabinet="easyhg.cab" EmbedCab="yes" DiskPrompt="CD-ROM #1"/>
-    <Property Id="DiskPrompt" Value="EasyMercurial Installation [1]"/>
-
-    <Directory Id="TARGETDIR" Name="SourceDir">
-      <Directory Id="ProgramFilesFolder" Name="PFiles">
-        <Directory Id="INSTALLDIR" Name="EasyMercurial">
-            
-            <Component
-                Id="MainExecutable"
-                Guid="DC128BA9-25A8-431E-8A88-7E0445E850B9">
-
-              <File
-                  Id="EasyHg"
-                  Name="EasyMercurial.exe"
-                  DiskId="1"
-                  Source="release\EasyMercurial.exe"
-                  KeyPath="yes">
-
-                <Shortcut
-                    Id="EasyHgStartEntry"
-                    Directory="ProgramMenuDir"
-                    Name="EasyMercurial"
-                    WorkingDirectory="INSTALLDIR"
-                    Icon="easyhg.ico"
-                    IconIndex="0"
-                    Advertise="yes"/>
-
-                <Shortcut
-                    Id="EasyHgDesktop"
-                    Directory="DesktopFolder"
-                    Name="EasyMercurial"
-                    WorkingDirectory="INSTALLDIR"
-                    Icon="easyhg.ico"
-                    IconIndex="0"
-                    Advertise="yes"/>
-              </File>
-
-              <File
-                  Id="COPYING"
-                  Name="COPYING"
-                  DiskId="1"
-                  Source="COPYING"/>
-
-              <File
-                  Id="easyhg.ico"
-                  Name="easyhg.ico"
-                  DiskId="1"
-                  Source="easyhg.ico"/>
-            </Component>
-
-            <Component
-                Id="HelperScripts"
-                Guid="971EA788-347E-4CDE-9899-69EEBE117BDD">
-
-              <File
-                  Id="mergebat"
-                  Name="easyhg-merge.bat"
-                  DiskId="1"
-                  Source="easyhg-merge.bat"
-                  KeyPath="yes"/>
-            </Component>		  
-
-            <Component
-                Id="VCLIBS"
-                Guid="2566C8F0-A2AD-40E9-A356-94E887CC1222">
-              <File
-                  Id="MSVCP100"
-                  Name="MSVCP100.dll"
-                  DiskId="1"
-                  Source="c:\windows\system32\MSVCP100.DLL"
-                  KeyPath="yes"/>
-              <File
-                  Id="MSVCR100"
-                  Name="MSVCR100.dll"
-                  DiskId="1"
-                  Source="c:\windows\system32\MSVCR100.DLL"/>
-            </Component>
-
-            <Component
-                Id="Qt4"
-                Guid="04F730AC-B361-45A2-B1CC-9CEB55256117">
-              <File
-                  Id="QtCore"
-                  Name="QtCore4.dll"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\QtCore4.dll"
-		  KeyPath="yes"/>
-              <File
-                  Id="QtGui"
-                  Name="QtGui4.dll"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\QtGui4.dll"/>
-              <File
-                  Id="QtNetwork"
-                  Name="QtNetwork4.dll"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\QtNetwork4.dll"/>
-            </Component>
-
-            <Component
-                Id="hg"
-                Guid="5BBC4080-2EDF-4616-A8CB-F96B9C942C1A">
-
-              <File
-                  Id="hg"
-                  Name="hg.exe"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\hg.exe"
-                  KeyPath="yes"/>
-              <File
-                  Id="pydll"
-                  Name="python27.dll"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\python27.dll"/>
-              <File
-                  Id="hglib"
-                  Name="library.zip"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\library.zip"/>
-              <File
-                  Id="plink"
-                  Name="TortoisePlink.exe"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\TortoisePlink.exe"/>
-              <File
-                  Id="ctypes"
-                  Name="_ctypes.pyd"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\_ctypes.pyd"/>
-              <File
-                  Id="ctypestest"
-                  Name="_ctypes_test.pyd"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\_ctypes_test.pyd"/>
-              <File
-                  Id="elementtree"
-                  Name="_elementtree.pyd"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\_elementtree.pyd"/>
-              <File
-                  Id="hashlib"
-                  Name="_hashlib.pyd"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\_hashlib.pyd"/>
-              <File
-                  Id="socket"
-                  Name="_socket.pyd"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\_socket.pyd"/>
-              <File
-                  Id="ssl"
-                  Name="_ssl.pyd"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\_ssl.pyd"/>
-              <File
-                  Id="winsysloader"
-                  Name="_win32sysloader.pyd"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\_win32sysloader.pyd"/>
-              <File
-                  Id="bz"
-                  Name="bz2.pyd"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\bz2.pyd"/>
-              <File
-                  Id="dulwichobjects"
-                  Name="dulwich._objects.pyd"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\dulwich._objects.pyd"/>
-              <File
-                  Id="dulwichpack"
-                  Name="dulwich._pack.pyd"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\dulwich._pack.pyd"/>
-              <File
-                  Id="libsvncore"
-                  Name="libsvn._core.pyd"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\libsvn._core.pyd"/>
-              <File
-                  Id="libsvnclient"
-                  Name="libsvn._client.pyd"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\libsvn._client.pyd"/>
-              <File
-                  Id="libsvndelta"
-                  Name="libsvn._delta.pyd"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\libsvn._delta.pyd"/>
-              <File
-                  Id="libsvnra"
-                  Name="libsvn._ra.pyd"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\libsvn._ra.pyd"/>
-              <File
-                  Id="libsvnwc"
-                  Name="libsvn._wc.pyd"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\libsvn._wc.pyd"/>
-              <File
-                  Id="mercurialbase"
-                  Name="mercurial.base85.pyd"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\mercurial.base85.pyd"/>
-              <File
-                  Id="mercurialbdiff"
-                  Name="mercurial.bdiff.pyd"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\mercurial.bdiff.pyd"/>
-              <File
-                  Id="mercurialdiffhelpers"
-                  Name="mercurial.diffhelpers.pyd"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\mercurial.diffhelpers.pyd"/>
-              <File
-                  Id="mercurialmpatch"
-                  Name="mercurial.mpatch.pyd"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\mercurial.mpatch.pyd"/>
-              <File
-                  Id="mercurialosutil"
-                  Name="mercurial.osutil.pyd"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\mercurial.osutil.pyd"/>
-              <File
-                  Id="mercurialparsers"
-                  Name="mercurial.parsers.pyd"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\mercurial.parsers.pyd"/>
-              <File
-                  Id="pyexpat"
-                  Name="pyexpat.pyd"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\pyexpat.pyd"/>
-              <File
-                  Id="unicodedata"
-                  Name="unicodedata.pyd"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\unicodedata.pyd"/>
-              <File
-                  Id="QtCorepy"
-                  Name="PyQt4.QtCore.pyd"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\PyQt4.QtCore.pyd" />
-              <File
-                  Id="QtGuipy"
-                  Name="PyQt4.QtGui.pyd"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\PyQt4.QtGui.pyd" />
-            </Component>		  
-
-            <Component
-                Id="sip"
-                Guid="DCCE0979-A0A6-475D-B6CD-3173740593F9">
-              <File
-                  Id="sip"
-                  Name="sip.pyd"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\sip.pyd" />
-            </Component>
-
-            <Component
-                Id="kdiff3"
-                Guid="6BA0CB20-F426-42AB-A95A-615A4FF87752">
-              <File
-                  Id="kdiff3"
-                  Name="kdiff3.exe"
-                  DiskId="1"
-                  Source="d:\easyhg-bundle-dependencies\kdiff3.exe"
-                  KeyPath="yes"/>
-            </Component>		  
-
-	    <Directory Id="Crypto" Name="Crypto">
-	      <Directory Id="Cipher" Name="Cipher">
-		<Component
-		    Id="cryptocipher"
-		    Guid="FB7C7C7E-FC62-4024-9E7E-47034B416286">
-		  <File
-		      Id="cipherinit"
-		      Name="__init__.py"
-		      DiskId="1"
-		      Source="d:\easyhg-bundle-dependencies\Crypto\Cipher\__init__.py" />
-		  <File
-		      Id="cipheraesd"
-		      Name="_AES.pyd"
-		      DiskId="1"
-		      Source="d:\easyhg-bundle-dependencies\Crypto\Cipher\_AES.pyd" />
-		  <File
-		      Id="cipheraes"
-		      Name="AES.py"
-		      DiskId="1"
-		      Source="d:\easyhg-bundle-dependencies\Crypto\Cipher\AES.py" />
-		  <File
-		      Id="cipherblockalgo"
-		      Name="blockalgo.py"
-		      DiskId="1"
-		      Source="d:\easyhg-bundle-dependencies\Crypto\Cipher\blockalgo.py" />
-		</Component>
-	      </Directory>
-	      <Directory Id="Util" Name="Util">
-		
-		<Component
-		    Id="cryptoutil"
-		    Guid="9B5FB64F-B5B3-4E36-A4E6-1EC648470557">
-		  <File
-		      Id="utilinit"
-		      Name="__init__.py"
-		      DiskId="1"
-		      Source="d:\easyhg-bundle-dependencies\Crypto\Util\__init__.py" />
-		  <File
-		      Id="utilpy3compat"
-		      Name="py3compat.py"
-		      DiskId="1"
-		      Source="d:\easyhg-bundle-dependencies\Crypto\Util\py3compat.py" />
-		</Component>
-	      </Directory>
-	      
-	      <Component
-		  Id="crypto"
-		  Guid="AB5D6864-6D47-4C51-A132-5E0EC5BE1EF8">
-		<File
-		    Id="cryptoinit"
-		    Name="__init__.py"
-		    DiskId="1"
-		    Source="d:\easyhg-bundle-dependencies\Crypto\__init__.py" />
-	      </Component>
-
-	    </Directory>
-
-        </Directory>
-      </Directory>
-
-      <Directory Id="ProgramMenuFolder" Name="Programs">
-        <Directory Id="ProgramMenuDir" Name="EasyMercurial">
-          <Component Id="ProgramMenuDir" Guid="2E8BDEA0-A6E4-4607-854D-E317A23A535B">
-            <RemoveFolder Id="ProgramMenuDir" On="uninstall"/>
-            <RegistryValue Root="HKMU" Key="Software\[Manufacturer]\[ProductName]" Type="string" Value="" KeyPath="yes"/>
-          </Component>
-        </Directory>
-      </Directory>
-
-      <Directory Id="DesktopFolder" Name="Desktop"/>
-
-    </Directory>
-
-    <Feature Id="Complete" Level="1">
-      <ComponentRef Id="MainExecutable"/>
-      <ComponentRef Id="VCLIBS"/>
-      <ComponentRef Id="HelperScripts"/>
-      <ComponentRef Id="Qt4"/>
-      <ComponentRef Id="hg"/>
-      <ComponentRef Id="sip"/>
-      <ComponentRef Id="crypto"/>
-      <ComponentRef Id="cryptocipher"/>
-      <ComponentRef Id="cryptoutil"/>
-      <ComponentRef Id="kdiff3"/>
-      <ComponentRef Id="ProgramMenuDir"/>
-    </Feature>
-
-    <Icon
-        Id="easyhg.ico"
-        SourceFile="easyhg.ico"/>
-
-  </Product>
-</Wix>
--- a/src/mainwindow.cpp	Thu Dec 06 13:54:34 2018 +0000
+++ b/src/mainwindow.cpp	Fri Dec 07 13:41:32 2018 +0000
@@ -874,14 +874,13 @@
         // forward slashes as directory separators, Windows
         // Explorer is not
         int last = m_workFolderPath.length() - 1;
-        char c = m_workFolderPath[last].toAscii();
+        QChar c = m_workFolderPath[last];
         if (c == '\\' || c == '/') {
             m_workFolderPath.chop(1);
         }
         file = m_workFolderPath + "\\" + file;
         file = file.replace('/', '\\');
         args << "/select," << file;
-        // FIXME: This shouldn't be using a hardcoded path.
         QProcess::execute("c:/windows/explorer.exe", args);
 #elif defined(Q_OS_MAC)
         file = m_workFolderPath + "/" + file;