Mercurial > jhg
comparison src/com/tmate/hgkit/console/Main.java @ 3:24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Mon, 20 Dec 2010 02:50:36 +0100 |
| parents | 08db726a0fb7 |
| children | aa1912c70b36 |
comparison
equal
deleted
inserted
replaced
| 2:08db726a0fb7 | 3:24bb4f365164 |
|---|---|
| 4 import java.io.DataInput; | 4 import java.io.DataInput; |
| 5 import java.io.DataInputStream; | 5 import java.io.DataInputStream; |
| 6 import java.io.File; | 6 import java.io.File; |
| 7 import java.io.FileInputStream; | 7 import java.io.FileInputStream; |
| 8 import java.math.BigInteger; | 8 import java.math.BigInteger; |
| 9 import java.util.ArrayList; | |
| 10 import java.util.Collections; | |
| 11 import java.util.Iterator; | |
| 12 import java.util.LinkedList; | 9 import java.util.LinkedList; |
| 13 import java.util.List; | |
| 14 import java.util.zip.Deflater; | |
| 15 import java.util.zip.Inflater; | 10 import java.util.zip.Inflater; |
| 16 | 11 |
| 17 import com.tmate.hgkit.ll.Changeset; | 12 import com.tmate.hgkit.ll.Changeset; |
| 18 | 13 |
| 19 /** | 14 /** |
| 21 * @author artem | 16 * @author artem |
| 22 */ | 17 */ |
| 23 public class Main { | 18 public class Main { |
| 24 | 19 |
| 25 public static void main(String[] args) throws Exception { | 20 public static void main(String[] args) throws Exception { |
| 21 //String filename = "store/00changelog.i"; | |
| 22 String filename = "store/data/hello.c.i"; | |
| 26 LinkedList<Changeset> changelog = new LinkedList<Changeset>(); | 23 LinkedList<Changeset> changelog = new LinkedList<Changeset>(); |
| 27 // | 24 // |
| 28 DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream(new File("/temp/hg/hello/" + ".hg/store/00changelog.i")))); | 25 DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream(new File("/temp/hg/hello/.hg/" + filename)))); |
| 29 DataInput di = dis; | 26 DataInput di = dis; |
| 30 dis.mark(10); | 27 dis.mark(10); |
| 31 int versionField = di.readInt(); | 28 int versionField = di.readInt(); |
| 32 dis.reset(); | 29 dis.reset(); |
| 33 final int INLINEDATA = 1 << 16; | 30 final int INLINEDATA = 1 << 16; |
| 49 byte[] buf = new byte[32]; | 46 byte[] buf = new byte[32]; |
| 50 di.readFully(buf, 12, 20); | 47 di.readFully(buf, 12, 20); |
| 51 dis.skip(12); | 48 dis.skip(12); |
| 52 System.out.printf("%14d %6X %10d %10d %10d %10d %8d %8d %040x\n", offset, flags, compressedLen, actualLen, baseRevision, linkRevision, parent1Revision, parent2Revision, new BigInteger(buf)); | 49 System.out.printf("%14d %6X %10d %10d %10d %10d %8d %8d %040x\n", offset, flags, compressedLen, actualLen, baseRevision, linkRevision, parent1Revision, parent2Revision, new BigInteger(buf)); |
| 53 if (inlineData) { | 50 if (inlineData) { |
| 51 String resultString; | |
| 54 byte[] data = new byte[compressedLen]; | 52 byte[] data = new byte[compressedLen]; |
| 55 di.readFully(data); | 53 di.readFully(data); |
| 56 if (data[0] == 0x78 /* 'x' */) { | 54 if (data[0] == 0x78 /* 'x' */) { |
| 57 Inflater zlib = new Inflater(); | 55 Inflater zlib = new Inflater(); |
| 58 zlib.setInput(data, 0, compressedLen); | 56 zlib.setInput(data, 0, compressedLen); |
| 59 byte[] result = new byte[actualLen*2]; | 57 byte[] result = new byte[actualLen*2]; |
| 60 int resultLen = zlib.inflate(result); | 58 int resultLen = zlib.inflate(result); |
| 61 zlib.end(); | 59 zlib.end(); |
| 62 if (resultLen != actualLen) { | |
| 63 System.err.printf("Expected:%d, decomressed to:%d bytes\n", actualLen, resultLen); | |
| 64 } | |
| 65 String resultString; | |
| 66 if (baseRevision != entryCount) { | |
| 67 // this is a patch | |
| 68 byte[] baseRevContent = changelog.get(baseRevision).rawData; | |
| 69 LinkedList<PatchRecord> bins = new LinkedList<PatchRecord>(); | |
| 70 int p1, p2, len, patchElementIndex = 0; | |
| 71 do { | |
| 72 final int x = patchElementIndex; | |
| 73 p1 = (result[x] << 24) | (result[x+1] << 16) | (result[x+2] << 8) | result[x+3]; | |
| 74 p2 = (result[x+4] << 24) | (result[x+5] << 16) | (result[x+6] << 8) | result[x+7]; | |
| 75 len = (result[x+8] << 24) | (result[x+9] << 16) | (result[x+10] << 8) | result[x+11]; | |
| 76 System.out.printf("%4d %4d %4d\n", p1, p2, len); | |
| 77 patchElementIndex += 12 + len; | |
| 78 bins.add(new PatchRecord(p1, p2, len, result, x+12)); | |
| 79 } while (patchElementIndex < resultLen); | |
| 80 // | |
| 81 result = apply(baseRevContent, bins); | |
| 82 resultLen = result.length; | |
| 83 } | |
| 84 resultString = new String(result, 0, resultLen, "UTF-8"); | 60 resultString = new String(result, 0, resultLen, "UTF-8"); |
| 85 System.out.println(resultString); | 61 } else if (data[0] == 0x75 /* 'u' */) { |
| 86 entryCount++; | 62 resultString = new String(data, 1, data.length - 1, "UTF-8"); |
| 87 Changeset changeset = new Changeset(); | 63 } else { |
| 88 changeset.read(result, 0, resultLen); | 64 resultString = new String(data); |
| 89 changelog.add(changeset); | 65 } |
| 90 } // TODO else if uncompressed | 66 System.out.println(resultString); |
| 91 } | 67 } |
| 92 } | 68 } |
| 93 dis.close(); | 69 dis.close(); |
| 94 // | 70 // |
| 95 System.out.println("\n\n"); | 71 System.out.println("\n\n"); |
| 98 System.out.println(">"); | 74 System.out.println(">"); |
| 99 cset.dump(); | 75 cset.dump(); |
| 100 System.out.println("<"); | 76 System.out.println("<"); |
| 101 } | 77 } |
| 102 } | 78 } |
| 103 | |
| 104 | |
| 105 // mpatch.c : apply() | |
| 106 private static byte[] apply(byte[] baseRevisionContent, List<PatchRecord> patch) { | |
| 107 byte[] tempBuf = new byte[512]; // XXX | |
| 108 int last = 0, destIndex = 0; | |
| 109 for (PatchRecord pr : patch) { | |
| 110 System.arraycopy(baseRevisionContent, last, tempBuf, destIndex, pr.start-last); | |
| 111 destIndex += pr.start - last; | |
| 112 System.arraycopy(pr.data, 0, tempBuf, destIndex, pr.data.length); | |
| 113 destIndex += pr.data.length; | |
| 114 last = pr.end; | |
| 115 } | |
| 116 System.arraycopy(baseRevisionContent, last, tempBuf, destIndex, baseRevisionContent.length - last); | |
| 117 destIndex += baseRevisionContent.length - last; // total length | |
| 118 byte[] rv = new byte[destIndex]; | |
| 119 System.arraycopy(tempBuf, 0, rv, 0, destIndex); | |
| 120 return rv; | |
| 121 } | |
| 122 | |
| 123 static class PatchRecord { // copy of struct frag from mpatch.c | |
| 124 int start, end, len; | |
| 125 byte[] data; | |
| 126 | |
| 127 public PatchRecord(int p1, int p2, int len, byte[] src, int srcOffset) { | |
| 128 start = p1; | |
| 129 end = p2; | |
| 130 this.len = len; | |
| 131 data = new byte[len]; | |
| 132 System.arraycopy(src, srcOffset, data, 0, len); | |
| 133 } | |
| 134 } | |
| 135 } | 79 } |
