Make build in mock less monolithic
authorMathieu Baudier <mbaudier@argeo.org>
Tue, 25 Jun 2013 11:46:41 +0000 (11:46 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Tue, 25 Jun 2013 11:46:41 +0000 (11:46 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@6365 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/BuildInMock.java
runtime/org.argeo.slc.rpmfactory/src/main/java/org/argeo/slc/rpmfactory/core/RpmFactory.java

index 11b772be9eadafc72d7a570d1dd6b0570b99845d..3b4d84a779893e6c9f56c21b68992ef89b9dcbb0 100644 (file)
@@ -45,36 +45,34 @@ public class BuildInMock implements Runnable {
        private String debuginfoDirName = "debuginfo";
        private String mockExecutable = "/usr/bin/mock";
 
-       public void run() {
-               String mockCfg = factory.getMockConfig(arch);
-               File mockConfigFile = factory.getMockConfigFile(arch, branch);
+       private List<String> preBuildCommands = new ArrayList<String>();
 
-               // prepare mock call
-               SystemCall mock = new SystemCall();
-               if (arch != null)
-                       mock.arg("setarch").arg(arch);
-               mock.arg(mockExecutable);
-               mock.arg("-v");
-               mock.arg("--configdir=" + mockConfigFile.getAbsoluteFile().getParent());
-               if (arch != null)
-                       mock.arg("--arch=" + arch);
-               mock.arg("-r").arg(mockCfg);
-               mock.arg("--scm-enable");
-               // mock.arg("--scm-option");
-               // mock.arg("git_get='git clone " + (branch != null ? "-b " + branch :
-               // "")
-               // + " " + factory.getGitBaseUrl() + "/SCM_PKG SCM_PKG'");
-               mock.arg("--scm-option").arg("package=" + rpmPackage);
+       public void run() {
+               if (!factory.isDeveloperInstance()) {
+                       // clean/init
+                       SystemCall mockClean = createBaseMockCall();
+                       mockClean.arg("--init");
+                       mockClean.run();
+               }
 
-               mock.setLogCommand(true);
-               mock.setExecutor(executor);
+               // pre build commands
+               for (String preBuildCmd : preBuildCommands) {
+                       SystemCall mockClean = createBaseMockCall();
+                       mockClean.arg("--chroot").arg(preBuildCmd);
+                       mockClean.run();
+               }
 
+               // actual build
+               SystemCall mockBuild = createBaseMockCall();
+               mockBuild.arg("--scm-enable");
+               mockBuild.arg("--scm-option").arg("package=" + rpmPackage);
+               mockBuild.arg("--no-clean");
                //
-               // mock command execution
                //
-               mock.run();
+               mockBuild.run();
                //
 
+               // copy RPMs to target directories
                File stagingDir = factory
                                .getWorkspaceDir(factory.getStagingWorkspace());
                File srpmDir = new File(stagingDir, "SRPMS");
@@ -87,7 +85,6 @@ public class BuildInMock implements Runnable {
                        debuginfoDir.mkdirs();
                }
 
-               // copy RPMs
                Set<File> reposToRecreate = new HashSet<File>();
                File resultDir = factory.getResultDir(arch);
                if (resultDir.exists())
@@ -142,6 +139,29 @@ public class BuildInMock implements Runnable {
                factory.indexWorkspace(factory.getStagingWorkspace());
        }
 
+       /** Creates a mock call with all the common options such as config file etc. */
+       protected SystemCall createBaseMockCall() {
+               String mockCfg = factory.getMockConfig(arch);
+               File mockConfigFile = factory.getMockConfigFile(arch, branch);
+
+               // prepare mock call
+               SystemCall mock = new SystemCall();
+
+               if (arch != null)
+                       mock.arg("setarch").arg(arch);
+               mock.arg(mockExecutable);
+               mock.arg("-v");
+               mock.arg("--configdir=" + mockConfigFile.getAbsoluteFile().getParent());
+               if (arch != null)
+                       mock.arg("--arch=" + arch);
+               mock.arg("-r").arg(mockCfg);
+
+               mock.setLogCommand(true);
+               mock.setExecutor(executor);
+
+               return mock;
+       }
+
        protected void copyToDirs(File file, File[] dirs) {
                for (File dir : dirs) {
                        try {
@@ -178,4 +198,8 @@ public class BuildInMock implements Runnable {
                this.mockExecutable = mockExecutable;
        }
 
+       public void setPreBuildCommands(List<String> preBuildCommands) {
+               this.preBuildCommands = preBuildCommands;
+       }
+
 }
\ No newline at end of file
index 95e6977033e3fa62b797399d9c507127f12f897d..0a9115395bbfa2b2098d761431598c734b581b3f 100644 (file)
@@ -347,6 +347,10 @@ public class RpmFactory {
                }
        }
 
+       public Boolean isDeveloperInstance() {
+               return gitDevBaseUrl != null;
+       }
+
        /** Write (topdir)/rpmmacros and (topdir)/rpmrc */
        public void writeRpmbuildConfigFiles(File topdir) {
                writeRpmbuildConfigFiles(topdir, new File(topdir, "rpmmacros"),