Merge tag 'v2.3.20' into testing
[gpl/argeo-jcr.git] / org.argeo.slc.rpmfactory / src / org / argeo / slc / rpmfactory / core / ReleaseStaging.java
diff --git a/org.argeo.slc.rpmfactory/src/org/argeo/slc/rpmfactory/core/ReleaseStaging.java b/org.argeo.slc.rpmfactory/src/org/argeo/slc/rpmfactory/core/ReleaseStaging.java
new file mode 100644 (file)
index 0000000..78f7af3
--- /dev/null
@@ -0,0 +1,108 @@
+package org.argeo.slc.rpmfactory.core;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.exec.Executor;
+import org.apache.commons.io.FileUtils;
+import org.argeo.api.cms.CmsLog;
+import org.argeo.slc.SlcException;
+import org.argeo.slc.rpmfactory.RpmFactory;
+import org.argeo.slc.runtime.tasks.SystemCall;
+
+/** Releases the content of staging to a public repository. */
+public class ReleaseStaging implements Runnable {
+       private final static CmsLog log = CmsLog.getLog(ReleaseStaging.class);
+
+       private RpmFactory rpmFactory;
+       private Executor executor;
+
+       private String debuginfoDirName = "debuginfo";
+
+       @Override
+       public void run() {
+               String sourceWorkspace = rpmFactory.getStagingWorkspace();
+               File sourceRepoDir = rpmFactory.getWorkspaceDir(sourceWorkspace);
+               String targetWorkspace = rpmFactory.getTestingWorkspace() != null ? rpmFactory
+                               .getTestingWorkspace() : rpmFactory.getStableWorkspace();
+               File targetRepoDir = rpmFactory.getWorkspaceDir(targetWorkspace);
+               List<File> reposToRecreate = new ArrayList<File>();
+
+               stagingChildren: for (File dir : sourceRepoDir.listFiles()) {
+                       if (!dir.isDirectory())
+                               continue stagingChildren;
+                       if (dir.getName().equals("lost+found"))
+                               continue stagingChildren;
+
+                       File targetDir = new File(targetRepoDir, dir.getName());
+                       try {
+                               FileUtils.copyDirectory(dir, targetDir);
+                               if (log.isDebugEnabled())
+                                       log.debug(dir + " => " + targetDir);
+                       } catch (IOException e) {
+                               throw new SlcException(sourceRepoDir
+                                               + " could not be copied properly, check it manually."
+                                               + " Metadata have NOT been updated.", e);
+                       }
+
+                       reposToRecreate.add(dir);
+                       reposToRecreate.add(targetDir);
+                       File debugInfoDir = new File(dir, debuginfoDirName);
+                       if (debugInfoDir.exists())
+                               reposToRecreate.add(debugInfoDir);
+                       File targetDebugInfoDir = new File(targetDir, debuginfoDirName);
+                       if (targetDebugInfoDir.exists())
+                               reposToRecreate.add(targetDebugInfoDir);
+
+               }
+
+               // clear staging
+               for (File dir : sourceRepoDir.listFiles()) {
+                       try {
+                               if (dir.getName().equals("lost+found"))
+                                       continue;
+                               if (dir.isDirectory())
+                                       FileUtils.deleteDirectory(dir);
+                       } catch (IOException e) {
+                               log.error("Could not delete " + dir + ". " + e);
+                       }
+               }
+
+               // recreate changed repos
+               for (File repoToRecreate : reposToRecreate) {
+                       repoToRecreate.mkdirs();
+                       SystemCall createrepo = new SystemCall();
+                       createrepo.arg("createrepo");
+                       // sqllite db
+                       createrepo.arg("-d");
+                       // debuginfo
+                       if (!repoToRecreate.getName().equals(debuginfoDirName))
+                               createrepo.arg("-x").arg(debuginfoDirName + "/*");
+                       // quiet
+                       createrepo.arg("-q");
+                       createrepo.arg(repoToRecreate.getAbsolutePath());
+
+                       createrepo.setExecutor(executor);
+                       createrepo.run();
+                       log.info("Updated repo " + repoToRecreate);
+               }
+
+               rpmFactory.indexWorkspace(sourceWorkspace);
+               rpmFactory.indexWorkspace(targetWorkspace);
+       }
+
+       public void setRpmFactory(RpmFactory rpmFactory) {
+               this.rpmFactory = rpmFactory;
+       }
+
+       public void setExecutor(Executor executor) {
+               this.executor = executor;
+       }
+
+       public void setDebuginfoDirName(String debuginfoDirName) {
+               this.debuginfoDirName = debuginfoDirName;
+       }
+
+}