changeset 583:e40e3ebe9f2e fswatcher

Merge from default branch
author Chris Cannam
date Mon, 12 Mar 2012 14:58:40 +0000
parents 9f91d1b2ed51 (current diff) f3a61f28896e (diff)
children 09b9849b9800
files easyhg-icon.ico help/topics/34.txt images/crappy-icon-design.xcf images/crappy-icon.png
diffstat 114 files changed, 1120 insertions(+), 297 deletions(-) [+]
line wrap: on
line diff
--- a/.hgtags	Tue Feb 14 17:53:29 2012 +0000
+++ b/.hgtags	Mon Mar 12 14:58:40 2012 +0000
@@ -15,3 +15,4 @@
 319f920a51ee61df29701db8ad9bdb413c66a399 easyhg_v0.9.8
 6bb2a1f3087cd57d5a3296bbb82a494b7fa609c6 easyhg_v1.0
 06507a59f2b8f5db9ae37e0dcd37a320e03ae8b8 easyhg_v1.1
+ca943d5147697d8a63d835e1227315fefee0691b easyhg_v1.2
--- a/CHANGELOG	Tue Feb 14 17:53:29 2012 +0000
+++ b/CHANGELOG	Mon Mar 12 14:58:40 2012 +0000
@@ -1,3 +1,20 @@
+Changes in v1.2 since v1.1:
+
+ * Add a Find function to both My Work and History tabs
+ * Add a Cancel button to the progress bar in the status line when
+   carrying out network operations
+ * Remove Refresh button from the toolbar. This button was found to be
+   causing significant confusion, as some users interpreted it as
+   meaning resynchronise with the server, while in fact all it did was
+   re-read the local working copy. The function is still present, but
+   has been relegated to File -> Re-Read Working Folder
+ * Rework the filesystem watcher code, making it generally more
+   reliable (a requirement for removing the Refresh button)
+ * Fix problem with return codes in Mercurial 2.1 causing push and
+   pull to be reported as failing
+ * Make it possible to clear the remote repository URL
+ * Switch the Windows installer from InstallJammer to WiX
+
 Changes in v1.1 since v1.0.1:
 
  * Closed branches are now supported: you can close a branch in EasyMercurial
--- a/README.txt	Tue Feb 14 17:53:29 2012 +0000
+++ b/README.txt	Mon Mar 12 14:58:40 2012 +0000
@@ -44,8 +44,8 @@
 
 EasyMercurial is
 Copyright 2010 Jari Korhonen
-Copyright 2010-2011 Chris Cannam
-Copyright 2010-2011 Queen Mary, University of London
+Copyright 2010-2012 Chris Cannam
+Copyright 2010-2012 Queen Mary, University of London
 
 
 
--- a/deploy/osx/deploy.sh	Tue Feb 14 17:53:29 2012 +0000
+++ b/deploy/osx/deploy.sh	Mon Mar 12 14:58:40 2012 +0000
@@ -30,6 +30,7 @@
 mkdir "$volume" || exit 1
 
 ln -s /Applications "$volume"/Applications
+cp COPYING "$volume/COPYING.txt"
 cp -RPp "$source" "$target"
 
 echo "Done"
Binary file easyhg-icon.icns has changed
Binary file easyhg-icon.ico has changed
Binary file easyhg.ico has changed
--- a/easyhg.pro	Tue Feb 14 17:53:29 2012 +0000
+++ b/easyhg.pro	Mon Mar 12 14:58:40 2012 +0000
@@ -65,7 +65,8 @@
     src/hgignoredialog.h \
     src/versiontester.h \
     src/squeezedlabel.h \
-    src/fswatcher.h
+    src/fswatcher.h \
+    src/findwidget.h
 SOURCES = \
     src/main.cpp \
     src/mainwindow.cpp \
@@ -103,7 +104,8 @@
     src/hgignoredialog.cpp \
     src/versiontester.cpp \
     src/squeezedlabel.cpp \
