Mercurial > jhg
comparison src/org/tmatesoft/hg/internal/CommitFacility.java @ 664:ae2d439fbed3
Utilize transaction when writing fncache. Better HgIOException
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Wed, 10 Jul 2013 19:33:51 +0200 | 
| parents | 4fd317a2fecf | 
| children | fba85bc1dfb8 | 
   comparison
  equal
  deleted
  inserted
  replaced
| 663:46b56864b483 | 664:ae2d439fbed3 | 
|---|---|
| 140 } | 140 } | 
| 141 // | 141 // | 
| 142 saveCommitMessage(message); | 142 saveCommitMessage(message); | 
| 143 // | 143 // | 
| 144 // Register new/changed | 144 // Register new/changed | 
| 145 LinkedHashMap<Path, RevlogStream> newlyAddedFiles = new LinkedHashMap<Path, RevlogStream>(); | 145 FNCacheFile.Mediator fncache = new FNCacheFile.Mediator(repo, transaction); | 
| 146 ArrayList<Path> touchInDirstate = new ArrayList<Path>(); | 146 ArrayList<Path> touchInDirstate = new ArrayList<Path>(); | 
| 147 for (Pair<HgDataFile, DataSource> e : files.values()) { | 147 for (Pair<HgDataFile, DataSource> e : files.values()) { | 
| 148 HgDataFile df = e.first(); | 148 HgDataFile df = e.first(); | 
| 149 DataSource bds = e.second(); | 149 DataSource bds = e.second(); | 
| 150 Pair<Integer, Integer> fp = fileParents.get(df.getPath()); | 150 Pair<Integer, Integer> fp = fileParents.get(df.getPath()); | 
| 151 if (fp == null) { | 151 if (fp == null) { | 
| 152 // NEW FILE | 152 // NEW FILE | 
| 153 fp = new Pair<Integer, Integer>(NO_REVISION, NO_REVISION); | 153 fp = new Pair<Integer, Integer>(NO_REVISION, NO_REVISION); | 
| 154 } | 154 } | 
| 155 RevlogStream contentStream = repo.getImplAccess().getStream(df); | 155 RevlogStream contentStream = repo.getImplAccess().getStream(df); | 
| 156 if (!df.exists()) { | 156 final boolean isNewFile = !df.exists(); | 
| 157 newlyAddedFiles.put(df.getPath(), contentStream); | |
| 158 } | |
| 159 RevlogStreamWriter fileWriter = new RevlogStreamWriter(repo, contentStream, transaction); | 157 RevlogStreamWriter fileWriter = new RevlogStreamWriter(repo, contentStream, transaction); | 
| 160 Nodeid fileRev = fileWriter.addRevision(bds, clogRevisionIndex, fp.first(), fp.second()).second(); | 158 Nodeid fileRev = fileWriter.addRevision(bds, clogRevisionIndex, fp.first(), fp.second()).second(); | 
| 161 newManifestRevision.put(df.getPath(), fileRev); | 159 newManifestRevision.put(df.getPath(), fileRev); | 
| 162 touchInDirstate.add(df.getPath()); | 160 touchInDirstate.add(df.getPath()); | 
| 161 if (isNewFile) { | |
| 162 // registerNew shall go after fileWriter.addRevision as it needs to know if data is inlined or not | |
| 163 fncache.registerNew(df.getPath(), contentStream); | |
| 164 } | |
| 163 } | 165 } | 
| 164 // | 166 // | 
| 165 // Manifest | 167 // Manifest | 
| 166 final ManifestEntryBuilder manifestBuilder = new ManifestEntryBuilder(repo.buildFileNameEncodingHelper()); | 168 final ManifestEntryBuilder manifestBuilder = new ManifestEntryBuilder(repo.buildFileNameEncodingHelper()); | 
| 167 for (Map.Entry<Path, Nodeid> me : newManifestRevision.entrySet()) { | 169 for (Map.Entry<Path, Nodeid> me : newManifestRevision.entrySet()) { | 
| 176 changelogBuilder.branch(branch == null ? DEFAULT_BRANCH_NAME : branch); | 178 changelogBuilder.branch(branch == null ? DEFAULT_BRANCH_NAME : branch); | 
| 177 changelogBuilder.user(String.valueOf(user)); | 179 changelogBuilder.user(String.valueOf(user)); | 
| 178 changelogBuilder.manifest(manifestRev).comment(message); | 180 changelogBuilder.manifest(manifestRev).comment(message); | 
| 179 RevlogStreamWriter changelogWriter = new RevlogStreamWriter(repo, repo.getImplAccess().getChangelogStream(), transaction); | 181 RevlogStreamWriter changelogWriter = new RevlogStreamWriter(repo, repo.getImplAccess().getChangelogStream(), transaction); | 
| 180 Nodeid changesetRev = changelogWriter.addRevision(changelogBuilder, clogRevisionIndex, p1Commit, p2Commit).second(); | 182 Nodeid changesetRev = changelogWriter.addRevision(changelogBuilder, clogRevisionIndex, p1Commit, p2Commit).second(); | 
| 181 // TODO move fncache update to an external facility, along with dirstate and bookmark update | 183 // TODO move dirstate and bookmark update update to an external facility | 
| 182 if (!newlyAddedFiles.isEmpty() && repo.fncacheInUse()) { | 184 fncache.complete(); | 
| 183 FNCacheFile fncache = new FNCacheFile(repo); | |
| 184 for (Path p : newlyAddedFiles.keySet()) { | |
| 185 fncache.addIndex(p); | |
| 186 if (!newlyAddedFiles.get(p).isInlineData()) { | |
| 187 fncache.addData(p); | |
| 188 } | |
| 189 } | |
| 190 try { | |
| 191 fncache.write(); | |
| 192 } catch (IOException ex) { | |
| 193 // see comment above for fnchache.read() | |
| 194 repo.getLog().dump(getClass(), Error, ex, "Failed to write fncache, error ignored"); | |
| 195 } | |
| 196 } | |
| 197 String oldBranchValue = DirstateReader.readBranch(repo); | 185 String oldBranchValue = DirstateReader.readBranch(repo); | 
| 198 String newBranchValue = branch == null ? DEFAULT_BRANCH_NAME : branch; | 186 String newBranchValue = branch == null ? DEFAULT_BRANCH_NAME : branch; | 
| 199 if (!oldBranchValue.equals(newBranchValue)) { | 187 if (!oldBranchValue.equals(newBranchValue)) { | 
| 200 // prepare undo.branch as described in http://mercurial.selenic.com/wiki/FileFormats#undo..2A | 188 // prepare undo.branch as described in http://mercurial.selenic.com/wiki/FileFormats#undo..2A | 
| 201 File branchFile = transaction.prepare(repo.getRepositoryFile(Branch), repo.getRepositoryFile(UndoBranch)); | 189 File branchFile = transaction.prepare(repo.getRepositoryFile(Branch), repo.getRepositoryFile(UndoBranch)); | 
