comparison src/org/tmatesoft/hg/core/HgAnnotateCommand.java @ 686:f1f095e42555

Annotated file is not always changed in the latest changeset, need to find out last changest it was changed at (iow, diffed to with BlameHelper)
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Thu, 25 Jul 2013 22:12:14 +0200
parents 58a6900f845d
children 7839ff0bfd78
comparison
equal deleted inserted replaced
685:9897cbfd2790 686:f1f095e42555
13 * For information on how to redistribute this software under 13 * For information on how to redistribute this software under
14 * the terms of a license other than GNU General Public License 14 * the terms of a license other than GNU General Public License
15 * contact TMate Software at support@hg4j.com 15 * contact TMate Software at support@hg4j.com
16 */ 16 */
17 package org.tmatesoft.hg.core; 17 package org.tmatesoft.hg.core;
18
19 import static org.tmatesoft.hg.repo.HgRepository.TIP;
18 20
19 import org.tmatesoft.hg.internal.Callback; 21 import org.tmatesoft.hg.internal.Callback;
20 import org.tmatesoft.hg.internal.CsetParamKeeper; 22 import org.tmatesoft.hg.internal.CsetParamKeeper;
21 import org.tmatesoft.hg.internal.ForwardAnnotateInspector; 23 import org.tmatesoft.hg.internal.ForwardAnnotateInspector;
22 import org.tmatesoft.hg.repo.HgDataFile; 24 import org.tmatesoft.hg.repo.HgDataFile;
42 private boolean followRename; 44 private boolean followRename;
43 45
44 public HgAnnotateCommand(HgRepository hgRepo) { 46 public HgAnnotateCommand(HgRepository hgRepo) {
45 repo = hgRepo; 47 repo = hgRepo;
46 annotateRevision = new CsetParamKeeper(repo); 48 annotateRevision = new CsetParamKeeper(repo);
47 annotateRevision.doSet(HgRepository.TIP); 49 annotateRevision.doSet(TIP);
48 } 50 }
49 51
50 public HgAnnotateCommand changeset(Nodeid nodeid) throws HgBadArgumentException { 52 public HgAnnotateCommand changeset(Nodeid nodeid) throws HgBadArgumentException {
51 annotateRevision.set(nodeid); 53 annotateRevision.set(nodeid);
52 return this; 54 return this;
117 HgDataFile df = repo.getFileNode(file); 119 HgDataFile df = repo.getFileNode(file);
118 if (!df.exists()) { 120 if (!df.exists()) {
119 return; 121 return;
120 } 122 }
121 final int changesetStart = followRename ? 0 : df.getChangesetRevisionIndex(0); 123 final int changesetStart = followRename ? 0 : df.getChangesetRevisionIndex(0);
122 final int annotateRevIndex = annotateRevision.get(); 124 final int annotateRevIndex = annotateRevision.get(TIP);
123 HgDiffCommand cmd = new HgDiffCommand(repo).file(df); 125 HgDiffCommand cmd = new HgDiffCommand(repo).file(df);
124 cmd.range(changesetStart, annotateRevIndex); 126 cmd.range(changesetStart, annotateRevIndex);
125 cmd.set(cancellation); 127 cmd.set(cancellation);
126 cmd.set(new ProgressSupport.Sub(progress, 100)); 128 cmd.set(new ProgressSupport.Sub(progress, 100));
127 // 129 //
129 ForwardAnnotateInspector ai = new ForwardAnnotateInspector(); 131 ForwardAnnotateInspector ai = new ForwardAnnotateInspector();
130 cmd.order(ai.iterateDirection()); 132 cmd.order(ai.iterateDirection());
131 // 133 //
132 cmd.executeAnnotate(ai); 134 cmd.executeAnnotate(ai);
133 cancellation.checkCancelled(); 135 cancellation.checkCancelled();
134 ai.report(annotateRevIndex, inspector, new ProgressSupport.Sub(progress, 100), cancellation); 136 final int lastCsetWithFileChange;
137 Nodeid fileRev = repo.getManifest().getFileRevision(annotateRevIndex, df.getPath());
138 if (fileRev != null) {
139 lastCsetWithFileChange = df.getChangesetRevisionIndex(df.getRevisionIndex(fileRev));
140 } else {
141 lastCsetWithFileChange = annotateRevIndex;
142 }
143 ai.report(lastCsetWithFileChange, inspector, new ProgressSupport.Sub(progress, 100), cancellation);
135 } catch (HgRuntimeException ex) { 144 } catch (HgRuntimeException ex) {
136 throw new HgLibraryFailureException(ex); 145 throw new HgLibraryFailureException(ex);
137 } 146 }
138 progress.done(); 147 progress.done();
139 } 148 }