-    src/fswatcher.cpp
+    src/fswatcher.cpp \
+    src/findwidget.cpp
 
 macx-* {
     SOURCES += src/common_osx.mm
--- a/easyhg.py	Tue Feb 14 17:53:29 2012 +0000
+++ b/easyhg.py	Mon Mar 12 14:58:40 2012 +0000
@@ -4,8 +4,8 @@
 #
 #    Based on hgExplorer by Jari Korhonen
 #    Copyright (c) 2010 Jari Korhonen
-#    Copyright (c) 2010-2011 Chris Cannam
-#    Copyright (c) 2010-2011 Queen Mary, University of London
+#    Copyright (c) 2010-2012 Chris Cannam
+#    Copyright (c) 2010-2012 Queen Mary, University of London
 #    
 #    This program is free software; you can redistribute it and/or
 #    modify it under the terms of the GNU General Public License as
--- a/easyhg.qrc	Tue Feb 14 17:53:29 2012 +0000
+++ b/easyhg.qrc	Mon Mar 12 14:58:40 2012 +0000
@@ -27,6 +27,7 @@
         <file>images/home.png</file>
         <file>images/back.png</file>
         <file>images/forward.png</file>
+        <file>images/cancel-small.png</file>
 	<file>help/topics.html</file>
 	<file>help/help.css</file>
 	<file>help/a-04.html</file>
@@ -43,6 +44,7 @@
 	<file>help/a-32.html</file>
 	<file>help/a-33.html</file>
 	<file>help/a-34.html</file>
+	<file>help/a-35.html</file>
 	<file>help/a-40.html</file>
 	<file>help/images/openremote50.png</file>
 	<file>help/images/openfolder50.png</file>
--- a/easyhg.rc	Tue Feb 14 17:53:29 2012 +0000
+++ b/easyhg.rc	Mon Mar 12 14:58:40 2012 +0000
@@ -1,1 +1,1 @@
-IDI_ICON1 ICON DISCARDABLE "easyhg-icon.ico"
+IDI_ICON1 ICON DISCARDABLE "easyhg.ico"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/easyhg.wxs	Mon Mar 12 14:58:40 2012 +0000
@@ -0,0 +1,232 @@
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+
+  <Product
+      Name="EasyMercurial" 
+      Id="CDD72D35-518B-49E2-A389-B3F7C1AE289D" 
+      Language="1033"
+      Codepage="1252" 
+      Version="1.2.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"/>
+
+    <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="EasyHg" Name="EasyMercurial">
+          <Directory Id="INSTALLDIR" Name="EasyMercurial 1.2.0">
+            
+            <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"/>
+            </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="python26.dll"
+                  DiskId="1"
+                  Source="d:\easyhg-bundle-dependencies\python26.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"/>
+            </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="PyQt4" Name="PyQt4">
+              <Component
+                  Id="PyQt4"
+                  Guid="5EE2BE01-3D91-44C5-869A-5E8167079AA0">
+                <File
+                    Id="init"
+                    Name="__init__.py"
+                    DiskId="1"
+                    Source="d:\easyhg-bundle-dependencies\PyQt4\__init__.py"
+                    KeyPath="yes"/>
+                <File
+                    Id="inito"
+                    Name="__init__.pyo"
+                    DiskId="1"
+                    Source="d:\easyhg-bundle-dependencies\PyQt4\__init__.pyo" />
+                <File
+                    Id="Qtpy"
+                    Name="Qt.pyd"
+                    DiskId="1"
+                    Source="d:\easyhg-bundle-dependencies\PyQt4\Qt.pyd" />
+                <File
+                    Id="QtCorepy"
+                    Name="QtCore.pyd"
+                    DiskId="1"
+                    Source="d:\easyhg-bundle-dependencies\PyQt4\QtCore.pyd" />
+                <File
+                    Id="QtGuipy"
+                    Name="QtGui.pyd"
+                    DiskId="1"
+                    Source="d:\easyhg-bundle-dependencies\PyQt4\QtGui.pyd" />
+              </Component>
+            </Directory>
+
+          </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="HKCU" 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="kdiff3"/>
+      <ComponentRef Id="PyQt4"/>
+      <ComponentRef Id="ProgramMenuDir"/>
+    </Feature>
+
+    <Icon
+        Id="easyhg.ico"
+        SourceFile="easyhg.ico"/>
+
+  </Product>
+</Wix>
--- a/easyhg_en.ts	Tue Feb 14 17:53:29 2012 +0000
+++ b/easyhg_en.ts	Mon Mar 12 14:58:40 2012 +0000
@@ -868,7 +868,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>&lt;qt&gt;&lt;h2&gt;EasyMercurial v%1&lt;/h2&gt;&lt;font size=-1&gt;&lt;p&gt;EasyMercurial is a simple user interface for the Mercurial&lt;/a&gt; version control system.&lt;/p&gt;&lt;h4&gt;Credits and Copyright&lt;/h4&gt;&lt;p&gt;Development carried out by Chris Cannam for SoundSoftware.ac.uk at the Centre for Digital Music, Queen Mary, University of London.&lt;/p&gt;&lt;p&gt;EasyMercurial is based on HgExplorer by Jari Korhonen, with thanks.&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;Copyright &amp;copy; 2011 Queen Mary, University of London.&lt;br&gt;Copyright &amp;copy; 2010 Jari Korhonen.&lt;br&gt;Copyright &amp;copy; 2011 Chris Cannam.&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;This program requires Mercurial, by Matt Mackall and others.&lt;br&gt;This program uses Qt by Nokia.&lt;br&gt;This program uses Nuvola icons by David Vignoni.&lt;br&gt;This program may use KDiff3 by Joachim Eibl.&lt;br&gt;This program may use PyQt by River Bank Computing.&lt;br&gt;Packaging for Mercurial and other dependencies on Windows is derived from TortoiseHg by Steve Borho and others.&lt;/p&gt;&lt;h4&gt;License&lt;/h4&gt;&lt;p&gt;This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.  See the file COPYING included with this distribution for more information.&lt;/p&gt;&lt;/font&gt;</source>
+        <source>&lt;qt&gt;&lt;h2&gt;EasyMercurial v%1&lt;/h2&gt;&lt;font size=-1&gt;&lt;p&gt;EasyMercurial is a simple user interface for the Mercurial&lt;/a&gt; version control system.&lt;/p&gt;&lt;h4&gt;Credits and Copyright&lt;/h4&gt;&lt;p&gt;Development carried out by Chris Cannam for SoundSoftware.ac.uk at the Centre for Digital Music, Queen Mary, University of London.&lt;/p&gt;&lt;p&gt;EasyMercurial is based on HgExplorer by Jari Korhonen, with thanks.&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;Copyright &amp;copy; 2012 Queen Mary, University of London.&lt;br&gt;Copyright &amp;copy; 2010 Jari Korhonen.&lt;br&gt;Copyright &amp;copy; 2012 Chris Cannam.&lt;/p&gt;&lt;p style=&quot;margin-left: 2em;&quot;&gt;This program requires Mercurial, by Matt Mackall and others.&lt;br&gt;This program uses Qt by Nokia.&lt;br&gt;This program uses Nuvola icons by David Vignoni.&lt;br&gt;This program may use KDiff3 by Joachim Eibl.&lt;br&gt;This program may use PyQt by River Bank Computing.&lt;br&gt;Packaging for Mercurial and other dependencies on Windows is derived from TortoiseHg by Steve Borho and others.&lt;/p&gt;&lt;h4&gt;License&lt;/h4&gt;&lt;p&gt;This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.  See the file COPYING included with this distribution for more information.&lt;/p&gt;&lt;/font&gt;</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
--- a/help/a-34.html	Tue Feb 14 17:53:29 2012 +0000
+++ b/help/a-34.html	Mon Mar 12 14:58:40 2012 +0000
@@ -1,57 +1,30 @@
 <link rel="stylesheet" type="text/css" href="help.css"/>
 
 
-<h2>How do I use the Merge window?</h2>
+<h2>Every time I push some changes, I have to type my password again</h2>
 
-<p>If you are working with other people on a project, it is likely that
-at some point you'll find that more than one of you have edited the
-same lines in the same file, in different ways.</p>
+<p>When you push to a remote repository with an &ldquo;https:" prefix on its
+URL, EasyMercurial's password dialog should ask whether you want to
+remember your login details.</p>
 
-<p>When that happens and you try to merge the two versions, EasyMercurial
-will pop up a merge window that looks a bit like this.</p>
+<p>If you say yes, the details will be stored until EasyMercurial
+exits&mdash;so you won't have to enter them if you push or pull again
+while the present EasyMercurial session is running. Your password will
+be stored, encrypted with a session key, in a file which is deleted
+when EasyMercurial exits.</p>
 
-<p><center><img src="images/merge50.png"></center></p>
+<p><b>If this option does not appear</b></p>
 
-<p>(This is actually a separate program, not part of EasyMercurial: it's
-a merge tool called kdiff3.)</p>
+<p>... and if you're using OS/X, then you need to install the PyCrypto
+library before EasyMercurial will be able to store encrypted passwords
+for you.</p>
 
-<p>This looks a bit complicated, but it is there to help you pick which
-of the changes from each of the two &ldquo;rival&rdquo; versions of the file you
-want to use in your merged version.</p>
+<p>Try running <code>sudo easy_install pycrypto</code> in a terminal window.</p>
 
-<p> <b>The top middle one is <i>your current version</i>.</b> That's
-  the one you had before you decided to merge the other version into
-  it.</p>
+<p><b>Not using an https repository?</b></p>
 
-<p> <b>At top right is <i>the version you're merging</i>.</b> That's the other
-  rival version &ndash; the one that the other person can see in their copy
-  of the repository.</p>
+<p>If your remote repository uses ssh or some other protocol, then
+EasyMercurial won't be able to help. You might consider using ssh
+public key authentication and an ssh agent&mdash;talk to the admin of your
+remote repository for more details.</p>
 
-<p> <b>At top left is <i>the common ancestor</i>.</b> That's the version that both
-  of you had, before you started editing it in different ways.</p>
-
-<p> <b>At the bottom is the output.</b></p>
-
-<p>Each <i>conflict</i> (a line which you have both changed in different ways)
-is shown with <b>Merge Conflict</b> in the output at the bottom.  To sort
-out the conflicts and get the right output, you need to go through
-them one by one, for each one pressing the A, B, or C button to say
-whether for this line you want the top-left, top-middle, or top-right
-version to &ldquo;win&rdquo;.  (You can choose more than one, if you want both
-versions of a line to appear.)</p>
-
-<p>Then having resolved a conflict, press the three-arrows-down toolbar
-button to go to the next one &ndash; and when you've done them all, save
-and exit.</p>
-
-<p>The most important thing to remember is that <i>whatever appears in the
-bottom pane is what you'll get as a result</i>.</p>
-
-<p>No matter how confusing the process, just remember that if it looks
-correct in the bottom pane, it will be correct when you save and
-exit. You can even edit the file directly in the bottom pane if you
-aren't happy with the way the merge is going.</p>
-
-
-
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help/a-35.html	Mon Mar 12 14:58:40 2012 +0000
@@ -0,0 +1,57 @@
+<link rel="stylesheet" type="text/css" href="help.css"/>
+
+
+<h2>How do I use the Merge window?</h2>
+
+<p>If you are working with other people on a project, it is likely that
+at some point you'll find that more than one of you have edited the
+same lines in the same file, in different ways.</p>
+
+<p>When that happens and you try to merge the two versions, EasyMercurial
+will pop up a merge window that looks a bit like this.</p>
+
+<p><center><img src="images/merge50.png"></center></p>
+
+<p>(This is actually a separate program, not part of EasyMercurial: it's
+a merge tool called kdiff3.)</p>
+
+<p>This looks a bit complicated, but it is there to help you pick which
+of the changes from each of the two &ldquo;rival&rdquo; versions of the file you
+want to use in your merged version.</p>
+
+<p> <b>The top middle one is <i>your current version</i>.</b> That's
+  the one you had before you decided to merge the other version into
+  it.</p>
+
+<p> <b>At top right is <i>the version you're merging</i>.</b> That's the other
+  rival version &ndash; the one that the other person can see in their copy
+  of the repository.</p>
+
+<p> <b>At top left is <i>the common ancestor</i>.</b> That's the version that both
+  of you had, before you started editing it in different ways.</p>
+
+<p> <b>At the bottom is the output.</b></p>
+
+<p>Each <i>conflict</i> (a line which you have both changed in different ways)
+is shown with <b>Merge Conflict</b> in the output at the bottom.  To sort
+out the conflicts and get the right output, you need to go through
+them one by one, for each one pressing the A, B, or C button to say
+whether for this line you want the top-left, top-middle, or top-right
+version to &ldquo;win&rdquo;.  (You can choose more than one, if you want both
+versions of a line to appear.)</p>
+
+<p>Then having resolved a conflict, press the three-arrows-down toolbar
+button to go to the next one &ndash; and when you've done them all, save
+and exit.</p>
+
+<p>The most important thing to remember is that <i>whatever appears in the
+bottom pane is what you'll get as a result</i>.</p>
+
+<p>No matter how confusing the process, just remember that if it looks
+correct in the bottom pane, it will be correct when you save and
+exit. You can even edit the file directly in the bottom pane if you
+aren't happy with the way the merge is going.</p>
+
+
+
+
Binary file help/images/openfolder50.png has changed
Binary file help/images/openlocal50.png has changed
Binary file help/images/openremote50.png has changed
--- a/help/topics.html	Tue Feb 14 17:53:29 2012 +0000
+++ b/help/topics.html	Mon Mar 12 14:58:40 2012 +0000
@@ -20,6 +20,7 @@
 <p><a href="a-31.html">I want to let my colleagues pull changes directly from my local repository</a></p>
 <p><a href="a-32.html">I want to put my changes into a master repository shared with my colleagues</a></p>
 <p><a href="a-33.html">I tried to push my changes, but it told me &ldquo;the remote repository may have been changed by someone else&rdquo; and refused</a></p>
-<p><a href="a-34.html">How do I use the Merge window?</a></p>
+<p><a href="a-34.html">Every time I push some changes, I have to type my password again</a></p>
+<p><a href="a-35.html">How do I use the Merge window?</a></p>
 <h3>See also</h3>
 <p><a href="a-40.html">Video tutorials</a></p>
--- a/help/topics/34.txt	Tue Feb 14 17:53:29 2012 +0000
+++ b/help/topics/34.txt	Mon Mar 12 14:58:40 2012 +0000
@@ -1,56 +1,28 @@
 {Sharing changes}
 
-How do I use the Merge window?
+Every time I push some changes, I have to type my password again
 
-If you are working with other people on a project, it is likely that
-at some point you'll find that more than one of you have edited the
-same lines in the same file, in different ways.
+When you push to a remote repository with an "https:" prefix on its
+URL, EasyMercurial's password dialog should ask whether you want to
+remember your login details.
 
-When that happens and you try to merge the two versions, EasyMercurial
-will pop up a merge window that looks a bit like this.
+If you say yes, the details will be stored until EasyMercurial
+exits---so you won't have to enter them if you push or pull again
+while the present EasyMercurial session is running. Your password will
+be stored, encrypted with a session key, in a file which is deleted
+when EasyMercurial exits.
 
-#merge50
+*If this option does not appear*
 
-(This is actually a separate program, not part of EasyMercurial: it's
-a merge tool called kdiff3.)
+... and if you're using OS/X, then you need to install the PyCrypto
+library before EasyMercurial will be able to store encrypted passwords
+for you.
 
-This looks a bit complicated, but it is there to help you pick which
-of the changes from each of the two "rival" versions of the file you
-want to use in your merged version.
+Try running @sudo easy_install pycrypto@ in a terminal window.
 
- *The top middle one is _your current version_.* That's
-  the one you had before you decided to merge the other version into
-  it.
+*Not using an https repository?*
 
- *At top right is _the version you're merging_.* That's the other
-  rival version -- the one that the other person can see in their copy
-  of the repository.
-
- *At top left is _the common ancestor_.* That's the version that both
-  of you had, before you started editing it in different ways.
-
- *At the bottom is the output.*
-
-Each _conflict_ (a line which you have both changed in different ways)
-is shown with *Merge Conflict* in the output at the bottom.  To sort
-out the conflicts and get the right output, you need to go through
-them one by one, for each one pressing the A, B, or C button to say
-whether for this line you want the top-left, top-middle, or top-right
-version to "win".  (You can choose more than one, if you want both
-versions of a line to appear.)
-
-Then having resolved a conflict, press the three-arrows-down toolbar
-button to go to the next one -- and when you've done them all, save
-and exit.
-
-The most important thing to remember is that _whatever appears in the
-bottom pane is what you'll get as a result_.
-
-No matter how confusing the process, just remember that if it looks
-correct in the bottom pane, it will be correct when you save and
-exit. You can even edit the file directly in the bottom pane if you
-aren't happy with the way the merge is going.
-
-
-
-
+If your remote repository uses ssh or some other protocol, then
+EasyMercurial won't be able to help. You might consider using ssh
+public key authentication and an ssh agent---talk to the admin of your
+remote repository for more details.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help/topics/35.txt	Mon Mar 12 14:58:40 2012 +0000
@@ -0,0 +1,56 @@
+{Sharing changes}
+
+How do I use the Merge window?
+
+If you are working with other people on a project, it is likely that
+at some point you'll find that more than one of you have edited the
+same lines in the same file, in different ways.
+
+When that happens and you try to merge the two versions, EasyMercurial
+will pop up a merge window that looks a bit like this.
+
+#merge50
+
+(This is actually a separate program, not part of EasyMercurial: it's
+a merge tool called kdiff3.)
+
+This looks a bit complicated, but it is there to help you pick which
+of the changes from each of the two "rival" versions of the file you
+want to use in your merged version.
+
+ *The top middle one is _your current version_.* That's
+  the one you had before you decided to merge the other version into
+  it.
+
+ *At top right is _the version you're merging_.* That's the other
+  rival version -- the one that the other person can see in their copy
+  of the repository.
+
+ *At top left is _the common ancestor_.* That's the version that both
+  of you had, before you started editing it in different ways.
+
+ *At the bottom is the output.*
+
+Each _conflict_ (a line which you have both changed in different ways)
+is shown with *Merge Conflict* in the output at the bottom.  To sort
+out the conflicts and get the right output, you need to go through
+them one by one, for each one pressing the A, B, or C button to say
+whether for this line you want the top-left, top-middle, or top-right
+version to "win".  (You can choose more than one, if you want both
+versions of a line to appear.)
+
+Then having resolved a conflict, press the three-arrows-down toolbar
+button to go to the next one -- and when you've done them all, save
+and exit.
+
+The most important thing to remember is that _whatever appears in the
+bottom pane is what you'll get as a result_.
+
+No matter how confusing the process, just remember that if it looks
+correct in the bottom pane, it will be correct when you save and
+exit. You can even edit the file directly in the bottom pane if you
+aren't happy with the way the merge is going.
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help/topics/40.txt	Mon Mar 12 14:58:40 2012 +0000
@@ -0,0 +1,8 @@
+{See also}
+
+Video tutorials
+
+There are some very simple video tutorials available on the EasyMercurial website.
+
+Please see [[http://easyhg.org/videos.html]].
+
Binary file images/cancel-small.png has changed
Binary file images/crappy-icon-design.xcf has changed
Binary file images/crappy-icon.png has changed
Binary file images/easyhg-icon-128.png has changed
Binary file images/easyhg-icon-16.png has changed
Binary file images/easyhg-icon-192.png has changed
Binary file images/easyhg-icon-22.png has changed
Binary file images/easyhg-icon-24.png has changed
Binary file images/easyhg-icon-256.png has changed
Binary file images/easyhg-icon-32.png has changed
Binary file images/easyhg-icon-48.png has changed
Binary file images/easyhg-icon-64.png has changed
Binary file images/easyhg-icon.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/images/easyhg-icon.svg	Mon Mar 12 14:58:40 2012 +0000
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="64px"
+   height="64px"
+   id="svg2985"
+   version="1.1"
+   inkscape:version="0.48.3.1 r9886"
+   sodipodi:docname="test-new-icon.svg"
+   inkscape:export-filename="/work/easyhg/test-new-icon-256.png"
+   inkscape:export-xdpi="360"
+   inkscape:export-ydpi="360">
+  <defs
+     id="defs2987">
+    <linearGradient
+       id="linearGradient3793">
+      <stop
+         id="stop3795"
+         offset="0"
+         style="stop-color:#b4b4b4;stop-opacity:1;" />
+      <stop
+         id="stop3797"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3785">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3787" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3789" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3793"
+       id="linearGradient3791"
+       x1="12.287697"
+       y1="34.172951"
+       x2="51.994736"
+       y2="34.172951"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="7.7781746"
+     inkscape:cx="32.570025"
+     inkscape:cy="32.596202"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:document-units="px"
+     inkscape:grid-bbox="true"
+     inkscape:snap-global="true"
+     inkscape:window-width="1030"
+     inkscape:window-height="759"
+     inkscape:window-x="775"
+     inkscape:window-y="345"
+     inkscape:window-maximized="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid2997"
+       empspacing="2"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="false"
+       dotted="false" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata2990">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <path
+       sodipodi:type="arc"
+       style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.08466768;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="path2995"
+       sodipodi:cx="32.141216"
+       sodipodi:cy="34.172951"
+       sodipodi:rx="19.156166"
+       sodipodi:ry="19.284731"
+       d="m 51.297382,34.172951 a 19.156166,19.284731 0 1 1 -38.312332,0 19.156166,19.284731 0 1 1 38.312332,0 z"
+       transform="matrix(1.017949,0,0,1.0111627,-2.2181191,1.4455869)" />
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#linearGradient3791);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.01503563;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="path2995-1"
+       sodipodi:cx="32.141216"
+       sodipodi:cy="34.172951"
+       sodipodi:rx="19.156166"
+       sodipodi:ry="19.284731"
+       d="m 51.297382,34.172951 a 19.156166,19.284731 0 1 1 -38.312332,0 19.156166,19.284731 0 1 1 38.312332,0 z"
+       transform="matrix(0,0.80913895,-0.80374471,0,57.778828,9.9932907)" />
+    <path
+       sodipodi:type="star"
+       style="fill:#acacac;fill-opacity:1;stroke:#000000;stroke-width:1.60000002;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="path3805"
+       sodipodi:sides="5"
+       sodipodi:cx="36"
+       sodipodi:cy="6"
+       sodipodi:r1="10.630146"
+       sodipodi:r2="4.3201118"
+       sodipodi:arg1="0.85196633"
+       sodipodi:arg2="1.4802849"
+       inkscape:flatsided="false"
+       inkscape:rounded="0"
+       inkscape:randomized="0"
+       d="m 43,14 -6.609514,-3.697572 -5.835819,4.827104 1.474148,-7.4286344 -6.394216,-4.0585369 7.520588,-0.8935761 1.883976,-7.3354175 3.173831,6.8763737 7.558577,-0.4750005 -5.559052,5.1434088 z"
+       inkscape:transform-center-x="-0.073740988"
+       inkscape:transform-center-y="-0.94470063"
+       transform="matrix(0.99362658,0.11272187,-0.11272187,0.99362658,12.137363,6.1314664)" />
+  </g>
+</svg>
--- a/src/annotatedialog.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/annotatedialog.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on hgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
 
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/annotatedialog.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/annotatedialog.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on hgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
 
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/changeset.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/changeset.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/changeset.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/changeset.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/changesetdetailitem.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/changesetdetailitem.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/changesetdetailitem.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/changesetdetailitem.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/changesetitem.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/changesetitem.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
@@ -38,7 +38,7 @@
 ChangesetItem::ChangesetItem(Changeset *cs) :
     m_changeset(cs), m_detail(0),
     m_showBranch(false), m_column(0), m_row(0), m_wide(false),
-    m_current(false), m_closing(false), m_new(false)
+    m_current(false), m_closing(false), m_new(false), m_searchMatches(false)
 {
     m_font = QFont();
     m_font.setPixelSize(11);
@@ -91,6 +91,22 @@
     emit detailHidden();
 }    
 
+bool
+ChangesetItem::matchSearchText(QString text)
+{
+    m_searchText = text;
+    m_searchMatches = false;
+    if (m_showBranch) {
+        m_searchMatches = (m_changeset->branch().contains
+                           (text, Qt::CaseInsensitive));
+    }
+    if (!m_searchMatches) {
+        m_searchMatches = (m_changeset->comment().contains
+                           (text, Qt::CaseInsensitive));
+    }
+    return m_searchMatches;
+}
+
 void
 ChangesetItem::mousePressEvent(QGraphicsSceneMouseEvent *e)
 {
@@ -296,6 +312,17 @@
     bool showText = (scale >= 0.2);
     bool showProperLines = (scale >= 0.1);
 
+    if (m_searchText != "") {
+        if (m_searchMatches) {
+            userColour = QColor("#008400");
+            showProperLines = true;
+            showText = true;
+        } else {
+            branchColour = Qt::gray;
+            userColour = Qt::gray;
+        }
+    }
+
     if (!showProperLines) {
 	paint->setPen(QPen(branchColour, 0));
     } else {
@@ -452,6 +479,8 @@
 
     paint->setFont(f);
 
+    if (m_searchMatches) paint->setPen(userColour);
+
     for (int i = 0; i < lines.size(); ++i) {
 	paint->drawText(x0 + 3, i * fh + fh + fm.ascent(), lines[i].trimmed());
     }
--- a/src/changesetitem.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/changesetitem.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
@@ -65,6 +65,8 @@
     bool showBranch() const { return m_showBranch; }
     void setShowBranch(bool s) { m_showBranch = s; }
 
+    bool matchSearchText(QString text); // return true and records the match if it matches
+
 signals:
     void detailShown();
     void detailHidden();
@@ -110,6 +112,8 @@
     bool m_current;
     bool m_closing;
     bool m_new;
+    QString m_searchText;
+    bool m_searchMatches;
 
     QMap<QAction *, QString> m_parentDiffActions;
     QMap<QAction *, QString> m_summaryActions;
--- a/src/changesetscene.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/changesetscene.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/changesetscene.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/changesetscene.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/changesetview.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/changesetview.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/changesetview.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/changesetview.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/clickablelabel.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/clickablelabel.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/colourset.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/colourset.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/colourset.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/colourset.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/common.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/common.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/common.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/common.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/confirmcommentdialog.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/confirmcommentdialog.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on hgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
 
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/confirmcommentdialog.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/confirmcommentdialog.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on hgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
 
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/connectionitem.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/connectionitem.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/connectionitem.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/connectionitem.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/debug.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/debug.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/debug.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/debug.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/filestates.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/filestates.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
 
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/filestates.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/filestates.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
 
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/filestatuswidget.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/filestatuswidget.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
@@ -18,6 +18,7 @@
 #include "filestatuswidget.h"
 #include "debug.h"
 #include "multichoicedialog.h"
+#include "findwidget.h"
 
 #include <QLabel>
 #include <QListWidget>
@@ -154,9 +155,19 @@
 
     layout->addItem(new QSpacerItem(8, 8), ++row, 0);
 
-    m_showAllFiles = new QCheckBox(tr("Show all files"), this);
+    QWidget *opts = new QWidget;
+    QGridLayout *optLayout = new QGridLayout(opts);
+    optLayout->setMargin(0);
+    layout->addWidget(opts, ++row, 0);
+
+    m_findWidget = new FindWidget(this);
+    optLayout->addWidget(m_findWidget, 0, 0, Qt::AlignLeft);
+    connect(m_findWidget, SIGNAL(findTextChanged(QString)),
+            this, SLOT(setSearchText(QString)));
+
+    m_showAllFiles = new QCheckBox(tr("Show all file states"), this);
     m_showAllFiles->setEnabled(false);
-    layout->addWidget(m_showAllFiles, ++row, 0, Qt::AlignLeft);
+    optLayout->addWidget(m_showAllFiles, 0, 1, Qt::AlignRight);
 
     QSettings settings;
     m_showAllFiles->setChecked(settings.value("showall", false).toBool());
@@ -209,7 +220,16 @@
 {
     QSettings settings;
     settings.beginGroup("Presentation");
-    if (settings.value("showhelpfultext", true).toBool()) {
+
+    if (m_searchText != "") {
+        if (!m_showAllFiles->isChecked()) {
+            m_noModificationsLabel->setText
+                (tr("<qt><b>Nothing found</b><br>None of the modified files have matching filenames.<br>Select <b>Show all file states</b> to find matches among unmodified and untracked files as well.</qt>"));
+        } else {
+            m_noModificationsLabel->setText
+                (tr("<qt><b>Nothing found</b><br>No files have matching filenames.</qt>"));
+        }
+    } else if (settings.value("showhelpfultext", true).toBool()) {
         m_noModificationsLabel->setText
             (tr("<qt>This area will list files in your working folder that you have changed.<br><br>At the moment you have no uncommitted changes.<br><br>To see changes previously made to the repository,<br>switch to the History tab.<br><br>%1</qt>")
 #if defined Q_OS_MAC
@@ -413,6 +433,14 @@
 }
 
 void
+FileStatusWidget::setSearchText(QString text)
+{
+    if (m_searchText == text) return;
+    m_searchText = text;
+    updateWidgets();
+}
+
+void
 FileStatusWidget::updateWidgets()
 {
     QDateTime lastInteractionTime;
@@ -425,6 +453,7 @@
     foreach (QString f, m_selectedFiles) selectedFiles.insert(f);
 
     int visibleCount = 0;
+    bool finding = (m_searchText != "");
 
     foreach (FileStates::State s, m_stateListMap.keys()) {
 
@@ -437,11 +466,22 @@
         }
 
         QStringList files = m_fileStates.filesInState(s);
+        bool foundSomething = false;
 
         QStringList highPriority, lowPriority;
 
         foreach (QString file, files) {
 
+            if (finding) {
+                if (file.contains(m_searchText, Qt::CaseInsensitive)) {
+                    highPriority.push_back(file);
+                    foundSomething = true;
+                }
+                continue;
+            } else {
+                foundSomething = true;
+            }
+
             bool highlighted = false;
 
             if (s == FileStates::Unknown) {
@@ -467,7 +507,11 @@
         foreach (QString file, highPriority) {
             QListWidgetItem *item = new QListWidgetItem(file);
             w->addItem(item);
-            item->setForeground(QColor("#d40000"));
+            if (finding) {
+                item->setForeground(QColor("#008400"));
+            } else {
+                item->setForeground(QColor("#d40000"));
+            }                
             item->setSelected(selectedFiles.contains(file));
         }
 
@@ -479,7 +523,7 @@
 
         setLabelFor(w, s, !highPriority.empty());
 
-        if (files.empty()) {
+        if (!foundSomething) {
             w->parentWidget()->hide();
         } else {
             w->parentWidget()->show();
--- a/src/filestatuswidget.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/filestatuswidget.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
@@ -29,6 +29,7 @@
 class QPushButton;
 class QFileInfo;
 class QCheckBox;
+class FindWidget;
 
 class FileStatusWidget : public QWidget
 {
@@ -78,6 +79,8 @@
     void clearSelections();
     void updateWidgets();
 
+    void setSearchText(QString text);
+
 private slots:
     void menuActionActivated();
     void itemSelectionChanged();
@@ -87,6 +90,7 @@
     QString m_localPath;
     QLabel *m_noModificationsLabel;
 
+    FindWidget *m_findWidget;
     QCheckBox *m_showAllFiles;
     
     FileStates m_fileStates;
@@ -104,6 +108,8 @@
     QList<QWidget *> m_boxes;
     QWidget *m_boxesParent;
 
+    QString m_searchText;
+
     void layoutBoxesGridly(int count);
     void layoutBoxesLinearly();
     void setNoModificationsLabelText();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/findwidget.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -0,0 +1,76 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
+
+/*
+    EasyMercurial
+
+    Based on HgExplorer by Jari Korhonen
+    Copyright (c) 2010 Jari Korhonen
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
+    
+    This program is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License as
+    published by the Free Software Foundation; either version 2 of the
+    License, or (at your option) any later version.  See the file
+    COPYING included with this distribution for more information.
+*/
+
+#include "findwidget.h"
+
+#include <QGridLayout>
+#include <QLabel>
+#include <QLineEdit>
+#include <QToolButton>
+
+FindWidget::FindWidget(QWidget *parent) :
+    QWidget(parent)
+{
+    QGridLayout *layout = new QGridLayout;
+    layout->setMargin(0);
+    setLayout(layout);
+
+    QToolButton *button = new QToolButton();
+    layout->addWidget(button, 0, 0);
+    button->setText(tr("Find..."));
+    button->setToolButtonStyle(Qt::ToolButtonTextOnly);
+    connect(button, SIGNAL(clicked()), this, SLOT(buttonPressed()));
+
+    m_lineEdit = new QLineEdit();
+    layout->addWidget(m_lineEdit, 0, 1);
+
+    m_lineEdit->setFixedWidth(100);
+    m_lineEdit->hide();
+
+    int h = m_lineEdit->sizeHint().height();
+    int h0 = button->sizeHint().height();
+    if (h > h0) button->setFixedHeight(h);
+
+    connect(m_lineEdit, SIGNAL(textChanged(const QString &)),
+	    this, SIGNAL(findTextChanged(QString)));
+}
+
+FindWidget::~FindWidget()
+{
+}
+
+void
+FindWidget::buttonPressed()
+{
+    QAbstractButton *button = qobject_cast<QAbstractButton *>(sender());
+    if (!button) return;
+    if (m_lineEdit->isVisible()) {
+	m_lineEdit->hide();
+	button->setText(tr("Find..."));
+        if (m_lineEdit->text() != "") {
+            emit findTextChanged("");
+        }
+    } else {
+	m_lineEdit->show();
+        m_lineEdit->setFocus(Qt::OtherFocusReason);
+	button->setText(tr("Find:"));
+        if (m_lineEdit->text() != "") {
+            emit findTextChanged(m_lineEdit->text());
+        }
+    }
+}
+	
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/findwidget.h	Mon Mar 12 14:58:40 2012 +0000
@@ -0,0 +1,43 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
+
+/*
+    EasyMercurial
+
+    Based on HgExplorer by Jari Korhonen
+    Copyright (c) 2010 Jari Korhonen
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
+    
+    This program is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License as
+    published by the Free Software Foundation; either version 2 of the
+    License, or (at your option) any later version.  See the file
+    COPYING included with this distribution for more information.
+*/
+
+#ifndef FINDWIDGET_H
+#define FINDWIDGET_H
+
+#include <QWidget>
+
+class QLineEdit;
+
+class FindWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    FindWidget(QWidget *parent = 0);
+    ~FindWidget();
+
+signals:
+    void findTextChanged(QString);
+
+private slots:
+    void buttonPressed();
+
+private:
+    QLineEdit *m_lineEdit;
+};
+
+#endif
--- a/src/fswatcher.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/fswatcher.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on hgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
@@ -23,7 +23,7 @@
 
 #include <deque>
 
-#define DEBUG_FSWATCHER 1
+//#define DEBUG_FSWATCHER 1
 
 /*
  * Watching the filesystem is trickier than it seems at first glance.
@@ -66,8 +66,13 @@
 {
     QMutexLocker locker(&m_mutex);
     if (m_workDirPath == path) return;
-    m_watcher.removePaths(m_watcher.directories());
-    m_watcher.removePaths(m_watcher.files());
+    // annoyingly, removePaths prints a warning if given an empty list
+    if (!m_watcher.directories().empty()) {
+        m_watcher.removePaths(m_watcher.directories());
+    }
+    if (!m_watcher.files().empty()) {
+        m_watcher.removePaths(m_watcher.files());
+    }
     m_workDirPath = path;
     addWorkDirectory(path);
     debugPrint();
@@ -212,7 +217,9 @@
         // watching the file explicitly, i.e. the file is in the
         // tracked file paths list. So we never want to ignore them
 
+#ifdef DEBUG_FSWATCHER
         std::cerr << "FsWatcher: Tracked file " << path << " has changed" << std::endl;
+#endif
 
         size_t counter = ++m_lastCounter;
         m_changes[path] = counter;
@@ -228,13 +235,17 @@
     QString fn(fi.fileName());
     foreach (QString pfx, m_ignoredPrefixes) {
         if (fn.startsWith(pfx)) {
+#ifdef DEBUG_FSWATCHER
             std::cerr << "(ignoring: " << path << ")" << std::endl;
+#endif
             return true;
         }
     }
     foreach (QString sfx, m_ignoredSuffixes) {
         if (fn.endsWith(sfx)) {
+#ifdef DEBUG_FSWATCHER
             std::cerr << "(ignoring: " << path << ")" << std::endl;
+#endif
             return true;
         }
     }
--- a/src/fswatcher.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/fswatcher.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/grapher.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/grapher.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/grapher.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/grapher.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/hgaction.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/hgaction.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
@@ -118,6 +118,20 @@
 	    return false;
 	}
     }
+
+    bool makesSenseToCancel() const {
+        switch (action) {
+        case ACT_INCOMING:
+        case ACT_PUSH:
+        case ACT_PULL:
+        case ACT_CLONEFROMREMOTE:
+        case ACT_FOLDERDIFF:
+        case ACT_CHGSETDIFF:
+            return true;
+        default:
+            return false;
+        }
+    }
 };
 
 #endif
--- a/src/hgignoredialog.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/hgignoredialog.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on hgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
 
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/hgignoredialog.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/hgignoredialog.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on hgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
 
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/hgrunner.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/hgrunner.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
@@ -20,16 +20,14 @@
 #include "debug.h"
 #include "settingsdialog.h"
 
-#include <QPushButton>
-#include <QListWidget>
-#include <QDialog>
-#include <QLabel>
-#include <QVBoxLayout>
 #include <QSettings>
 #include <QInputDialog>
 #include <QDesktopServices>
 #include <QTemporaryFile>
 #include <QDir>
+#include <QProgressBar>
+#include <QPushButton>
+#include <QGridLayout>
 
 #include <iostream>
 #include <errno.h>
@@ -44,10 +42,24 @@
 #include <process.h>
 #endif
 
-HgRunner::HgRunner(QString myDirPath, QWidget * parent) :
-    QProgressBar(parent),
+HgRunner::HgRunner(QString myDirPath, QWidget *parent) :
+    QWidget(parent),
     m_myDirPath(myDirPath)
 {
+    QGridLayout *layout = new QGridLayout(this);
+    layout->setMargin(0);
+
+    m_progress = new QProgressBar;
+    layout->addWidget(m_progress, 0, 0);
+
+    m_cancel = new QPushButton;
+    m_cancel->setIcon(QIcon(":images/cancel-small.png"));
+    m_cancel->setFlat(true);
+    m_cancel->setFixedHeight(m_progress->sizeHint().height());
+    m_cancel->setFixedWidth(m_progress->sizeHint().height());
+    connect(m_cancel, SIGNAL(clicked()), this, SLOT(killCurrentActions()));
+    layout->addWidget(m_cancel, 0, 1);
+
     m_proc = 0;
 
     // Always unbundle the extension: even if it already exists (in
@@ -59,8 +71,8 @@
     // unbundling failed
     unbundleExtension();
 
-    setTextVisible(false);
-    setVisible(false);
+    m_progress->setTextVisible(false);
+    hide();
     m_isRunning = false;
 }
 
@@ -328,9 +340,9 @@
 
 void HgRunner::finished(int procExitCode, QProcess::ExitStatus procExitStatus)
 {
-	if (!m_proc) return;
+    if (!m_proc) return;
 
-	// Save the current action and reset m_currentAction before we
+    // Save the current action and reset m_currentAction before we
     // emit a signal to mark the completion; otherwise we may be
     // resetting the action after a slot has already tried to set it
     // to something else to start a new action
@@ -366,8 +378,10 @@
 
 void HgRunner::killCurrentActions()
 {
+    HgAction current = m_currentAction;
     m_queue.clear();
     killCurrentCommand();
+    emit commandCancelled(current);
 }
 
 void HgRunner::killCurrentCommand()
@@ -524,8 +538,11 @@
     }
 
     m_isRunning = true;
-    setRange(0, 0);
-    if (!action.shouldBeFast()) show();
+    m_progress->setRange(0, 0);
+    if (!action.shouldBeFast()) {
+        show();
+        m_cancel->setVisible(action.makesSenseToCancel());
+    }
     m_stdout.clear();
     m_stderr.clear();
     m_realm = "";
--- a/src/hgrunner.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/hgrunner.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
@@ -20,22 +20,24 @@
 
 #include "hgaction.h"
 
-#include <QProgressBar>
+#include <QWidget>
 #include <QProcess>
-#include <QByteArray>
-#include <QRect>
-#include <QFile>
+
+class QProgressBar;
+class QPushButton;
+class QFile;
 
 #include <deque>
 
-class HgRunner : public QProgressBar
+class HgRunner : public QWidget
 {
     Q_OBJECT
 
 public:
-    HgRunner(QString myDirPath, QWidget * parent = 0);
+    HgRunner(QString myDirPath, QWidget *parent = 0);
     ~HgRunner();
 
+public slots:
     void requestAction(HgAction action);
     void killCurrentActions(); // kill anything running; clear the queue
 
@@ -44,6 +46,13 @@
     void commandCompleted(HgAction action, QString stdOut);
     void commandFailed(HgAction action, QString stdErr, QString stdOut);
 
+    /**
+     * Emitted when the currently executing command is cancelled. Note
+     * that this clears the queue completely, so all subsequent
+     * commands are also discarded.
+     */
+    void commandCancelled(HgAction action);
+
 private slots:
     void started();
     void error(QProcess::ProcessError);
@@ -78,6 +87,9 @@
     QString getUnbundledFileName();
     QString unbundleExtension();
 
+    QProgressBar *m_progress;
+    QPushButton *m_cancel;
+
     QStringList addExtensionOptions(QStringList);
 
     int m_ptyMasterFd;
--- a/src/hgtabwidget.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/hgtabwidget.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
@@ -154,6 +154,12 @@
     m_historyWidget->update();
 }
 
+void HgTabWidget::setSearchText(QString text)
+{
+    m_fileStatusWidget->setSearchText(text);
+    m_historyWidget->setSearchText(text);
+}
+
 bool HgTabWidget::canDiff() const
 {
     return canRevert();
--- a/src/hgtabwidget.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/hgtabwidget.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
@@ -113,6 +113,8 @@
     void showWorkTab();
     void showHistoryTab();
 
+    void setSearchText(QString text);
+
 private:
     FileStatusWidget *m_fileStatusWidget;
     HistoryWidget *m_historyWidget;
--- a/src/historywidget.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/historywidget.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
@@ -23,6 +23,7 @@
 #include "grapher.h"
 #include "debug.h"
 #include "uncommitteditem.h"
+#include "findwidget.h"
 
 #include <iostream>
 
@@ -55,11 +56,21 @@
     settings.beginGroup("Presentation");
     bool showClosed = (settings.value("showclosedbranches", false).toBool());
 
+    QWidget *opts = new QWidget;
+    QGridLayout *optLayout = new QGridLayout(opts);
+    optLayout->setMargin(0);
+    layout->addWidget(opts, ++row, 0, 1, 2);
+
+    m_findWidget = new FindWidget(this);
+    optLayout->addWidget(m_findWidget, 0, 0, Qt::AlignLeft);
+    connect(m_findWidget, SIGNAL(findTextChanged(QString)),
+            this, SLOT(setSearchText(QString)));
+
     m_showClosedBranches = new QCheckBox(tr("Show closed branches"), this);
     m_showClosedBranches->setChecked(showClosed);
     connect(m_showClosedBranches, SIGNAL(toggled(bool)), 
             this, SLOT(showClosedChanged(bool)));
-    layout->addWidget(m_showClosedBranches, ++row, 0, Qt::AlignLeft);
+    optLayout->addWidget(m_showClosedBranches, 0, 1, Qt::AlignRight);
     m_showClosedBranches->hide();
 
     setLayout(layout);
@@ -241,6 +252,9 @@
         toFocus->ensureVisible();
     }
 
+    if (m_searchText != "") {
+        updateSearchStatus();
+    }
     connectSceneSignals();
 }
 
@@ -294,6 +308,38 @@
     }
 }
 
+void HistoryWidget::setSearchText(QString text)
+{
+    if (m_searchText == text) return;
+    m_searchText = text;
+    updateSearchStatus();
+}
+
+void HistoryWidget::updateSearchStatus()
+{
+    QGraphicsScene *scene = m_panned->scene();
+    if (!scene) return;
+
+    ChangesetItem *toFocus = 0;
+
+    QList<QGraphicsItem *> items = scene->items();
+    foreach (QGraphicsItem *it, items) {
+
+        ChangesetItem *csit = dynamic_cast<ChangesetItem *>(it);
+        if (!csit) continue;
+        
+        bool matched = csit->matchSearchText(m_searchText);
+        if (matched && (!toFocus || csit->row() < toFocus->row())) {
+            toFocus = csit;
+        }
+        csit->update();
+    }
+
+    if (toFocus) {
+        toFocus->ensureVisible();
+    }
+}
+
 void HistoryWidget::connectSceneSignals()
 {
     ChangesetScene *scene = qobject_cast<ChangesetScene *>(m_panned->scene());
--- a/src/historywidget.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/historywidget.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
@@ -28,6 +28,7 @@
 class Panner;
 class UncommittedItem;
 class QGraphicsScene;
+class FindWidget;
 
 class HistoryWidget : public QWidget
 {
@@ -68,6 +69,9 @@
 
 private slots:
     void showClosedChanged(bool);
+
+public slots:
+    void setSearchText(QString);
     
 private:
     Changesets m_changesets;
@@ -78,10 +82,13 @@
     bool m_showUncommitted;
     bool m_refreshNeeded;
 
+    FindWidget *m_findWidget;
     Panned *m_panned;
     Panner *m_panner;
     QCheckBox *m_showClosedBranches;
 
+    QString m_searchText;
+
     QGraphicsScene *scene();
     void clearChangesets();
     void replaceChangesets(Changesets);
@@ -90,6 +97,7 @@
     void setChangesetParents();
     void updateNewAndCurrentItems();
     void connectSceneSignals();
+    void updateSearchStatus();
 };
 
 #endif
--- a/src/incomingdialog.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/incomingdialog.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on hgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
 
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/incomingdialog.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/incomingdialog.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on hgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
 
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/logparser.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/logparser.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/logparser.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/logparser.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/main.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/main.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/mainwindow.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/mainwindow.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on hgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
@@ -85,6 +85,8 @@
             this, SLOT(commandCompleted(HgAction, QString)));
     connect(m_runner, SIGNAL(commandFailed(HgAction, QString, QString)),
             this, SLOT(commandFailed(HgAction, QString, QString)));
+    connect(m_runner, SIGNAL(commandCancelled(HgAction)),
+            this, SLOT(commandCancelled(HgAction)));
     statusBar()->addPermanentWidget(m_runner);
 
     setWindowTitle(tr("EasyMercurial"));
@@ -112,7 +114,7 @@
     m_hgTabs = new HgTabWidget(central, m_workFolderPath);
     connectTabsSignals();
 
-    cl->addWidget(m_hgTabs, row++, 0);
+    cl->addWidget(m_hgTabs, row++, 0, 1, 2);
 
     connect(m_hgTabs, SIGNAL(selectionChanged()),
             this, SLOT(enableDisableActions()));
@@ -153,6 +155,11 @@
 }
 
 
+void MainWindow::resizeEvent(QResizeEvent *)
+{
+}
+
+
 QString MainWindow::getUserInfo() const
 {
     QSettings settings;
@@ -187,9 +194,9 @@
                          "<p>EasyMercurial is based on HgExplorer by "
                          "Jari Korhonen, with thanks.</p>"
                          "<p style=\"margin-left: 2em;\">"
-                         "Copyright &copy; 2011 Queen Mary, University of London.<br>"
+                         "Copyright &copy; 2012 Queen Mary, University of London.<br>"
                          "Copyright &copy; 2010 Jari Korhonen.<br>"
-                         "Copyright &copy; 2011 Chris Cannam."
+                         "Copyright &copy; 2012 Chris Cannam."
                          "</p>"
                          "<p style=\"margin-left: 2em;\">"
                          "This program requires Mercurial, by Matt Mackall and others.<br>"
@@ -282,6 +289,8 @@
         path = s.value("default").toString();
     }
 
+//    std::cerr << "hgQueryPaths: setting m_remoteRepoPath to " << m_remoteRepoPath << " from file " << hgrc.absoluteFilePath() << std::endl;
+    
     m_remoteRepoPath = path;
 
     // We have to do this here, because commandCompleted won't be called
@@ -1484,7 +1493,8 @@
     d->addChoice("remote",
                  tr("<qt><center><img src=\":images/browser-64.png\"><br>Remote repository</center></qt>"),
                  explanation,
-                 MultiChoiceDialog::UrlArg);
+                 MultiChoiceDialog::UrlArg,
+                 true); // default empty
 
     if (d->exec() == QDialog::Accepted) {
 
@@ -1779,6 +1789,7 @@
 
     if (status == FolderHasRepo) {
         if (!askToOpenInsteadOfInit(local)) return false;
+        return openLocal(local);
     }
 
     if (containing != "") {
@@ -1831,8 +1842,8 @@
             hgRefresh();
             return;
         }
+        updateFsWatcher();
     }
-    updateFsWatcher();
 }
 
 QString MainWindow::format1(QString head)
@@ -2519,6 +2530,19 @@
     }
 }
 
+void MainWindow::commandCancelled(HgAction cancelledAction)
+{
+    // Originally I had this checking whether the cancelled action was
+    // a network one and, if so, calling hgQueryPaths to update the
+    // local view in case it had changed anything. But that doesn't
+    // work properly -- because at this point, although the command
+    // has been cancelled and a kill signal sent, it hasn't actually
+    // exited yet. If we request another command now, it will go on
+    // the stack and be associated with the failed exit forthcoming
+    // from the cancelled command -- giving the user a disturbing
+    // command-failed dialog
+}
+
 void MainWindow::connectActions()
 {
     connect(m_exitAct, SIGNAL(triggered()), this, SLOT(close()));
@@ -3007,8 +3031,13 @@
     int sz = 32;
 
     bool spacingReqd = false;
+    QString spacer = "";
 #ifndef Q_OS_MAC
     spacingReqd = true;
+    spacer = " ";
+#ifdef Q_OS_WIN32
+    spacer = "  ";
+#endif
 #endif
 
     m_workFolderToolBar = addToolBar(tr("Work"));
@@ -3032,9 +3061,13 @@
 
     m_repoToolBar = addToolBar(tr("Remote"));
     m_repoToolBar->setIconSize(QSize(sz, sz));
-    if (spacingReqd) m_repoToolBar->addWidget(new QLabel(" "));
+    if (spacingReqd) {
+        m_repoToolBar->addWidget(new QLabel(spacer));
+    }
     m_repoToolBar->addAction(m_openAct);
-    if (spacingReqd) m_repoToolBar->addWidget(new QLabel(" "));
+    if (spacingReqd) {
+        m_repoToolBar->addWidget(new QLabel(spacer));
+    }
     m_repoToolBar->addSeparator();
     m_repoToolBar->addAction(m_hgIncomingAct);
     m_repoToolBar->addAction(m_hgPullAct);
@@ -3077,10 +3110,8 @@
 
     QSettings settings;
 
-    m_remoteRepoPath = settings.value("remoterepopath", "").toString();
     m_workFolderPath = settings.value("workfolderpath", "").toString();
-    if (!workFolder.exists(m_workFolderPath))
-    {
+    if (!workFolder.exists(m_workFolderPath)) {
         m_workFolderPath = "";
     }
 
--- a/src/mainwindow.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/mainwindow.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on hgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
@@ -46,6 +46,7 @@
 
 protected:
     void closeEvent(QCloseEvent *event);
+    void resizeEvent(QResizeEvent *event);
 
 public slots:
     void open(QString local);
@@ -53,6 +54,7 @@
     void commandStarting(HgAction);
     void commandCompleted(HgAction action, QString stdOut);
     void commandFailed(HgAction action, QString stdErr, QString stdOut);
+    void commandCancelled(HgAction action);
     void enableDisableActions();
 
 private slots:
--- a/src/moreinformationdialog.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/moreinformationdialog.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on hgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
 
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/moreinformationdialog.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/moreinformationdialog.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on hgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
 
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/multichoicedialog.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/multichoicedialog.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
 
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
@@ -136,13 +136,15 @@
 
 void
 MultiChoiceDialog::addChoice(QString id, QString text,
-                             QString description, ArgType arg)
+                             QString description, ArgType arg,
+                             bool defaultEmpty)
 {
     bool first = (m_texts.empty());
 
     m_texts[id] = text;
     m_descriptions[id] = description;
     m_argTypes[id] = arg;
+    m_defaultEmpty[id] = defaultEmpty;
     
     if (arg != NoArg) {
         m_recentFiles[id] = QSharedPointer<RecentFiles>
@@ -263,7 +265,9 @@
 void
 MultiChoiceDialog::updateOkButton()
 {
-    if (m_argTypes[m_currentChoice] == UrlToDirectoryArg) {
+    if (m_defaultEmpty[m_currentChoice]) {
+        m_okButton->setEnabled(true);
+    } else if (m_argTypes[m_currentChoice] == UrlToDirectoryArg) {
         m_okButton->setEnabled(getArgument() != "" &&
                                getAdditionalArgument() != "");
     } else {
@@ -326,6 +330,7 @@
         m_fileLabel->show();
         m_fileCombo->show();
         m_fileCombo->addItems(rf->getRecent());
+        if (m_defaultEmpty[id]) m_fileCombo->lineEdit()->setText("");
         m_browseButton->show();
         break;
 
@@ -334,6 +339,7 @@
         m_fileLabel->show();
         m_fileCombo->show();
         m_fileCombo->addItems(rf->getRecent());
+        if (m_defaultEmpty[id]) m_fileCombo->lineEdit()->setText("");
         m_browseButton->show();
         break;
 
@@ -341,12 +347,14 @@
         m_urlLabel->show();
         m_urlCombo->show();
         m_urlCombo->addItems(rf->getRecent());
+        if (m_defaultEmpty[id]) m_urlCombo->lineEdit()->setText("");
         break;
 
     case UrlToDirectoryArg:
         m_urlLabel->show();
         m_urlCombo->show();
         m_urlCombo->addItems(rf->getRecent());
+        if (m_defaultEmpty[id]) m_urlCombo->lineEdit()->setText("");
         m_fileLabel->setText(tr("&Folder:"));
         m_fileLabel->show();
         m_fileCombo->show();
--- a/src/multichoicedialog.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/multichoicedialog.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
 
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
@@ -48,7 +48,8 @@
     };
 
     void addChoice(QString identifier, QString text,
-                   QString description, ArgType arg);
+                   QString description, ArgType arg,
+                   bool defaultEmpty = false);
 
     void setCurrentChoice(QString);
     QString getCurrentChoice();
@@ -71,6 +72,7 @@
     QMap<QString, QString> m_texts;
     QMap<QString, QString> m_descriptions;
     QMap<QString, ArgType> m_argTypes;
+    QMap<QString, bool> m_defaultEmpty;
     QMap<QString, QSharedPointer<RecentFiles> > m_recentFiles;
 
     QString m_currentChoice;
--- a/src/panned.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/panned.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/panned.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/panned.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/panner.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/panner.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/panner.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/panner.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/recentfiles.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/recentfiles.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/recentfiles.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/recentfiles.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/repositorydialog.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/repositorydialog.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
 
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/repositorydialog.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/repositorydialog.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
 
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/selectablelabel.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/selectablelabel.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/selectablelabel.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/selectablelabel.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/settingsdialog.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/settingsdialog.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/settingsdialog.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/settingsdialog.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/squeezedlabel.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/squeezedlabel.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
@@ -17,7 +17,7 @@
 
 /*
     This file adapted from Rosegarden, a sequencer and musical
-    notation editor.  Copyright 2000-2011 the Rosegarden development
+    notation editor.  Copyright 2000-2012 the Rosegarden development
     team.
 
     Adapted from KDE 4.2.0, this code originally Copyright (c) 2000
--- a/src/squeezedlabel.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/squeezedlabel.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
@@ -17,7 +17,7 @@
 
 /*
     This file adapted from Rosegarden, a sequencer and musical
-    notation editor.  Copyright 2000-2011 the Rosegarden development
+    notation editor.  Copyright 2000-2012 the Rosegarden development
     team.
 
     Adapted from KDE 4.2.0, this code originally Copyright (c) 2000
--- a/src/startupdialog.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/startupdialog.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/startupdialog.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/startupdialog.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/textabbrev.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/textabbrev.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/textabbrev.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/textabbrev.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/uncommitteditem.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/uncommitteditem.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/uncommitteditem.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/uncommitteditem.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/version.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/version.h	Mon Mar 12 14:58:40 2012 +0000
@@ -1,1 +1,1 @@
-#define EASYHG_VERSION "1.1"
+#define EASYHG_VERSION "1.2"
--- a/src/versiontester.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/versiontester.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on hgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/versiontester.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/versiontester.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on hgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/workstatuswidget.cpp	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/workstatuswidget.cpp	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as
--- a/src/workstatuswidget.h	Tue Feb 14 17:53:29 2012 +0000
+++ b/src/workstatuswidget.h	Mon Mar 12 14:58:40 2012 +0000
@@ -5,8 +5,8 @@
 
     Based on HgExplorer by Jari Korhonen
     Copyright (c) 2010 Jari Korhonen
-    Copyright (c) 2011 Chris Cannam
-    Copyright (c) 2011 Queen Mary, University of London
+    Copyright (c) 2012 Chris Cannam
+    Copyright (c) 2012 Queen Mary, University of London
     
     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License as