Mercurial > hg4j
comparison test/org/tmatesoft/hg/test/TestHistory.java @ 521:59e555c85da0
Cover ChangesetTreeHandler with various followRename, followAncestry and direction
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Wed, 26 Dec 2012 17:51:07 +0100 |
parents | 1ee452f31187 |
children | 2103388d4010 |
comparison
equal
deleted
inserted
replaced
520:1ee452f31187 | 521:59e555c85da0 |
---|---|
22 import static org.junit.Assert.assertTrue; | 22 import static org.junit.Assert.assertTrue; |
23 | 23 |
24 import java.util.ArrayList; | 24 import java.util.ArrayList; |
25 import java.util.Collections; | 25 import java.util.Collections; |
26 import java.util.Comparator; | 26 import java.util.Comparator; |
27 import java.util.HashMap; | |
28 import java.util.Iterator; | 27 import java.util.Iterator; |
29 import java.util.LinkedList; | 28 import java.util.LinkedList; |
30 import java.util.List; | 29 import java.util.List; |
31 import java.util.Map; | |
32 | 30 |
33 import org.junit.Assert; | 31 import org.junit.Assert; |
34 import org.junit.Rule; | 32 import org.junit.Rule; |
35 import org.junit.Test; | 33 import org.junit.Test; |
36 import org.tmatesoft.hg.core.HgCallbackTargetException; | 34 import org.tmatesoft.hg.core.HgCallbackTargetException; |
109 changelogParser.reset(); | 107 changelogParser.reset(); |
110 eh.run("hg", "log", "--debug", "--follow", f.toString()); | 108 eh.run("hg", "log", "--debug", "--follow", f.toString()); |
111 | 109 |
112 CollectWithRenameHandler h = new CollectWithRenameHandler(); | 110 CollectWithRenameHandler h = new CollectWithRenameHandler(); |
113 new HgLogCommand(repo).file(f, true).execute(h); | 111 new HgLogCommand(repo).file(f, true).execute(h); |
114 errorCollector.assertEquals(1, h.renames.size()); | 112 errorCollector.assertEquals(1, h.rh.renames.size()); |
115 HgFileRevision from = h.renames.get(0).first(); | 113 HgFileRevision from = h.rh.renames.get(0).first(); |
116 boolean fromMatched = "src/com/tmate/hgkit/console/Remote.java".equals(from.getPath().toString()); | 114 boolean fromMatched = "src/com/tmate/hgkit/console/Remote.java".equals(from.getPath().toString()); |
117 String what = "hg log - FOLLOW FILE HISTORY"; | 115 String what = "hg log - FOLLOW FILE HISTORY"; |
118 errorCollector.checkThat(what + "#copyReported ", h.copyReported, is(true)); | 116 errorCollector.checkThat(what + "#copyReported ", h.rh.copyReported, is(true)); |
119 errorCollector.checkThat(what + "#copyFromMatched", fromMatched, is(true)); | 117 errorCollector.checkThat(what + "#copyFromMatched", fromMatched, is(true)); |
120 // | 118 // |
121 // cmdline always gives in changesets in order from newest (bigger rev number) to oldest. | 119 // cmdline always gives in changesets in order from newest (bigger rev number) to oldest. |
122 // LogCommand does other way round, from oldest to newest, follewed by revisions of copy source, if any | 120 // LogCommand does other way round, from oldest to newest, follewed by revisions of copy source, if any |
123 // (apparently older than oldest of the copy target). Hence need to sort Java results according to rev numbers | 121 // (apparently older than oldest of the copy target). Hence need to sort Java results according to rev numbers |
139 | 137 |
140 TreeCollectHandler h = new TreeCollectHandler(false); | 138 TreeCollectHandler h = new TreeCollectHandler(false); |
141 new HgLogCommand(repo).file(fname, false).execute(h); | 139 new HgLogCommand(repo).file(fname, false).execute(h); |
142 // since we use TreeCollectHandler with natural order (older to newer), shall reverse console result in report() | 140 // since we use TreeCollectHandler with natural order (older to newer), shall reverse console result in report() |
143 report("execute with HgChangesetTreeHandler(follow == false)", h.getResult(), true); | 141 report("execute with HgChangesetTreeHandler(follow == false)", h.getResult(), true); |
144 } | |
145 | |
146 @Test | |
147 public void testChangesetTreeFollowRenameAndAncestry() throws Exception { | |
148 repo = Configuration.get().find("log-follow"); | |
149 final String fname = "file1_b"; | |
150 assertTrue("[sanity]", repo.getFileNode(fname).exists()); | |
151 eh.run("hg", "log", "--debug", "--follow", fname, "--cwd", repo.getLocation()); | |
152 | |
153 final Map<Path,Path> renames = new HashMap<Path, Path>(); | |
154 TreeCollectHandler h = new TreeCollectHandler(true); | |
155 h.attachAdapter(HgFileRenameHandlerMixin.class, new HgFileRenameHandlerMixin() { | |
156 | |
157 public void copy(HgFileRevision from, HgFileRevision to) throws HgCallbackTargetException { | |
158 renames.put(from.getPath(), to.getPath()); | |
159 } | |
160 }); | |
161 h.checkPrevInParents = true; | |
162 new HgLogCommand(repo).file(fname, true, true).execute(h); | |
163 | |
164 assertEquals(1, h.getAdapterUse(HgFileRenameHandlerMixin.class)); | |
165 | |
166 report("execute with HgChangesetTreeHandler(follow == true)", h.getResult(), false); | |
167 | |
168 assertEquals(1, renames.size()); | |
169 assertEquals(Path.create(fname), renames.get(Path.create("file1_a"))); | |
170 } | 142 } |
171 | 143 |
172 /** | 144 /** |
173 * Few tests to check newly introduced followAncestry parameter to HgLogCommand: | 145 * Few tests to check newly introduced followAncestry parameter to HgLogCommand: |
174 * followRename: true, followAncestry: false | 146 * followRename: true, followAncestry: false |
186 // sequentially gives follow rename semantics without ancestry | 158 // sequentially gives follow rename semantics without ancestry |
187 eh.run("hg", "log", "--debug", fname2, fname1, "--cwd", repo.getLocation()); | 159 eh.run("hg", "log", "--debug", fname2, fname1, "--cwd", repo.getLocation()); |
188 | 160 |
189 CollectWithRenameHandler h = new CollectWithRenameHandler(); | 161 CollectWithRenameHandler h = new CollectWithRenameHandler(); |
190 new HgLogCommand(repo).file(fname2, true, false).execute(h); | 162 new HgLogCommand(repo).file(fname2, true, false).execute(h); |
191 errorCollector.assertEquals(1, h.renames.size()); | 163 errorCollector.assertEquals(1, h.rh.renames.size()); |
192 Pair<HgFileRevision, HgFileRevision> rename = h.renames.get(0); | 164 Pair<HgFileRevision, HgFileRevision> rename = h.rh.renames.get(0); |
193 errorCollector.assertEquals(fname1, rename.first().getPath().toString()); | 165 errorCollector.assertEquals(fname1, rename.first().getPath().toString()); |
194 errorCollector.assertEquals(fname2, rename.second().getPath().toString()); | 166 errorCollector.assertEquals(fname2, rename.second().getPath().toString()); |
195 // Ensure rename info came in the right moment | 167 // Ensure rename info came in the right moment |
196 errorCollector.assertEquals(1, h.lastChangesetReportedAtRename.size()); | 168 errorCollector.assertEquals(1, h.lastChangesetReportedAtRename.size()); |
197 // Command iterates old to new, rename comes after last fname1 revision. Since we don't follow | 169 // Command iterates old to new, rename comes after last fname1 revision. Since we don't follow |
202 // | 174 // |
203 // Direction | 175 // Direction |
204 h = new CollectWithRenameHandler(); | 176 h = new CollectWithRenameHandler(); |
205 new HgLogCommand(repo).file(fname2, true, false).debugSwitch1().execute(h); | 177 new HgLogCommand(repo).file(fname2, true, false).debugSwitch1().execute(h); |
206 // Identical rename shall be reported, at the same moment | 178 // Identical rename shall be reported, at the same moment |
207 errorCollector.assertEquals(1, h.renames.size()); | 179 errorCollector.assertEquals(1, h.rh.renames.size()); |
208 rename = h.renames.get(0); | 180 rename = h.rh.renames.get(0); |
209 errorCollector.assertEquals(fname1, rename.first().getPath().toString()); | 181 errorCollector.assertEquals(fname1, rename.first().getPath().toString()); |
210 errorCollector.assertEquals(fname2, rename.second().getPath().toString()); | 182 errorCollector.assertEquals(fname2, rename.second().getPath().toString()); |
211 errorCollector.assertEquals(1, h.lastChangesetReportedAtRename.size()); | 183 errorCollector.assertEquals(1, h.lastChangesetReportedAtRename.size()); |
212 // new to old, recently reported would be the very first revision fname2 pops up | 184 // new to old, recently reported would be the very first revision fname2 pops up |
213 String firstRevOfFname2 = "27e7a69373b74d42e75f3211e56510ff17d01370"; | 185 String firstRevOfFname2 = "27e7a69373b74d42e75f3211e56510ff17d01370"; |
214 errorCollector.assertEquals(firstRevOfFname2, h.lastChangesetReportedAtRename.get(0).getNodeid().toString()); | 186 errorCollector.assertEquals(firstRevOfFname2, h.lastChangesetReportedAtRename.get(0).getNodeid().toString()); |
215 report("HgChangesetHandler(renames: true, ancestry:false)", h.getChanges(), false); | 187 report("HgChangesetHandler(renames: true, ancestry:false)", h.getChanges(), false); |
216 // | 188 // |
217 // TODO TreeChangeHandler | 189 // TreeChangeHandler - in #testChangesetTreeFollowRenamesNotAncestry |
190 } | |
191 | |
192 @Test | |
193 public void testChangesetTreeFollowRenamesNotAncestry() throws Exception { | |
194 repo = Configuration.get().find("log-follow"); | |
195 final String fname1 = "file1_a"; | |
196 final String fname2 = "file1_b"; | |
197 assertTrue("[sanity]", repo.getFileNode(fname2).exists()); | |
198 // no --follow, but two names we know have been the same file (fname1 renamed to fname2) | |
199 // sequentially gives follow rename semantics without ancestry | |
200 eh.run("hg", "log", "--debug", fname2, fname1, "--cwd", repo.getLocation()); | |
201 | |
202 TreeCollectHandler h = new TreeCollectHandler(true); | |
203 RenameCollector rh = new RenameCollector(h); | |
204 // can't check that prev revision is in parent because there are forks in | |
205 // file history (e.g. rev2 and rev3 (that comes next) both have rev0 as their parent | |
206 // and followAncestry is false | |
207 // h.checkPrevInParents = true; | |
208 new HgLogCommand(repo).file(fname2, true, false).execute(h); | |
209 errorCollector.assertEquals(1, rh.renames.size()); | |
210 Pair<HgFileRevision, HgFileRevision> rename = rh.renames.get(0); | |
211 errorCollector.assertEquals(fname1, rename.first().getPath().toString()); | |
212 errorCollector.assertEquals(fname2, rename.second().getPath().toString()); | |
213 report("HgChangesetTreeHandler(renames: true, ancestry:false)", h.getResult(), false); | |
214 | |
215 // Direction | |
216 h = new TreeCollectHandler(false); | |
217 rh = new RenameCollector(h); | |
218 // h.checkPrevInChildren = true; see above | |
219 new HgLogCommand(repo).file(fname2, true, false).debugSwitch1().execute(h); | |
220 errorCollector.assertEquals(1, rh.renames.size()); | |
221 rename = rh.renames.get(0); | |
222 errorCollector.assertEquals(fname1, rename.first().getPath().toString()); | |
223 errorCollector.assertEquals(fname2, rename.second().getPath().toString()); | |
224 report("HgChangesetTreeHandler(renames: true, ancestry:false)", h.getResult(), false); | |
218 } | 225 } |
219 | 226 |
220 @Test | 227 @Test |
221 public void testFollowAncestryNotRenames() throws Exception { | 228 public void testFollowAncestryNotRenames() throws Exception { |
222 repo = Configuration.get().find("log-follow"); | 229 repo = Configuration.get().find("log-follow"); |
223 final String fname2 = "file1_b"; | 230 final String fname2 = "file1_b"; |
224 assertTrue("[sanity]", repo.getFileNode(fname2).exists()); | 231 assertTrue("[sanity]", repo.getFileNode(fname2).exists()); |
232 final List<Record> fname2Follow = getAncestryWithoutRenamesFromCmdline(fname2); | |
233 | |
234 CollectWithRenameHandler h = new CollectWithRenameHandler(); | |
235 new HgLogCommand(repo).file(fname2, false, true).execute(h); | |
236 errorCollector.assertEquals(0, h.rh.renames.size()); | |
237 report("HgChangesetHandler(renames: false, ancestry:true)", h.getChanges(), fname2Follow, true, errorCollector); | |
238 // | |
239 // Direction | |
240 h = new CollectWithRenameHandler(); | |
241 new HgLogCommand(repo).file(fname2, false, true).debugSwitch1().execute(h); | |
242 report("HgChangesetHandler(renames: false, ancestry:true)", h.getChanges(), fname2Follow, false/*!!!*/, errorCollector); | |
243 // | |
244 // TreeChangeHandler - in #testChangesetTreeFollowAncestryNotRenames | |
245 } | |
246 | |
247 @Test | |
248 public void testChangesetTreeFollowAncestryNotRenames() throws Exception { | |
249 repo = Configuration.get().find("log-follow"); | |
250 final String fname2 = "file1_b"; | |
251 final List<Record> fname2Follow = getAncestryWithoutRenamesFromCmdline(fname2); | |
252 | |
253 TreeCollectHandler h = new TreeCollectHandler(false); | |
254 RenameCollector rh = new RenameCollector(h); | |
255 h.checkPrevInParents = true; | |
256 new HgLogCommand(repo).file(fname2, false, true).execute(h); | |
257 errorCollector.assertEquals(0, rh.renames.size()); | |
258 report("HgChangesetTreeHandler(renames: false, ancestry:true)", h.getResult(), fname2Follow, true, errorCollector); | |
259 | |
260 // Direction | |
261 h = new TreeCollectHandler(false); | |
262 rh = new RenameCollector(h); | |
263 h.checkPrevInChildren = true; | |
264 new HgLogCommand(repo).file(fname2, false, true).debugSwitch1().execute(h); | |
265 report("HgChangesetTreeHandler(renames: false, ancestry:true)", h.getResult(), fname2Follow, false, errorCollector); | |
266 } | |
267 | |
268 | |
269 private List<Record> getAncestryWithoutRenamesFromCmdline(String fname2) throws Exception { | |
225 // to get "followed" history of fname2 only (without fname1 origin), | 270 // to get "followed" history of fname2 only (without fname1 origin), |
226 // get the complete history and keep there only elements that match fname2 own history | 271 // get the complete history and keep there only elements that match fname2 own history |
227 eh.run("hg", "log", "--debug", "--follow", fname2, "--cwd", repo.getLocation()); | 272 eh.run("hg", "log", "--debug", "--follow", fname2, "--cwd", repo.getLocation()); |
228 final List<Record> fname2Follow = new LinkedList<LogOutputParser.Record>(changelogParser.getResult()); | 273 final List<Record> fname2Follow = new LinkedList<LogOutputParser.Record>(changelogParser.getResult()); |
229 changelogParser.reset(); | 274 changelogParser.reset(); |
241 } | 286 } |
242 if (!belongsToSoleFname2History) { | 287 if (!belongsToSoleFname2History) { |
243 it.remove(); | 288 it.remove(); |
244 } | 289 } |
245 } | 290 } |
246 CollectWithRenameHandler h = new CollectWithRenameHandler(); | 291 return fname2Follow; |
247 new HgLogCommand(repo).file(fname2, false, true).execute(h); | |
248 errorCollector.assertEquals(0, h.renames.size()); | |
249 report("HgChangesetHandler(renames: false, ancestry:true)", h.getChanges(), fname2Follow, true, errorCollector); | |
250 // | |
251 // Direction | |
252 h = new CollectWithRenameHandler(); | |
253 new HgLogCommand(repo).file(fname2, false, true).debugSwitch1().execute(h); | |
254 report("HgChangesetHandler(renames: false, ancestry:true)", h.getChanges(), fname2Follow, false/*!!!*/, errorCollector); | |
255 // | |
256 // TODO TreeChangeHandler | |
257 } | 292 } |
258 | 293 |
259 /** | 294 /** |
260 * output identical to that of "hg log --follow" | 295 * output identical to that of "hg log --follow" |
261 */ | 296 */ |
267 assertTrue("[sanity]", repo.getFileNode(fname2).exists()); | 302 assertTrue("[sanity]", repo.getFileNode(fname2).exists()); |
268 eh.run("hg", "log", "--debug", "--follow", fname2, "--cwd", repo.getLocation()); | 303 eh.run("hg", "log", "--debug", "--follow", fname2, "--cwd", repo.getLocation()); |
269 | 304 |
270 CollectWithRenameHandler h = new CollectWithRenameHandler(); | 305 CollectWithRenameHandler h = new CollectWithRenameHandler(); |
271 new HgLogCommand(repo).file(fname2, true, true).execute(h); | 306 new HgLogCommand(repo).file(fname2, true, true).execute(h); |
272 errorCollector.assertEquals(1, h.renames.size()); | 307 errorCollector.assertEquals(1, h.rh.renames.size()); |
273 Pair<HgFileRevision, HgFileRevision> rename = h.renames.get(0); | 308 Pair<HgFileRevision, HgFileRevision> rename = h.rh.renames.get(0); |
274 errorCollector.assertEquals(fname1, rename.first().getPath().toString()); | 309 errorCollector.assertEquals(fname1, rename.first().getPath().toString()); |
275 errorCollector.assertEquals(fname2, rename.second().getPath().toString()); | 310 errorCollector.assertEquals(fname2, rename.second().getPath().toString()); |
276 // Ensure rename info came in the right moment | 311 // Ensure rename info came in the right moment |
277 errorCollector.assertEquals(1, h.lastChangesetReportedAtRename.size()); | 312 errorCollector.assertEquals(1, h.lastChangesetReportedAtRename.size()); |
278 String fname1BranchRevision = "6e668ff2940acb250c8627843f8116166fe5d5cd"; | 313 String fname1BranchRevision = "6e668ff2940acb250c8627843f8116166fe5d5cd"; |
282 // | 317 // |
283 // Switch direction and compare, order shall match that from console | 318 // Switch direction and compare, order shall match that from console |
284 h = new CollectWithRenameHandler(); | 319 h = new CollectWithRenameHandler(); |
285 new HgLogCommand(repo).file(fname2, true, true).debugSwitch1().execute(h); | 320 new HgLogCommand(repo).file(fname2, true, true).debugSwitch1().execute(h); |
286 // Identical rename event shall be reported | 321 // Identical rename event shall be reported |
287 errorCollector.assertEquals(1, h.renames.size()); | 322 errorCollector.assertEquals(1, h.rh.renames.size()); |
288 rename = h.renames.get(0); | 323 rename = h.rh.renames.get(0); |
289 errorCollector.assertEquals(fname1, rename.first().getPath().toString()); | 324 errorCollector.assertEquals(fname1, rename.first().getPath().toString()); |
290 errorCollector.assertEquals(fname2, rename.second().getPath().toString()); | 325 errorCollector.assertEquals(fname2, rename.second().getPath().toString()); |
291 // new to old, recently reported would be the very first revision fname2 pops up | 326 // new to old, recently reported would be the very first revision fname2 pops up |
292 String firstRevOfFname2 = "27e7a69373b74d42e75f3211e56510ff17d01370"; | 327 String firstRevOfFname2 = "27e7a69373b74d42e75f3211e56510ff17d01370"; |
293 errorCollector.assertEquals(firstRevOfFname2, h.lastChangesetReportedAtRename.get(0).getNodeid().toString()); | 328 errorCollector.assertEquals(firstRevOfFname2, h.lastChangesetReportedAtRename.get(0).getNodeid().toString()); |
294 report("HgChangesetHandler(renames: true, ancestry:true)", h.getChanges(), false /*do not reorder console results !!!*/); | 329 report("HgChangesetHandler(renames: true, ancestry:true)", h.getChanges(), false /*do not reorder console results !!!*/); |
295 // | 330 // |
296 // TreeChangeHandler in #testChangesetTreeFollowRenameAndAncestry | 331 // TreeChangeHandler in #testChangesetTreeFollowRenameAndAncestry |
332 } | |
333 | |
334 @Test | |
335 public void testChangesetTreeFollowRenameAndAncestry() throws Exception { | |
336 repo = Configuration.get().find("log-follow"); | |
337 final String fname = "file1_b"; | |
338 assertTrue("[sanity]", repo.getFileNode(fname).exists()); | |
339 eh.run("hg", "log", "--debug", "--follow", fname, "--cwd", repo.getLocation()); | |
340 | |
341 TreeCollectHandler h = new TreeCollectHandler(true); | |
342 RenameCollector rh = new RenameCollector(h); | |
343 h.checkPrevInParents = true; | |
344 new HgLogCommand(repo).file(fname, true, true).execute(h); | |
345 | |
346 assertEquals(1, h.getAdapterUse(HgFileRenameHandlerMixin.class)); | |
347 | |
348 report("execute with HgChangesetTreeHandler(follow == true)", h.getResult(), false); | |
349 | |
350 assertEquals(1, rh.renames.size()); | |
351 assertEquals(Path.create(fname), rh.renames.get(0).second().getPath()); | |
297 } | 352 } |
298 | 353 |
299 /** | 354 /** |
300 * @see TestAuxUtilities#testChangelogCancelSupport() | 355 * @see TestAuxUtilities#testChangelogCancelSupport() |
301 */ | 356 */ |
494 //// | 549 //// |
495 | 550 |
496 private final class TreeCollectHandler extends AdapterPlug implements HgChangesetTreeHandler { | 551 private final class TreeCollectHandler extends AdapterPlug implements HgChangesetTreeHandler { |
497 private final LinkedList<HgChangeset> cmdResult = new LinkedList<HgChangeset>(); | 552 private final LinkedList<HgChangeset> cmdResult = new LinkedList<HgChangeset>(); |
498 private final boolean reverseResult; | 553 private final boolean reverseResult; |
499 boolean checkPrevInChildren = false; | 554 boolean checkPrevInChildren = false; // true when iterating new to old |
500 boolean checkPrevInParents = false; | 555 boolean checkPrevInParents = false; // true when iterating old to new |
501 | 556 |
502 public TreeCollectHandler(boolean _reverseResult) { | 557 public TreeCollectHandler(boolean _reverseResult) { |
503 this.reverseResult = _reverseResult; | 558 this.reverseResult = _reverseResult; |
504 } | 559 } |
505 | 560 |
544 } | 599 } |
545 } | 600 } |
546 } | 601 } |
547 | 602 |
548 private static class CollectWithRenameHandler extends CollectHandler implements HgChangesetHandler.WithCopyHistory { | 603 private static class CollectWithRenameHandler extends CollectHandler implements HgChangesetHandler.WithCopyHistory { |
549 public boolean copyReported = false; | 604 public final RenameCollector rh = new RenameCollector(); |
550 public List<Pair<HgFileRevision, HgFileRevision>> renames = new LinkedList<Pair<HgFileRevision,HgFileRevision>>(); | 605 public List<HgChangeset> lastChangesetReportedAtRename = new LinkedList<HgChangeset>(); |
551 public List<HgChangeset> lastChangesetReportedAtRename = new LinkedList<HgChangeset>(); | 606 |
552 | 607 public void copy(HgFileRevision from, HgFileRevision to) throws HgCallbackTargetException { |
553 public void copy(HgFileRevision from, HgFileRevision to) { | |
554 copyReported = true; | |
555 Assert.assertTrue("Renames couldn't be reported prior to any change", getChanges().size() > 0); | 608 Assert.assertTrue("Renames couldn't be reported prior to any change", getChanges().size() > 0); |
556 HgChangeset lastKnown = getChanges().get(getChanges().size() - 1); | 609 HgChangeset lastKnown = getChanges().get(getChanges().size() - 1); |
557 lastChangesetReportedAtRename.add(lastKnown); | 610 lastChangesetReportedAtRename.add(lastKnown); |
611 rh.copy(from, to); | |
612 } | |
613 }; | |
614 | |
615 private static class RenameCollector implements HgFileRenameHandlerMixin { | |
616 public boolean copyReported = false; | |
617 public List<Pair<HgFileRevision, HgFileRevision>> renames = new LinkedList<Pair<HgFileRevision,HgFileRevision>>(); | |
618 | |
619 public RenameCollector() { | |
620 } | |
621 | |
622 public RenameCollector(AdapterPlug ap) { | |
623 ap.attachAdapter(HgFileRenameHandlerMixin.class, this); | |
624 } | |
625 | |
626 public void copy(HgFileRevision from, HgFileRevision to) { | |
627 copyReported = true; | |
558 renames.add(new Pair<HgFileRevision, HgFileRevision>(from, to)); | 628 renames.add(new Pair<HgFileRevision, HgFileRevision>(from, to)); |
559 } | 629 } |
560 }; | 630 } |
561 } | 631 } |