Mercurial > jhg
comparison src/org/tmatesoft/hg/core/HgRevertCommand.java @ 617:65c01508f002
Rollback support for commands that modify repository. Strategy to keep complete copy of a file being changed
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Wed, 15 May 2013 20:10:09 +0200 |
parents | f41dd9a3b8af |
children | b4242b7e7dfe |
comparison
equal
deleted
inserted
replaced
616:5e0313485eef | 617:65c01508f002 |
---|---|
19 import java.io.File; | 19 import java.io.File; |
20 import java.util.Arrays; | 20 import java.util.Arrays; |
21 import java.util.LinkedHashSet; | 21 import java.util.LinkedHashSet; |
22 import java.util.Set; | 22 import java.util.Set; |
23 | 23 |
24 import org.tmatesoft.hg.internal.COWTransaction; | |
24 import org.tmatesoft.hg.internal.CsetParamKeeper; | 25 import org.tmatesoft.hg.internal.CsetParamKeeper; |
25 import org.tmatesoft.hg.internal.DirstateBuilder; | 26 import org.tmatesoft.hg.internal.DirstateBuilder; |
26 import org.tmatesoft.hg.internal.DirstateReader; | 27 import org.tmatesoft.hg.internal.DirstateReader; |
27 import org.tmatesoft.hg.internal.Internals; | 28 import org.tmatesoft.hg.internal.Internals; |
29 import org.tmatesoft.hg.internal.Transaction; | |
28 import org.tmatesoft.hg.repo.HgManifest; | 30 import org.tmatesoft.hg.repo.HgManifest; |
29 import org.tmatesoft.hg.repo.HgManifest.Flags; | 31 import org.tmatesoft.hg.repo.HgManifest.Flags; |
30 import org.tmatesoft.hg.repo.HgRepository; | 32 import org.tmatesoft.hg.repo.HgRepository; |
33 import org.tmatesoft.hg.repo.HgRepositoryLock; | |
31 import org.tmatesoft.hg.repo.HgRuntimeException; | 34 import org.tmatesoft.hg.repo.HgRuntimeException; |
32 import org.tmatesoft.hg.util.CancelSupport; | 35 import org.tmatesoft.hg.util.CancelSupport; |
33 import org.tmatesoft.hg.util.CancelledException; | 36 import org.tmatesoft.hg.util.CancelledException; |
34 import org.tmatesoft.hg.util.Path; | 37 import org.tmatesoft.hg.util.Path; |
35 import org.tmatesoft.hg.util.ProgressSupport; | 38 import org.tmatesoft.hg.util.ProgressSupport; |
97 * @throws HgIOException to indicate troubles updating files in working copy | 100 * @throws HgIOException to indicate troubles updating files in working copy |
98 * @throws HgException subclass thereof to indicate specific issue with the command arguments or repository state | 101 * @throws HgException subclass thereof to indicate specific issue with the command arguments or repository state |
99 * @throws CancelledException if execution of the command was cancelled | 102 * @throws CancelledException if execution of the command was cancelled |
100 */ | 103 */ |
101 public void execute() throws HgException, CancelledException { | 104 public void execute() throws HgException, CancelledException { |
105 final HgRepositoryLock wdLock = repo.getWorkingDirLock(); | |
106 wdLock.acquire(); | |
102 try { | 107 try { |
103 final ProgressSupport progress = getProgressSupport(null); | 108 final ProgressSupport progress = getProgressSupport(null); |
104 final CancelSupport cancellation = getCancelSupport(null, true); | 109 final CancelSupport cancellation = getCancelSupport(null, true); |
105 cancellation.checkCancelled(); | 110 cancellation.checkCancelled(); |
106 progress.start(files.size() + 2); | 111 progress.start(files.size() + 2); |
153 repo.getManifest().walkFileRevisions(file, insp, csetRevision); | 158 repo.getManifest().walkFileRevisions(file, insp, csetRevision); |
154 worker.checkFailed(); | 159 worker.checkFailed(); |
155 progress.worked(1); | 160 progress.worked(1); |
156 cancellation.checkCancelled(); | 161 cancellation.checkCancelled(); |
157 } | 162 } |
158 dirstateBuilder.serialize(); | 163 Transaction.Factory trFactory = new COWTransaction.Factory(); |
164 Transaction tr = trFactory.create(repo); | |
165 try { | |
166 // TODO same code in HgAddRemoveCommand and similar in HgCommitCommand | |
167 dirstateBuilder.serialize(tr); | |
168 tr.commit(); | |
169 } catch (RuntimeException ex) { | |
170 tr.rollback(); | |
171 throw ex; | |
172 } catch (HgException ex) { | |
173 tr.rollback(); | |
174 throw ex; | |
175 } | |
159 progress.worked(1); | 176 progress.worked(1); |
160 progress.done(); | 177 progress.done(); |
161 } catch (HgRuntimeException ex) { | 178 } catch (HgRuntimeException ex) { |
162 throw new HgLibraryFailureException(ex); | 179 throw new HgLibraryFailureException(ex); |
180 } finally { | |
181 wdLock.release(); | |
163 } | 182 } |
164 } | 183 } |
165 } | 184 } |