]> git.argeo.org Git - gpl/argeo-slc.git/blob - cms/org.argeo.slc.support/src/org/argeo/slc/lib/linux/rpmfactory/BuildInMock.java
Clarify SLC project structure.
[gpl/argeo-slc.git] / cms / org.argeo.slc.support / src / org / argeo / slc / lib / linux / rpmfactory / BuildInMock.java
1 package org.argeo.slc.lib.linux.rpmfactory;
2
3 import java.io.File;
4 import java.io.IOException;
5 import java.util.ArrayList;
6 import java.util.Arrays;
7 import java.util.HashSet;
8 import java.util.List;
9 import java.util.Set;
10
11 import org.apache.commons.exec.Executor;
12 import org.apache.commons.io.FileUtils;
13 import org.apache.commons.logging.Log;
14 import org.apache.commons.logging.LogFactory;
15 import org.argeo.slc.SlcException;
16 import org.argeo.slc.core.execution.tasks.SystemCall;
17
18 /** Rebuild an SRPM in mock. (Historical) Replaces the build-mock.sh script. */
19 public class BuildInMock implements Runnable {
20 private final static Log log = LogFactory.getLog(BuildInMock.class);
21
22 /** Mock flavour provided by the EPEL repository */
23 public final static String EPEL = "EPEL";
24 /** Mock flavour provided by CentOS until v5 */
25 public final static String CENTOS = "CENTOS";
26
27 public final static String NOARCH = "noarch";
28
29 private String mockVar = "/var/lib/mock";
30
31 private String mockFlavour = EPEL;
32 private String mockConfig = null;
33
34 private String repository;
35 private String release = null;
36 private String level = null;
37 private String arch = NOARCH;
38
39 private String rpmPackage = null;
40
41 private Boolean mkdirs = true;
42
43 private RpmBuildEnvironment buildEnvironment;
44 private Executor executor;
45
46 private String debuginfoDirName = "debuginfo";
47
48 public void run() {
49 // TODO check if caller is in mock group
50
51 String cfgId = repository + "-" + release + "-" + arch;
52 String cfg = mockConfig != null ? mockConfig : "slc/" + cfgId;
53
54 // prepare mock call
55 SystemCall mock = new SystemCall();
56 if (arch != null)
57 mock.arg("setarch").arg(arch);
58 mock.arg("mock");
59 if (mockFlavour.equals(EPEL))
60 mock.arg("-v");
61 else if (mockFlavour.equals(CENTOS))
62 mock.arg("--debug");
63 if (arch != null)
64 mock.arg("--arch=" + arch);
65 mock.arg("-r").arg(cfg);
66
67 mock.arg("--scm-enable");
68 mock.arg("--scm-option").arg("package=" + rpmPackage);
69
70 mock.setLogCommand(true);
71
72 // mock command execution
73 mock.setExecutor(executor);
74 mock.run();
75
76 // File repoDir = new File(buildEnvironment.getStagingBase() + "/"
77 // + repository + "/" + level + "/" + release);
78 File repoDir = new File(buildEnvironment.getStagingBase() + "/"
79 + repository + "-" + release + "-staging");
80 File srpmDir = new File(repoDir, "SRPMS");
81 if (mkdirs)
82 srpmDir.mkdirs();
83 File archDir = null;
84 File debuginfoDir = null;
85 if (!arch.equals(NOARCH)) {
86 archDir = new File(repoDir, arch);
87 debuginfoDir = new File(archDir, debuginfoDirName);
88 debuginfoDir.mkdirs();
89 }
90
91 // copy RPMs
92 Set<File> reposToRecreate = new HashSet<File>();
93 File resultDir = new File(mockVar + "/" + cfgId + "/result");
94 rpms: for (File file : resultDir.listFiles()) {
95 if (file.isDirectory())
96 continue rpms;
97
98 File[] targetDirs;
99 if (file.getName().contains(".src.rpm"))
100 targetDirs = new File[] { srpmDir };
101 else if (file.getName().contains("-debuginfo-"))
102 targetDirs = new File[] { debuginfoDir };
103 else if (!arch.equals(NOARCH)
104 && file.getName().contains("." + arch + ".rpm"))
105 targetDirs = new File[] { archDir };
106 else if (file.getName().contains(".noarch.rpm")) {
107 List<File> dirs = new ArrayList<File>();
108 for (String arch : buildEnvironment.getArchs())
109 dirs.add(new File(repoDir, arch));
110 targetDirs = dirs.toArray(new File[dirs.size()]);
111 } else if (file.getName().contains(".rpm"))
112 throw new SlcException("Don't know where to copy " + file);
113 else {
114 if (log.isTraceEnabled())
115 log.trace("Skip " + file);
116 continue rpms;
117 }
118
119 reposToRecreate.addAll(Arrays.asList(targetDirs));
120 copyToDirs(file, targetDirs);
121 }
122
123 // recreate changed repos
124 for (File repoToRecreate : reposToRecreate) {
125 SystemCall createrepo = new SystemCall();
126 createrepo.arg("createrepo");
127 // sqllite db
128 createrepo.arg("-d");
129 // debuginfo
130 if (!repoToRecreate.getName().equals(debuginfoDirName))
131 createrepo.arg("-x").arg(debuginfoDirName + "/*");
132 // quiet
133 createrepo.arg("-q");
134 createrepo.arg(repoToRecreate.getAbsolutePath());
135
136 createrepo.setExecutor(executor);
137 createrepo.run();
138 log.info("Updated repo " + repoToRecreate);
139 }
140 }
141
142 protected void copyToDirs(File file, File[] dirs) {
143 for (File dir : dirs) {
144 try {
145 FileUtils.copyFileToDirectory(file, dir);
146 if (log.isDebugEnabled())
147 log.debug(file + " => " + dir);
148 } catch (IOException e) {
149 throw new SlcException("Cannot copy " + file + " to " + dir, e);
150 }
151 }
152 }
153
154 public void setMockFlavour(String mockFlavour) {
155 this.mockFlavour = mockFlavour;
156 }
157
158 public void setMockConfig(String mockConfig) {
159 this.mockConfig = mockConfig;
160 }
161
162 public void setRepository(String repo) {
163 this.repository = repo;
164 }
165
166 public void setRelease(String release) {
167 this.release = release;
168 }
169
170 public void setLevel(String level) {
171 this.level = level;
172 }
173
174 public void setArch(String arch) {
175 this.arch = arch;
176 }
177
178 public void setRpmPackage(String rpmPackage) {
179 this.rpmPackage = rpmPackage;
180 }
181
182 public void setMockVar(String mockVar) {
183 this.mockVar = mockVar;
184 }
185
186 public void setMkdirs(Boolean mkdirs) {
187 this.mkdirs = mkdirs;
188 }
189
190 public void setBuildEnvironment(RpmBuildEnvironment buildEnvironment) {
191 this.buildEnvironment = buildEnvironment;
192 }
193
194 public void setExecutor(Executor executor) {
195 this.executor = executor;
196 }
197
198 }