Mercurial > jhg
comparison src/org/tmatesoft/hg/core/HgCheckoutCommand.java @ 580:bd5926e24aa3
Respect unix flags for checkout/revert
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Fri, 19 Apr 2013 20:30:34 +0200 |
parents | becd2a1310a2 |
children | 0890628ed51e |
comparison
equal
deleted
inserted
replaced
579:36e36b926747 | 580:bd5926e24aa3 |
---|---|
133 final CheckoutWorker worker = new CheckoutWorker(internalRepo); | 133 final CheckoutWorker worker = new CheckoutWorker(internalRepo); |
134 HgManifest.Inspector insp = new HgManifest.Inspector() { | 134 HgManifest.Inspector insp = new HgManifest.Inspector() { |
135 | 135 |
136 public boolean next(Nodeid nid, Path fname, Flags flags) { | 136 public boolean next(Nodeid nid, Path fname, Flags flags) { |
137 if (worker.next(nid, fname, flags)) { | 137 if (worker.next(nid, fname, flags)) { |
138 // new dirstate based on manifest | 138 // Mercurial seems to write "n 0 -1 unset fname" on `hg --clean co -rev <earlier rev>` |
139 dirstateBuilder.recordNormal(fname, flags, worker.getLastWrittenFileSize()); | 139 // and the reason for 'force lookup' I suspect is a slight chance of simultaneous modification |
140 // of the file by user that doesn't alter its size the very second dirstate is being written | |
141 // (or the file is being updated and the update brought in changes that didn't alter the file size - | |
142 // with size and timestamp set, later `hg status` won't notice these changes) | |
143 | |
144 // However, as long as we use this class to write clean copies of the files, we can put all the fields | |
145 // right away. | |
146 int mtime = worker.getLastFileModificationTime(); | |
147 // Manifest flags are chars (despite octal values `hg manifest --debug` displays), | |
148 // while dirstate keeps actual unix flags. | |
149 int fmode = worker.getLastFileMode(); | |
150 dirstateBuilder.recordNormal(fname, fmode, mtime, worker.getLastFileSize()); | |
140 return true; | 151 return true; |
141 } | 152 } |
142 return false; | 153 return false; |
143 } | 154 } |
144 | 155 |
183 | 194 |
184 static class CheckoutWorker { | 195 static class CheckoutWorker { |
185 private final Internals hgRepo; | 196 private final Internals hgRepo; |
186 private HgException failure; | 197 private HgException failure; |
187 private int lastWrittenFileSize; | 198 private int lastWrittenFileSize; |
199 private int lastFileMode; | |
200 private int lastFileModificationTime; | |
188 | 201 |
189 CheckoutWorker(Internals implRepo) { | 202 CheckoutWorker(Internals implRepo) { |
190 hgRepo = implRepo; | 203 hgRepo = implRepo; |
191 } | 204 } |
192 | 205 |
194 WorkingDirFileWriter workingDirWriter = null; | 207 WorkingDirFileWriter workingDirWriter = null; |
195 try { | 208 try { |
196 HgDataFile df = hgRepo.getRepo().getFileNode(fname); | 209 HgDataFile df = hgRepo.getRepo().getFileNode(fname); |
197 int fileRevIndex = df.getRevisionIndex(nid); | 210 int fileRevIndex = df.getRevisionIndex(nid); |
198 // check out files based on manifest | 211 // check out files based on manifest |
199 // FIXME links! | |
200 workingDirWriter = new WorkingDirFileWriter(hgRepo); | 212 workingDirWriter = new WorkingDirFileWriter(hgRepo); |
201 workingDirWriter.processFile(df, fileRevIndex); | 213 workingDirWriter.processFile(df, fileRevIndex, flags); |
202 lastWrittenFileSize = workingDirWriter.bytesWritten(); | 214 lastWrittenFileSize = workingDirWriter.bytesWritten(); |
215 lastFileMode = workingDirWriter.fmode(); | |
216 lastFileModificationTime = workingDirWriter.mtime(); | |
203 return true; | 217 return true; |
204 } catch (IOException ex) { | 218 } catch (IOException ex) { |
205 failure = new HgIOException("Failed to write down file revision", ex, workingDirWriter.getDestinationFile()); | 219 failure = new HgIOException("Failed to write down file revision", ex, workingDirWriter.getDestinationFile()); |
206 } catch (HgRuntimeException ex) { | 220 } catch (HgRuntimeException ex) { |
207 failure = new HgLibraryFailureException(ex); | 221 failure = new HgLibraryFailureException(ex); |
208 } | 222 } |
209 return false; | 223 return false; |
210 } | 224 } |
211 | 225 |
212 public int getLastWrittenFileSize() { | 226 public int getLastFileMode() { |
227 return lastFileMode; | |
228 } | |
229 | |
230 public int getLastFileModificationTime() { | |
231 return lastFileModificationTime; | |
232 } | |
233 | |
234 public int getLastFileSize() { | |
213 return lastWrittenFileSize; | 235 return lastWrittenFileSize; |
214 } | 236 } |
215 | 237 |
216 public void checkFailed() throws HgException { | 238 public void checkFailed() throws HgException { |
217 if (failure != null) { | 239 if (failure != null) { |