1 package de.masters_of_disaster.ant.tasks.deb; 2 3 import de.masters_of_disaster.ant.tasks.ar.Ar; 4 import de.masters_of_disaster.ant.tasks.ar.Ar.ArFileSet; 5 import java.io.File ; 6 import java.util.Enumeration ; 7 import java.util.Vector ; 8 import org.apache.tools.ant.BuildException; 9 import org.apache.tools.ant.Project; 10 import org.apache.tools.ant.Task; 11 import org.apache.tools.ant.taskdefs.Checksum; 12 import org.apache.tools.ant.taskdefs.Echo; 13 import org.apache.tools.ant.taskdefs.Echo.EchoLevel; 14 import org.apache.tools.ant.taskdefs.Mkdir; 15 import org.apache.tools.ant.taskdefs.MatchingTask; 16 import org.apache.tools.ant.taskdefs.Tar; 17 import org.apache.tools.ant.taskdefs.Tar.TarCompressionMethod; 18 import org.apache.tools.ant.taskdefs.Tar.TarFileSet; 19 import org.apache.tools.ant.util.FileUtils; 20 import org.apache.tools.ant.util.MergingMapper; 21 import org.apache.tools.ant.util.SourceFileScanner; 22 23 28 public class Deb extends MatchingTask { 29 Vector controlFileSets = new Vector (); 30 Vector dataFileSets = new Vector (); 31 File baseDir; 32 File destFile; 33 File tempDir; 34 boolean deleteTempFiles = true; 35 boolean includeMd5sums = false; 36 Tar controlTarGz = new Tar(); 37 Tar dataTarGz = new Tar(); 38 Ar debPackage = new Ar(); 39 40 { 41 fileset = dataTarGz.createTarFileSet(); 42 TarFileSet tarFileSet = controlTarGz.createTarFileSet(); 43 tarFileSet.setFile(new File (System.getProperty("user.dir"))); 44 tarFileSet.setUserName("root"); 45 tarFileSet.setGroup("root"); 46 tarFileSet.setFullpath("./"); 47 tarFileSet = dataTarGz.createTarFileSet(); 48 tarFileSet.setFile(new File (System.getProperty("user.dir"))); 49 tarFileSet.setUserName("root"); 50 tarFileSet.setGroup("root"); 51 tarFileSet.setFullpath("./"); 52 } 53 54 59 public TarFileSet createControlFileSet() { 60 TarFileSet fileSet = controlTarGz.createTarFileSet(); 61 controlFileSets.addElement(fileSet); 62 return fileSet; 63 } 64 65 70 public TarFileSet createDataFileSet() { 71 TarFileSet fileSet = dataTarGz.createTarFileSet(); 72 dataFileSets.addElement(fileSet); 73 return fileSet; 74 } 75 76 81 public void setDestFile(File destFile) { 82 this.destFile = destFile; 83 debPackage.setDestFile(destFile); 84 } 85 86 91 public void setBaseDir(File baseDir) { 92 this.baseDir = baseDir; 93 fileset.setDir(baseDir); 94 } 95 96 102 public void setTempDir(File tempDir) { 103 this.tempDir = tempDir; 104 } 105 106 111 public void setDeleteTempFiles(boolean deleteTempFiles) { 112 this.deleteTempFiles = deleteTempFiles; 113 } 114 115 121 public void setIncludeMd5sums(boolean includeMd5sums) { 122 this.includeMd5sums = includeMd5sums; 123 } 124 125 130 public void execute() throws BuildException { 131 if (null == tempDir) { 132 tempDir = getProject().getBaseDir(); 133 } 134 135 if (null != baseDir) { 136 dataFileSets.addElement(fileset); 138 } else { 139 fileset.setDir(new File (System.getProperty("user.dir"))); 140 fileset.setExcludes("**"); 141 } 142 143 boolean controlFound = false; 144 for (Enumeration e=controlFileSets.elements() ; e.hasMoreElements() ; ) { 145 TarFileSet fileSet = (TarFileSet)e.nextElement(); 146 String [] files = fileSet.getFiles(getProject()); 147 int i = 0; 148 int c; 149 150 for (c=files.length ; i<c && !controlFound ; i++) { 151 if (files[i].endsWith("control") 152 && (new File (fileSet.getDir(getProject()),files[i])).isFile()) { 153 controlFound = true; 154 } 155 } 156 } 157 if (!controlFound) { 158 throw new BuildException("The control fileset must contain a file \"control\"", getLocation()); 159 } 160 161 boolean upToDate = true; 163 for (Enumeration e=controlFileSets.elements() ; e.hasMoreElements() ; ) { 164 TarFileSet fileSet = (TarFileSet)e.nextElement(); 165 String [] files = fileSet.getFiles(getProject()); 166 167 if (!packageIsUpToDate(files,fileSet.getDir(getProject()))) { 168 upToDate = false; 169 } 170 } 171 172 for (Enumeration e=dataFileSets.elements() ; e.hasMoreElements() ; ) { 173 TarFileSet fileSet = (TarFileSet)e.nextElement(); 174 String [] files = fileSet.getFiles(getProject()); 175 176 if (!packageIsUpToDate(files,fileSet.getDir(getProject()))) { 177 upToDate = false; 178 } 179 } 180 181 if (upToDate) { 182 log("Nothing to do: " + destFile.getAbsolutePath() 183 + " is up to date.", Project.MSG_INFO); 184 return; 185 } 186 187 log("Building deb: " + destFile.getAbsolutePath(), Project.MSG_INFO); 188 189 Mkdir mkdir = new Mkdir(); 190 mkdir.setDir(tempDir); 191 prepareTask(mkdir); 192 mkdir.perform(); 193 194 Echo echo = new Echo(); 195 EchoLevel echoLevel = new EchoLevel(); 196 echoLevel.setValue("error"); 197 File debianBinaryFile = new File (tempDir,"debian-binary"); 198 echo.setFile(debianBinaryFile); 199 echo.setLevel(echoLevel); 200 echo.setMessage("2.0\n"); 201 prepareTask(echo); 202 echo.perform(); 203 204 for (Enumeration e=controlFileSets.elements() ; e.hasMoreElements() ; ) { 205 TarFileSet fileSet = (TarFileSet)e.nextElement(); 206 String prefix = fileSet.getPrefix(); 207 if (!prefix.startsWith("./")) { 208 if (prefix.startsWith("/")) { 209 fileSet.setPrefix("." + prefix); 210 } else { 211 fileSet.setPrefix("./" + prefix); 212 } 213 } 214 String fullpath = fileSet.getFullpath(); 215 if ((fullpath.length() > 0) && !fullpath.startsWith("./")) { 216 if (fullpath.startsWith("/")) { 217 fileSet.setFullpath("." + fullpath); 218 } else { 219 fileSet.setFullpath("./" + fullpath); 220 } 221 } 222 if ((0 == fileSet.getUid()) && ("" == fileSet.getUserName())) { 223 fileSet.setUserName("root"); 224 } 225 if ((0 == fileSet.getGid()) && ("" == fileSet.getGroup())) { 226 fileSet.setGroup("root"); 227 } 228 } 229 230 for (Enumeration e=dataFileSets.elements() ; e.hasMoreElements() ; ) { 231 TarFileSet fileSet = (TarFileSet)e.nextElement(); 232 String prefix = fileSet.getPrefix(); 233 if (!prefix.startsWith("./")) { 234 if (prefix.startsWith("/")) { 235 fileSet.setPrefix("." + prefix); 236 } else { 237 fileSet.setPrefix("./" + prefix); 238 } 239 } 240 String fullpath = fileSet.getFullpath(); 241 if ((fullpath.length() > 0) && !fullpath.startsWith("./")) { 242 if (fullpath.startsWith("/")) { 243 fileSet.setFullpath("." + fullpath); 244 } else { 245 fileSet.setFullpath("./" + fullpath); 246 } 247 } 248 if ((0 == fileSet.getUid()) && ("" == fileSet.getUserName())) { 249 fileSet.setUserName("root"); 250 } 251 if ((0 == fileSet.getGid()) && ("" == fileSet.getGroup())) { 252 fileSet.setGroup("root"); 253 } 254 } 255 256 File md5sumsFile = new File (tempDir,"md5sums"); 257 if (includeMd5sums) { 258 Checksum md5 = new Checksum(); 259 prepareTask(md5); 260 int md5Count = 0; 261 StringBuffer md5sums = new StringBuffer (); 262 for (Enumeration e=dataFileSets.elements() ; e.hasMoreElements() ; ) { 263 TarFileSet fileSet = (TarFileSet)e.nextElement(); 264 String [] files = fileSet.getDirectoryScanner(getProject()).getIncludedFiles(); 265 File fileSetDir = fileSet.getDir(getProject()); 266 for (int i=0, c=files.length ; i<c ; i++) { 267 md5.setFile(new File (fileSetDir,files[i])); 268 md5.setProperty("md5_"+md5Count); 269 md5.perform(); 270 md5sums.append(getProject().getProperty("md5_"+md5Count)).append(" "); 271 String fullpath = fileSet.getFullpath(); 272 if (fullpath.length() > 0) { 273 md5sums.append(fullpath.substring(2)); 274 } else { 275 md5sums.append(fileSet.getPrefix().substring(2)).append(files[i].replace('\\','/')); 276 } 277 md5sums.append("\n"); 278 md5Count++; 279 } 280 } 281 echo.setFile(md5sumsFile); 282 echo.setMessage(md5sums.toString()); 283 echo.perform(); 284 TarFileSet tarFileSet = controlTarGz.createTarFileSet(); 285 tarFileSet.setFile(md5sumsFile); 286 tarFileSet.setUserName("root"); 287 tarFileSet.setGroup("root"); 288 tarFileSet.setPrefix("./"); 289 } 290 291 TarCompressionMethod tarCompressionMethod = new TarCompressionMethod(); 292 tarCompressionMethod.setValue("gzip"); 293 controlTarGz.setCompression(tarCompressionMethod); 294 File controlTarGzFile = new File (tempDir,"control.tar.gz"); 295 controlTarGz.setDestFile(controlTarGzFile); 296 prepareTask(controlTarGz); 297 controlTarGz.perform(); 298 299 dataTarGz.setCompression(tarCompressionMethod); 300 File dataTarGzFile = new File (tempDir,"data.tar.gz"); 301 dataTarGz.setDestFile(dataTarGzFile); 302 prepareTask(dataTarGz); 303 dataTarGz.perform(); 304 305 FileUtils.delete(destFile); 306 ArFileSet fileSet = debPackage.createArFileSet(); 307 fileSet.setFile(debianBinaryFile); 308 fileSet = debPackage.createArFileSet(); 309 fileSet.setFile(controlTarGzFile); 310 fileSet = debPackage.createArFileSet(); 311 fileSet.setFile(dataTarGzFile); 312 prepareTask(debPackage); 313 debPackage.perform(); 314 315 if (deleteTempFiles) { 316 FileUtils.delete(debianBinaryFile); 317 FileUtils.delete(controlTarGzFile); 318 FileUtils.delete(dataTarGzFile); 319 FileUtils.delete(md5sumsFile); 320 } 321 } 322 323 330 protected boolean packageIsUpToDate(String [] files, File dir) { 331 SourceFileScanner sfs = new SourceFileScanner(this); 332 MergingMapper mm = new MergingMapper(); 333 mm.setTo(destFile.getAbsolutePath()); 334 return sfs.restrict(files, dir, null, mm).length == 0; 335 } 336 337 342 protected void prepareTask(Task task) { 343 task.setProject(getProject()); 344 task.setOwningTarget(getOwningTarget()); 345 task.setTaskName(getTaskName()); 346 task.setTaskType(getTaskType()); 347 } 348 } 349 | Popular Tags |