views:

478

answers:

2

I can't get Tortoisehg (1.0) to work with subrepos

I have a directory structure like this:

root
  .hg
  .hgsub
  .hgsubstate
  Customer1
    Project1
      .hg
      foo.txt
    Project2
      .hg
  Customer2
    Project3
      .hg

the .hgsub file under root looks like

Customer1\Project1=Customer1\Project1  
Customer1\Project2=Customer1\Project2  
Customer2\Project3=Customer2\Project3  

If modify the file Customer1\Project1\foo.txt and commit from the root it works

>hg ci -m "command line commit"
committing subrepository customer1\project1

in Tortoisehg customer1\project1 is displayed with status S (subrepo) but when commiting I get a message

abort: customer1/project1: no match under directory!

Is this scenario not supported or am I doing something wrong?

The doc says:
"TortoiseHg 1.0 introduced rudimentary support for subrepositories, and only in the commit / status tool. When Mercurial considers a subrepo as dirty, it will appear in the commit tool as a special entry in the file list with a status of S. If a subrepo is included in the file list of a commit, the subrepo is committed along with the other changes, updating the .hgsubstate file in the main repository root."

+2  A: 

I think your problem is with specifying "Customer1\Project1" as a sub repository because Customer1 should be a nested repository as well.

Customer1 and Customer2 should both have '.hgsub' files describing the subrepos inside them (Project1/2)

Remake your Customer1 repository elsewhere and clone Project1 and Project2 into it. Add Project1 and Project2 entries to the '.hgsub' file within Customer1.

Then do the same for a Customer2 repository.

Remember that nested repositories can themselves be nested so create a 'root' repository and then clone Customer1 and Customer2 into it remembering to add entries to the .hgsub file.

Commit 'root' and you should be fine.

The key is to push changes from all instances of a subrepos to its clone master so that other clones that include that subrepos are able to pull that revision if needed.

I have all master repos in the same parent folder on my machine so it makes putting relative paths inside '.hgsub' files such as '../Project1' or '../Customer1' a simple way to push changes to my local clones from our central server.

As far as using TortoiseHG, you will be fine with v1.0 as it will create and manage the '.hgsubstate' file in a nested repository as long as you have already created the '.hgsub' file!

Neil Trodden
It is much easier to just use the command line for the top level commit. My guess is that tortoisehg tries to commit customer1/project1 instead of customer1\project1 (backslash).
adrianm