+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;
+ }
+
+}