Mercurial > jhg
comparison src/org/tmatesoft/hg/core/HgCheckoutCommand.java @ 565:78a9e26e670d
Refactor common code to initialize changelog revision for a command into standalone class
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Tue, 09 Apr 2013 17:15:30 +0200 |
parents | ca56a36c2eea |
children | becd2a1310a2 |
comparison
equal
deleted
inserted
replaced
564:e6407313bab7 | 565:78a9e26e670d |
---|---|
23 import java.io.FileOutputStream; | 23 import java.io.FileOutputStream; |
24 import java.io.IOException; | 24 import java.io.IOException; |
25 import java.io.OutputStreamWriter; | 25 import java.io.OutputStreamWriter; |
26 import java.nio.channels.FileChannel; | 26 import java.nio.channels.FileChannel; |
27 | 27 |
28 import org.tmatesoft.hg.internal.CsetParamKeeper; | |
28 import org.tmatesoft.hg.internal.DirstateBuilder; | 29 import org.tmatesoft.hg.internal.DirstateBuilder; |
29 import org.tmatesoft.hg.internal.EncodingHelper; | 30 import org.tmatesoft.hg.internal.EncodingHelper; |
30 import org.tmatesoft.hg.internal.Experimental; | 31 import org.tmatesoft.hg.internal.Experimental; |
31 import org.tmatesoft.hg.internal.Internals; | 32 import org.tmatesoft.hg.internal.Internals; |
32 import org.tmatesoft.hg.internal.WorkingDirFileWriter; | 33 import org.tmatesoft.hg.internal.WorkingDirFileWriter; |
33 import org.tmatesoft.hg.repo.HgDataFile; | 34 import org.tmatesoft.hg.repo.HgDataFile; |
34 import org.tmatesoft.hg.repo.HgDirstate; | 35 import org.tmatesoft.hg.repo.HgDirstate; |
35 import org.tmatesoft.hg.repo.HgInternals; | |
36 import org.tmatesoft.hg.repo.HgInvalidRevisionException; | |
37 import org.tmatesoft.hg.repo.HgManifest; | |
38 import org.tmatesoft.hg.repo.HgDirstate.EntryKind; | 36 import org.tmatesoft.hg.repo.HgDirstate.EntryKind; |
39 import org.tmatesoft.hg.repo.HgDirstate.Record; | 37 import org.tmatesoft.hg.repo.HgDirstate.Record; |
38 import org.tmatesoft.hg.repo.HgInternals; | |
39 import org.tmatesoft.hg.repo.HgManifest; | |
40 import org.tmatesoft.hg.repo.HgManifest.Flags; | 40 import org.tmatesoft.hg.repo.HgManifest.Flags; |
41 import org.tmatesoft.hg.repo.HgRepository; | 41 import org.tmatesoft.hg.repo.HgRepository; |
42 import org.tmatesoft.hg.repo.HgRuntimeException; | 42 import org.tmatesoft.hg.repo.HgRuntimeException; |
43 import org.tmatesoft.hg.util.CancelledException; | 43 import org.tmatesoft.hg.util.CancelledException; |
44 import org.tmatesoft.hg.util.Path; | 44 import org.tmatesoft.hg.util.Path; |
55 */ | 55 */ |
56 @Experimental(reason="Work in progress") | 56 @Experimental(reason="Work in progress") |
57 public class HgCheckoutCommand extends HgAbstractCommand<HgCheckoutCommand>{ | 57 public class HgCheckoutCommand extends HgAbstractCommand<HgCheckoutCommand>{ |
58 | 58 |
59 private final HgRepository repo; | 59 private final HgRepository repo; |
60 private int revisionToCheckout = HgRepository.BAD_REVISION; | 60 private final CsetParamKeeper revisionToCheckout; |
61 private boolean cleanCheckout; | 61 private boolean cleanCheckout; |
62 | 62 |
63 public HgCheckoutCommand(HgRepository hgRepo) { | 63 public HgCheckoutCommand(HgRepository hgRepo) { |
64 repo = hgRepo; | 64 repo = hgRepo; |
65 revisionToCheckout = new CsetParamKeeper(repo); | |
65 } | 66 } |
66 | 67 |
67 /** | 68 /** |
68 * Whether to discard all uncommited changes prior to check-out. | 69 * Whether to discard all uncommited changes prior to check-out. |
69 * | 70 * |
83 * @param nodeid revision | 84 * @param nodeid revision |
84 * @return <code>this</code> for convenience | 85 * @return <code>this</code> for convenience |
85 * @throws HgBadArgumentException if failed to find supplied changeset | 86 * @throws HgBadArgumentException if failed to find supplied changeset |
86 */ | 87 */ |
87 public HgCheckoutCommand changeset(Nodeid nodeid) throws HgBadArgumentException { | 88 public HgCheckoutCommand changeset(Nodeid nodeid) throws HgBadArgumentException { |
88 try { | 89 revisionToCheckout.set(nodeid); |
89 return changeset(repo.getChangelog().getRevisionIndex(nodeid)); | 90 return this; |
90 } catch (HgInvalidRevisionException ex) { | |
91 throw new HgBadArgumentException("Can't find revision", ex).setRevision(nodeid); | |
92 } | |
93 } | 91 } |
94 | 92 |
95 /** | 93 /** |
96 * Select revision to check out using local revision index | 94 * Select revision to check out using local revision index |
97 * | 95 * |
98 * @param changesetIndex local revision index, or {@link HgRepository#TIP} | 96 * @param changesetIndex local changelog revision index, or {@link HgRepository#TIP} |
99 * @return <code>this</code> for convenience | 97 * @return <code>this</code> for convenience |
100 * @throws HgBadArgumentException if failed to find supplied changeset | 98 * @throws HgBadArgumentException if failed to find supplied changeset |
101 */ | 99 */ |
102 public HgCheckoutCommand changeset(int changesetIndex) throws HgBadArgumentException { | 100 public HgCheckoutCommand changeset(int changesetIndex) throws HgBadArgumentException { |
103 int lastCsetIndex = repo.getChangelog().getLastRevision(); | 101 revisionToCheckout.set(changesetIndex); |
104 if (changesetIndex == HgRepository.TIP) { | |
105 changesetIndex = lastCsetIndex; | |
106 } | |
107 if (changesetIndex < 0 || changesetIndex > lastCsetIndex) { | |
108 throw new HgBadArgumentException(String.format("Bad revision index %d, value from [0..%d] expected", changesetIndex, lastCsetIndex), null).setRevisionIndex(changesetIndex); | |
109 } | |
110 revisionToCheckout = changesetIndex; | |
111 return this; | 102 return this; |
112 } | 103 } |
113 | 104 |
114 /** | 105 /** |
115 * | 106 * |
157 | 148 |
158 public boolean begin(int mainfestRevision, Nodeid nid, int changelogRevision) { | 149 public boolean begin(int mainfestRevision, Nodeid nid, int changelogRevision) { |
159 return true; | 150 return true; |
160 } | 151 } |
161 }; | 152 }; |
162 dirstateBuilder.parents(repo.getChangelog().getRevision(revisionToCheckout), null); | 153 // checkout tip if no revision set |
163 repo.getManifest().walk(revisionToCheckout, revisionToCheckout, insp); | 154 final int coRevision = revisionToCheckout.get(HgRepository.TIP); |
155 dirstateBuilder.parents(repo.getChangelog().getRevision(coRevision), null); | |
156 repo.getManifest().walk(coRevision, coRevision, insp); | |
164 worker.checkFailed(); | 157 worker.checkFailed(); |
165 File dirstateFile = internalRepo.getRepositoryFile(Dirstate); | 158 File dirstateFile = internalRepo.getRepositoryFile(Dirstate); |
166 try { | 159 try { |
167 FileChannel dirstateFileChannel = new FileOutputStream(dirstateFile).getChannel(); | 160 FileChannel dirstateFileChannel = new FileOutputStream(dirstateFile).getChannel(); |
168 dirstateBuilder.serialize(dirstateFileChannel); | 161 dirstateBuilder.serialize(dirstateFileChannel); |
169 dirstateFileChannel.close(); | 162 dirstateFileChannel.close(); |
170 } catch (IOException ex) { | 163 } catch (IOException ex) { |
171 throw new HgIOException("Can't write down new directory state", ex, dirstateFile); | 164 throw new HgIOException("Can't write down new directory state", ex, dirstateFile); |
172 } | 165 } |
173 String branchName = repo.getChangelog().range(revisionToCheckout, revisionToCheckout).get(0).branch(); | 166 String branchName = repo.getChangelog().range(coRevision, coRevision).get(0).branch(); |
174 assert branchName != null; | 167 assert branchName != null; |
175 if (!HgRepository.DEFAULT_BRANCH_NAME.equals(branchName)) { | 168 if (!HgRepository.DEFAULT_BRANCH_NAME.equals(branchName)) { |
176 File branchFile = internalRepo.getRepositoryFile(Branch); | 169 File branchFile = internalRepo.getRepositoryFile(Branch); |
177 try { | 170 try { |
178 // branch file is UTF-8, see http://mercurial.selenic.com/wiki/EncodingStrategy#UTF-8_strings | 171 // branch file is UTF-8, see http://mercurial.selenic.com/wiki/EncodingStrategy#UTF-8_strings |