Mercurial > hg > mercurial
view mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/Settings.java @ 205:ccf0b5ad00c1 Eluru-6.0.x
Write repository url without credentials to the hgrc
We can work without default path, but it is hard to understand which local repository clone what.
author | Dmitry Neverov <dmitry.neverov@jetbrains.com> |
---|---|
date | Thu, 13 Jan 2011 19:48:54 +0300 |
parents | bcc04a74783d |
children |
line wrap: on
line source
/* * Copyright 2000-2011 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jetbrains.buildServer.buildTriggers.vcs.mercurial.command; import jetbrains.buildServer.buildTriggers.vcs.mercurial.Constants; import jetbrains.buildServer.buildTriggers.vcs.mercurial.PathUtil; import jetbrains.buildServer.log.Loggers; import jetbrains.buildServer.util.Hash; import jetbrains.buildServer.util.StringUtil; import jetbrains.buildServer.vcs.VcsRoot; import org.jetbrains.annotations.NotNull; import java.io.File; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.HashSet; import java.util.Set; /** * Represents Mercurial repository settings */ public class Settings { private String myRepository; private String myHgCommandPath; private File myWorkingDir; private File myWorkFolderParentDir; private String myUsername; private String myPassword; private String myBranchName; private static final String DEFAULT_BRANCH_NAME = "default"; public Settings(@NotNull File workFolderParentDir, @NotNull VcsRoot vcsRoot) { myWorkFolderParentDir = workFolderParentDir; setRepository(vcsRoot.getProperty(Constants.REPOSITORY_PROP)); setHgCommandPath(vcsRoot.getProperty(Constants.HG_COMMAND_PATH_PROP)); myBranchName = vcsRoot.getProperty(Constants.BRANCH_NAME_PROP); myUsername = vcsRoot.getProperty(Constants.USERNAME); myPassword = vcsRoot.getProperty(Constants.PASSWORD); } public Settings() { } public void setRepository(@NotNull final String repository) { myRepository = repository; } public String getRepository() { return myRepository; } /** * Returns name of the branch to use (returns 'default' if no branch specified) * @return see above */ @NotNull public String getBranchName() { return StringUtil.isEmpty(myBranchName) ? DEFAULT_BRANCH_NAME : myBranchName; } /** * Returns true if current branch is default branch * @return see above */ public boolean isDefaultBranch() { return getBranchName().equals(DEFAULT_BRANCH_NAME); } /** * Returns path to hg command * @return path to hg command */ @NotNull public String getHgCommandPath() { return myHgCommandPath; } public String getUsername() { return myUsername; } public String getPassword() { return myPassword; } private final static Set<String> AUTH_PROTOS = new HashSet<String>(); static { AUTH_PROTOS.add("http"); AUTH_PROTOS.add("https"); AUTH_PROTOS.add("ssh"); } /** * Returns URL to use for push command * @return URL to use for push command */ public String getRepositoryUrl() { if (isRequireCredentials()) { if (containsCredentials(myRepository)) return myRepository; try { return createURLWithCredentials(myRepository); } catch (MalformedURLException e) { Loggers.VCS.warn("Error while parsing url " + myRepository, e); } return myRepository; } else { return myRepository; } } private boolean containsCredentials(final String repository) { try { URL url = new URL(repository); String userInfo = url.getUserInfo(); return userInfo != null && userInfo.contains(":"); } catch (MalformedURLException e) { return false; } } private String createURLWithCredentials(final String originalUrl) throws MalformedURLException { String userInfo = createUserInfo(); if (!"".equals(userInfo)) { URL url = new URL(originalUrl); return url.getProtocol() + "://" + userInfo + "@" + url.getHost() + (url.getPort() != -1 ? ":" + url.getPort() : "") + url.getFile() + (url.getRef() != null ? url.getRef() : ""); } else { return originalUrl; } } private boolean isRequireCredentials() { for (String scheme : AUTH_PROTOS) { if (myRepository.startsWith(scheme + ":")) { return true; } } return false; } private String createUserInfo() { String userInfo = ""; if (!StringUtil.isEmpty(myUsername)) { userInfo += myUsername; if (!StringUtil.isEmpty(myPassword)) { userInfo += ":" + myPassword; } } return getEscapedUserInfo(userInfo); } private static String getEscapedUserInfo(String userInfo) { try { URI uri = new URI("http", userInfo, "somewhere.com", 80, "", "", ""); String escapedURI = uri.toASCIIString(); int from = "http://".length(); int to = escapedURI.indexOf("somewhere.com") - 1; return escapedURI.substring(from, to); } catch (URISyntaxException e) { assert false; } return userInfo; } public void setHgCommandPath(@NotNull final String hgCommandPath) { myHgCommandPath = hgCommandPath; } public void setWorkingDir(@NotNull final File workingDir) { myWorkingDir = PathUtil.getCanonicalFile(workingDir); } /** * Returns directory where repository is supposed to be cloned, i.e. working directory of cloned repository * @return repository working directory */ @NotNull public File getLocalRepositoryDir() { if (myWorkingDir != null) { return myWorkingDir; } return getDefaultWorkDir(myWorkFolderParentDir, myRepository); } /** * Returns true if current working directory contains copy of repository (contains .hg directory) * @return see above */ public boolean hasCopyOfRepository() { // need better way to check that repository copy is ok return getLocalRepositoryDir().isDirectory() && new File(getLocalRepositoryDir(), ".hg").isDirectory(); } public static String DEFAULT_WORK_DIR_PREFIX = "hg_"; private static File getDefaultWorkDir(@NotNull File workFolderParentDir, @NotNull String repPath) { String workingDirname = DEFAULT_WORK_DIR_PREFIX + String.valueOf(Hash.calc(normalize(repPath))); return PathUtil.getCanonicalFile(new File(workFolderParentDir, workingDirname)); } private static String normalize(final String path) { String normalized = PathUtil.normalizeSeparator(path); if (path.endsWith("/")) { return normalized.substring(0, normalized.length()-1); } return normalized; } }