comparison src/org/tmatesoft/hg/internal/CommitFacility.java @ 616:5e0313485eef

encode directories as demanded by fncache format
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Tue, 14 May 2013 17:31:35 +0200
parents f41dd9a3b8af
children 65c01508f002
comparison
equal deleted inserted replaced
615:84104448a0bf 616:5e0313485eef
131 for (Path p : removals) { 131 for (Path p : removals) {
132 newManifestRevision.remove(p); 132 newManifestRevision.remove(p);
133 } 133 }
134 // 134 //
135 // Register new/changed 135 // Register new/changed
136 ArrayList<Path> newlyAddedFiles = new ArrayList<Path>(); 136 LinkedHashMap<Path, RevlogStream> newlyAddedFiles = new LinkedHashMap<Path, RevlogStream>();
137 ArrayList<Path> touchInDirstate = new ArrayList<Path>(); 137 ArrayList<Path> touchInDirstate = new ArrayList<Path>();
138 for (Pair<HgDataFile, ByteDataSupplier> e : files.values()) { 138 for (Pair<HgDataFile, ByteDataSupplier> e : files.values()) {
139 HgDataFile df = e.first(); 139 HgDataFile df = e.first();
140 Pair<Integer, Integer> fp = fileParents.get(df.getPath()); 140 Pair<Integer, Integer> fp = fileParents.get(df.getPath());
141 if (fp == null) { 141 if (fp == null) {
154 RevlogStream contentStream; 154 RevlogStream contentStream;
155 if (df.exists()) { 155 if (df.exists()) {
156 contentStream = repo.getImplAccess().getStream(df); 156 contentStream = repo.getImplAccess().getStream(df);
157 } else { 157 } else {
158 contentStream = repo.createStoreFile(df.getPath()); 158 contentStream = repo.createStoreFile(df.getPath());
159 newlyAddedFiles.add(df.getPath()); 159 newlyAddedFiles.put(df.getPath(), contentStream);
160 // FIXME df doesn't get df.content updated, and clients 160 // FIXME df doesn't get df.content updated, and clients
161 // that would attempt to access newly added file after commit would fail 161 // that would attempt to access newly added file after commit would fail
162 // (despite the fact the file is in there) 162 // (despite the fact the file is in there)
163 } 163 }
164 RevlogStreamWriter fileWriter = new RevlogStreamWriter(repo, contentStream); 164 RevlogStreamWriter fileWriter = new RevlogStreamWriter(repo, contentStream);
181 changelogBuilder.branch(branch == null ? DEFAULT_BRANCH_NAME : branch); 181 changelogBuilder.branch(branch == null ? DEFAULT_BRANCH_NAME : branch);
182 changelogBuilder.user(String.valueOf(user)); 182 changelogBuilder.user(String.valueOf(user));
183 byte[] clogContent = changelogBuilder.build(manifestRev, message); 183 byte[] clogContent = changelogBuilder.build(manifestRev, message);
184 RevlogStreamWriter changelogWriter = new RevlogStreamWriter(repo, repo.getImplAccess().getChangelogStream()); 184 RevlogStreamWriter changelogWriter = new RevlogStreamWriter(repo, repo.getImplAccess().getChangelogStream());
185 Nodeid changesetRev = changelogWriter.addRevision(clogContent, clogRevisionIndex, p1Commit, p2Commit); 185 Nodeid changesetRev = changelogWriter.addRevision(clogContent, clogRevisionIndex, p1Commit, p2Commit);
186 // FIXME move fncache update to an external facility, along with dirstate and bookmark update 186 // TODO move fncache update to an external facility, along with dirstate and bookmark update
187 if (!newlyAddedFiles.isEmpty() && repo.fncacheInUse()) { 187 if (!newlyAddedFiles.isEmpty() && repo.fncacheInUse()) {
188 FNCacheFile fncache = new FNCacheFile(repo); 188 FNCacheFile fncache = new FNCacheFile(repo);
189 for (Path p : newlyAddedFiles) { 189 for (Path p : newlyAddedFiles.keySet()) {
190 fncache.add(p); 190 fncache.addIndex(p);
191 if (!newlyAddedFiles.get(p).isInlineData()) {
192 fncache.addData(p);
193 }
191 } 194 }
192 try { 195 try {
193 fncache.write(); 196 fncache.write();
194 } catch (IOException ex) { 197 } catch (IOException ex) {
195 // see comment above for fnchache.read() 198 // see comment above for fnchache.read()
230 dirstateBuilder.serialize(); 233 dirstateBuilder.serialize();
231 // update bookmarks 234 // update bookmarks
232 if (p1Commit != NO_REVISION || p2Commit != NO_REVISION) { 235 if (p1Commit != NO_REVISION || p2Commit != NO_REVISION) {
233 repo.getRepo().getBookmarks().updateActive(p1Cset, p2Cset, changesetRev); 236 repo.getRepo().getBookmarks().updateActive(p1Cset, p2Cset, changesetRev);
234 } 237 }
238 // TODO undo.dirstate and undo.branch as described in http://mercurial.selenic.com/wiki/FileFormats#undo..2A
235 // TODO Revisit: might be reasonable to send out a "Repo changed" notification, to clear 239 // TODO Revisit: might be reasonable to send out a "Repo changed" notification, to clear
236 // e.g. cached branch, tags and so on, not to rely on file change detection methods? 240 // e.g. cached branch, tags and so on, not to rely on file change detection methods?
237 // The same notificaion might come useful once Pull is implemented 241 // The same notification might come useful once Pull is implemented
238 return changesetRev; 242 return changesetRev;
239 } 243 }
240 /* 244 /*
241 private Pair<Integer, Integer> getManifestParents() { 245 private Pair<Integer, Integer> getManifestParents() {
242 return new Pair<Integer, Integer>(extractManifestRevisionIndex(p1Commit), extractManifestRevisionIndex(p2Commit)); 246 return new Pair<Integer, Integer>(extractManifestRevisionIndex(p1Commit), extractManifestRevisionIndex(p2Commit));