]> git.argeo.org Git - gpl/argeo-jcr.git/blob - rpmfactory/core/ReleaseStaging.java
Prepare next development cycle
[gpl/argeo-jcr.git] / rpmfactory / core / ReleaseStaging.java
1 package org.argeo.slc.rpmfactory.core;
2
3 import java.io.File;
4 import java.io.IOException;
5 import java.util.ArrayList;
6 import java.util.List;
7
8 import org.apache.commons.exec.Executor;
9 import org.apache.commons.io.FileUtils;
10 import org.argeo.api.cms.CmsLog;
11 import org.argeo.slc.SlcException;
12 import org.argeo.slc.rpmfactory.RpmFactory;
13 import org.argeo.slc.runtime.tasks.SystemCall;
14
15 /** Releases the content of staging to a public repository. */
16 public class ReleaseStaging implements Runnable {
17 private final static CmsLog log = CmsLog.getLog(ReleaseStaging.class);
18
19 private RpmFactory rpmFactory;
20 private Executor executor;
21
22 private String debuginfoDirName = "debuginfo";
23
24 @Override
25 public void run() {
26 String sourceWorkspace = rpmFactory.getStagingWorkspace();
27 File sourceRepoDir = rpmFactory.getWorkspaceDir(sourceWorkspace);
28 String targetWorkspace = rpmFactory.getTestingWorkspace() != null ? rpmFactory
29 .getTestingWorkspace() : rpmFactory.getStableWorkspace();
30 File targetRepoDir = rpmFactory.getWorkspaceDir(targetWorkspace);
31 List<File> reposToRecreate = new ArrayList<File>();
32
33 stagingChildren: for (File dir : sourceRepoDir.listFiles()) {
34 if (!dir.isDirectory())
35 continue stagingChildren;
36 if (dir.getName().equals("lost+found"))
37 continue stagingChildren;
38
39 File targetDir = new File(targetRepoDir, dir.getName());
40 try {
41 FileUtils.copyDirectory(dir, targetDir);
42 if (log.isDebugEnabled())
43 log.debug(dir + " => " + targetDir);
44 } catch (IOException e) {
45 throw new SlcException(sourceRepoDir
46 + " could not be copied properly, check it manually."
47 + " Metadata have NOT been updated.", e);
48 }
49
50 reposToRecreate.add(dir);
51 reposToRecreate.add(targetDir);
52 File debugInfoDir = new File(dir, debuginfoDirName);
53 if (debugInfoDir.exists())
54 reposToRecreate.add(debugInfoDir);
55 File targetDebugInfoDir = new File(targetDir, debuginfoDirName);
56 if (targetDebugInfoDir.exists())
57 reposToRecreate.add(targetDebugInfoDir);
58
59 }
60
61 // clear staging
62 for (File dir : sourceRepoDir.listFiles()) {
63 try {
64 if (dir.getName().equals("lost+found"))
65 continue;
66 if (dir.isDirectory())
67 FileUtils.deleteDirectory(dir);
68 } catch (IOException e) {
69 log.error("Could not delete " + dir + ". " + e);
70 }
71 }
72
73 // recreate changed repos
74 for (File repoToRecreate : reposToRecreate) {
75 repoToRecreate.mkdirs();
76 SystemCall createrepo = new SystemCall();
77 createrepo.arg("createrepo");
78 // sqllite db
79 createrepo.arg("-d");
80 // debuginfo
81 if (!repoToRecreate.getName().equals(debuginfoDirName))
82 createrepo.arg("-x").arg(debuginfoDirName + "/*");
83 // quiet
84 createrepo.arg("-q");
85 createrepo.arg(repoToRecreate.getAbsolutePath());
86
87 createrepo.setExecutor(executor);
88 createrepo.run();
89 log.info("Updated repo " + repoToRecreate);
90 }
91
92 rpmFactory.indexWorkspace(sourceWorkspace);
93 rpmFactory.indexWorkspace(targetWorkspace);
94 }
95
96 public void setRpmFactory(RpmFactory rpmFactory) {
97 this.rpmFactory = rpmFactory;
98 }
99
100 public void setExecutor(Executor executor) {
101 this.executor = executor;
102 }
103
104 public void setDebuginfoDirName(String debuginfoDirName) {
105 this.debuginfoDirName = debuginfoDirName;
106 }
107
108 }