1 package org
.argeo
.slc
.lib
.linux
.rpmfactory
;
4 import java
.io
.IOException
;
5 import java
.util
.ArrayList
;
6 import java
.util
.Arrays
;
7 import java
.util
.HashSet
;
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
;
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);
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";
27 public final static String NOARCH
= "noarch";
29 private String mockVar
= "/var/lib/mock";
31 private String mockFlavour
= EPEL
;
32 private String mockConfig
= null;
34 private String repository
;
35 private String release
= null;
36 private String level
= null;
37 private String arch
= NOARCH
;
39 private String rpmPackage
= null;
41 private Boolean mkdirs
= true;
43 private RpmBuildEnvironment buildEnvironment
;
44 private Executor executor
;
46 private String debuginfoDirName
= "debuginfo";
49 // TODO check if caller is in mock group
51 String cfgId
= repository
+ "-" + release
+ "-" + arch
;
52 String cfg
= mockConfig
!= null ? mockConfig
: "slc/" + cfgId
;
55 SystemCall mock
= new SystemCall();
57 mock
.arg("setarch").arg(arch
);
59 if (mockFlavour
.equals(EPEL
))
61 else if (mockFlavour
.equals(CENTOS
))
64 mock
.arg("--arch=" + arch
);
65 mock
.arg("-r").arg(cfg
);
67 mock
.arg("--scm-enable");
68 mock
.arg("--scm-option").arg("package=" + rpmPackage
);
70 mock
.setLogCommand(true);
72 // mock command execution
73 mock
.setExecutor(executor
);
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");
84 File debuginfoDir
= null;
85 if (!arch
.equals(NOARCH
)) {
86 archDir
= new File(repoDir
, arch
);
87 debuginfoDir
= new File(archDir
, debuginfoDirName
);
88 debuginfoDir
.mkdirs();
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())
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
);
114 if (log
.isTraceEnabled())
115 log
.trace("Skip " + file
);
119 reposToRecreate
.addAll(Arrays
.asList(targetDirs
));
120 copyToDirs(file
, targetDirs
);
123 // recreate changed repos
124 for (File repoToRecreate
: reposToRecreate
) {
125 SystemCall createrepo
= new SystemCall();
126 createrepo
.arg("createrepo");
128 createrepo
.arg("-d");
130 if (!repoToRecreate
.getName().equals(debuginfoDirName
))
131 createrepo
.arg("-x").arg(debuginfoDirName
+ "/*");
133 createrepo
.arg("-q");
134 createrepo
.arg(repoToRecreate
.getAbsolutePath());
136 createrepo
.setExecutor(executor
);
138 log
.info("Updated repo " + repoToRecreate
);
142 protected void copyToDirs(File file
, File
[] dirs
) {
143 for (File dir
: dirs
) {
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
);
154 public void setMockFlavour(String mockFlavour
) {
155 this.mockFlavour
= mockFlavour
;
158 public void setMockConfig(String mockConfig
) {
159 this.mockConfig
= mockConfig
;
162 public void setRepository(String repo
) {
163 this.repository
= repo
;
166 public void setRelease(String release
) {
167 this.release
= release
;
170 public void setLevel(String level
) {
174 public void setArch(String arch
) {
178 public void setRpmPackage(String rpmPackage
) {
179 this.rpmPackage
= rpmPackage
;
182 public void setMockVar(String mockVar
) {
183 this.mockVar
= mockVar
;
186 public void setMkdirs(Boolean mkdirs
) {
187 this.mkdirs
= mkdirs
;
190 public void setBuildEnvironment(RpmBuildEnvironment buildEnvironment
) {
191 this.buildEnvironment
= buildEnvironment
;
194 public void setExecutor(Executor executor
) {
195 this.executor
= executor
;