# HG changeset patch # User Artem Tikhomirov # Date 1354312359 -3600 # Node ID 27398bbfd543f3bdcadaffd1107d2d213634a292 # Parent 3cd3c3d374325bfd26ed715f13aef8c53d55427e Experiment to add a facility to check working files for actual changes diff -r 3cd3c3d37432 -r 27398bbfd543 cmdline/org/tmatesoft/hg/console/Main.java --- a/cmdline/org/tmatesoft/hg/console/Main.java Fri Nov 30 22:08:11 2012 +0100 +++ b/cmdline/org/tmatesoft/hg/console/Main.java Fri Nov 30 22:52:39 2012 +0100 @@ -16,42 +16,31 @@ */ package org.tmatesoft.hg.console; -import static org.junit.Assert.*; import static org.tmatesoft.hg.repo.HgRepository.TIP; import static org.tmatesoft.hg.repo.HgRepository.WORKING_COPY; import static org.tmatesoft.hg.util.LogFacility.Severity.*; import java.io.File; -import java.io.IOException; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.regex.Pattern; -import org.tmatesoft.hg.core.HgManifestHandler; -import org.tmatesoft.hg.core.HgCallbackTargetException; -import org.tmatesoft.hg.core.HgCatCommand; import org.tmatesoft.hg.core.HgChangeset; -import org.tmatesoft.hg.core.HgChangesetFileSneaker; import org.tmatesoft.hg.core.HgChangesetTreeHandler; import org.tmatesoft.hg.core.HgException; import org.tmatesoft.hg.core.HgFileRevision; import org.tmatesoft.hg.core.HgLogCommand; import org.tmatesoft.hg.core.HgManifestCommand; +import org.tmatesoft.hg.core.HgManifestHandler; import org.tmatesoft.hg.core.Nodeid; import org.tmatesoft.hg.internal.BasicSessionContext; import org.tmatesoft.hg.internal.ByteArrayChannel; import org.tmatesoft.hg.internal.ConfigFile; import org.tmatesoft.hg.internal.DigestHelper; -import org.tmatesoft.hg.internal.IntMap; -import org.tmatesoft.hg.internal.Internals; import org.tmatesoft.hg.internal.PathGlobMatcher; -import org.tmatesoft.hg.internal.PhasesHelper; import org.tmatesoft.hg.internal.RelativePathRewrite; -import org.tmatesoft.hg.internal.RevisionDescendants; import org.tmatesoft.hg.internal.StreamLogFacility; import org.tmatesoft.hg.repo.HgBookmarks; import org.tmatesoft.hg.repo.HgBranches; @@ -66,30 +55,22 @@ import org.tmatesoft.hg.repo.HgManifest; import org.tmatesoft.hg.repo.HgManifest.Flags; import org.tmatesoft.hg.repo.HgMergeState; -import org.tmatesoft.hg.repo.HgParentChildMap; -import org.tmatesoft.hg.repo.HgPhase; import org.tmatesoft.hg.repo.HgRepository; +import org.tmatesoft.hg.repo.HgRevisionMap; import org.tmatesoft.hg.repo.HgRuntimeException; import org.tmatesoft.hg.repo.HgStatusCollector; import org.tmatesoft.hg.repo.HgStatusInspector; import org.tmatesoft.hg.repo.HgSubrepoLocation; import org.tmatesoft.hg.repo.HgSubrepoLocation.Kind; +import org.tmatesoft.hg.repo.HgWorkingCopyStatusCollector; import org.tmatesoft.hg.repo.ext.HgExtensionsManager; import org.tmatesoft.hg.repo.ext.HgExtensionsManager.HgExt; -import org.tmatesoft.hg.repo.ext.MqManager; import org.tmatesoft.hg.repo.ext.Rebase; -import org.tmatesoft.hg.repo.ext.MqManager.PatchRecord; -import org.tmatesoft.hg.repo.HgWorkingCopyStatusCollector; -import org.tmatesoft.hg.repo.HgRevisionMap; -import org.tmatesoft.hg.test.ExecHelper; -import org.tmatesoft.hg.test.OutputParser; import org.tmatesoft.hg.util.FileWalker; import org.tmatesoft.hg.util.LogFacility; import org.tmatesoft.hg.util.Pair; import org.tmatesoft.hg.util.Path; import org.tmatesoft.hg.util.PathRewrite; -import org.tmatesoft.hg.util.ProgressSupport; -import org.tmatesoft.hg.util.LogFacility.Severity; /** * Various debug dumps. @@ -159,7 +140,7 @@ private void dumpBookmarks() throws Exception { HgBookmarks bm = hgRepo.getBookmarks(); String active = bm.getActiveBookmarkName(); - ArrayList all = new ArrayList(bm.getAllBookmarks()); + ArrayList all = new ArrayList(bm.getAllBookmarks()); Collections.sort(all); for (String bmname : all) { if (bmname.equals(active)) { diff -r 3cd3c3d37432 -r 27398bbfd543 src/org/tmatesoft/hg/repo/HgWorkingCopyStatusCollector.java --- a/src/org/tmatesoft/hg/repo/HgWorkingCopyStatusCollector.java Fri Nov 30 22:08:11 2012 +0100 +++ b/src/org/tmatesoft/hg/repo/HgWorkingCopyStatusCollector.java Fri Nov 30 22:52:39 2012 +0100 @@ -34,6 +34,7 @@ import org.tmatesoft.hg.core.Nodeid; import org.tmatesoft.hg.core.SessionContext; import org.tmatesoft.hg.internal.ByteArrayChannel; +import org.tmatesoft.hg.internal.Experimental; import org.tmatesoft.hg.internal.FilterByteChannel; import org.tmatesoft.hg.internal.Internals; import org.tmatesoft.hg.internal.ManifestRevision; @@ -162,7 +163,7 @@ * Walk working copy, analyze status for each file found and missing. * May be invoked few times. * - *

There's no dedicated constant to for working copy parent, at least now. + *

There's no dedicated constant for working copy parent, at least now. * Use {@link HgRepository#WORKING_COPY} to indicate comparison * shall be run against working copy parent. Although a bit confusing, single case doesn't * justify a dedicated constant. @@ -322,6 +323,26 @@ } return rv; } + + /** + * Compares file state from working directory against parent recorded in dirstate. + * Might be handy for merged files, always reported as 'modified' or files deemed modified + * based on their flags change. + * + * @param fname repository-relative path to the file in question + * @param fileInfo file content mediator + * @return true when content in working dir differs from that of manifest-recorded revision + */ + @Experimental(reason="Perhaps, HgDataFile#isWorkingCopyChanged() would be better - no need to pass any arguments?") + public boolean hasTangibleChanges(Path fname, FileInfo fileInfo) throws HgRuntimeException { + // see #checkLocalStatusAgainstFile() below for the origin of changed file check + HgDataFile df = repo.getFileNode(fname); + if (!df.exists()) { + throw new HgInvalidFileException("File not found", null).setFileName(fname); + } + Nodeid rev = getDirstateParentManifest().nodeid(fname); + return rev == null || !areTheSame(fileInfo, df, rev); + } //********************************************