Mercurial > jhg
comparison src/org/tmatesoft/hg/internal/RevlogStreamWriter.java @ 539:9edfd5a223b8
Commit: handle empty repository case
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Wed, 13 Feb 2013 18:44:58 +0100 |
| parents | dd4f6311af52 |
| children | 7f5998a9619d |
comparison
equal
deleted
inserted
replaced
| 538:dd4f6311af52 | 539:9edfd5a223b8 |
|---|---|
| 92 revlogHeader.length(content.length, compressedLen); | 92 revlogHeader.length(content.length, compressedLen); |
| 93 revlogHeader.nodeid(revisionNodeidBytes); | 93 revlogHeader.nodeid(revisionNodeidBytes); |
| 94 revlogHeader.linkRevision(linkRevision); | 94 revlogHeader.linkRevision(linkRevision); |
| 95 revlogHeader.parents(p1, p2); | 95 revlogHeader.parents(p1, p2); |
| 96 revlogHeader.baseRevision(writeComplete ? lastEntryIndex+1 : lastEntryBase); | 96 revlogHeader.baseRevision(writeComplete ? lastEntryIndex+1 : lastEntryBase); |
| 97 revlogHeader.offset(revlogStream.newEntryOffset()); | 97 long lastEntryOffset = revlogStream.newEntryOffset(); |
| 98 revlogHeader.offset(lastEntryOffset); | |
| 98 // | 99 // |
| 99 revlogHeader.serialize(indexFile); | 100 revlogHeader.serialize(indexFile); |
| 100 | 101 |
| 101 if (isInlineData) { | 102 if (isInlineData) { |
| 102 dataFile = indexFile; | 103 dataFile = indexFile; |
| 112 } else { | 113 } else { |
| 113 dataFile.writeByte((byte) 'u'); | 114 dataFile.writeByte((byte) 'u'); |
| 114 dataSource.serialize(dataFile); | 115 dataSource.serialize(dataFile); |
| 115 } | 116 } |
| 116 | 117 |
| 118 | |
| 117 lastEntryContent = content; | 119 lastEntryContent = content; |
| 118 lastEntryBase = revlogHeader.baseRevision(); | 120 lastEntryBase = revlogHeader.baseRevision(); |
| 119 lastEntryIndex++; | 121 lastEntryIndex++; |
| 120 lastEntryRevision = Nodeid.fromBinary(revisionNodeidBytes, 0); | 122 lastEntryRevision = Nodeid.fromBinary(revisionNodeidBytes, 0); |
| 121 revisionCache.put(lastEntryIndex, lastEntryRevision); | 123 revisionCache.put(lastEntryIndex, lastEntryRevision); |
| 124 | |
| 125 revlogStream.revisionAdded(lastEntryIndex, lastEntryRevision, lastEntryBase, lastEntryOffset); | |
| 122 } catch (IOException ex) { | 126 } catch (IOException ex) { |
| 123 String m = String.format("Failed to write revision %d", lastEntryIndex+1, null); | 127 String m = String.format("Failed to write revision %d", lastEntryIndex+1, null); |
| 124 HgInvalidControlFileException t = new HgInvalidControlFileException(m, ex, null); | 128 HgInvalidControlFileException t = new HgInvalidControlFileException(m, ex, null); |
| 125 if (activeFile == dataFile) { | 129 if (activeFile == dataFile) { |
| 126 throw revlogStream.initWithDataFile(t); | 130 throw revlogStream.initWithDataFile(t); |
| 147 } | 151 } |
| 148 return n; | 152 return n; |
| 149 } | 153 } |
| 150 | 154 |
| 151 private void populateLastEntry() throws HgInvalidControlFileException { | 155 private void populateLastEntry() throws HgInvalidControlFileException { |
| 152 if (lastEntryIndex != NO_REVISION && lastEntryContent == null) { | 156 if (lastEntryContent != null) { |
| 157 return; | |
| 158 } | |
| 159 if (lastEntryIndex != NO_REVISION) { | |
| 153 assert lastEntryIndex >= 0; | 160 assert lastEntryIndex >= 0; |
| 154 final IOException[] failure = new IOException[1]; | 161 final IOException[] failure = new IOException[1]; |
| 155 revlogStream.iterate(lastEntryIndex, lastEntryIndex, true, new RevlogStream.Inspector() { | 162 revlogStream.iterate(lastEntryIndex, lastEntryIndex, true, new RevlogStream.Inspector() { |
| 156 | 163 |
| 157 public void next(int revisionIndex, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, DataAccess data) { | 164 public void next(int revisionIndex, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, DataAccess data) { |
| 166 }); | 173 }); |
| 167 if (failure[0] != null) { | 174 if (failure[0] != null) { |
| 168 String m = String.format("Failed to get content of most recent revision %d", lastEntryIndex); | 175 String m = String.format("Failed to get content of most recent revision %d", lastEntryIndex); |
| 169 throw revlogStream.initWithDataFile(new HgInvalidControlFileException(m, failure[0], null)); | 176 throw revlogStream.initWithDataFile(new HgInvalidControlFileException(m, failure[0], null)); |
| 170 } | 177 } |
| 178 } else { | |
| 179 lastEntryContent = new byte[0]; | |
| 171 } | 180 } |
| 172 } | 181 } |
| 173 | 182 |
| 174 public static boolean preferCompleteOverPatch(int patchLength, int fullContentLength) { | 183 public static boolean preferCompleteOverPatch(int patchLength, int fullContentLength) { |
| 175 return !decideWorthEffort(patchLength, fullContentLength); | 184 return !decideWorthEffort(patchLength, fullContentLength); |
| 265 // assume 12 bytes left are zeros | 274 // assume 12 bytes left are zeros |
| 266 out.write(header.array(), 0, header.capacity()); | 275 out.write(header.array(), 0, header.capacity()); |
| 267 | 276 |
| 268 // regardless whether it's inline or separate data, | 277 // regardless whether it's inline or separate data, |
| 269 // offset field always represent cumulative compressedLength | 278 // offset field always represent cumulative compressedLength |
| 270 // (while offset in the index file with inline==true differs by n*sizeof(header), where n is entry's position in the file) | 279 // (while physical offset in the index file with inline==true differs by n*sizeof(header), where n is entry's position in the file) |
| 271 offset += compressedLength; | 280 offset += compressedLength; |
| 272 } | 281 } |
| 273 | 282 |
| 274 public int serializeLength() { | 283 public int serializeLength() { |
| 275 return header.capacity(); | 284 return header.capacity(); |
