package org.codehaus.mojo.deb.jdpkg;
import org.codehaus.mojo.deb.jdpkg.ar.Ar;
import static org.codehaus.mojo.deb.jdpkg.ar.ArUtil.*;
import org.codehaus.mojo.deb.jdpkg.ar.CloseableIterable;
import org.codehaus.mojo.deb.jdpkg.ar.ReadableArFile;
import org.codehaus.plexus.archiver.tar.TarEntry;
import org.codehaus.plexus.archiver.tar.TarInputStream;
import org.codehaus.plexus.util.StringUtils;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.TimeZone;
import java.util.zip.GZIPInputStream;
/**
* @author <a href="mailto:trygve.laugstol@arktekk.no">Trygve Laugstøl</a>
* @version $Id$
*/
public class DpkgDebCli {
private PrintWriter out;
public DpkgDebCli(PrintWriter out) {
this.out = out;
}
public void main(String[] args) throws Exception {
String command = args[0];
if (command.equals("-c")) {
contents(new File(args[1]));
}
}
public void contents(File debFile) throws IOException {
CloseableIterable<ReadableArFile> reader = null;
try {
reader = Ar.read(debFile);
for (ReadableArFile file : reader) {
if (file.getName().equals("data.tar.gz")) {
dumpContents(file);
break;
}
}
}
finally {
closeSilent(reader);
}
}
private void dumpContents(ReadableArFile arFile) throws IOException {
TarInputStream tis = null;
try {
tis = new TarInputStream(new GZIPInputStream(arFile.open()));
TarEntry entry = tis.getNextEntry();
while (entry != null) {
print(entry);
entry = tis.getNextEntry();
}
}
finally {
closeSilent(tis);
}
}
final SimpleDateFormat dateFormat;
{
dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
}
private void print(TarEntry entry) {
String type;
if (!entry.getLinkName().equals("")) {
type = "l";
} else if (entry.isDirectory()) {
type = "d";
} else {
type = "-";
}
String mode = mode(entry.getMode());
String ug = entry.getUserName() + "/" + entry.getGroupName();
String date = dateFormat.format(entry.getModTime());
String size = StringUtils.leftPad(Long.toString(entry.getSize()), 9);
out.print(type + mode + " " + ug + " " + size + " " + date + " " + entry.getName());
if (type.equals("l")) {
out.print(" -> " + entry.getLinkName());
}
out.println();
}
private String mode(int mode) {
StringBuilder builder = new StringBuilder(" ");
builder.setLength(9);
builder.setCharAt(0, (mode & 0x100) > 0 ? 'r' : '-');
builder.setCharAt(1, (mode & 0x080) > 0 ? 'w' : '-');
builder.setCharAt(2, (mode & 0x040) > 0 ? 'x' : '-');
builder.setCharAt(3, (mode & 0x020) > 0 ? 'r' : '-');
builder.setCharAt(4, (mode & 0x010) > 0 ? 'w' : '-');
builder.setCharAt(5, (mode & 0x400) > 0 ? 's' : (mode & 0x008) > 0 ? 'x' : '-');
builder.setCharAt(6, (mode & 0x004) > 0 ? 'r' : '-');
builder.setCharAt(7, (mode & 0x002) > 0 ? 'w' : '-');
builder.setCharAt(8, (mode & 0x001) > 0 ? 'x' : '-');
return builder.toString();
}
}