diff --git a/plugins/scm-hg-plugin/src/main/java/sonia/scm/installer/WindowsHgInstaller.java b/plugins/scm-hg-plugin/src/main/java/sonia/scm/installer/WindowsHgInstaller.java index 84e9c52a21..9c5371ff13 100644 --- a/plugins/scm-hg-plugin/src/main/java/sonia/scm/installer/WindowsHgInstaller.java +++ b/plugins/scm-hg-plugin/src/main/java/sonia/scm/installer/WindowsHgInstaller.java @@ -29,6 +29,8 @@ * */ + + package sonia.scm.installer; //~--- non-JDK imports -------------------------------------------------------- @@ -36,10 +38,9 @@ package sonia.scm.installer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import sonia.scm.io.SimpleCommand; -import sonia.scm.io.SimpleCommandResult; import sonia.scm.repository.HgConfig; import sonia.scm.util.IOUtil; +import sonia.scm.util.RegistryUtil; import sonia.scm.util.Util; //~--- JDK imports ------------------------------------------------------------ @@ -48,8 +49,6 @@ import java.io.File; import java.io.FilenameFilter; import java.io.IOException; -import java.util.Scanner; - /** * * @author Sebastian Sdorra @@ -60,20 +59,21 @@ public class WindowsHgInstaller extends AbstractHgInstaller /** Field description */ private static final String FILE_LIBRARY_ZIP = "library.zip"; + /** Field description */ + private static final String FILE_LIB_MERCURIAL = + "Lib\\site-packages\\mercurial"; + /** Field description */ private static final String FILE_MERCURIAL_EXE = "hg.exe"; /** Field description */ private static final String FILE_MERCURIAL_SCRIPT = "hg.bat"; - /** Field description */ - private static final String FILE_TEMPLATES = "templates"; - /** Field description */ private static final String FILE_SCRIPTS = "Scripts"; /** Field description */ - private static final String FILE_LIB_MERCURIAL = "Lib\\site-packages\\mercurial"; + private static final String FILE_TEMPLATES = "templates"; /** Field description */ private static final String[] REGISTRY_HG = new String[] @@ -87,11 +87,12 @@ public class WindowsHgInstaller extends AbstractHgInstaller }; /** Field description */ - private static final String REGISTRY_PYTHON = "HKEY_CLASSES_ROOT\\Python.File\\shell\\open\\command"; + private static final String REGISTRY_PYTHON = + "HKEY_CLASSES_ROOT\\Python.File\\shell\\open\\command"; /** the logger for WindowsHgInstaller */ - private static final Logger logger = LoggerFactory - .getLogger(WindowsHgInstaller.class); + private static final Logger logger = + LoggerFactory.getLogger(WindowsHgInstaller.class); //~--- constructors --------------------------------------------------------- @@ -122,10 +123,12 @@ public class WindowsHgInstaller extends AbstractHgInstaller super.install(config); String pythonBinary = getPythonBinary(); + config.setPythonBinary(pythonBinary); File hgScript = getMercurialScript(pythonBinary); File hgDirectory = getMercurialDirectory(); + if (hgScript != null) { config.setHgBinary(hgScript.getAbsolutePath()); @@ -145,8 +148,7 @@ public class WindowsHgInstaller extends AbstractHgInstaller * @param config */ @Override - public void update(HgConfig config) - {} + public void update(HgConfig config) {} /** * Method description @@ -233,8 +235,8 @@ public class WindowsHgInstaller extends AbstractHgInstaller IOUtil.copy(templateDirectory, new File(libDir, FILE_TEMPLATES)); } - config.setHgBinary(new File(hgDirectory, FILE_MERCURIAL_EXE) - .getAbsolutePath()); + config.setHgBinary(new File(hgDirectory, + FILE_MERCURIAL_EXE).getAbsolutePath()); } //~--- get methods ---------------------------------------------------------- @@ -251,7 +253,7 @@ public class WindowsHgInstaller extends AbstractHgInstaller for (String registryKey : REGISTRY_HG) { - String path = getRegistryValue(registryKey, null, null); + String path = RegistryUtil.getRegistryValue(registryKey); if (path != null) { @@ -275,6 +277,10 @@ public class WindowsHgInstaller extends AbstractHgInstaller * Returns the location of the script to run Mercurial, if Mercurial is * installed as a Python package from source. Only packages that include a * templates directory will be recognized. + * + * @param pythonBinary + * + * @return */ private File getMercurialScript(String pythonBinary) { @@ -283,6 +289,7 @@ public class WindowsHgInstaller extends AbstractHgInstaller if (pythonBinary != null) { File pythonBinaryFile = new File(pythonBinary); + if (pythonBinaryFile.exists()) { File pythonDir = pythonBinaryFile.getParentFile(); @@ -290,10 +297,14 @@ public class WindowsHgInstaller extends AbstractHgInstaller File potentialHgScript = new File(scriptsDir, FILE_MERCURIAL_SCRIPT); File mercurialPackageDir = new File(pythonDir, FILE_LIB_MERCURIAL); File templatesDir = new File(mercurialPackageDir, FILE_TEMPLATES); + if (potentialHgScript.exists() && templatesDir.exists()) + { hgScript = potentialHgScript; + } } } + return hgScript; } @@ -305,7 +316,7 @@ public class WindowsHgInstaller extends AbstractHgInstaller */ private String getPythonBinary() { - String python = getRegistryValue(REGISTRY_PYTHON, null, null); + String python = RegistryUtil.getRegistryValue(REGISTRY_PYTHON); if (python == null) { @@ -314,71 +325,4 @@ public class WindowsHgInstaller extends AbstractHgInstaller return python; } - - /** - * Method description - * - * - * @param key - * @param subKey - * @param defaultValue - * - * @return - */ - private String getRegistryValue(String key, String subKey, String defaultValue) - { - String programDirectory = defaultValue; - SimpleCommand command = null; - - if (subKey != null) - { - command = new SimpleCommand("reg", "query", key, "/v", subKey); - } - else - { - command = new SimpleCommand("reg", "query", key); - } - - try - { - SimpleCommandResult result = command.execute(); - - if (result.isSuccessfull()) - { - String output = result.getOutput(); - Scanner scanner = new Scanner(output); - - while (scanner.hasNextLine()) - { - String line = scanner.nextLine(); - int index = line.indexOf("REG_SZ"); - - if (index > 0) - { - programDirectory = line.substring(index + "REG_SZ".length()).trim(); - - if (programDirectory.startsWith("\"")) - { - programDirectory = programDirectory.substring(1); - programDirectory = programDirectory.substring(0, programDirectory - .indexOf("\"")); - } - - if (logger.isDebugEnabled()) - { - logger.debug("use program directory {}", programDirectory); - } - - break; - } - } - } - } - catch (IOException ex) - { - logger.error(ex.getMessage(), ex); - } - - return programDirectory; - } } diff --git a/scm-core/src/main/java/sonia/scm/util/RegistryUtil.java b/scm-core/src/main/java/sonia/scm/util/RegistryUtil.java new file mode 100644 index 0000000000..12a6cfccaa --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/util/RegistryUtil.java @@ -0,0 +1,156 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of SCM-Manager; nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.util; + +//~--- non-JDK imports -------------------------------------------------------- + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import sonia.scm.io.SimpleCommand; +import sonia.scm.io.SimpleCommandResult; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.IOException; + +import java.util.Scanner; + +/** + * + * @author Sebastian Sdorra + */ +public class RegistryUtil +{ + + /** the logger for RegistryUtil */ + private static final Logger logger = + LoggerFactory.getLogger(RegistryUtil.class); + + //~--- get methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @param key + * + * @return + */ + public static String getRegistryValue(String key) + { + return getRegistryValue(key, null, null); + } + + /** + * Method description + * + * + * @param key + * @param defaultValue + * + * @return + */ + public static String getRegistryValue(String key, String defaultValue) + { + return getRegistryValue(key, null, defaultValue); + } + + /** + * Method description + * + * + * @param key + * @param subKey + * @param defaultValue + * + * @return + */ + public static String getRegistryValue(String key, String subKey, + String defaultValue) + { + String value = defaultValue; + SimpleCommand command = null; + + if (subKey != null) + { + command = new SimpleCommand("reg", "query", key, "/v", subKey); + } + else + { + command = new SimpleCommand("reg", "query", key); + } + + try + { + SimpleCommandResult result = command.execute(); + + if (result.isSuccessfull()) + { + String output = result.getOutput(); + Scanner scanner = new Scanner(output); + + while (scanner.hasNextLine()) + { + String line = scanner.nextLine(); + int index = line.indexOf("REG_SZ"); + + if (index > 0) + { + value = line.substring(index + "REG_SZ".length()).trim(); + + if (value.startsWith("\"")) + { + value = value.substring(1); + value = value.substring(0, value.indexOf("\"")); + } + + if (logger.isDebugEnabled()) + { + logger.debug("registry value {} at {}", value, key); + } + + break; + } + } + } + } + catch (IOException ex) + { + logger.error(ex.getMessage(), ex); + } + + return value; + } +}