Wednesday 18 June 2014

JavaHg and ssh

I'm a fan of the JavaHg library.  It allows me to automate Mercurial commands in clean and elegant code.  But the documentation and help can be hard to find - you've basically got JavaDoc, the test cases and a  very small number of questions and answers on StackOverflow.

We had a problem talking to a remote Mercurial repository via ssh.  When doing this you're generally advised to put something like this in your home directory Mercurial.ini file:

[ui]
ssh = "C:\Program Files\TortoiseHg\TortoisePlink.exe" -ssh -i "C:\<path>\private_key.ppk" -C


[Note i've set up ssh access with keys to avoid entering a password each time.  Articles on how to do this are available on the web]

Although this worked for manual command line hg commands, it wouldn't work with the JavaHg code.  It turns out JavaHg is not picking up the home directory Mercurial.ini.  I'm not exactly sure why, but here is a code snippet of one solution that solves the issue:

RepositoryConfiguration repoConfig = new RepositoryConfiguration();
repoConfig.setSshBin("\"C:\\<path>\\TortoisePlink.exe\" -ssh -i \"C:\\<path>\\private_key.ppk\"");
File repositoryDirectory = new File("C:\\<path>\\<repo>");
Repository repo = Repository.open(repoConfig, repositoryDirectory);
PushCommand.on(repo).execute("ssh://<username>@<hostname>/<repo>");

I suspect there are other solutions, possibly setting ProcessBuilder's working directory, maybe updating the hgrc file in the repository with which you're working.  Over to you to experiment, hope I saved you a little time ;)

Update:  reading the source you find RepositoryConfiguration.setHgrcPath(null) will pick up the Mercurial.ini file as normal but note the default is to set hgrc path to "" which means Mercurial.ini is not picked up

Have a look here: http://grepcode.com/file/repo1.maven.org/maven2/com.aragost.javahg/javahg/0.4/com/aragost/javahg/RepositoryConfiguration.java