Mercurial > hg4j
annotate src/org/tmatesoft/hg/internal/RevlogStreamWriter.java @ 598:d29d9dc6c128
Utilize the fact nodeids are very different and are read anyway to speed up reverse lookup
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Fri, 03 May 2013 15:19:18 +0200 | 
| parents | e447384f3771 | 
| children | e1b29756f901 | 
| rev | line source | 
|---|---|
| 530 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 1 /* | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 2 * Copyright (c) 2013 TMate Software Ltd | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 3 * | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 4 * This program is free software; you can redistribute it and/or modify | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 5 * it under the terms of the GNU General Public License as published by | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 6 * the Free Software Foundation; version 2 of the License. | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 7 * | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 8 * This program is distributed in the hope that it will be useful, | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 11 * GNU General Public License for more details. | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 12 * | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 13 * For information on how to redistribute this software under | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 14 * the terms of a license other than GNU General Public License | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 15 * contact TMate Software at support@hg4j.com | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 16 */ | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 17 package org.tmatesoft.hg.internal; | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 18 | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 19 import static org.tmatesoft.hg.internal.Internals.REVLOGV1_RECORD_SIZE; | 
| 534 
243202f1bda5
Commit: refactor revision creation code from clone command to work separately, fit into existing library structure
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
533diff
changeset | 20 import static org.tmatesoft.hg.repo.HgRepository.NO_REVISION; | 
| 530 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 21 | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 22 import java.io.IOException; | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 23 import java.nio.ByteBuffer; | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 24 | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 25 import org.tmatesoft.hg.core.Nodeid; | 
| 534 
243202f1bda5
Commit: refactor revision creation code from clone command to work separately, fit into existing library structure
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
533diff
changeset | 26 import org.tmatesoft.hg.core.SessionContext; | 
| 
243202f1bda5
Commit: refactor revision creation code from clone command to work separately, fit into existing library structure
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
533diff
changeset | 27 import org.tmatesoft.hg.repo.HgInvalidControlFileException; | 
| 
243202f1bda5
Commit: refactor revision creation code from clone command to work separately, fit into existing library structure
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
533diff
changeset | 28 import org.tmatesoft.hg.repo.HgInvalidStateException; | 
| 530 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 29 | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 30 /** | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 31 * | 
| 534 
243202f1bda5
Commit: refactor revision creation code from clone command to work separately, fit into existing library structure
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
533diff
changeset | 32 * TODO separate operation to check if index is too big and split into index+data | 
| 532 
688c1ab113bb
Introduce explicit reference to base patch in bundle's group element, use it when cloning to fix defect when few revisions list null,null parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
530diff
changeset | 33 * | 
| 530 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 34 * @author Artem Tikhomirov | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 35 * @author TMate Software Ltd. | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 36 */ | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 37 public class RevlogStreamWriter { | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 38 | 
| 538 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 39 private final DigestHelper dh = new DigestHelper(); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 40 private final RevlogCompressor revlogDataZip; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 41 private int lastEntryBase, lastEntryIndex; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 42 private byte[] lastEntryContent; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 43 private Nodeid lastEntryRevision; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 44 private IntMap<Nodeid> revisionCache = new IntMap<Nodeid>(32); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 45 private RevlogStream revlogStream; | 
| 530 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 46 | 
| 591 
e447384f3771
CommitFacility as internal class; refactored infrastructure around internals (access to RevlogStream)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
544diff
changeset | 47 public RevlogStreamWriter(SessionContext.Source ctxSource, RevlogStream stream) { | 
| 
e447384f3771
CommitFacility as internal class; refactored infrastructure around internals (access to RevlogStream)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
544diff
changeset | 48 assert ctxSource != null; | 
| 538 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 49 assert stream != null; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 50 | 
| 591 
e447384f3771
CommitFacility as internal class; refactored infrastructure around internals (access to RevlogStream)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
544diff
changeset | 51 revlogDataZip = new RevlogCompressor(ctxSource.getSessionContext()); | 
| 538 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 52 revlogStream = stream; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 53 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 54 | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 55 /** | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 56 * @return nodeid of added revision | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 57 */ | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 58 public Nodeid addRevision(byte[] content, int linkRevision, int p1, int p2) { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 59 lastEntryRevision = Nodeid.NULL; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 60 int revCount = revlogStream.revisionCount(); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 61 lastEntryIndex = revCount == 0 ? NO_REVISION : revCount - 1; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 62 populateLastEntry(); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 63 // | 
| 544 
7f5998a9619d
Refactor PatchGenerator to be generic and welcome sequence of any nature
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
539diff
changeset | 64 Patch patch = GeneratePatchInspector.delta(lastEntryContent, content); | 
| 538 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 65 int patchSerializedLength = patch.serializedLength(); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 66 | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 67 final boolean writeComplete = preferCompleteOverPatch(patchSerializedLength, content.length); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 68 DataSerializer.DataSource dataSource = writeComplete ? new DataSerializer.ByteArrayDataSource(content) : patch.new PatchDataSource(); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 69 revlogDataZip.reset(dataSource); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 70 final int compressedLen; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 71 final boolean useCompressedData = preferCompressedOverComplete(revlogDataZip.getCompressedLength(), dataSource.serializeLength()); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 72 if (useCompressedData) { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 73 compressedLen= revlogDataZip.getCompressedLength(); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 74 } else { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 75 // compression wasn't too effective, | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 76 compressedLen = dataSource.serializeLength() + 1 /*1 byte for 'u' - uncompressed prefix byte*/; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 77 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 78 // | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 79 Nodeid p1Rev = revision(p1); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 80 Nodeid p2Rev = revision(p2); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 81 byte[] revisionNodeidBytes = dh.sha1(p1Rev, p2Rev, content).asBinary(); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 82 // | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 83 | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 84 DataSerializer indexFile, dataFile, activeFile; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 85 indexFile = dataFile = activeFile = null; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 86 try { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 87 // | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 88 activeFile = indexFile = revlogStream.getIndexStreamWriter(); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 89 final boolean isInlineData = revlogStream.isInlineData(); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 90 HeaderWriter revlogHeader = new HeaderWriter(isInlineData); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 91 revlogHeader.length(content.length, compressedLen); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 92 revlogHeader.nodeid(revisionNodeidBytes); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 93 revlogHeader.linkRevision(linkRevision); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 94 revlogHeader.parents(p1, p2); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 95 revlogHeader.baseRevision(writeComplete ? lastEntryIndex+1 : lastEntryBase); | 
| 539 
9edfd5a223b8
Commit: handle empty repository case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
538diff
changeset | 96 long lastEntryOffset = revlogStream.newEntryOffset(); | 
| 
9edfd5a223b8
Commit: handle empty repository case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
538diff
changeset | 97 revlogHeader.offset(lastEntryOffset); | 
| 538 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 98 // | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 99 revlogHeader.serialize(indexFile); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 100 | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 101 if (isInlineData) { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 102 dataFile = indexFile; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 103 } else { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 104 dataFile = revlogStream.getDataStreamWriter(); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 105 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 106 activeFile = dataFile; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 107 if (useCompressedData) { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 108 int actualCompressedLenWritten = revlogDataZip.writeCompressedData(dataFile); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 109 if (actualCompressedLenWritten != compressedLen) { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 110 throw new HgInvalidStateException(String.format("Expected %d bytes of compressed data, but actually wrote %d in %s", compressedLen, actualCompressedLenWritten, revlogStream.getDataFileName())); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 111 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 112 } else { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 113 dataFile.writeByte((byte) 'u'); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 114 dataSource.serialize(dataFile); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 115 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 116 | 
| 539 
9edfd5a223b8
Commit: handle empty repository case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
538diff
changeset | 117 | 
| 538 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 118 lastEntryContent = content; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 119 lastEntryBase = revlogHeader.baseRevision(); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 120 lastEntryIndex++; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 121 lastEntryRevision = Nodeid.fromBinary(revisionNodeidBytes, 0); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 122 revisionCache.put(lastEntryIndex, lastEntryRevision); | 
| 539 
9edfd5a223b8
Commit: handle empty repository case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
538diff
changeset | 123 | 
| 
9edfd5a223b8
Commit: handle empty repository case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
538diff
changeset | 124 revlogStream.revisionAdded(lastEntryIndex, lastEntryRevision, lastEntryBase, lastEntryOffset); | 
| 538 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 125 } catch (IOException ex) { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 126 String m = String.format("Failed to write revision %d", lastEntryIndex+1, null); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 127 HgInvalidControlFileException t = new HgInvalidControlFileException(m, ex, null); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 128 if (activeFile == dataFile) { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 129 throw revlogStream.initWithDataFile(t); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 130 } else { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 131 throw revlogStream.initWithIndexFile(t); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 132 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 133 } finally { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 134 indexFile.done(); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 135 if (dataFile != null && dataFile != indexFile) { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 136 dataFile.done(); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 137 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 138 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 139 return lastEntryRevision; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 140 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 141 | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 142 private Nodeid revision(int revisionIndex) { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 143 if (revisionIndex == NO_REVISION) { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 144 return Nodeid.NULL; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 145 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 146 Nodeid n = revisionCache.get(revisionIndex); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 147 if (n == null) { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 148 n = Nodeid.fromBinary(revlogStream.nodeid(revisionIndex), 0); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 149 revisionCache.put(revisionIndex, n); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 150 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 151 return n; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 152 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 153 | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 154 private void populateLastEntry() throws HgInvalidControlFileException { | 
| 539 
9edfd5a223b8
Commit: handle empty repository case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
538diff
changeset | 155 if (lastEntryContent != null) { | 
| 
9edfd5a223b8
Commit: handle empty repository case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
538diff
changeset | 156 return; | 
| 
9edfd5a223b8
Commit: handle empty repository case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
538diff
changeset | 157 } | 
| 
9edfd5a223b8
Commit: handle empty repository case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
538diff
changeset | 158 if (lastEntryIndex != NO_REVISION) { | 
| 538 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 159 assert lastEntryIndex >= 0; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 160 final IOException[] failure = new IOException[1]; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 161 revlogStream.iterate(lastEntryIndex, lastEntryIndex, true, new RevlogStream.Inspector() { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 162 | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 163 public void next(int revisionIndex, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, DataAccess data) { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 164 try { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 165 lastEntryBase = baseRevision; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 166 lastEntryRevision = Nodeid.fromBinary(nodeid, 0); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 167 lastEntryContent = data.byteArray(); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 168 } catch (IOException ex) { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 169 failure[0] = ex; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 170 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 171 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 172 }); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 173 if (failure[0] != null) { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 174 String m = String.format("Failed to get content of most recent revision %d", lastEntryIndex); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 175 throw revlogStream.initWithDataFile(new HgInvalidControlFileException(m, failure[0], null)); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 176 } | 
| 539 
9edfd5a223b8
Commit: handle empty repository case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
538diff
changeset | 177 } else { | 
| 
9edfd5a223b8
Commit: handle empty repository case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
538diff
changeset | 178 lastEntryContent = new byte[0]; | 
| 538 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 179 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 180 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 181 | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 182 public static boolean preferCompleteOverPatch(int patchLength, int fullContentLength) { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 183 return !decideWorthEffort(patchLength, fullContentLength); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 184 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 185 | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 186 public static boolean preferCompressedOverComplete(int compressedLen, int fullContentLength) { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 187 if (compressedLen <= 0) { // just in case, meaningless otherwise | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 188 return false; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 189 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 190 return decideWorthEffort(compressedLen, fullContentLength); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 191 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 192 | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 193 // true if length obtained with effort is worth it | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 194 private static boolean decideWorthEffort(int lengthWithExtraEffort, int lengthWithoutEffort) { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 195 return lengthWithExtraEffort < (/* 3/4 of original */lengthWithoutEffort - (lengthWithoutEffort >>> 2)); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 196 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 197 | 
| 534 
243202f1bda5
Commit: refactor revision creation code from clone command to work separately, fit into existing library structure
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
533diff
changeset | 198 /*XXX public because HgCloneCommand uses it*/ | 
| 
243202f1bda5
Commit: refactor revision creation code from clone command to work separately, fit into existing library structure
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
533diff
changeset | 199 public static class HeaderWriter implements DataSerializer.DataSource { | 
| 530 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 200 private final ByteBuffer header; | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 201 private final boolean isInline; | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 202 private long offset; | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 203 private int length, compressedLength; | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 204 private int baseRev, linkRev, p1, p2; | 
| 534 
243202f1bda5
Commit: refactor revision creation code from clone command to work separately, fit into existing library structure
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
533diff
changeset | 205 private byte[] nodeid; | 
| 530 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 206 | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 207 public HeaderWriter(boolean inline) { | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 208 isInline = inline; | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 209 header = ByteBuffer.allocate(REVLOGV1_RECORD_SIZE); | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 210 } | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 211 | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 212 public HeaderWriter offset(long offset) { | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 213 this.offset = offset; | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 214 return this; | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 215 } | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 216 | 
| 532 
688c1ab113bb
Introduce explicit reference to base patch in bundle's group element, use it when cloning to fix defect when few revisions list null,null parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
530diff
changeset | 217 public int baseRevision() { | 
| 
688c1ab113bb
Introduce explicit reference to base patch in bundle's group element, use it when cloning to fix defect when few revisions list null,null parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
530diff
changeset | 218 return baseRev; | 
| 
688c1ab113bb
Introduce explicit reference to base patch in bundle's group element, use it when cloning to fix defect when few revisions list null,null parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
530diff
changeset | 219 } | 
| 
688c1ab113bb
Introduce explicit reference to base patch in bundle's group element, use it when cloning to fix defect when few revisions list null,null parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
530diff
changeset | 220 | 
| 530 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 221 public HeaderWriter baseRevision(int baseRevision) { | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 222 this.baseRev = baseRevision; | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 223 return this; | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 224 } | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 225 | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 226 public HeaderWriter length(int len, int compressedLen) { | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 227 this.length = len; | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 228 this.compressedLength = compressedLen; | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 229 return this; | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 230 } | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 231 | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 232 public HeaderWriter parents(int parent1, int parent2) { | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 233 p1 = parent1; | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 234 p2 = parent2; | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 235 return this; | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 236 } | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 237 | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 238 public HeaderWriter linkRevision(int linkRevision) { | 
| 534 
243202f1bda5
Commit: refactor revision creation code from clone command to work separately, fit into existing library structure
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
533diff
changeset | 239 linkRev = linkRevision; | 
| 530 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 240 return this; | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 241 } | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 242 | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 243 public HeaderWriter nodeid(Nodeid n) { | 
| 534 
243202f1bda5
Commit: refactor revision creation code from clone command to work separately, fit into existing library structure
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
533diff
changeset | 244 nodeid = n.toByteArray(); | 
| 530 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 245 return this; | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 246 } | 
| 534 
243202f1bda5
Commit: refactor revision creation code from clone command to work separately, fit into existing library structure
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
533diff
changeset | 247 | 
| 
243202f1bda5
Commit: refactor revision creation code from clone command to work separately, fit into existing library structure
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
533diff
changeset | 248 public HeaderWriter nodeid(byte[] nodeidBytes) { | 
| 
243202f1bda5
Commit: refactor revision creation code from clone command to work separately, fit into existing library structure
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
533diff
changeset | 249 nodeid = nodeidBytes; | 
| 
243202f1bda5
Commit: refactor revision creation code from clone command to work separately, fit into existing library structure
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
533diff
changeset | 250 return this; | 
| 
243202f1bda5
Commit: refactor revision creation code from clone command to work separately, fit into existing library structure
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
533diff
changeset | 251 } | 
| 
243202f1bda5
Commit: refactor revision creation code from clone command to work separately, fit into existing library structure
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
533diff
changeset | 252 | 
| 
243202f1bda5
Commit: refactor revision creation code from clone command to work separately, fit into existing library structure
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
533diff
changeset | 253 public void serialize(DataSerializer out) throws IOException { | 
| 530 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 254 header.clear(); | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 255 if (offset == 0) { | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 256 int version = 1 /* RevlogNG */; | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 257 if (isInline) { | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 258 final int INLINEDATA = 1 << 16; // FIXME extract constant | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 259 version |= INLINEDATA; | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 260 } | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 261 header.putInt(version); | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 262 header.putInt(0); | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 263 } else { | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 264 header.putLong(offset << 16); | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 265 } | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 266 header.putInt(compressedLength); | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 267 header.putInt(length); | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 268 header.putInt(baseRev); | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 269 header.putInt(linkRev); | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 270 header.putInt(p1); | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 271 header.putInt(p2); | 
| 534 
243202f1bda5
Commit: refactor revision creation code from clone command to work separately, fit into existing library structure
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
533diff
changeset | 272 header.put(nodeid); | 
| 530 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 273 // assume 12 bytes left are zeros | 
| 534 
243202f1bda5
Commit: refactor revision creation code from clone command to work separately, fit into existing library structure
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
533diff
changeset | 274 out.write(header.array(), 0, header.capacity()); | 
| 530 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 275 | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 276 // regardless whether it's inline or separate data, | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 277 // offset field always represent cumulative compressedLength | 
| 539 
9edfd5a223b8
Commit: handle empty repository case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
538diff
changeset | 278 // (while physical offset in the index file with inline==true differs by n*sizeof(header), where n is entry's position in the file) | 
| 530 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 279 offset += compressedLength; | 
| 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 280 } | 
| 534 
243202f1bda5
Commit: refactor revision creation code from clone command to work separately, fit into existing library structure
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
533diff
changeset | 281 | 
| 
243202f1bda5
Commit: refactor revision creation code from clone command to work separately, fit into existing library structure
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
533diff
changeset | 282 public int serializeLength() { | 
| 
243202f1bda5
Commit: refactor revision creation code from clone command to work separately, fit into existing library structure
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
533diff
changeset | 283 return header.capacity(); | 
| 
243202f1bda5
Commit: refactor revision creation code from clone command to work separately, fit into existing library structure
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
533diff
changeset | 284 } | 
| 
243202f1bda5
Commit: refactor revision creation code from clone command to work separately, fit into existing library structure
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
533diff
changeset | 285 } | 
| 530 
0f6fa88e2162
Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 286 } | 
