diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/installer/UnixHgInstaller.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/installer/UnixHgInstaller.java index 26ea293c12..ed81b27bdb 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/installer/UnixHgInstaller.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/installer/UnixHgInstaller.java @@ -77,7 +77,6 @@ public class UnixHgInstaller extends AbstractHgInstaller super.install(baseDirectory, config); // search mercurial (hg) - if (Util.isEmpty(config.getHgBinary())) { String hg = IOUtil.search(COMMAND_HG); @@ -100,9 +99,8 @@ public class UnixHgInstaller extends AbstractHgInstaller } } } - - // search python + // search python if (Util.isEmpty(config.getPythonBinary())) { config.setPythonBinary(IOUtil.search(COMMAND_PYTHON)); diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/installer/WindowsHgInstaller.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/installer/WindowsHgInstaller.java index 879eead8ff..a764997c73 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/installer/WindowsHgInstaller.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/installer/WindowsHgInstaller.java @@ -272,8 +272,9 @@ public class WindowsHgInstaller extends AbstractHgInstaller IOUtil.copy(templateDirectory, new File(libDir, FILE_TEMPLATES)); } - File hg = new File( hgDirectory, FILE_MERCURIAL_EXE ); - if ( hg.exists() ) + File hg = new File(hgDirectory, FILE_MERCURIAL_EXE); + + if (hg.exists()) { config.setHgBinary(hg.getAbsolutePath()); } @@ -322,8 +323,8 @@ public class WindowsHgInstaller extends AbstractHgInstaller private File getMercurialDirectory(String hgBinary) { File directory = null; - - if ( Util.isNotEmpty(hgBinary) ) + + if (Util.isNotEmpty(hgBinary)) { File hg = new File(hgBinary); @@ -332,8 +333,8 @@ public class WindowsHgInstaller extends AbstractHgInstaller directory = hg.getParentFile(); } } - - if ( directory == null ) + + if (directory == null) { directory = getMercurialDirectoryFromRegistry(); } diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgCGIServlet.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgCGIServlet.java index ad46358cc1..9e5219ca57 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgCGIServlet.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgCGIServlet.java @@ -36,6 +36,7 @@ package sonia.scm.web; //~--- non-JDK imports -------------------------------------------------------- import com.google.inject.Inject; +import com.google.inject.Provider; import com.google.inject.Singleton; import sonia.scm.config.ScmConfiguration; @@ -55,7 +56,6 @@ import java.io.File; import java.io.IOException; import java.util.Enumeration; -import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.ServletException; @@ -103,6 +103,7 @@ public class HgCGIServlet extends HttpServlet * @param cgiExecutorFactory * @param configuration * @param repositoryManager + * @param repositoryProvider * @param handler * @param hookManager */ @@ -110,11 +111,13 @@ public class HgCGIServlet extends HttpServlet public HgCGIServlet(CGIExecutorFactory cgiExecutorFactory, ScmConfiguration configuration, RepositoryManager repositoryManager, + Provider repositoryProvider, HgRepositoryHandler handler, HgHookManager hookManager) { this.cgiExecutorFactory = cgiExecutorFactory; this.configuration = configuration; this.repositoryManager = repositoryManager; + this.repositoryProvider = repositoryProvider; this.handler = handler; this.hookManager = hookManager; } @@ -149,7 +152,7 @@ public class HgCGIServlet extends HttpServlet HttpServletResponse response) throws ServletException, IOException { - Repository repository = getRepository(request); + Repository repository = repositoryProvider.get(); if (repository == null) { @@ -244,33 +247,6 @@ public class HgCGIServlet extends HttpServlet return python; } - /** - * Method description - * - * - * @param request - * - * @return - */ - private Repository getRepository(HttpServletRequest request) - { - Repository repository = null; - String uri = request.getRequestURI(); - - uri = uri.substring(request.getContextPath().length()); - - Matcher m = PATTERN_REPOSITORYNAME.matcher(uri); - - if (m.matches()) - { - String repositoryname = m.group(1); - - repository = getRepository(repositoryname); - } - - return repository; - } - /** * Method description * @@ -303,4 +279,7 @@ public class HgCGIServlet extends HttpServlet /** Field description */ private RepositoryManager repositoryManager; + + /** Field description */ + private Provider repositoryProvider; } diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgHookCallbackServlet.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgHookCallbackServlet.java index a59303ae02..2d7f684cde 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgHookCallbackServlet.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgHookCallbackServlet.java @@ -51,6 +51,7 @@ import sonia.scm.repository.RepositoryManager; import sonia.scm.repository.RepositoryNotFoundException; import sonia.scm.security.CipherUtil; import sonia.scm.util.HttpUtil; +import sonia.scm.util.IOUtil; import sonia.scm.util.Util; import sonia.scm.web.security.WebSecurityContext; @@ -80,6 +81,9 @@ public class HgHookCallbackServlet extends HttpServlet /** Field description */ public static final String HGHOOK_PRE_RECEIVE = "pretxnchangegroup"; + /** Field description */ + public static final String PARAM_REPOSITORYPATH = "repositoryPath"; + /** Field description */ private static final String PARAM_CHALLENGE = "challenge"; @@ -91,7 +95,7 @@ public class HgHookCallbackServlet extends HttpServlet /** Field description */ private static final Pattern REGEX_URL = - Pattern.compile("^/hook/hg/([^/]+)/([^/]+)$"); + Pattern.compile("^/hook/hg/([^/]+)$"); /** the logger for HgHookCallbackServlet */ private static final Logger logger = @@ -144,8 +148,8 @@ public class HgHookCallbackServlet extends HttpServlet if (m.matches()) { - String repositoryId = m.group(1); - String type = m.group(2); + String repositoryId = getRepositoryName(request); + String type = m.group(1); String challenge = request.getParameter(PARAM_CHALLENGE); if (Util.isNotEmpty(challenge)) @@ -316,6 +320,43 @@ public class HgHookCallbackServlet extends HttpServlet } } + //~--- get methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @param request + * + * @return + */ + private String getRepositoryName(HttpServletRequest request) + { + String name = null; + String path = request.getParameter(PARAM_REPOSITORYPATH); + + if (Util.isNotEmpty(path)) + { + int directoryLength = + handler.getConfig().getRepositoryDirectory().getAbsolutePath().length(); + + if (directoryLength < path.length()) + { + name = IOUtil.trimSeperatorChars(path.substring(directoryLength)); + } + else if (logger.isWarnEnabled()) + { + logger.warn("path is shorter as the main hg repository path"); + } + } + else if (logger.isWarnEnabled()) + { + logger.warn("no repository path parameter found"); + } + + return name; + } + //~--- fields --------------------------------------------------------------- /** Field description */ diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgPermissionFilter.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgPermissionFilter.java index c44c422ea5..865513e8c8 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgPermissionFilter.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgPermissionFilter.java @@ -39,9 +39,8 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; -import sonia.scm.repository.HgRepositoryHandler; -import sonia.scm.repository.RepositoryManager; -import sonia.scm.web.filter.RegexPermissionFilter; +import sonia.scm.repository.Repository; +import sonia.scm.web.filter.ProviderPermissionFilter; import sonia.scm.web.security.WebSecurityContext; //~--- JDK imports ------------------------------------------------------------ @@ -53,7 +52,7 @@ import javax.servlet.http.HttpServletRequest; * @author Sebastian Sdorra */ @Singleton -public class HgPermissionFilter extends RegexPermissionFilter +public class HgPermissionFilter extends ProviderPermissionFilter { /** @@ -61,30 +60,18 @@ public class HgPermissionFilter extends RegexPermissionFilter * * * @param securityContextProvider - * @param repositoryManager + * @param repositoryProvider */ @Inject public HgPermissionFilter( Provider securityContextProvider, - RepositoryManager repositoryManager) + Provider repositoryProvider) { - super(securityContextProvider, repositoryManager); + super(securityContextProvider, repositoryProvider); } //~--- get methods ---------------------------------------------------------- - /** - * Method description - * - * - * @return - */ - @Override - protected String getType() - { - return HgRepositoryHandler.TYPE_NAME; - } - /** * Method description * diff --git a/scm-plugins/scm-hg-plugin/src/main/resources/sonia/scm/hghook.py b/scm-plugins/scm-hg-plugin/src/main/resources/sonia/scm/hghook.py index 170b0d8769..f03ece6f9e 100644 --- a/scm-plugins/scm-hg-plugin/src/main/resources/sonia/scm/hghook.py +++ b/scm-plugins/scm-hg-plugin/src/main/resources/sonia/scm/hghook.py @@ -48,9 +48,9 @@ def callback(ui, repo, hooktype, node=None, source=None, pending=None, **kwargs) failure = True if node != None: try: - url = baseUrl + os.path.basename(repo.root) + "/" + hooktype + url = baseUrl + hooktype ui.debug( "send scm-hook to " + url + " and " + node + "\n" ) - data = urllib.urlencode({'node': node, 'challenge': challenge, 'credentials': credentials}) + data = urllib.urlencode({'node': node, 'challenge': challenge, 'credentials': credentials, 'repositoryPath': repo.root}) conn = urllib.urlopen(url, data); if conn.code >= 200 and conn.code < 300: ui.debug( "scm-hook " + hooktype + " success with status code " + str(conn.code) + "\n" )