- ${%Reload}
+
+
+
diff --git a/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/git/config.jelly b/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/git/config.jelly
index 2c74e408..c54fbc48 100644
--- a/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/git/config.jelly
+++ b/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/git/config.jelly
@@ -3,5 +3,7 @@
-
+
+
+
\ No newline at end of file
diff --git a/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/git/url-help.properties b/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/git/url-help.properties
index 7b68062d..6933f03f 100644
--- a/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/git/url-help.properties
+++ b/src/main/resources/hudson/plugins/scm_sync_configuration/ScmSyncConfigurationPlugin/scms/git/url-help.properties
@@ -23,4 +23,5 @@
description.1=\
Specify the git repository URL to synchronize your configuration files with, such as "git@github.com:mycompany/jenkins-config.git"
description.2=\
- Note that, for the moment, your MUST reference your Git repository root
+ Specify branch name in branch field. If you leave it empty, master branch will be used. \
+ If you want to switch to new branch, just type it's name. If newly typed branch already contains any configuration, it will be merged with current one immediately after pressing "Save" button.
diff --git a/src/main/webapp/help/reloadScmConfig-branch-help.html b/src/main/webapp/help/reloadScmConfig-branch-help.html
new file mode 100644
index 00000000..f589250c
--- /dev/null
+++ b/src/main/webapp/help/reloadScmConfig-branch-help.html
@@ -0,0 +1,4 @@
+
+ A branch of repository which is source of configuration for reloading.
+ Please read help at "Reload" button for further help.
+
\ No newline at end of file
diff --git a/src/main/webapp/help/reloadScmConfig-help.html b/src/main/webapp/help/reloadScmConfig-help.html
index 39e70fa7..510de01e 100644
--- a/src/main/webapp/help/reloadScmConfig-help.html
+++ b/src/main/webapp/help/reloadScmConfig-help.html
@@ -29,6 +29,14 @@
Note that it should never happen since as soon as you activate scm sync config, every of your config file should be commited to the repository
+
+ job XXX |
+ Doesn't exist |
+
+ Beware! Job will be removed! Opposite to jenkins config files, all jobs are removed before reload
+ This is the only way to remove jobs that aren't stored in other branch or repo. After reload your Jenkins job configuration should be the same as in repository
+ |
+
Doesn't exist |
XXX |
diff --git a/src/main/webapp/help/reloadScmConfig-url-help.html b/src/main/webapp/help/reloadScmConfig-url-help.html
new file mode 100644
index 00000000..f425ee06
--- /dev/null
+++ b/src/main/webapp/help/reloadScmConfig-url-help.html
@@ -0,0 +1,4 @@
+
+ An URL of repository which is source of configuration for reloading.
+ Please read help at "Reload" button for further help.
+
\ No newline at end of file
diff --git a/src/test/java/hudson/plugins/scm_sync_configuration/basic/ScmSyncConfigurationBasicTest.java b/src/test/java/hudson/plugins/scm_sync_configuration/basic/ScmSyncConfigurationBasicTest.java
index 0e15fc1e..e77912a8 100644
--- a/src/test/java/hudson/plugins/scm_sync_configuration/basic/ScmSyncConfigurationBasicTest.java
+++ b/src/test/java/hudson/plugins/scm_sync_configuration/basic/ScmSyncConfigurationBasicTest.java
@@ -5,12 +5,12 @@
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertThat;
-import hudson.model.Hudson;
import hudson.plugins.scm_sync_configuration.util.ScmSyncConfigurationBaseTest;
import hudson.plugins.test.utils.scms.ScmUnderTestSubversion;
import java.io.File;
+import jenkins.model.Jenkins;
import org.junit.Test;
public class ScmSyncConfigurationBasicTest extends ScmSyncConfigurationBaseTest {
@@ -21,16 +21,16 @@ public ScmSyncConfigurationBasicTest() {
@Test
public void shouldRetrieveMockedHudsonInstanceCorrectly() throws Throwable {
- Hudson hudsonInstance = Hudson.getInstance();
- assertThat(hudsonInstance, is(notNullValue()));
- assertThat(hudsonInstance.toString().split("@")[0], is(not(equalTo("hudson.model.Hudson"))));
+ Jenkins jenkinsInstance = Jenkins.getInstance();
+ assertThat(jenkinsInstance, is(notNullValue()));
+ assertThat(jenkinsInstance.toString().split("@")[0], is(not(equalTo("jenkins.model.Jenkins"))));
}
@Test
public void shouldVerifyIfHudsonRootDirectoryExists() throws Throwable {
-
- Hudson hudsonInstance = Hudson.getInstance();
- File hudsonRootDir = hudsonInstance.getRootDir();
+
+ Jenkins jenkinsInstance = Jenkins.getInstance();
+ File hudsonRootDir = jenkinsInstance.getRootDir();
assertThat(hudsonRootDir, is(not(equalTo(null))));
assertThat(hudsonRootDir.exists(), is(true));
}
diff --git a/src/test/java/hudson/plugins/scm_sync_configuration/data/CurrentVersionCompatibilityTest.java b/src/test/java/hudson/plugins/scm_sync_configuration/data/CurrentVersionCompatibilityTest.java
index c10904af..5c4ba7e7 100644
--- a/src/test/java/hudson/plugins/scm_sync_configuration/data/CurrentVersionCompatibilityTest.java
+++ b/src/test/java/hudson/plugins/scm_sync_configuration/data/CurrentVersionCompatibilityTest.java
@@ -17,6 +17,7 @@
import hudson.plugins.test.utils.PluginUtil;
import hudson.plugins.test.utils.scms.ScmUnderTestSubversion;
+import jenkins.model.Jenkins;
import org.junit.Test;
import org.powermock.core.classloader.annotations.PrepareForTest;
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 bb4ebde4..2c31a2dc 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
@@ -383,6 +383,56 @@ private void assertStrategy(Class extends ScmSyncStrategy> expectedStrategyCla
}
}
+ /**
+ * Test that checks if after reload, disk contains only jobs that were reloaded from SCM. Speaking in other way -
+ * if joba non existent in SCM were removed from the disk.
+ * @throws Throwable
+ */
+ @Test
+ public void shouldReloadAllFilesRemoveNonExistentJobs() throws Throwable {
+ createSCMMock();
+
+ sscBusiness.synchronizeAllConfigs(ScmSyncConfigurationPlugin.AVAILABLE_STRATEGIES);
+
+ // Let's checkout current scm view ... and commit something in it ...
+ SCMManipulator scmManipulator = createMockedScmManipulator();
+ File checkoutDirectoryForVerifications = createTmpDirectory(this.getClass().getSimpleName()+"_"+testName.getMethodName()+"__tmpHierarchyForCommit");
+ scmManipulator.checkout(checkoutDirectoryForVerifications);
+
+ verifyCurrentScmContentMatchesCurrentHudsonDir(true);
+
+
+ final String jobDir = checkoutDirectoryForVerifications.getAbsolutePath() + "/jobs/myJob";
+ FileUtils.mkdir(jobDir);
+ final File addedJobFile = new File(jobDir + "/config.xml");
+ FileUtils.fileWrite(addedJobFile.getAbsolutePath(), "titi");
+ scmManipulator.addFile(checkoutDirectoryForVerifications, "jobs/myJob");
+ File jobToRemove = new File(checkoutDirectoryForVerifications.getAbsolutePath() + "/jobs/fakeJob");
+ FileUtils.deleteDirectory(jobToRemove);
+ scmManipulator.deleteHierarchy(jobToRemove);
+ scmManipulator.checkinFiles(checkoutDirectoryForVerifications, "external commit for add myJob file and remove fakeJob");
+
+ verifyCurrentScmContentMatchesCurrentHudsonDir(false);
+
+ // Reload config
+ List removedJobs = sscBusiness.removeSourceJobsDuringReload();
+ List syncedFiles = sscBusiness.reloadAllFilesFromScm();
+
+ verifyCurrentScmContentMatchesCurrentHudsonDir(true);
+
+ assertThat(removedJobs.size(), is(1));
+ assertThat(removedJobs.contains(new File(getCurrentHudsonRootDirectory().getAbsolutePath() + "/jobs/fakeJob")), is(true));
+
+ assertThat(syncedFiles.size(), is(1));
+ assertThat(syncedFiles.contains(new File(getCurrentHudsonRootDirectory().getAbsolutePath() + "/jobs/myJob")), is(true));
+
+ assertThat(new File(getCurrentHudsonRootDirectory().getAbsolutePath() + "/jobs/fakeJob").exists(), is(false));
+ assertThat(new File(getCurrentHudsonRootDirectory().getAbsolutePath() + "/jobs/myJob").exists(), is(true));
+
+
+ assertStatusManagerIsOk();
+ }
+
@Override
protected String getHudsonRootBaseTemplate(){
if("shouldFileWhichHaveToBeInSCM".equals(testName.getMethodName())){
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..b35c5d21 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
@@ -2,7 +2,6 @@
import hudson.Plugin;
import hudson.PluginWrapper;
-import hudson.model.Hudson;
import hudson.model.User;
import hudson.plugins.scm_sync_configuration.SCMManagerFactory;
import hudson.plugins.scm_sync_configuration.SCMManipulator;
@@ -16,6 +15,7 @@
import hudson.plugins.scm_sync_configuration.xstream.migration.ScmSyncConfigurationPOJO;
import hudson.plugins.test.utils.DirectoryUtils;
import hudson.plugins.test.utils.scms.ScmUnderTest;
+import jenkins.model.Jenkins;
import org.codehaus.plexus.PlexusContainerException;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.codehaus.plexus.util.FileUtils;
@@ -46,7 +46,7 @@
@RunWith(PowerMockRunner.class)
@PowerMockIgnore({ "org.tmatesoft.svn.*" })
-@PrepareForTest({Hudson.class, SCM.class, ScmSyncSubversionSCM.class, PluginWrapper.class})
+@PrepareForTest({SCM.class, ScmSyncSubversionSCM.class, PluginWrapper.class, Jenkins.class})
public abstract class ScmSyncConfigurationBaseTest {
@Rule protected TestName testName = new TestName();
@@ -105,14 +105,14 @@ public void setup() throws Throwable {
// Mocking Hudson singleton instance ...
// Warning : this line will only work on Objenesis supported VMs :
// http://code.google.com/p/objenesis/wiki/ListOfCurrentlySupportedVMs
- Hudson hudsonMockedInstance = spy((Hudson) new ObjenesisStd().getInstantiatorOf(Hudson.class).newInstance());
- PowerMockito.doReturn(currentHudsonRootDirectory).when(hudsonMockedInstance).getRootDir();
- PowerMockito.doReturn(mockedUser).when(hudsonMockedInstance).getMe();
- PowerMockito.doReturn(scmSyncConfigPluginInstance).when(hudsonMockedInstance).getPlugin(ScmSyncConfigurationPlugin.class);
-
- PowerMockito.mockStatic(Hudson.class);
- PowerMockito.doReturn(hudsonMockedInstance).when(Hudson.class); Hudson.getInstance();
- //when(Hudson.getInstance()).thenReturn(hudsonMockedInstance);
+
+ Jenkins jenkinsMockInstance = spy((Jenkins) new ObjenesisStd().getInstantiatorOf(Jenkins.class).newInstance());
+ PowerMockito.doReturn(currentHudsonRootDirectory).when(jenkinsMockInstance).getRootDir();
+ PowerMockito.doReturn(mockedUser).when(jenkinsMockInstance).getMe();
+ PowerMockito.doReturn(scmSyncConfigPluginInstance).when(jenkinsMockInstance).getPlugin(ScmSyncConfigurationPlugin.class);
+
+ PowerMockito.mockStatic(Jenkins.class);
+ PowerMockito.doReturn(jenkinsMockInstance).when(Jenkins.class); Jenkins.getInstance();
}
@After