annotate src/org/tmatesoft/hg/core/HgAnnotateCommand.java @ 656:a937e63b6e02

Performance: rebuild information about branches takes too long (my improvement: 3 times, 11-15 s to less than 4 sec)
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Thu, 04 Jul 2013 18:40:03 +0200
parents 5f52074707b2
children 3219cfadda49
rev   line source
566
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
1 /*
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
2 * Copyright (c) 2013 TMate Software Ltd
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
3 *
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
4 * This program is free software; you can redistribute it and/or modify
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
5 * it under the terms of the GNU General Public License as published by
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
6 * the Free Software Foundation; version 2 of the License.
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
7 *
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
8 * This program is distributed in the hope that it will be useful,
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
11 * GNU General Public License for more details.
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
12 *
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
13 * For information on how to redistribute this software under
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
14 * the terms of a license other than GNU General Public License
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
15 * contact TMate Software at support@hg4j.com
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
16 */
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
17 package org.tmatesoft.hg.core;
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
18
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
19 import static org.tmatesoft.hg.repo.HgRepository.NO_REVISION;
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
20
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
21 import java.util.Arrays;
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
22
629
5f52074707b2 Diff/blame methods as command, their residence in HgDataFile was a mistake
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 628
diff changeset
23 import org.tmatesoft.hg.core.HgBlameInspector.BlockData;
566
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
24 import org.tmatesoft.hg.internal.Callback;
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
25 import org.tmatesoft.hg.internal.CsetParamKeeper;
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
26 import org.tmatesoft.hg.internal.FileAnnotation;
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
27 import org.tmatesoft.hg.internal.FileAnnotation.LineDescriptor;
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
28 import org.tmatesoft.hg.internal.FileAnnotation.LineInspector;
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
29 import org.tmatesoft.hg.repo.HgDataFile;
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
30 import org.tmatesoft.hg.repo.HgRepository;
628
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 626
diff changeset
31 import org.tmatesoft.hg.repo.HgRuntimeException;
581
0890628ed51e Progress/cancel support in new commands
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 569
diff changeset
32 import org.tmatesoft.hg.util.CancelSupport;
566
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
33 import org.tmatesoft.hg.util.CancelledException;
569
c4fd1037bc6f Support for copy/rename follow/no-follow for annotate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 566
diff changeset
34 import org.tmatesoft.hg.util.Path;
581
0890628ed51e Progress/cancel support in new commands
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 569
diff changeset
35 import org.tmatesoft.hg.util.ProgressSupport;
566
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
36
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
37 /**
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
38 * 'hg annotate' counterpart, report origin revision and file line-by-line
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
39 *
613
f41dd9a3b8af Remove few Experimental annotations as the API they've marked graduates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 603
diff changeset
40 * @since 1.1
566
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
41 * @author Artem Tikhomirov
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
42 * @author TMate Software Ltd.
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
43 */
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
44 public class HgAnnotateCommand extends HgAbstractCommand<HgAnnotateCommand> {
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
45
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
46 private final HgRepository repo;
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
47 private final CsetParamKeeper annotateRevision;
569
c4fd1037bc6f Support for copy/rename follow/no-follow for annotate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 566
diff changeset
48 private Path file;
c4fd1037bc6f Support for copy/rename follow/no-follow for annotate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 566
diff changeset
49 private boolean followRename;
566
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
50
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
51 public HgAnnotateCommand(HgRepository hgRepo) {
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
52 repo = hgRepo;
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
53 annotateRevision = new CsetParamKeeper(repo);
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
54 annotateRevision.doSet(HgRepository.TIP);
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
55 }
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
56
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
57 public HgAnnotateCommand changeset(Nodeid nodeid) throws HgBadArgumentException {
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
58 annotateRevision.set(nodeid);
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
59 return this;
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
60 }
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
61
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
62 public HgAnnotateCommand changeset(int changelogRevIndex) throws HgBadArgumentException {
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
63 annotateRevision.set(changelogRevIndex);
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
64 return this;
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
65 }
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
66
569
c4fd1037bc6f Support for copy/rename follow/no-follow for annotate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 566
diff changeset
67 /**
c4fd1037bc6f Support for copy/rename follow/no-follow for annotate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 566
diff changeset
68 * Select file to annotate, origin of renamed/copied file would be followed, too.
c4fd1037bc6f Support for copy/rename follow/no-follow for annotate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 566
diff changeset
69 *
c4fd1037bc6f Support for copy/rename follow/no-follow for annotate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 566
diff changeset
70 * @param filePath path relative to repository root
c4fd1037bc6f Support for copy/rename follow/no-follow for annotate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 566
diff changeset
71 * @return <code>this</code> for convenience
c4fd1037bc6f Support for copy/rename follow/no-follow for annotate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 566
diff changeset
72 */
c4fd1037bc6f Support for copy/rename follow/no-follow for annotate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 566
diff changeset
73 public HgAnnotateCommand file(Path filePath) {
c4fd1037bc6f Support for copy/rename follow/no-follow for annotate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 566
diff changeset
74 return file(filePath, true);
c4fd1037bc6f Support for copy/rename follow/no-follow for annotate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 566
diff changeset
75 }
c4fd1037bc6f Support for copy/rename follow/no-follow for annotate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 566
diff changeset
76
c4fd1037bc6f Support for copy/rename follow/no-follow for annotate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 566
diff changeset
77 /**
c4fd1037bc6f Support for copy/rename follow/no-follow for annotate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 566
diff changeset
78 * Select file to annotate.
c4fd1037bc6f Support for copy/rename follow/no-follow for annotate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 566
diff changeset
79 *
c4fd1037bc6f Support for copy/rename follow/no-follow for annotate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 566
diff changeset
80 * @param filePath path relative to repository root
c4fd1037bc6f Support for copy/rename follow/no-follow for annotate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 566
diff changeset
81 * @param followCopyRename true to follow copies/renames.
c4fd1037bc6f Support for copy/rename follow/no-follow for annotate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 566
diff changeset
82 * @return <code>this</code> for convenience
c4fd1037bc6f Support for copy/rename follow/no-follow for annotate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 566
diff changeset
83 */
c4fd1037bc6f Support for copy/rename follow/no-follow for annotate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 566
diff changeset
84 public HgAnnotateCommand file(Path filePath, boolean followCopyRename) {
c4fd1037bc6f Support for copy/rename follow/no-follow for annotate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 566
diff changeset
85 file = filePath;
c4fd1037bc6f Support for copy/rename follow/no-follow for annotate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 566
diff changeset
86 followRename = followCopyRename;
566
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
87 return this;
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
88 }
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
89
626
5afc7eedb3dd @since, TODOs. Tests: add 1 sec to deal with fs timestamp granularity on linux
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 613
diff changeset
90 // TODO [post-1.1] set encoding and provide String line content from LineInfo
566
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
91
586
73c20c648c1f HgCommitCommand initial support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 584
diff changeset
92 /**
73c20c648c1f HgCommitCommand initial support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 584
diff changeset
93 * Annotate selected file
73c20c648c1f HgCommitCommand initial support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 584
diff changeset
94 *
73c20c648c1f HgCommitCommand initial support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 584
diff changeset
95 * @param inspector
73c20c648c1f HgCommitCommand initial support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 584
diff changeset
96 * @throws HgException subclass thereof to indicate specific issue with the command arguments or repository state
73c20c648c1f HgCommitCommand initial support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 584
diff changeset
97 * @throws HgCallbackTargetException
73c20c648c1f HgCommitCommand initial support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 584
diff changeset
98 * @throws CancelledException if execution of the command was cancelled
73c20c648c1f HgCommitCommand initial support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 584
diff changeset
99 */
566
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
100 public void execute(Inspector inspector) throws HgException, HgCallbackTargetException, CancelledException {
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
101 if (inspector == null) {
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
102 throw new IllegalArgumentException();
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
103 }
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
104 if (file == null) {
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
105 throw new HgBadArgumentException("Command needs file argument", null);
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
106 }
581
0890628ed51e Progress/cancel support in new commands
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 569
diff changeset
107 final ProgressSupport progress = getProgressSupport(inspector);
0890628ed51e Progress/cancel support in new commands
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 569
diff changeset
108 final CancelSupport cancellation = getCancelSupport(inspector, true);
0890628ed51e Progress/cancel support in new commands
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 569
diff changeset
109 cancellation.checkCancelled();
0890628ed51e Progress/cancel support in new commands
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 569
diff changeset
110 progress.start(2);
628
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 626
diff changeset
111 try {
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 626
diff changeset
112 HgDataFile df = repo.getFileNode(file);
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 626
diff changeset
113 if (!df.exists()) {
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 626
diff changeset
114 return;
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 626
diff changeset
115 }
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 626
diff changeset
116 final int changesetStart = followRename ? 0 : df.getChangesetRevisionIndex(0);
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 626
diff changeset
117 Collector c = new Collector(cancellation);
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 626
diff changeset
118 FileAnnotation fa = new FileAnnotation(c);
629
5f52074707b2 Diff/blame methods as command, their residence in HgDataFile was a mistake
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 628
diff changeset
119 HgDiffCommand cmd = new HgDiffCommand(repo);
5f52074707b2 Diff/blame methods as command, their residence in HgDataFile was a mistake
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 628
diff changeset
120 cmd.file(df).order(HgIterateDirection.NewToOld);
5f52074707b2 Diff/blame methods as command, their residence in HgDataFile was a mistake
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 628
diff changeset
121 cmd.range(changesetStart, annotateRevision.get());
5f52074707b2 Diff/blame methods as command, their residence in HgDataFile was a mistake
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 628
diff changeset
122 cmd.executeAnnotate(fa);
628
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 626
diff changeset
123 progress.worked(1);
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 626
diff changeset
124 c.throwIfCancelled();
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 626
diff changeset
125 cancellation.checkCancelled();
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 626
diff changeset
126 ProgressSupport.Sub subProgress = new ProgressSupport.Sub(progress, 1);
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 626
diff changeset
127 subProgress.start(c.lineRevisions.length);
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 626
diff changeset
128 LineImpl li = new LineImpl();
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 626
diff changeset
129 for (int i = 0; i < c.lineRevisions.length; i++) {
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 626
diff changeset
130 li.init(i+1, c.lineRevisions[i], c.line(i));
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 626
diff changeset
131 inspector.next(li);
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 626
diff changeset
132 subProgress.worked(1);
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 626
diff changeset
133 cancellation.checkCancelled();
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 626
diff changeset
134 }
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 626
diff changeset
135 subProgress.done();
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 626
diff changeset
136 } catch (HgRuntimeException ex) {
6526d8adbc0f Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 626
diff changeset
137 throw new HgLibraryFailureException(ex);
569
c4fd1037bc6f Support for copy/rename follow/no-follow for annotate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 566
diff changeset
138 }
581
0890628ed51e Progress/cancel support in new commands
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 569
diff changeset
139 progress.done();
566
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
140 }
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
141
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
142 /**
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
143 * Callback to receive annotated lines
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
144 */
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
145 @Callback
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
146 public interface Inspector {
569
c4fd1037bc6f Support for copy/rename follow/no-follow for annotate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 566
diff changeset
147 // start(FileDescriptor) throws HgCallbackTargetException;
c4fd1037bc6f Support for copy/rename follow/no-follow for annotate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 566
diff changeset
148 void next(LineInfo lineInfo) throws HgCallbackTargetException;
c4fd1037bc6f Support for copy/rename follow/no-follow for annotate
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 566
diff changeset
149 // end(FileDescriptor) throws HgCallbackTargetException;
566
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
150 }
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
151
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
152 /**
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
153 * Describes a line reported through {@link Inspector#next(LineInfo)}
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
154 *
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
155 * Clients shall not implement this interface
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
156 */
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
157 public interface LineInfo {
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
158 int getLineNumber();
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
159 int getChangesetIndex();
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
160 byte[] getContent();
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
161 }
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
162
626
5afc7eedb3dd @since, TODOs. Tests: add 1 sec to deal with fs timestamp granularity on linux
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 613
diff changeset
163 // TODO [post-1.1] there's no need in FileAnnotation.LineInspector, merge it here
5afc7eedb3dd @since, TODOs. Tests: add 1 sec to deal with fs timestamp granularity on linux
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 613
diff changeset
164 // ok for 1.1 as this LineInspector is internal class
566
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
165 private static class Collector implements LineInspector {
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
166 private int[] lineRevisions;
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
167 private byte[][] lines;
582
90df078d6418 Delegate cancel to original support, do not implement CancelSupport ourselves
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 581
diff changeset
168 private final CancelSupport cancelSupport;
90df078d6418 Delegate cancel to original support, do not implement CancelSupport ourselves
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 581
diff changeset
169 private CancelledException cancelEx;
566
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
170
582
90df078d6418 Delegate cancel to original support, do not implement CancelSupport ourselves
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 581
diff changeset
171 Collector(CancelSupport cancellation) {
90df078d6418 Delegate cancel to original support, do not implement CancelSupport ourselves
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 581
diff changeset
172 cancelSupport = cancellation;
566
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
173 }
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
174
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
175 public void line(int lineNumber, int changesetRevIndex, BlockData lineContent, LineDescriptor ld) {
582
90df078d6418 Delegate cancel to original support, do not implement CancelSupport ourselves
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 581
diff changeset
176 if (cancelEx != null) {
90df078d6418 Delegate cancel to original support, do not implement CancelSupport ourselves
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 581
diff changeset
177 return;
90df078d6418 Delegate cancel to original support, do not implement CancelSupport ourselves
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 581
diff changeset
178 }
566
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
179 if (lineRevisions == null) {
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
180 lineRevisions = new int [ld.totalLines()];
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
181 Arrays.fill(lineRevisions, NO_REVISION);
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
182 lines = new byte[ld.totalLines()][];
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
183 }
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
184 lineRevisions[lineNumber] = changesetRevIndex;
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
185 lines[lineNumber] = lineContent.asArray();
582
90df078d6418 Delegate cancel to original support, do not implement CancelSupport ourselves
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 581
diff changeset
186 try {
90df078d6418 Delegate cancel to original support, do not implement CancelSupport ourselves
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 581
diff changeset
187 cancelSupport.checkCancelled();
90df078d6418 Delegate cancel to original support, do not implement CancelSupport ourselves
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 581
diff changeset
188 } catch (CancelledException ex) {
90df078d6418 Delegate cancel to original support, do not implement CancelSupport ourselves
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 581
diff changeset
189 cancelEx = ex;
90df078d6418 Delegate cancel to original support, do not implement CancelSupport ourselves
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 581
diff changeset
190 }
566
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
191 }
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
192
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
193 public byte[] line(int i) {
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
194 return lines[i];
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
195 }
582
90df078d6418 Delegate cancel to original support, do not implement CancelSupport ourselves
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 581
diff changeset
196
90df078d6418 Delegate cancel to original support, do not implement CancelSupport ourselves
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 581
diff changeset
197 public void throwIfCancelled() throws CancelledException {
90df078d6418 Delegate cancel to original support, do not implement CancelSupport ourselves
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 581
diff changeset
198 if (cancelEx != null) {
90df078d6418 Delegate cancel to original support, do not implement CancelSupport ourselves
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 581
diff changeset
199 throw cancelEx;
90df078d6418 Delegate cancel to original support, do not implement CancelSupport ourselves
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 581
diff changeset
200 }
90df078d6418 Delegate cancel to original support, do not implement CancelSupport ourselves
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 581
diff changeset
201 }
566
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
202 }
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
203
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
204
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
205 private static class LineImpl implements LineInfo {
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
206 private int ln;
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
207 private int rev;
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
208 private byte[] content;
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
209
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
210 void init(int line, int csetRev, byte[] cnt) {
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
211 ln = line;
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
212 rev = csetRev;
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
213 content = cnt;
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
214 }
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
215
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
216 public int getLineNumber() {
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
217 return ln;
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
218 }
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
219
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
220 public int getChangesetIndex() {
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
221 return rev;
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
222 }
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
223
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
224 public byte[] getContent() {
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
225 return content;
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
226 }
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
227 }
32453f30de07 Annotate command with command-line example
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff changeset
228 }