From 51e47353d1662dc1ba7382d0b98e52c99c4ab74b Mon Sep 17 00:00:00 2001 From: Clarence Bakirtzidis Date: Fri, 7 Dec 2012 09:57:02 +1100 Subject: [PATCH 1/5] Work in progress: Mercurial SCM support. Currently broken. --- pom.xml | 8 +++- .../scm_sync_configuration/scms/SCM.java | 1 + .../scms/ScmSyncHgSCM.java | 31 ++++++++++++++ .../scms/hg/config.jelly | 7 ++++ .../scms/hg/config_fr.properties | 1 + .../scms/hg/url-help.jelly | 32 ++++++++++++++ .../scms/hg/url-help.properties | 26 ++++++++++++ .../scms/hg/url-help_fr.properties | 26 ++++++++++++ .../repository/HudsonExtensionsHgTest.java | 16 +++++++ .../repository/InitRepositoryHgTest.java | 13 ++++++ .../util/ScmSyncConfigurationBaseTest.java | 1 + .../test/utils/scms/ScmUnderTestHg.java | 42 +++++++++++++++++++ .../config.xml | 31 ++++++++++++++ .../hudson.tasks.Shell.xml | 5 +++ .../scm-sync-configuration.xml | 5 +++ 15 files changed, 244 insertions(+), 1 deletion(-) create mode 100644 src/main/java/hudson/plugins/scm_sync_configuration/scms/ScmSyncHgSCM.java create mode 100644 src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/hg/config.jelly create mode 100644 src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/hg/config_fr.properties create mode 100644 src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/hg/url-help.jelly create mode 100644 src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/hg/url-help.properties create mode 100644 src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/hg/url-help_fr.properties create mode 100644 src/test/java/hudson/plugins/scm_sync_configuration/repository/HudsonExtensionsHgTest.java create mode 100644 src/test/java/hudson/plugins/scm_sync_configuration/repository/InitRepositoryHgTest.java create mode 100644 src/test/java/hudson/plugins/test/utils/scms/ScmUnderTestHg.java create mode 100644 src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.shouldJobDeleteBeCorrectlyImpactedOnSCM.hg/config.xml create mode 100644 src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.shouldJobDeleteBeCorrectlyImpactedOnSCM.hg/hudson.tasks.Shell.xml create mode 100644 src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.shouldJobDeleteBeCorrectlyImpactedOnSCM.hg/scm-sync-configuration.xml diff --git a/pom.xml b/pom.xml index 54c7ef89..d3143f56 100644 --- a/pom.xml +++ b/pom.xml @@ -145,7 +145,8 @@ org.jenkins-ci.plugins subversion 1.39 - + + com.google.code.maven-scm-provider-svnjava @@ -159,6 +160,11 @@ 1.6 + + org.apache.maven.scm + maven-scm-provider-hg + 1.8 + diff --git a/src/main/java/hudson/plugins/scm_sync_configuration/scms/SCM.java b/src/main/java/hudson/plugins/scm_sync_configuration/scms/SCM.java index f473948d..722de775 100644 --- a/src/main/java/hudson/plugins/scm_sync_configuration/scms/SCM.java +++ b/src/main/java/hudson/plugins/scm_sync_configuration/scms/SCM.java @@ -25,6 +25,7 @@ public abstract class SCM { add(new ScmSyncNoSCM()); add(new ScmSyncSubversionSCM()); add(new ScmSyncGitSCM()); + add(new ScmSyncHgSCM()); } }; transient protected String title; diff --git a/src/main/java/hudson/plugins/scm_sync_configuration/scms/ScmSyncHgSCM.java b/src/main/java/hudson/plugins/scm_sync_configuration/scms/ScmSyncHgSCM.java new file mode 100644 index 00000000..eb9f3fa9 --- /dev/null +++ b/src/main/java/hudson/plugins/scm_sync_configuration/scms/ScmSyncHgSCM.java @@ -0,0 +1,31 @@ +package hudson.plugins.scm_sync_configuration.scms; + +import org.kohsuke.stapler.StaplerRequest; + +public class ScmSyncHgSCM extends SCM { + + private static final String SCM_URL_PREFIX="scm:hg:"; + + ScmSyncHgSCM(){ + super("Mercurial", "hg/config.jelly", "hudson.plugins.mercurial.MercurialSCM", "/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/hg/url-help.jelly"); + } + + public String createScmUrlFromRequest(StaplerRequest req) { + String repoURL = req.getParameter("hgRepositoryUrl"); + if(repoURL == null){ + return null; + } + else { + return SCM_URL_PREFIX+repoURL; + } + } + + public String extractScmUrlFrom(String scmUrl) { + return scmUrl.substring(SCM_URL_PREFIX.length()); + } + + public SCMCredentialConfiguration extractScmCredentials(String scmUrl) { + return null; + } + +} diff --git a/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/hg/config.jelly b/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/hg/config.jelly new file mode 100644 index 00000000..e089d694 --- /dev/null +++ b/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/hg/config.jelly @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/hg/config_fr.properties b/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/hg/config_fr.properties new file mode 100644 index 00000000..7c14cc25 --- /dev/null +++ b/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/hg/config_fr.properties @@ -0,0 +1 @@ +Repository\ URL=URL du repository diff --git a/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/hg/url-help.jelly b/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/hg/url-help.jelly new file mode 100644 index 00000000..e5c23d37 --- /dev/null +++ b/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/hg/url-help.jelly @@ -0,0 +1,32 @@ + + + + +
+ ${%description.1}
+ ${%description.2} +
+
+
\ No newline at end of file diff --git a/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/hg/url-help.properties b/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/hg/url-help.properties new file mode 100644 index 00000000..8c1247f1 --- /dev/null +++ b/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/hg/url-help.properties @@ -0,0 +1,26 @@ +# The MIT License +# +# Copyright (c) 2004-2010, Sun Microsystems, Inc., Kohsuke Kawaguchi, Seiji Sogabe +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +description.1=\ + Specify the hg repository URL to synchronize your configuration files with, such as "hg@bitbucket.org:mycompany/jenkins-config" +description.2=\ + Note that, for the moment, your MUST reference your Hg repository root diff --git a/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/hg/url-help_fr.properties b/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/hg/url-help_fr.properties new file mode 100644 index 00000000..35e500fd --- /dev/null +++ b/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/hg/url-help_fr.properties @@ -0,0 +1,26 @@ +# The MIT License +# +# Copyright (c) 2004-2010, Sun Microsystems, Inc., Kohsuke Kawaguchi, Eric Lefevre-Ardant +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +description.1=\ + Spécifier l''url du repository Hg vers lequel synchroniser vos fichiers de configuration, tel que "hg@bitbucket.org/mycompany/jenkins-config" +description.2=\ + A noter qu''il est pour le moment obligatoire de référencer la racine du repository diff --git a/src/test/java/hudson/plugins/scm_sync_configuration/repository/HudsonExtensionsHgTest.java b/src/test/java/hudson/plugins/scm_sync_configuration/repository/HudsonExtensionsHgTest.java new file mode 100644 index 00000000..b6cdab06 --- /dev/null +++ b/src/test/java/hudson/plugins/scm_sync_configuration/repository/HudsonExtensionsHgTest.java @@ -0,0 +1,16 @@ +package hudson.plugins.scm_sync_configuration.repository; + +import hudson.plugins.test.utils.scms.ScmUnderTestHg; +import org.junit.Ignore; + +public class HudsonExtensionsHgTest extends HudsonExtensionsTest { + + public HudsonExtensionsHgTest() { + super(new ScmUnderTestHg()); + } + + @Ignore("Should be re-activated once maven-scm-api 1.9 is released (see JENKINS-15128)") + public void shouldJobRenameBeCorrectlyImpactedOnSCM() throws Throwable { + super.shouldJobRenameBeCorrectlyImpactedOnSCM(); + } +} diff --git a/src/test/java/hudson/plugins/scm_sync_configuration/repository/InitRepositoryHgTest.java b/src/test/java/hudson/plugins/scm_sync_configuration/repository/InitRepositoryHgTest.java new file mode 100644 index 00000000..174b865a --- /dev/null +++ b/src/test/java/hudson/plugins/scm_sync_configuration/repository/InitRepositoryHgTest.java @@ -0,0 +1,13 @@ +package hudson.plugins.scm_sync_configuration.repository; + +import hudson.plugins.test.utils.scms.ScmUnderTestHg; + + + +public class InitRepositoryHgTest extends InitRepositoryTest { + + public InitRepositoryHgTest() { + super(new ScmUnderTestHg()); + } + +} diff --git a/src/test/java/hudson/plugins/scm_sync_configuration/util/ScmSyncConfigurationBaseTest.java b/src/test/java/hudson/plugins/scm_sync_configuration/util/ScmSyncConfigurationBaseTest.java index 5de847fa..9ac58922 100644 --- a/src/test/java/hudson/plugins/scm_sync_configuration/util/ScmSyncConfigurationBaseTest.java +++ b/src/test/java/hudson/plugins/scm_sync_configuration/util/ScmSyncConfigurationBaseTest.java @@ -203,6 +203,7 @@ protected static List getSpecialSCMDirectoryExcludePattern(){ return new ArrayList(){{ add(Pattern.compile("\\.svn")); add(Pattern.compile("\\.git.*")); + add(Pattern.compile("\\.hg.*")); add(Pattern.compile("scm-sync-configuration\\..*\\.log")); add(Pattern.compile("scm-sync-configuration")); }}; diff --git a/src/test/java/hudson/plugins/test/utils/scms/ScmUnderTestHg.java b/src/test/java/hudson/plugins/test/utils/scms/ScmUnderTestHg.java new file mode 100644 index 00000000..f447d252 --- /dev/null +++ b/src/test/java/hudson/plugins/test/utils/scms/ScmUnderTestHg.java @@ -0,0 +1,42 @@ +package hudson.plugins.test.utils.scms; + +import hudson.plugins.scm_sync_configuration.scms.SCM; +import hudson.plugins.scm_sync_configuration.scms.ScmSyncHgSCM; + +import java.io.File; + +public class ScmUnderTestHg implements ScmUnderTest { + + public void initRepo(File path) throws Exception { + ProcessBuilder[] commands = new ProcessBuilder[] { + new ProcessBuilder("hg", "init"), + new ProcessBuilder("touch", "blank.txt"), + new ProcessBuilder("hg", "add", "blank.txt"), + new ProcessBuilder("hg", "commit", "-m", "\"initial commit\"") + }; + for (ProcessBuilder pb : commands) { + pb.directory(path); + Process p = pb.start(); + if (p.waitFor() != 0) { + throw new Exception("Unable to init hg repo in " + path.getAbsolutePath()); + } + } + } + + public String createUrl(String url) { + return "scm:hg:" + url; + } + + public Class getClazz() { + return ScmSyncHgSCM.class; + } + + public boolean useCredentials() { + return false; + } + + public String getSuffixForTestFiles() { + return ".hg"; + } + +} diff --git a/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.shouldJobDeleteBeCorrectlyImpactedOnSCM.hg/config.xml b/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.shouldJobDeleteBeCorrectlyImpactedOnSCM.hg/config.xml new file mode 100644 index 00000000..824eae41 --- /dev/null +++ b/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.shouldJobDeleteBeCorrectlyImpactedOnSCM.hg/config.xml @@ -0,0 +1,31 @@ + + + 1.339 + 2 + NORMAL + true + + + true + + Welcome ! + + + + 5 + 0 + + + + All + false + false + + + All + 0 + + + + + \ No newline at end of file diff --git a/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.shouldJobDeleteBeCorrectlyImpactedOnSCM.hg/hudson.tasks.Shell.xml b/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.shouldJobDeleteBeCorrectlyImpactedOnSCM.hg/hudson.tasks.Shell.xml new file mode 100644 index 00000000..8b953697 --- /dev/null +++ b/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.shouldJobDeleteBeCorrectlyImpactedOnSCM.hg/hudson.tasks.Shell.xml @@ -0,0 +1,5 @@ + + + + /bin/bash + \ No newline at end of file diff --git a/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.shouldJobDeleteBeCorrectlyImpactedOnSCM.hg/scm-sync-configuration.xml b/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.shouldJobDeleteBeCorrectlyImpactedOnSCM.hg/scm-sync-configuration.xml new file mode 100644 index 00000000..8545485d --- /dev/null +++ b/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.shouldJobDeleteBeCorrectlyImpactedOnSCM.hg/scm-sync-configuration.xml @@ -0,0 +1,5 @@ + + + scm:svn:https://myrepo/synchronizedDirectory/ + + \ No newline at end of file From df61cd0960ff723ce94a16819c5b90f7b627761d Mon Sep 17 00:00:00 2001 From: Clarence Bakirtzidis Date: Fri, 7 Dec 2012 14:00:42 +1100 Subject: [PATCH 2/5] Updated failing test to meet HG specific behaviour. --- .../repository/InitRepositoryTest.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/test/java/hudson/plugins/scm_sync_configuration/repository/InitRepositoryTest.java b/src/test/java/hudson/plugins/scm_sync_configuration/repository/InitRepositoryTest.java index 75107891..ee3abcc0 100644 --- a/src/test/java/hudson/plugins/scm_sync_configuration/repository/InitRepositoryTest.java +++ b/src/test/java/hudson/plugins/scm_sync_configuration/repository/InitRepositoryTest.java @@ -60,7 +60,14 @@ public void shouldResetCheckoutConfigurationDirectoryWhenAsked() throws Throwabl // Reseting the repository, without cleanup sscBusiness.initializeRepository(scmContext, false); - assertThat(fileWhichShouldBeDeletedAfterReset.exists(), is(true)); + if (this instanceof InitRepositoryHgTest) { + //HG behaves differently and always destroys files that aren't in source control + //Also should this be allowed in the first place. If a reset is requested why should it + //allow untracked files to linger around???? + assertThat(fileWhichShouldBeDeletedAfterReset.exists(), is(false)); + } else { + assertThat(fileWhichShouldBeDeletedAfterReset.exists(), is(true)); + } // Reseting the repository with cleanup sscBusiness.initializeRepository(scmContext, true); From 01c624a9befce37ac61282057124c80f836d1d80 Mon Sep 17 00:00:00 2001 From: Clarence Bakirtzidis Date: Fri, 7 Dec 2012 16:44:15 +1100 Subject: [PATCH 3/5] Making tests pass with Mercurial SCM provider. --- .../scm_sync_configuration/SCMManipulator.java | 10 ++++++---- .../ScmSyncConfigurationBusiness.java | 2 +- .../repository/HudsonExtensionsTest.java | 12 +++++++++++- .../util/ScmSyncConfigurationBaseTest.java | 1 + .../plugins/test/utils/scms/ScmUnderTestHg.java | 7 ++++--- .../scm-sync-configuration.xml | 2 +- 6 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/main/java/hudson/plugins/scm_sync_configuration/SCMManipulator.java b/src/main/java/hudson/plugins/scm_sync_configuration/SCMManipulator.java index f2af3515..b15ba70f 100644 --- a/src/main/java/hudson/plugins/scm_sync_configuration/SCMManipulator.java +++ b/src/main/java/hudson/plugins/scm_sync_configuration/SCMManipulator.java @@ -106,14 +106,16 @@ public boolean checkout(File checkoutDirectory){ return checkoutOk; } - public List deleteHierarchy(File hierarchyToDelete){ + public List deleteHierarchy(File hierarchyToDelete, String hierarchyPath){ if(!expectScmRepositoryInitiated()){ return null; } - File enclosingDirectory = hierarchyToDelete.getParentFile(); - - LOGGER.fine("Deleting SCM hierarchy ["+hierarchyToDelete.getAbsolutePath()+"] from SCM ..."); + String absolutePath = hierarchyToDelete.getAbsolutePath(); + String basePath = absolutePath.substring(0, absolutePath.lastIndexOf(hierarchyPath)); + File enclosingDirectory = new File(basePath); + + LOGGER.fine("Deleting SCM hierarchy ["+absolutePath+"] from SCM ..."); File commitFile = hierarchyToDelete; while(! commitFile.isDirectory()) { diff --git a/src/main/java/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationBusiness.java b/src/main/java/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationBusiness.java index a4112e7f..eda658e6 100644 --- a/src/main/java/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationBusiness.java +++ b/src/main/java/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationBusiness.java @@ -110,7 +110,7 @@ public List deleteHierarchy(ScmContext scmContext, Path hierarchyPath){ File rootHierarchyTranslatedInScm = hierarchyPath.getScmFile(); - List filesToCommit = scmManipulator.deleteHierarchy(rootHierarchyTranslatedInScm); + List filesToCommit = scmManipulator.deleteHierarchy(rootHierarchyTranslatedInScm, hierarchyPath.getPath()); // Once done, we should delete path in scm if it is a directory if(hierarchyPath.isDirectory()){ diff --git a/src/test/java/hudson/plugins/scm_sync_configuration/repository/HudsonExtensionsTest.java b/src/test/java/hudson/plugins/scm_sync_configuration/repository/HudsonExtensionsTest.java index 67bb10e0..84d0cbf3 100644 --- a/src/test/java/hudson/plugins/scm_sync_configuration/repository/HudsonExtensionsTest.java +++ b/src/test/java/hudson/plugins/scm_sync_configuration/repository/HudsonExtensionsTest.java @@ -294,7 +294,7 @@ public void shouldReloadAllFilesUpdateScmAndReloadAllFiles() throws Throwable { final File configJobFile = new File(checkoutDirectoryForVerifications.getAbsolutePath() + "/jobs/fakeJob/config.xml"); FileUtils.fileAppend(configJobFile.getAbsolutePath(), "titi"); - scmManipulator.checkinFiles(checkoutDirectoryForVerifications, "external commit on jonb file"); + scmManipulator.checkinFiles(checkoutDirectoryForVerifications, "external commit on job file"); verifyCurrentScmContentMatchesCurrentHudsonDir(false); @@ -303,6 +303,7 @@ public void shouldReloadAllFilesUpdateScmAndReloadAllFiles() throws Throwable { verifyCurrentScmContentMatchesCurrentHudsonDir(true); + assertAndRemoveHgSpecificFile(syncedFiles); assertThat(syncedFiles.size(), is(2)); assertThat(syncedFiles.contains(new File(getCurrentHudsonRootDirectory().getAbsolutePath() + "/config.xml")), is(true)); assertThat(syncedFiles.contains(new File(getCurrentHudsonRootDirectory().getAbsolutePath() + "/jobs/fakeJob/config.xml")), is(true)); @@ -310,6 +311,14 @@ public void shouldReloadAllFilesUpdateScmAndReloadAllFiles() throws Throwable { assertStatusManagerIsOk(); } + public void assertAndRemoveHgSpecificFile(List syncedFiles) { + if(this instanceof HudsonExtensionsHgTest) { + File file = new File(getCurrentHudsonRootDirectory().getAbsolutePath() + "/hg_dummy.txt"); + assertThat(syncedFiles.contains(file), is(true)); + syncedFiles.remove(syncedFiles.indexOf(file)); + } + } + @Test public void shouldReloadAllFilesUpdateScmAndReloadAllFilesWithFileAdd() throws Throwable { // Initializing the repository... @@ -345,6 +354,7 @@ public void shouldReloadAllFilesUpdateScmAndReloadAllFilesWithFileAdd() throws T verifyCurrentScmContentMatchesCurrentHudsonDir(true); + assertAndRemoveHgSpecificFile(syncedFiles); assertThat(syncedFiles.size(), is(2)); assertThat(syncedFiles.contains(new File(getCurrentHudsonRootDirectory().getAbsolutePath() + "/myConfigFile.xml")), is(true)); assertThat(syncedFiles.contains(new File(getCurrentHudsonRootDirectory().getAbsolutePath() + "/jobs/myJob")), is(true)); diff --git a/src/test/java/hudson/plugins/scm_sync_configuration/util/ScmSyncConfigurationBaseTest.java b/src/test/java/hudson/plugins/scm_sync_configuration/util/ScmSyncConfigurationBaseTest.java index 9ac58922..5f053715 100644 --- a/src/test/java/hudson/plugins/scm_sync_configuration/util/ScmSyncConfigurationBaseTest.java +++ b/src/test/java/hudson/plugins/scm_sync_configuration/util/ScmSyncConfigurationBaseTest.java @@ -204,6 +204,7 @@ protected static List getSpecialSCMDirectoryExcludePattern(){ add(Pattern.compile("\\.svn")); add(Pattern.compile("\\.git.*")); add(Pattern.compile("\\.hg.*")); + add(Pattern.compile("hg_dummy.txt")); add(Pattern.compile("scm-sync-configuration\\..*\\.log")); add(Pattern.compile("scm-sync-configuration")); }}; diff --git a/src/test/java/hudson/plugins/test/utils/scms/ScmUnderTestHg.java b/src/test/java/hudson/plugins/test/utils/scms/ScmUnderTestHg.java index f447d252..61b796a7 100644 --- a/src/test/java/hudson/plugins/test/utils/scms/ScmUnderTestHg.java +++ b/src/test/java/hudson/plugins/test/utils/scms/ScmUnderTestHg.java @@ -9,9 +9,10 @@ public class ScmUnderTestHg implements ScmUnderTest { public void initRepo(File path) throws Exception { ProcessBuilder[] commands = new ProcessBuilder[] { - new ProcessBuilder("hg", "init"), - new ProcessBuilder("touch", "blank.txt"), - new ProcessBuilder("hg", "add", "blank.txt"), + //unlike Git, Hg doesn't support bare repos. So we create one for real + new ProcessBuilder("hg", "init"), + new ProcessBuilder("touch", "hg_dummy.txt"), + new ProcessBuilder("hg", "add", "hg_dummy.txt"), new ProcessBuilder("hg", "commit", "-m", "\"initial commit\"") }; for (ProcessBuilder pb : commands) { diff --git a/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.shouldJobDeleteBeCorrectlyImpactedOnSCM.hg/scm-sync-configuration.xml b/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.shouldJobDeleteBeCorrectlyImpactedOnSCM.hg/scm-sync-configuration.xml index 8545485d..a83018f2 100644 --- a/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.shouldJobDeleteBeCorrectlyImpactedOnSCM.hg/scm-sync-configuration.xml +++ b/src/test/resources/expected-scm-hierarchies/HudsonExtensionsTest.shouldJobDeleteBeCorrectlyImpactedOnSCM.hg/scm-sync-configuration.xml @@ -1,5 +1,5 @@ scm:svn:https://myrepo/synchronizedDirectory/ - + \ No newline at end of file From 010915ceb3b52fc6636db9a5effc63559dd19cc6 Mon Sep 17 00:00:00 2001 From: Clarence Bakirtzidis Date: Mon, 10 Dec 2012 12:42:21 +1100 Subject: [PATCH 4/5] Final cleanup of HG support (minor edits, no change in functionality). --- pom.xml | 2 +- .../scms/ScmSyncHgSCM.java | 10 +++++----- .../scms/hg/url-help_fr.properties | 8 ++++---- .../repository/HudsonExtensionsTest.java | 17 +++++++++-------- .../repository/InitRepositoryTest.java | 6 +++--- .../plugins/test/utils/scms/ScmUnderTestHg.java | 3 ++- 6 files changed, 24 insertions(+), 22 deletions(-) diff --git a/pom.xml b/pom.xml index d3143f56..e0fc945e 100644 --- a/pom.xml +++ b/pom.xml @@ -146,7 +146,7 @@ subversion 1.39 - + com.google.code.maven-scm-provider-svnjava diff --git a/src/main/java/hudson/plugins/scm_sync_configuration/scms/ScmSyncHgSCM.java b/src/main/java/hudson/plugins/scm_sync_configuration/scms/ScmSyncHgSCM.java index eb9f3fa9..1de33a4b 100644 --- a/src/main/java/hudson/plugins/scm_sync_configuration/scms/ScmSyncHgSCM.java +++ b/src/main/java/hudson/plugins/scm_sync_configuration/scms/ScmSyncHgSCM.java @@ -5,11 +5,11 @@ public class ScmSyncHgSCM extends SCM { private static final String SCM_URL_PREFIX="scm:hg:"; - + ScmSyncHgSCM(){ super("Mercurial", "hg/config.jelly", "hudson.plugins.mercurial.MercurialSCM", "/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/hg/url-help.jelly"); } - + public String createScmUrlFromRequest(StaplerRequest req) { String repoURL = req.getParameter("hgRepositoryUrl"); if(repoURL == null){ @@ -19,13 +19,13 @@ public String createScmUrlFromRequest(StaplerRequest req) { return SCM_URL_PREFIX+repoURL; } } - + public String extractScmUrlFrom(String scmUrl) { return scmUrl.substring(SCM_URL_PREFIX.length()); } - + public SCMCredentialConfiguration extractScmCredentials(String scmUrl) { return null; } - + } diff --git a/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/hg/url-help_fr.properties b/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/hg/url-help_fr.properties index 35e500fd..d90cd208 100644 --- a/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/hg/url-help_fr.properties +++ b/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/hg/url-help_fr.properties @@ -1,17 +1,17 @@ # The MIT License -# +# # Copyright (c) 2004-2010, Sun Microsystems, Inc., Kohsuke Kawaguchi, Eric Lefevre-Ardant -# +# # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: -# +# # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. -# +# # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE diff --git a/src/test/java/hudson/plugins/scm_sync_configuration/repository/HudsonExtensionsTest.java b/src/test/java/hudson/plugins/scm_sync_configuration/repository/HudsonExtensionsTest.java index 84d0cbf3..ec86139b 100644 --- a/src/test/java/hudson/plugins/scm_sync_configuration/repository/HudsonExtensionsTest.java +++ b/src/test/java/hudson/plugins/scm_sync_configuration/repository/HudsonExtensionsTest.java @@ -311,14 +311,6 @@ public void shouldReloadAllFilesUpdateScmAndReloadAllFiles() throws Throwable { assertStatusManagerIsOk(); } - public void assertAndRemoveHgSpecificFile(List syncedFiles) { - if(this instanceof HudsonExtensionsHgTest) { - File file = new File(getCurrentHudsonRootDirectory().getAbsolutePath() + "/hg_dummy.txt"); - assertThat(syncedFiles.contains(file), is(true)); - syncedFiles.remove(syncedFiles.indexOf(file)); - } - } - @Test public void shouldReloadAllFilesUpdateScmAndReloadAllFilesWithFileAdd() throws Throwable { // Initializing the repository... @@ -388,4 +380,13 @@ private void assertStrategy(Class expectedStrategyCla } } + private void assertAndRemoveHgSpecificFile(List syncedFiles) { + // HG Support: If we encounter the dummy file used to initialise HG repo then we know + // we are dealing with a HG repo, so remove it so other tests can pass. + if(this instanceof HudsonExtensionsHgTest) { + File file = new File(getCurrentHudsonRootDirectory().getAbsolutePath() + "/hg_dummy.txt"); + assertThat(syncedFiles.contains(file), is(true)); + syncedFiles.remove(syncedFiles.indexOf(file)); + } + } } diff --git a/src/test/java/hudson/plugins/scm_sync_configuration/repository/InitRepositoryTest.java b/src/test/java/hudson/plugins/scm_sync_configuration/repository/InitRepositoryTest.java index ee3abcc0..cb6b20bf 100644 --- a/src/test/java/hudson/plugins/scm_sync_configuration/repository/InitRepositoryTest.java +++ b/src/test/java/hudson/plugins/scm_sync_configuration/repository/InitRepositoryTest.java @@ -61,9 +61,9 @@ public void shouldResetCheckoutConfigurationDirectoryWhenAsked() throws Throwabl // Reseting the repository, without cleanup sscBusiness.initializeRepository(scmContext, false); if (this instanceof InitRepositoryHgTest) { - //HG behaves differently and always destroys files that aren't in source control - //Also should this be allowed in the first place. If a reset is requested why should it - //allow untracked files to linger around???? + // HG Support: HG behaves differently and always destroys files that aren't yet in source control. + // Note: Should this be allowed in the first place? If a reset is requested why should it + // allow untracked files to linger around? assertThat(fileWhichShouldBeDeletedAfterReset.exists(), is(false)); } else { assertThat(fileWhichShouldBeDeletedAfterReset.exists(), is(true)); diff --git a/src/test/java/hudson/plugins/test/utils/scms/ScmUnderTestHg.java b/src/test/java/hudson/plugins/test/utils/scms/ScmUnderTestHg.java index 61b796a7..905b5732 100644 --- a/src/test/java/hudson/plugins/test/utils/scms/ScmUnderTestHg.java +++ b/src/test/java/hudson/plugins/test/utils/scms/ScmUnderTestHg.java @@ -9,7 +9,8 @@ public class ScmUnderTestHg implements ScmUnderTest { public void initRepo(File path) throws Exception { ProcessBuilder[] commands = new ProcessBuilder[] { - //unlike Git, Hg doesn't support bare repos. So we create one for real + // HG support: Unlike Git, Hg does not appear to support "bare" repos. + // So we have to initialise the repo by commiting a dummy file. new ProcessBuilder("hg", "init"), new ProcessBuilder("touch", "hg_dummy.txt"), new ProcessBuilder("hg", "add", "hg_dummy.txt"), From 3c20fd081f19a0a6263777eb11ba922fdcca403e Mon Sep 17 00:00:00 2001 From: Clarence Bakirtzidis Date: Mon, 10 Dec 2012 14:20:13 +1100 Subject: [PATCH 5/5] HG Support: Removed the 'touch' command from test and used 'FileUtils.fileWrite' instead so its not *nix specific. --- .../plugins/test/utils/scms/ScmUnderTestHg.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/test/java/hudson/plugins/test/utils/scms/ScmUnderTestHg.java b/src/test/java/hudson/plugins/test/utils/scms/ScmUnderTestHg.java index 905b5732..689281de 100644 --- a/src/test/java/hudson/plugins/test/utils/scms/ScmUnderTestHg.java +++ b/src/test/java/hudson/plugins/test/utils/scms/ScmUnderTestHg.java @@ -5,17 +5,24 @@ import java.io.File; +import org.codehaus.plexus.util.FileUtils; + public class ScmUnderTestHg implements ScmUnderTest { public void initRepo(File path) throws Exception { + // HG support: Unlike Git, Mercurial does not appear to support "bare" repositories. + // So we have to initialise the repository by committing a dummy file. + + final String dummyFileName = "hg_dummy.txt"; + File dummyFile = new File(path, dummyFileName); + FileUtils.fileWrite(dummyFile.getAbsolutePath(), "This is a dummy file"); + ProcessBuilder[] commands = new ProcessBuilder[] { - // HG support: Unlike Git, Hg does not appear to support "bare" repos. - // So we have to initialise the repo by commiting a dummy file. new ProcessBuilder("hg", "init"), - new ProcessBuilder("touch", "hg_dummy.txt"), - new ProcessBuilder("hg", "add", "hg_dummy.txt"), + new ProcessBuilder("hg", "add", dummyFileName), new ProcessBuilder("hg", "commit", "-m", "\"initial commit\"") }; + for (ProcessBuilder pb : commands) { pb.directory(path); Process p = pb.start();