comparison src/org/tmatesoft/hg/repo/CommitFacility.java @ 588:41218d84842a

Update dirstate after commit
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Mon, 29 Apr 2013 16:37:57 +0200
parents 73c20c648c1f
children
comparison
equal deleted inserted replaced
587:a52f4cc56f9c 588:41218d84842a
27 import java.util.Set; 27 import java.util.Set;
28 import java.util.TreeMap; 28 import java.util.TreeMap;
29 import java.util.TreeSet; 29 import java.util.TreeSet;
30 30
31 import org.tmatesoft.hg.core.HgCommitCommand; 31 import org.tmatesoft.hg.core.HgCommitCommand;
32 import org.tmatesoft.hg.core.HgIOException;
32 import org.tmatesoft.hg.core.HgRepositoryLockException; 33 import org.tmatesoft.hg.core.HgRepositoryLockException;
33 import org.tmatesoft.hg.core.Nodeid; 34 import org.tmatesoft.hg.core.Nodeid;
34 import org.tmatesoft.hg.internal.ByteArrayChannel; 35 import org.tmatesoft.hg.internal.ByteArrayChannel;
35 import org.tmatesoft.hg.internal.ChangelogEntryBuilder; 36 import org.tmatesoft.hg.internal.ChangelogEntryBuilder;
37 import org.tmatesoft.hg.internal.DirstateBuilder;
38 import org.tmatesoft.hg.internal.DirstateReader;
36 import org.tmatesoft.hg.internal.Experimental; 39 import org.tmatesoft.hg.internal.Experimental;
37 import org.tmatesoft.hg.internal.FNCacheFile; 40 import org.tmatesoft.hg.internal.FNCacheFile;
41 import org.tmatesoft.hg.internal.Internals;
38 import org.tmatesoft.hg.internal.ManifestEntryBuilder; 42 import org.tmatesoft.hg.internal.ManifestEntryBuilder;
39 import org.tmatesoft.hg.internal.ManifestRevision; 43 import org.tmatesoft.hg.internal.ManifestRevision;
40 import org.tmatesoft.hg.internal.RevlogStream; 44 import org.tmatesoft.hg.internal.RevlogStream;
41 import org.tmatesoft.hg.internal.RevlogStreamWriter; 45 import org.tmatesoft.hg.internal.RevlogStreamWriter;
42 import org.tmatesoft.hg.util.Pair; 46 import org.tmatesoft.hg.util.Pair;
95 99
96 public void user(String userName) { 100 public void user(String userName) {
97 user = userName; 101 user = userName;
98 } 102 }
99 103
100 public Nodeid commit(String message) throws HgRepositoryLockException { 104 public Nodeid commit(String message) throws HgIOException, HgRepositoryLockException {
101 105
102 final HgChangelog clog = repo.getChangelog(); 106 final HgChangelog clog = repo.getChangelog();
103 final int clogRevisionIndex = clog.getRevisionCount(); 107 final int clogRevisionIndex = clog.getRevisionCount();
104 ManifestRevision c1Manifest = new ManifestRevision(null, null); 108 ManifestRevision c1Manifest = new ManifestRevision(null, null);
105 ManifestRevision c2Manifest = new ManifestRevision(null, null); 109 ManifestRevision c2Manifest = new ManifestRevision(null, null);
134 newManifestRevision.remove(p); 138 newManifestRevision.remove(p);
135 } 139 }
136 // 140 //
137 // Register new/changed 141 // Register new/changed
138 ArrayList<Path> newlyAddedFiles = new ArrayList<Path>(); 142 ArrayList<Path> newlyAddedFiles = new ArrayList<Path>();
143 ArrayList<Path> touchInDirstate = new ArrayList<Path>();
139 for (Pair<HgDataFile, ByteDataSupplier> e : files.values()) { 144 for (Pair<HgDataFile, ByteDataSupplier> e : files.values()) {
140 HgDataFile df = e.first(); 145 HgDataFile df = e.first();
141 Pair<Integer, Integer> fp = fileParents.get(df.getPath()); 146 Pair<Integer, Integer> fp = fileParents.get(df.getPath());
142 if (fp == null) { 147 if (fp == null) {
143 // NEW FILE 148 // NEW FILE
163 // (despite the fact the file is in there) 168 // (despite the fact the file is in there)
164 } 169 }
165 RevlogStreamWriter fileWriter = new RevlogStreamWriter(repo.getSessionContext(), contentStream); 170 RevlogStreamWriter fileWriter = new RevlogStreamWriter(repo.getSessionContext(), contentStream);
166 Nodeid fileRev = fileWriter.addRevision(bac.toArray(), clogRevisionIndex, fp.first(), fp.second()); 171 Nodeid fileRev = fileWriter.addRevision(bac.toArray(), clogRevisionIndex, fp.first(), fp.second());
167 newManifestRevision.put(df.getPath(), fileRev); 172 newManifestRevision.put(df.getPath(), fileRev);
173 touchInDirstate.add(df.getPath());
168 } 174 }
169 // 175 //
170 // Manifest 176 // Manifest
171 final ManifestEntryBuilder manifestBuilder = new ManifestEntryBuilder(); 177 final ManifestEntryBuilder manifestBuilder = new ManifestEntryBuilder();
172 for (Map.Entry<Path, Nodeid> me : newManifestRevision.entrySet()) { 178 for (Map.Entry<Path, Nodeid> me : newManifestRevision.entrySet()) {
194 } catch (IOException ex) { 200 } catch (IOException ex) {
195 // see comment above for fnchache.read() 201 // see comment above for fnchache.read()
196 repo.getSessionContext().getLog().dump(getClass(), Severity.Error, ex, "Failed to write fncache, error ignored"); 202 repo.getSessionContext().getLog().dump(getClass(), Severity.Error, ex, "Failed to write fncache, error ignored");
197 } 203 }
198 } 204 }
205 // bring dirstate up to commit state
206 Internals implRepo = Internals.getInstance(repo);
207 final DirstateBuilder dirstateBuilder = new DirstateBuilder(implRepo);
208 dirstateBuilder.fillFrom(new DirstateReader(implRepo, new Path.SimpleSource()));
209 for (Path p : removals) {
210 dirstateBuilder.recordRemoved(p);
211 }
212 for (Path p : touchInDirstate) {
213 dirstateBuilder.recordUncertain(p);
214 }
215 dirstateBuilder.parents(changesetRev, Nodeid.NULL);
216 dirstateBuilder.serialize();
199 return changesetRev; 217 return changesetRev;
200 } 218 }
201 /* 219 /*
202 private Pair<Integer, Integer> getManifestParents() { 220 private Pair<Integer, Integer> getManifestParents() {
203 return new Pair<Integer, Integer>(extractManifestRevisionIndex(p1Commit), extractManifestRevisionIndex(p2Commit)); 221 return new Pair<Integer, Integer>(extractManifestRevisionIndex(p1Commit), extractManifestRevisionIndex(p2Commit));