diff src/org/tmatesoft/hg/repo/HgDataFile.java @ 629:5f52074707b2

Diff/blame methods as command, their residence in HgDataFile was a mistake
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Wed, 22 May 2013 16:46:15 +0200
parents 6526d8adbc0f
children 54e16ab771ec
line wrap: on
line diff
--- a/src/org/tmatesoft/hg/repo/HgDataFile.java	Wed May 22 15:52:31 2013 +0200
+++ b/src/org/tmatesoft/hg/repo/HgDataFile.java	Wed May 22 16:46:15 2013 +0200
@@ -27,14 +27,15 @@
 import java.nio.channels.FileChannel;
 import java.util.Arrays;
 
+import org.tmatesoft.hg.core.HgBlameInspector;
 import org.tmatesoft.hg.core.HgCallbackTargetException;
 import org.tmatesoft.hg.core.HgChangesetFileSneaker;
+import org.tmatesoft.hg.core.HgDiffCommand;
+import org.tmatesoft.hg.core.HgException;
 import org.tmatesoft.hg.core.HgIterateDirection;
+import org.tmatesoft.hg.core.HgLibraryFailureException;
 import org.tmatesoft.hg.core.Nodeid;
-import org.tmatesoft.hg.internal.BlameHelper;
 import org.tmatesoft.hg.internal.DataAccess;
-import org.tmatesoft.hg.internal.FileHistory;
-import org.tmatesoft.hg.internal.FileRevisionHistoryChunk;
 import org.tmatesoft.hg.internal.FileUtils;
 import org.tmatesoft.hg.internal.FilterByteChannel;
 import org.tmatesoft.hg.internal.FilterDataAccess;
@@ -426,80 +427,53 @@
 		int changesetRevIndex = getChangesetRevisionIndex(fileRevisionIndex);
 		return getRepo().getManifest().getFileFlags(changesetRevIndex, getPath());
 	}
-	
+
 	/**
-	 * mimic 'hg diff -r clogRevIndex1 -r clogRevIndex2'
+	 * @deprecated use {@link HgDiffCommand} instead
 	 */
+	@Deprecated
 	public void diff(int clogRevIndex1, int clogRevIndex2, HgBlameInspector insp) throws HgRuntimeException, HgCallbackTargetException {
-		int fileRevIndex1 = fileRevIndex(this, clogRevIndex1);
-		int fileRevIndex2 = fileRevIndex(this, clogRevIndex2);
-		BlameHelper bh = new BlameHelper(insp);
-		bh.prepare(this, clogRevIndex1, clogRevIndex2);
-		bh.diff(fileRevIndex1, clogRevIndex1, fileRevIndex2, clogRevIndex2);
+		try {
+			new HgDiffCommand(getRepo()).file(this).range(clogRevIndex1, clogRevIndex2).executeDiff(insp);
+		} catch (HgLibraryFailureException ex) {
+			throw ex.getCause();
+		} catch (HgException ex) {
+			throw new HgInvalidStateException(ex.getMessage());
+		} catch (CancelledException ex) {
+			throw new HgInvalidStateException("Cancellatin is not expected");
+		}
 	}
 	
 	/**
-	 * Walk file history up/down to revision at given changeset and report changes for each revision
-	 */
-	public void annotate(int changelogRevisionIndex, HgBlameInspector insp, HgIterateDirection iterateOrder) throws HgRuntimeException, HgCallbackTargetException {
-		annotate(0, changelogRevisionIndex, insp, iterateOrder);
-	}
-
-	/**
-	 * Walk file history range and report changes for each revision
+	 * @deprecated use {@link HgDiffCommand} instead
 	 */
