Mercurial > hg4j
annotate src/org/tmatesoft/hg/internal/RevlogStreamWriter.java @ 701:02766745dbe6
Added tag v1.2m2 for changeset 6e7786086f77
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Thu, 08 Aug 2013 21:05:21 +0200 | 
| parents | 545b1d4cc11d | 
| children | 4ffc17c0b534 | 
| 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; | 
| 663 
46b56864b483
Pull: phase2 - update phases from remote, fncache with added files. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
660diff
changeset | 20 import static org.tmatesoft.hg.repo.HgRepository.BAD_REVISION; | 
| 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 | 21 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 | 22 | 
| 
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.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 | 24 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 | 25 | 
| 617 
65c01508f002
Rollback support for commands that modify repository. Strategy to keep complete copy of a file being changed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
608diff
changeset | 26 import org.tmatesoft.hg.core.HgIOException; | 
| 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 | 27 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 | 28 import org.tmatesoft.hg.core.SessionContext; | 
| 660 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 29 import org.tmatesoft.hg.internal.DataSerializer.ByteArrayDataSource; | 
| 645 
14dac192aa26
Push: phase2 - upload bundle with changes to remote server
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
628diff
changeset | 30 import org.tmatesoft.hg.internal.DataSerializer.ByteArraySerializer; | 
| 618 
7c0d2ce340b8
Refactor approach how content finds it way down to a commit revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
617diff
changeset | 31 import org.tmatesoft.hg.internal.DataSerializer.DataSource; | 
| 660 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 32 import org.tmatesoft.hg.repo.HgBundle.GroupElement; | 
| 673 
545b1d4cc11d
Refactor HgBundle.GroupElement (clear experimental mark), resolve few technical debt issues
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
664diff
changeset | 33 import org.tmatesoft.hg.repo.HgInternals; | 
| 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 | 34 import org.tmatesoft.hg.repo.HgInvalidControlFileException; | 
| 664 
ae2d439fbed3
Utilize transaction when writing fncache. Better HgIOException
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
663diff
changeset | 35 import org.tmatesoft.hg.repo.HgInvalidDataFormatException; | 
| 628 
6526d8adbc0f
Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
618diff
changeset | 36 import org.tmatesoft.hg.repo.HgInvalidRevisionException; | 
| 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 | 37 import org.tmatesoft.hg.repo.HgInvalidStateException; | 
| 660 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 38 import org.tmatesoft.hg.repo.HgRepository; | 
| 628 
6526d8adbc0f
Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
618diff
changeset | 39 import org.tmatesoft.hg.repo.HgRuntimeException; | 
| 660 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 40 import org.tmatesoft.hg.util.Pair; | 
| 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 | 41 | 
| 
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 | 42 /** | 
| 
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 | 43 * | 
| 608 
e1b29756f901
Clean, organize and resolve some TODOs and FIXMEs: minor refactorings and comments
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
591diff
changeset | 44 * TODO [post-1.1] 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 | 45 * | 
| 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 * @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 | 47 * @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 | 48 */ | 
| 
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 | 49 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 | 50 | 
| 538 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 51 private final DigestHelper dh = new DigestHelper(); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 52 private final RevlogCompressor revlogDataZip; | 
| 617 
65c01508f002
Rollback support for commands that modify repository. Strategy to keep complete copy of a file being changed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
608diff
changeset | 53 private final Transaction transaction; | 
| 663 
46b56864b483
Pull: phase2 - update phases from remote, fncache with added files. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
660diff
changeset | 54 // init with illegal values | 
| 
46b56864b483
Pull: phase2 - update phases from remote, fncache with added files. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
660diff
changeset | 55 private int lastEntryBase = BAD_REVISION, lastEntryIndex = BAD_REVISION, lastEntryActualLen = -1; | 
| 660 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 56 // record revision and its full content | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 57 // the name might be misleading, it does not necessarily match lastEntryIndex | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 58 private Pair<Integer, byte[]> lastFullContent; | 
| 538 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 59 private Nodeid lastEntryRevision; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 60 private IntMap<Nodeid> revisionCache = new IntMap<Nodeid>(32); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 61 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 | 62 | 
| 617 
65c01508f002
Rollback support for commands that modify repository. Strategy to keep complete copy of a file being changed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
608diff
changeset | 63 public RevlogStreamWriter(SessionContext.Source ctxSource, RevlogStream stream, Transaction tr) { | 
| 591 
e447384f3771
CommitFacility as internal class; refactored infrastructure around internals (access to RevlogStream)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
544diff
changeset | 64 assert ctxSource != null; | 
| 538 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 65 assert stream != null; | 
| 617 
65c01508f002
Rollback support for commands that modify repository. Strategy to keep complete copy of a file being changed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
608diff
changeset | 66 assert tr != null; | 
| 538 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 67 | 
| 591 
e447384f3771
CommitFacility as internal class; refactored infrastructure around internals (access to RevlogStream)
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
544diff
changeset | 68 revlogDataZip = new RevlogCompressor(ctxSource.getSessionContext()); | 
| 538 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 69 revlogStream = stream; | 
| 617 
65c01508f002
Rollback support for commands that modify repository. Strategy to keep complete copy of a file being changed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
608diff
changeset | 70 transaction = tr; | 
| 538 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 71 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 72 | 
| 663 
46b56864b483
Pull: phase2 - update phases from remote, fncache with added files. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
660diff
changeset | 73 public RevlogStream getRevlogStream() { | 
| 
46b56864b483
Pull: phase2 - update phases from remote, fncache with added files. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
660diff
changeset | 74 return revlogStream; | 
| 
46b56864b483
Pull: phase2 - update phases from remote, fncache with added files. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
660diff
changeset | 75 } | 
| 
46b56864b483
Pull: phase2 - update phases from remote, fncache with added files. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
660diff
changeset | 76 | 
| 660 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 77 public Pair<Integer,Nodeid> addPatchRevision(GroupElement ge, RevisionToIndexMap clogRevs, RevisionToIndexMap revlogRevs) throws HgIOException, HgRuntimeException { | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 78 populateLastEntryIndex(); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 79 // | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 80 final Nodeid nodeRev = ge.node(); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 81 final Nodeid csetRev = ge.cset(); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 82 int linkRev; | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 83 if (nodeRev.equals(csetRev)) { | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 84 linkRev = lastEntryIndex+1; | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 85 } else { | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 86 linkRev = clogRevs.revisionIndex(csetRev); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 87 } | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 88 assert linkRev >= 0; | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 89 final Nodeid p1Rev = ge.firstParent(); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 90 int p1 = p1Rev.isNull() ? NO_REVISION : revlogRevs.revisionIndex(p1Rev); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 91 final Nodeid p2Rev = ge.secondParent(); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 92 int p2 = p2Rev.isNull() ? NO_REVISION : revlogRevs.revisionIndex(p2Rev); | 
| 673 
545b1d4cc11d
Refactor HgBundle.GroupElement (clear experimental mark), resolve few technical debt issues
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
664diff
changeset | 93 Patch p = null; | 
| 660 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 94 try { | 
| 673 
545b1d4cc11d
Refactor HgBundle.GroupElement (clear experimental mark), resolve few technical debt issues
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
664diff
changeset | 95 p = HgInternals.patchFromData(ge); | 
| 660 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 96 } catch (IOException ex) { | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 97 throw new HgIOException("Failed to read patch information", ex, null); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 98 } | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 99 // | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 100 final Nodeid patchBase = ge.patchBase(); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 101 int patchBaseRev = patchBase.isNull() ? NO_REVISION : revlogRevs.revisionIndex(patchBase); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 102 int baseRev = lastEntryIndex == NO_REVISION ? 0 : revlogStream.baseRevision(patchBaseRev); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 103 int revLen; | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 104 DataSource ds; | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 105 byte[] complete = null; | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 106 if (patchBaseRev == lastEntryIndex && lastEntryIndex != NO_REVISION) { | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 107 // we may write patch from GroupElement as is | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 108 int patchBaseLen = dataLength(patchBaseRev); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 109 revLen = patchBaseLen + p.patchSizeDelta(); | 
| 673 
545b1d4cc11d
Refactor HgBundle.GroupElement (clear experimental mark), resolve few technical debt issues
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
664diff
changeset | 110 ds = p.new PatchDataSource(); | 
| 660 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 111 } else { | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 112 // read baseRev, unless it's the pull to empty repository | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 113 try { | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 114 if (lastEntryIndex == NO_REVISION) { | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 115 complete = p.apply(new ByteArrayDataAccess(new byte[0]), -1); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 116 baseRev = 0; // it's done above, but doesn't hurt | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 117 } else { | 
| 663 
46b56864b483
Pull: phase2 - update phases from remote, fncache with added files. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
660diff
changeset | 118 assert patchBaseRev != NO_REVISION; | 
| 
46b56864b483
Pull: phase2 - update phases from remote, fncache with added files. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
660diff
changeset | 119 ReadContentInspector insp = new ReadContentInspector().read(revlogStream, patchBaseRev); | 
| 660 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 120 complete = p.apply(new ByteArrayDataAccess(insp.content), -1); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 121 baseRev = lastEntryIndex + 1; | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 122 } | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 123 ds = new ByteArrayDataSource(complete); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 124 revLen = complete.length; | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 125 } catch (IOException ex) { | 
| 663 
46b56864b483
Pull: phase2 - update phases from remote, fncache with added files. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
660diff
changeset | 126 // unlikely to happen, as ByteArrayDataSource throws IOException only in case of programming errors | 
| 664 
ae2d439fbed3
Utilize transaction when writing fncache. Better HgIOException
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
663diff
changeset | 127 // hence, throwing rt exception here makes more sense here than HgIOException (even that latter is in throws) | 
| 
ae2d439fbed3
Utilize transaction when writing fncache. Better HgIOException
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
663diff
changeset | 128 throw new HgInvalidDataFormatException("Failed to reconstruct revision", ex); | 
| 660 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 129 } | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 130 } | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 131 doAdd(nodeRev, p1, p2, linkRev, baseRev, revLen, ds); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 132 if (complete != null) { | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 133 lastFullContent = new Pair<Integer, byte[]>(lastEntryIndex, complete); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 134 } | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 135 return new Pair<Integer, Nodeid>(lastEntryIndex, lastEntryRevision); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 136 } | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 137 | 
| 538 
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 nodeid of added revision | 
| 628 
6526d8adbc0f
Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
618diff
changeset | 140 * @throws HgRuntimeException | 
| 538 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 141 */ | 
| 660 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 142 public Pair<Integer,Nodeid> addRevision(DataSource content, int linkRevision, int p1, int p2) throws HgIOException, HgRuntimeException { | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 143 populateLastEntryIndex(); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 144 populateLastEntryContent(); | 
| 538 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 145 // | 
| 618 
7c0d2ce340b8
Refactor approach how content finds it way down to a commit revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
617diff
changeset | 146 byte[] contentByteArray = toByteArray(content); | 
| 660 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 147 Patch patch = GeneratePatchInspector.delta(lastFullContent.second(), contentByteArray); | 
| 538 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 148 int patchSerializedLength = patch.serializedLength(); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 149 | 
| 618 
7c0d2ce340b8
Refactor approach how content finds it way down to a commit revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
617diff
changeset | 150 final boolean writeComplete = preferCompleteOverPatch(patchSerializedLength, contentByteArray.length); | 
| 
7c0d2ce340b8
Refactor approach how content finds it way down to a commit revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
617diff
changeset | 151 DataSerializer.DataSource dataSource = writeComplete ? new ByteArrayDataSource(contentByteArray) : patch.new PatchDataSource(); | 
| 660 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 152 // | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 153 Nodeid p1Rev = revision(p1); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 154 Nodeid p2Rev = revision(p2); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 155 Nodeid newRev = Nodeid.fromBinary(dh.sha1(p1Rev, p2Rev, contentByteArray).asBinary(), 0); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 156 doAdd(newRev, p1, p2, linkRevision, writeComplete ? lastEntryIndex+1 : lastEntryBase, contentByteArray.length, dataSource); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 157 lastFullContent = new Pair<Integer, byte[]>(lastEntryIndex, contentByteArray); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 158 return new Pair<Integer, Nodeid>(lastEntryIndex, lastEntryRevision); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 159 } | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 160 | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 161 private Nodeid doAdd(Nodeid rev, int p1, int p2, int linkRevision, int baseRevision, int revLen, DataSerializer.DataSource dataSource) throws HgIOException, HgRuntimeException { | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 162 assert linkRevision >= 0; | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 163 assert baseRevision >= 0; | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 164 assert p1 == NO_REVISION || p1 >= 0; | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 165 assert p2 == NO_REVISION || p2 >= 0; | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 166 assert !rev.isNull(); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 167 assert revLen >= 0; | 
| 538 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 168 revlogDataZip.reset(dataSource); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 169 final int compressedLen; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 170 final boolean useCompressedData = preferCompressedOverComplete(revlogDataZip.getCompressedLength(), dataSource.serializeLength()); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 171 if (useCompressedData) { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 172 compressedLen= revlogDataZip.getCompressedLength(); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 173 } else { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 174 // compression wasn't too effective, | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 175 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 | 176 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 177 // | 
| 618 
7c0d2ce340b8
Refactor approach how content finds it way down to a commit revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
617diff
changeset | 178 DataSerializer indexFile, dataFile; | 
| 
7c0d2ce340b8
Refactor approach how content finds it way down to a commit revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
617diff
changeset | 179 indexFile = dataFile = null; | 
| 538 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 180 try { | 
| 673 
545b1d4cc11d
Refactor HgBundle.GroupElement (clear experimental mark), resolve few technical debt issues
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
664diff
changeset | 181 // FIXME perhaps, not a good idea to open stream for each revision added (e.g, when we pull a lot of them) | 
| 618 
7c0d2ce340b8
Refactor approach how content finds it way down to a commit revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
617diff
changeset | 182 indexFile = revlogStream.getIndexStreamWriter(transaction); | 
| 538 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 183 final boolean isInlineData = revlogStream.isInlineData(); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 184 HeaderWriter revlogHeader = new HeaderWriter(isInlineData); | 
| 660 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 185 revlogHeader.length(revLen, compressedLen); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 186 revlogHeader.nodeid(rev.toByteArray()); | 
| 538 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 187 revlogHeader.linkRevision(linkRevision); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 188 revlogHeader.parents(p1, p2); | 
| 660 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 189 revlogHeader.baseRevision(baseRevision); | 
| 539 
9edfd5a223b8
Commit: handle empty repository case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
538diff
changeset | 190 long lastEntryOffset = revlogStream.newEntryOffset(); | 
| 
9edfd5a223b8
Commit: handle empty repository case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
538diff
changeset | 191 revlogHeader.offset(lastEntryOffset); | 
| 538 
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 revlogHeader.serialize(indexFile); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 194 | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 195 if (isInlineData) { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 196 dataFile = indexFile; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 197 } else { | 
| 617 
65c01508f002
Rollback support for commands that modify repository. Strategy to keep complete copy of a file being changed
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
608diff
changeset | 198 dataFile = revlogStream.getDataStreamWriter(transaction); | 
| 538 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 199 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 200 if (useCompressedData) { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 201 int actualCompressedLenWritten = revlogDataZip.writeCompressedData(dataFile); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 202 if (actualCompressedLenWritten != compressedLen) { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 203 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 | 204 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 205 } else { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 206 dataFile.writeByte((byte) 'u'); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 207 dataSource.serialize(dataFile); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 208 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 209 | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 210 lastEntryBase = revlogHeader.baseRevision(); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 211 lastEntryIndex++; | 
| 660 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 212 lastEntryActualLen = revLen; | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 213 lastEntryRevision = rev; | 
| 538 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 214 revisionCache.put(lastEntryIndex, lastEntryRevision); | 
| 539 
9edfd5a223b8
Commit: handle empty repository case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
538diff
changeset | 215 | 
| 
9edfd5a223b8
Commit: handle empty repository case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
538diff
changeset | 216 revlogStream.revisionAdded(lastEntryIndex, lastEntryRevision, lastEntryBase, lastEntryOffset); | 
| 538 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 217 } finally { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 218 indexFile.done(); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 219 if (dataFile != null && dataFile != indexFile) { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 220 dataFile.done(); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 221 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 222 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 223 return lastEntryRevision; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 224 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 225 | 
| 628 
6526d8adbc0f
Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
618diff
changeset | 226 private byte[] toByteArray(DataSource content) throws HgIOException, HgRuntimeException { | 
| 645 
14dac192aa26
Push: phase2 - upload bundle with changes to remote server
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
628diff
changeset | 227 ByteArraySerializer ba = new ByteArraySerializer(); | 
| 618 
7c0d2ce340b8
Refactor approach how content finds it way down to a commit revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
617diff
changeset | 228 content.serialize(ba); | 
| 
7c0d2ce340b8
Refactor approach how content finds it way down to a commit revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
617diff
changeset | 229 return ba.toByteArray(); | 
| 
7c0d2ce340b8
Refactor approach how content finds it way down to a commit revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
617diff
changeset | 230 } | 
| 
7c0d2ce340b8
Refactor approach how content finds it way down to a commit revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
617diff
changeset | 231 | 
| 628 
6526d8adbc0f
Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
618diff
changeset | 232 private Nodeid revision(int revisionIndex) throws HgInvalidControlFileException, HgInvalidRevisionException { | 
| 538 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 233 if (revisionIndex == NO_REVISION) { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 234 return Nodeid.NULL; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 235 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 236 Nodeid n = revisionCache.get(revisionIndex); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 237 if (n == null) { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 238 n = Nodeid.fromBinary(revlogStream.nodeid(revisionIndex), 0); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 239 revisionCache.put(revisionIndex, n); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 240 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 241 return n; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 242 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 243 | 
| 660 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 244 private int dataLength(int revisionIndex) throws HgInvalidControlFileException, HgInvalidRevisionException { | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 245 assert revisionIndex >= 0; | 
| 663 
46b56864b483
Pull: phase2 - update phases from remote, fncache with added files. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
660diff
changeset | 246 if (revisionIndex == lastEntryIndex && lastEntryActualLen >= 0) { | 
| 
46b56864b483
Pull: phase2 - update phases from remote, fncache with added files. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
660diff
changeset | 247 // if the last entry is the one we've just written, we know its actual len. | 
| 
46b56864b483
Pull: phase2 - update phases from remote, fncache with added files. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
660diff
changeset | 248 // it's possible, however, that revisionIndex == lastEntryIndex just | 
| 
46b56864b483
Pull: phase2 - update phases from remote, fncache with added files. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
660diff
changeset | 249 // because revision being added comes right after last locally known one | 
| 
46b56864b483
Pull: phase2 - update phases from remote, fncache with added files. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
660diff
changeset | 250 // and lastEntryActualLen is not set | 
| 660 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 251 return lastEntryActualLen; | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 252 } | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 253 if (lastFullContent != null && lastFullContent.first() == revisionIndex) { | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 254 return lastFullContent.second().length; | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 255 } | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 256 return revlogStream.dataLength(revisionIndex); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 257 } | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 258 | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 259 private void populateLastEntryIndex() throws HgRuntimeException { | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 260 int revCount = revlogStream.revisionCount(); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 261 lastEntryIndex = revCount == 0 ? NO_REVISION : revCount - 1; | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 262 } | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 263 | 
| 664 
ae2d439fbed3
Utilize transaction when writing fncache. Better HgIOException
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
663diff
changeset | 264 private void populateLastEntryContent() throws HgIOException, HgRuntimeException { | 
| 660 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 265 if (lastFullContent != null && lastFullContent.first() == lastEntryIndex) { | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 266 // we have last entry cached | 
| 539 
9edfd5a223b8
Commit: handle empty repository case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
538diff
changeset | 267 return; | 
| 
9edfd5a223b8
Commit: handle empty repository case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
538diff
changeset | 268 } | 
| 660 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 269 lastEntryRevision = Nodeid.NULL; | 
| 539 
9edfd5a223b8
Commit: handle empty repository case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
538diff
changeset | 270 if (lastEntryIndex != NO_REVISION) { | 
| 660 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 271 ReadContentInspector insp = new ReadContentInspector().read(revlogStream, lastEntryIndex); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 272 lastEntryBase = insp.baseRev; | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 273 lastEntryRevision = insp.rev; | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 274 lastFullContent = new Pair<Integer, byte[]>(lastEntryIndex, insp.content); | 
| 539 
9edfd5a223b8
Commit: handle empty repository case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
538diff
changeset | 275 } else { | 
| 660 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 276 lastFullContent = new Pair<Integer, byte[]>(lastEntryIndex, new byte[0]); | 
| 538 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 277 } | 
| 660 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 278 assert lastFullContent.first() == lastEntryIndex; | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 279 assert lastFullContent.second() != null; | 
| 538 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 280 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 281 | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 282 public static boolean preferCompleteOverPatch(int patchLength, int fullContentLength) { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 283 return !decideWorthEffort(patchLength, fullContentLength); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 284 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 285 | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 286 public static boolean preferCompressedOverComplete(int compressedLen, int fullContentLength) { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 287 if (compressedLen <= 0) { // just in case, meaningless otherwise | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 288 return false; | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 289 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 290 return decideWorthEffort(compressedLen, fullContentLength); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 291 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 292 | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 293 // true if length obtained with effort is worth it | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 294 private static boolean decideWorthEffort(int lengthWithExtraEffort, int lengthWithoutEffort) { | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 295 return lengthWithExtraEffort < (/* 3/4 of original */lengthWithoutEffort - (lengthWithoutEffort >>> 2)); | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 296 } | 
| 
dd4f6311af52
Commit: first working version
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
534diff
changeset | 297 | 
| 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 | 298 /*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 | 299 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 | 300 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 | 301 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 | 302 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 | 303 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 | 304 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 | 305 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 | 306 | 
| 
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 | 307 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 | 308 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 | 309 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 | 310 } | 
| 
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 | 311 | 
| 
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 | 312 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 | 313 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 | 314 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 | 315 } | 
| 
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 | 316 | 
| 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 | 317 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 | 318 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 | 319 } | 
| 
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 | 320 | 
| 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 | 321 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 | 322 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 | 323 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 | 324 } | 
| 
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 | 325 | 
| 
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 | 326 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 | 327 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 | 328 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 | 329 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 | 330 } | 
| 
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 | 331 | 
| 
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 | 332 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 | 333 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 | 334 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 | 335 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 | 336 } | 
| 
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 | 337 | 
| 
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 | 338 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 | 339 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 | 340 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 | 341 } | 
| 
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 | 342 | 
| 
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 | 343 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 | 344 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 | 345 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 | 346 } | 
| 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 | 347 | 
| 
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 | 348 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 | 349 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 | 350 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 | 351 } | 
| 
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 | 352 | 
| 618 
7c0d2ce340b8
Refactor approach how content finds it way down to a commit revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
617diff
changeset | 353 public void serialize(DataSerializer out) throws HgIOException { | 
| 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 | 354 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 | 355 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 | 356 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 | 357 if (isInline) { | 
| 608 
e1b29756f901
Clean, organize and resolve some TODOs and FIXMEs: minor refactorings and comments
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
591diff
changeset | 358 version |= RevlogStream.INLINEDATA; | 
| 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 | 359 } | 
| 
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 | 360 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 | 361 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 | 362 } 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 | 363 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 | 364 } | 
| 
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 | 365 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 | 366 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 | 367 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 | 368 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 | 369 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 | 370 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 | 371 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 | 372 // 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 | 373 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 | 374 | 
| 
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 | 375 // 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 | 376 // offset field always represent cumulative compressedLength | 
| 539 
9edfd5a223b8
Commit: handle empty repository case
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
538diff
changeset | 377 // (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 | 378 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 | 379 } | 
| 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 | 380 | 
| 
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 | 381 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 | 382 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 | 383 } | 
| 
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 | 384 } | 
| 660 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 385 | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 386 // XXX part of HgRevisionMap contract, need public counterparts (along with IndexToRevisionMap) | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 387 public interface RevisionToIndexMap { | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 388 | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 389 /** | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 390 * @return {@link HgRepository#NO_REVISION} if unknown revision | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 391 */ | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 392 int revisionIndex(Nodeid revision); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 393 } | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 394 | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 395 private static class ReadContentInspector implements RevlogStream.Inspector { | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 396 public int baseRev; | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 397 public Nodeid rev; | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 398 public byte[] content; | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 399 private IOException failure; | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 400 | 
| 664 
ae2d439fbed3
Utilize transaction when writing fncache. Better HgIOException
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
663diff
changeset | 401 public ReadContentInspector read(RevlogStream rs, int revIndex) throws HgIOException, HgRuntimeException { | 
| 660 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 402 assert revIndex >= 0; | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 403 rs.iterate(revIndex, revIndex, true, this); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 404 if (failure != null) { | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 405 String m = String.format("Failed to get content of revision %d", revIndex); | 
| 664 
ae2d439fbed3
Utilize transaction when writing fncache. Better HgIOException
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
663diff
changeset | 406 throw rs.initWithIndexFile(new HgIOException(m, failure, null)); | 
| 660 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 407 } | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 408 return this; | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 409 } | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 410 | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 411 public void next(int revisionIndex, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, DataAccess data) { | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 412 try { | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 413 baseRev = baseRevision; | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 414 rev = Nodeid.fromBinary(nodeid, 0); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 415 content = data.byteArray(); | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 416 } catch (IOException ex) { | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 417 failure = ex; | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 418 } | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 419 } | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 420 } | 
| 
4fd317a2fecf
Pull: phase1 get remote changes and add local revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
645diff
changeset | 421 } | 
