When I used Subversion as the SCS, I had all my projects in one repository, and every commit went to the central server. I looked at root folder and I knew commit status of all projects.

Now I use Mercurial and I have multiple unrelated or loosely related projects and every project is a separate repository. My dev folder is structured like this:

  • /dev
    • /Apps
      • /App1
      • /App2
    • /Reporting
      • /ReportingApp1
      • /ReportingApp2
    • /Scripts
      • /Importer1
      • /Exporter2
    • /TestArea
      • /TestProject1
      • /Test2
    • /Utils
      • /Util1
      • /Util2

So, after a frantic week where I made fixes to old code, changed some scripts, worked at current development project and tested some new techiques in test projects, I asked myself:

  1. Have I commited every change in every project?
  2. Have I pushed every change to remote server?
  3. Is there any change in remote repository I can pull?

TortoiseHg icons give me some clues but they often can be wrong. I have to remember what I changed or check every project one by one. I’m not good at remembering things and I hate repetitive work that computer could do for me so i just had to write another utility to keep track of my projects.

Here’s how it works:

  • Configuration is done in config.ini
  • HGChecker will traverse folder hierarchy beginning from [ProjectRootDir]
  • It will check if any subfolder is project folder using patterns defined in [FindProjectRootFilePattern] or [FindProjectRootDirPattern]
  • It will run hg.ex defined in [HgExecutable] with status, incoming and outgoing parameters.
  • It will translate responses from hg and show the results in console, coded as following:
    • ? (cyan) – project is not source controlled
    • M (blue) – uncommitted changes
    • ↑↓ (red) – no valid default remote repository
    • ↑[#] (yelow) – there are # outgoing changes to push
    • ↓[#] (yelow) – # incoming changes available from remote repository

So, I have a scheduled a task that runs HGChecker every day at the end of the workday. Usually I strive to commit when I’m done, push when it’s ready and add every project to source control. But I’m not perfect and I easily forget. HGChecker is there now to remind me.


When this screen shows up, I immediatelly know the following:

  • I have some uncommited changes in App1 and there are two remote changes I must pull – there is merge on the way
  • It seems I created ReportingApp2 project but I didn’t add it to source control
  • I have commited one change to Importer1 but I didn’t push it to remote.
  • Importer 2 is source controled but it doesn’t have default remote repository