-	public void annotate(int changelogRevIndexStart, int changelogRevIndexEnd, HgBlameInspector insp, HgIterateDirection iterateOrder) throws HgRuntimeException, HgCallbackTargetException {
-		if (wrongRevisionIndex(changelogRevIndexStart) || wrongRevisionIndex(changelogRevIndexEnd)) {
-			throw new IllegalArgumentException();
-		}
-		// Note, changelogRevIndexEnd may be TIP, while the code below doesn't tolerate constants
-		//
-		int lastRevision = getRepo().getChangelog().getLastRevision();
-		if (changelogRevIndexEnd == TIP) {
-			changelogRevIndexEnd = lastRevision;
-		}
-		HgInternals.checkRevlogRange(changelogRevIndexStart, changelogRevIndexEnd, lastRevision);
-		if (!exists()) {
-			return;
-		}
-		BlameHelper bh = new BlameHelper(insp);
-		FileHistory fileHistory = bh.prepare(this, changelogRevIndexStart, changelogRevIndexEnd);
-
-		int[] fileClogParentRevs = new int[2];
-		int[] fileParentRevs = new int[2];
-		for (FileRevisionHistoryChunk fhc : fileHistory.iterate(iterateOrder)) {
-			for (int fri : fhc.fileRevisions(iterateOrder)) {
-				int clogRevIndex = fhc.changeset(fri);
-				// the way we built fileHistory ensures we won't walk past [changelogRevIndexStart..changelogRevIndexEnd]
-				assert clogRevIndex >= changelogRevIndexStart;
-				assert clogRevIndex <= changelogRevIndexEnd;
-				fhc.fillFileParents(fri, fileParentRevs);
-				fhc.fillCsetParents(fri, fileClogParentRevs);
-				bh.annotateChange(fri, clogRevIndex, fileParentRevs, fileClogParentRevs);
-			}
+	@Deprecated
+	public void annotate(int clogRevIndex1, int clogRevIndex2, HgBlameInspector insp, HgIterateDirection iterateOrder) throws HgRuntimeException, HgCallbackTargetException {
+		try {
+			new HgDiffCommand(getRepo()).file(this).range(clogRevIndex1, clogRevIndex2).order(iterateOrder).executeAnnotate(insp);
+		} catch (HgLibraryFailureException ex) {
+			throw ex.getCause();
+		} catch (HgException ex) {
+			throw new HgInvalidStateException(ex.getMessage());
+		} catch (CancelledException ex) {
+			throw new HgInvalidStateException("Cancellatin is not expected");
 		}
 	}
-
+	
 	/**
-	 * Annotates changes of the file against its parent(s). 
-	 * Unlike {@link #annotate(HgDataFile, int, Inspector, HgIterateDirection)}, doesn't
-	 * walk file history, looks at the specified revision only. Handles both parents (if merge revision).
+	 * @deprecated use {@link HgDiffCommand} instead
 	 */
+	@Deprecated
 	public void annotateSingleRevision(int changelogRevisionIndex, HgBlameInspector insp) throws HgRuntimeException, HgCallbackTargetException {
-		// TODO detect if file is text/binary (e.g. looking for chars < ' ' and not \t\r\n\f
-		int fileRevIndex = fileRevIndex(this, changelogRevisionIndex);
-		int[] fileRevParents = new int[2];
-		parents(fileRevIndex, fileRevParents, null, null);
-		if (changelogRevisionIndex == TIP) {
-			changelogRevisionIndex = getChangesetRevisionIndex(fileRevIndex);
+		try {
+			new HgDiffCommand(getRepo()).file(this).changeset(changelogRevisionIndex).executeAnnotateSingleRevision(insp);
+		} catch (HgLibraryFailureException ex) {
+			throw ex.getCause();
+		} catch (HgException ex) {
+			throw new HgInvalidStateException(ex.getMessage());
+		} catch (CancelledException ex) {
+			throw new HgInvalidStateException("Cancellatin is not expected");
 		}
-		int[] fileClogParentRevs = new int[2];
-		fileClogParentRevs[0] = fileRevParents[0] == NO_REVISION ? NO_REVISION : getChangesetRevisionIndex(fileRevParents[0]);
-		fileClogParentRevs[1] = fileRevParents[1] == NO_REVISION ? NO_REVISION : getChangesetRevisionIndex(fileRevParents[1]);
-		BlameHelper bh = new BlameHelper(insp);
-		int clogIndexStart = fileClogParentRevs[0] == NO_REVISION ? (fileClogParentRevs[1] == NO_REVISION ? 0 : fileClogParentRevs[1]) : fileClogParentRevs[0];
-		bh.prepare(this, clogIndexStart, changelogRevisionIndex);
-		bh.annotateChange(fileRevIndex, changelogRevisionIndex, fileRevParents, fileClogParentRevs);
 	}
 
 	@Override
@@ -519,13 +493,6 @@
 		RevlogStream.Inspector insp = new MetadataInspector(metadata, null);
 		super.content.iterate(localRev, localRev, true, insp);
 	}
-	
-
-	private static int fileRevIndex(HgDataFile df, int csetRevIndex) throws HgRuntimeException {
-		Nodeid fileRev = df.getRepo().getManifest().getFileRevision(csetRevIndex, df.getPath());
-		return df.getRevisionIndex(fileRev);
-	}
-
 
 	private static class MetadataInspector extends ErrorHandlingInspector implements RevlogStream.Inspector {
 		private final Metadata metadata;