Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/CommitFacility.java @ 539:9edfd5a223b8
Commit: handle empty repository case
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Wed, 13 Feb 2013 18:44:58 +0100 | 
| parents | dd4f6311af52 | 
| children | 67d4b0f73984 | 
   comparison
  equal
  deleted
  inserted
  replaced
| 538:dd4f6311af52 | 539:9edfd5a223b8 | 
|---|---|
| 16 */ | 16 */ | 
| 17 package org.tmatesoft.hg.repo; | 17 package org.tmatesoft.hg.repo; | 
| 18 | 18 | 
| 19 import static org.tmatesoft.hg.repo.HgRepository.NO_REVISION; | 19 import static org.tmatesoft.hg.repo.HgRepository.NO_REVISION; | 
| 20 | 20 | 
| 21 import java.io.IOException; | |
| 21 import java.nio.ByteBuffer; | 22 import java.nio.ByteBuffer; | 
| 23 import java.util.ArrayList; | |
| 22 import java.util.HashMap; | 24 import java.util.HashMap; | 
| 23 import java.util.LinkedHashMap; | 25 import java.util.LinkedHashMap; | 
| 24 import java.util.Map; | 26 import java.util.Map; | 
| 25 import java.util.TreeMap; | 27 import java.util.TreeMap; | 
| 26 | 28 | 
| 27 import org.tmatesoft.hg.core.HgRepositoryLockException; | 29 import org.tmatesoft.hg.core.HgRepositoryLockException; | 
| 28 import org.tmatesoft.hg.core.Nodeid; | 30 import org.tmatesoft.hg.core.Nodeid; | 
| 29 import org.tmatesoft.hg.internal.ByteArrayChannel; | 31 import org.tmatesoft.hg.internal.ByteArrayChannel; | 
| 30 import org.tmatesoft.hg.internal.ChangelogEntryBuilder; | 32 import org.tmatesoft.hg.internal.ChangelogEntryBuilder; | 
| 31 import org.tmatesoft.hg.internal.Experimental; | 33 import org.tmatesoft.hg.internal.Experimental; | 
| 34 import org.tmatesoft.hg.internal.FNCacheFile; | |
| 32 import org.tmatesoft.hg.internal.ManifestEntryBuilder; | 35 import org.tmatesoft.hg.internal.ManifestEntryBuilder; | 
| 33 import org.tmatesoft.hg.internal.ManifestRevision; | 36 import org.tmatesoft.hg.internal.ManifestRevision; | 
| 37 import org.tmatesoft.hg.internal.RequiresFile; | |
| 38 import org.tmatesoft.hg.internal.RevlogStream; | |
| 34 import org.tmatesoft.hg.internal.RevlogStreamWriter; | 39 import org.tmatesoft.hg.internal.RevlogStreamWriter; | 
| 35 import org.tmatesoft.hg.util.Pair; | 40 import org.tmatesoft.hg.util.Pair; | 
| 36 import org.tmatesoft.hg.util.Path; | 41 import org.tmatesoft.hg.util.Path; | 
| 42 import org.tmatesoft.hg.util.LogFacility.Severity; | |
| 37 | 43 | 
| 38 /** | 44 /** | 
| 39 * WORK IN PROGRESS | 45 * WORK IN PROGRESS | 
| 40 * | 46 * | 
| 41 * @author Artem Tikhomirov | 47 * @author Artem Tikhomirov | 
| 79 repo.getManifest().walk(p1Commit, p1Commit, c1Manifest); | 85 repo.getManifest().walk(p1Commit, p1Commit, c1Manifest); | 
| 80 } | 86 } | 
| 81 if (p2Commit != NO_REVISION) { | 87 if (p2Commit != NO_REVISION) { | 
| 82 repo.getManifest().walk(p2Commit, p2Commit, c2Manifest); | 88 repo.getManifest().walk(p2Commit, p2Commit, c2Manifest); | 
| 83 } | 89 } | 
| 90 FNCacheFile fncache = null; | |
| 91 if ((repo.getImplHelper().getRequiresFlags() & RequiresFile.FNCACHE) != 0) { | |
| 92 fncache = new FNCacheFile(repo.getImplHelper()); | |
| 93 try { | |
| 94 fncache.read(new Path.SimpleSource()); | |
| 95 } catch (IOException ex) { | |
| 96 // fncache may be restored using native client, so do not treat failure to read it as severe enough to stop | |
| 97 repo.getSessionContext().getLog().dump(getClass(), Severity.Error, ex, "Failed to read fncache, attempt commit nevertheless"); | |
| 98 } | |
| 99 } | |
| 84 // Pair<Integer, Integer> manifestParents = getManifestParents(); | 100 // Pair<Integer, Integer> manifestParents = getManifestParents(); | 
| 85 Pair<Integer, Integer> manifestParents = new Pair<Integer, Integer>(c1Manifest.revisionIndex(), c2Manifest.revisionIndex()); | 101 Pair<Integer, Integer> manifestParents = new Pair<Integer, Integer>(c1Manifest.revisionIndex(), c2Manifest.revisionIndex()); | 
| 86 TreeMap<Path, Nodeid> newManifestRevision = new TreeMap<Path, Nodeid>(); | 102 TreeMap<Path, Nodeid> newManifestRevision = new TreeMap<Path, Nodeid>(); | 
| 87 HashMap<Path, Pair<Integer, Integer>> fileParents = new HashMap<Path, Pair<Integer,Integer>>(); | 103 HashMap<Path, Pair<Integer, Integer>> fileParents = new HashMap<Path, Pair<Integer,Integer>>(); | 
| 88 for (Path f : c1Manifest.files()) { | 104 for (Path f : c1Manifest.files()) { | 
| 89 HgDataFile df = repo.getFileNode(f); | 105 HgDataFile df = repo.getFileNode(f); | 
| 90 Nodeid fileKnownRev = c1Manifest.nodeid(f); | 106 Nodeid fileKnownRev = c1Manifest.nodeid(f); | 
| 91 int fileRevIndex = df.getRevisionIndex(fileKnownRev); | 107 final int fileRevIndex1 = df.getRevisionIndex(fileKnownRev); | 
| 92 // FIXME merged files?! | 108 final int fileRevIndex2; | 
| 93 fileParents.put(f, new Pair<Integer, Integer>(fileRevIndex, NO_REVISION)); | 109 if ((fileKnownRev = c2Manifest.nodeid(f)) != null) { | 
| 110 // merged files | |
| 111 fileRevIndex2 = df.getRevisionIndex(fileKnownRev); | |
| 112 } else { | |
| 113 fileRevIndex2 = NO_REVISION; | |
| 114 } | |
| 115 | |
| 116 fileParents.put(f, new Pair<Integer, Integer>(fileRevIndex1, fileRevIndex2)); | |
| 94 newManifestRevision.put(f, fileKnownRev); | 117 newManifestRevision.put(f, fileKnownRev); | 
| 95 } | 118 } | 
| 96 // | 119 // | 
| 97 // Files | 120 // Files | 
| 121 ArrayList<Path> newlyAddedFiles = new ArrayList<Path>(); | |
| 98 for (Pair<HgDataFile, ByteDataSupplier> e : files.values()) { | 122 for (Pair<HgDataFile, ByteDataSupplier> e : files.values()) { | 
| 99 HgDataFile df = e.first(); | 123 HgDataFile df = e.first(); | 
| 100 Pair<Integer, Integer> fp = fileParents.get(df.getPath()); | 124 Pair<Integer, Integer> fp = fileParents.get(df.getPath()); | 
| 101 if (fp == null) { | 125 if (fp == null) { | 
| 102 // NEW FILE | 126 // NEW FILE | 
| 109 while (bds.read(bb) != -1) { | 133 while (bds.read(bb) != -1) { | 
| 110 bb.flip(); | 134 bb.flip(); | 
| 111 bac.write(bb); | 135 bac.write(bb); | 
| 112 bb.clear(); | 136 bb.clear(); | 
| 113 } | 137 } | 
| 114 RevlogStreamWriter fileWriter = new RevlogStreamWriter(repo.getSessionContext(), df.content); | 138 RevlogStream contentStream; | 
| 139 if (df.exists()) { | |
| 140 contentStream = df.content; | |
| 141 } else { | |
| 142 contentStream = repo.createStoreFile(df.getPath()); | |
| 143 newlyAddedFiles.add(df.getPath()); | |
| 144 } | |
| 145 RevlogStreamWriter fileWriter = new RevlogStreamWriter(repo.getSessionContext(), contentStream); | |
| 115 Nodeid fileRev = fileWriter.addRevision(bac.toArray(), clogRevisionIndex, fp.first(), fp.second()); | 146 Nodeid fileRev = fileWriter.addRevision(bac.toArray(), clogRevisionIndex, fp.first(), fp.second()); | 
| 116 newManifestRevision.put(df.getPath(), fileRev); | 147 newManifestRevision.put(df.getPath(), fileRev); | 
| 117 } | 148 } | 
| 118 // | 149 // | 
| 119 // Manifest | 150 // Manifest | 
| 128 final ChangelogEntryBuilder changelogBuilder = new ChangelogEntryBuilder(); | 159 final ChangelogEntryBuilder changelogBuilder = new ChangelogEntryBuilder(); | 
| 129 changelogBuilder.setModified(files.keySet()); | 160 changelogBuilder.setModified(files.keySet()); | 
| 130 byte[] clogContent = changelogBuilder.build(manifestRev, message); | 161 byte[] clogContent = changelogBuilder.build(manifestRev, message); | 
| 131 RevlogStreamWriter changelogWriter = new RevlogStreamWriter(repo.getSessionContext(), clog.content); | 162 RevlogStreamWriter changelogWriter = new RevlogStreamWriter(repo.getSessionContext(), clog.content); | 
| 132 Nodeid changesetRev = changelogWriter.addRevision(clogContent, clogRevisionIndex, p1Commit, p2Commit); | 163 Nodeid changesetRev = changelogWriter.addRevision(clogContent, clogRevisionIndex, p1Commit, p2Commit); | 
| 164 if (!newlyAddedFiles.isEmpty() && fncache != null) { | |
| 165 for (Path p : newlyAddedFiles) { | |
| 166 fncache.add(p); | |
| 167 } | |
| 168 try { | |
| 169 fncache.write(); | |
| 170 } catch (IOException ex) { | |
| 171 // see comment above for fnchache.read() | |
| 172 repo.getSessionContext().getLog().dump(getClass(), Severity.Error, ex, "Failed to write fncache, error ignored"); | |
| 173 } | |
| 174 } | |
| 133 return changesetRev; | 175 return changesetRev; | 
| 134 } | 176 } | 
| 135 /* | 177 /* | 
| 136 private Pair<Integer, Integer> getManifestParents() { | 178 private Pair<Integer, Integer> getManifestParents() { | 
| 137 return new Pair<Integer, Integer>(extractManifestRevisionIndex(p1Commit), extractManifestRevisionIndex(p2Commit)); | 179 return new Pair<Integer, Integer>(extractManifestRevisionIndex(p1Commit), extractManifestRevisionIndex(p2Commit)); | 
