# This patch file was generated by NetBeans IDE # This patch can be applied using context Tools: Apply Diff Patch action on respective folder. # It uses platform neutral UTF-8 encoding. # Above lines and this line are ignored by the patching process. Index: versioncontrol/mercurial/src/org/netbeans/modules/mercurial/FileStatusCache.java --- versioncontrol/mercurial/src/org/netbeans/modules/mercurial/FileStatusCache.java Base (1.17) +++ versioncontrol/mercurial/src/org/netbeans/modules/mercurial/FileStatusCache.java Locally Modified (Based On 1.17) @@ -277,7 +277,7 @@ * @see FileInformation */ public FileInformation getStatus(File file) { - if (file.isDirectory() && (hg.isAdministrative(file) || SharabilityQuery.getSharability(file) == SharabilityQuery.NOT_SHARABLE)) + if (file.isDirectory() && (hg.isAdministrative(file) || HgUtils.isIgnored(file))) return FileStatusCache.FILE_INFORMATION_EXCLUDED_DIRECTORY; File dir = file.getParentFile(); if (dir == null) { @@ -363,7 +363,7 @@ Mercurial.LOG.log(Level.FINE, "createFileInformation(): {0}", file); // NOI18N if (file == null) return FILE_INFORMATION_UNKNOWN; - if (hg.isAdministrative(file) || SharabilityQuery.getSharability(file) == SharabilityQuery.NOT_SHARABLE) + if (hg.isAdministrative(file) || HgUtils.isIgnored(file)) return file.isDirectory() ? FILE_INFORMATION_EXCLUDED_DIRECTORY : FILE_INFORMATION_EXCLUDED; // Excluded File rootManagedFolder = hg.getTopmostManagedParent(file); @@ -404,7 +404,7 @@ } @SuppressWarnings("unchecked") // Need to change turbo module to remove warning at source - private Map getScannedFiles(File dir, Map interestingFiles) { + public Map getScannedFiles(File dir, Map interestingFiles) { Map files; files = (Map) turbo.readEntry(dir, FILE_STATUS_MAP); @@ -682,7 +682,7 @@ // Only interested in looking for Hg managed dirs for (File file : files) { if (file.isDirectory() && hg.getTopmostManagedParent(file) != null){ - if (hg.isAdministrative(file) || SharabilityQuery.getSharability(file) == SharabilityQuery.NOT_SHARABLE) + if (hg.isAdministrative(file) || HgUtils.isIgnored(file)) folderFiles.put(file, FILE_INFORMATION_EXCLUDED_DIRECTORY); // Excluded dir else folderFiles.put(file, FILE_INFORMATION_UPTODATE_DIRECTORY); @@ -693,6 +693,21 @@ return folderFiles; } + boolean bInIgnoredDir = HgUtils.isIgnored(dir); + if(bInIgnoredDir){ + for (File file : files) { + if (HgUtils.isPartOfMercurialMetadata(file)) continue; + + if (file.isDirectory()) { + folderFiles.put(file, FILE_INFORMATION_EXCLUDED_DIRECTORY); // Excluded dir + } else { + Mercurial.LOG.log(Level.FINE, "scanFolder exclude: {0}", file); // NOI18N + folderFiles.put(file, FILE_INFORMATION_EXCLUDED); + } + } + return folderFiles; + } + if(interestingFiles == null){ try { interestingFiles = HgCommand.getInterestingStatus(rootManagedFolder, dir); @@ -719,30 +734,22 @@ if (interestingFiles == null || interestingFiles.isEmpty()) return folderFiles; - boolean bInIgnoredDir = SharabilityQuery.getSharability(dir) == SharabilityQuery.NOT_SHARABLE; - if(bInIgnoredDir){ for (File file : files) { if (HgUtils.isPartOfMercurialMetadata(file)) continue; if (file.isDirectory()) { + if (hg.isAdministrative(file) || HgUtils.isIgnored(file)) { folderFiles.put(file, FILE_INFORMATION_EXCLUDED_DIRECTORY); // Excluded dir } else { - folderFiles.put(file, FILE_INFORMATION_EXCLUDED); - } - } - return folderFiles; - } - - for (File file : files) { - if (HgUtils.isPartOfMercurialMetadata(file)) continue; - - if (file.isDirectory()) { - if (hg.isAdministrative(file) || SharabilityQuery.getSharability(file) == SharabilityQuery.NOT_SHARABLE) - folderFiles.put(file, FILE_INFORMATION_EXCLUDED_DIRECTORY); // Excluded dir - else folderFiles.put(file, FILE_INFORMATION_UPTODATE_DIRECTORY); + } } else { FileInformation fi = interestingFiles.get(file); + if (fi == null) { + // We have removed -i from HgCommand.getInterestingFiles + // so we might have a file we should be ignoring + fi = createFileInformation(file); + } if (fi != null && fi.getStatus() != FileInformation.STATUS_VERSIONED_UPTODATE) folderFiles.put(file, fi); } Index: versioncontrol/mercurial/src/org/netbeans/modules/mercurial/MercurialAnnotator.java --- versioncontrol/mercurial/src/org/netbeans/modules/mercurial/MercurialAnnotator.java Base (1.15) +++ versioncontrol/mercurial/src/org/netbeans/modules/mercurial/MercurialAnnotator.java Locally Modified (Based On 1.15) @@ -48,15 +48,19 @@ import org.netbeans.modules.versioning.spi.VersioningSupport; import org.netbeans.modules.versioning.util.Utils; import org.netbeans.api.project.Project; +import org.openide.util.RequestProcessor; import org.openide.util.Utilities; import org.openide.nodes.Node; import org.openide.util.NbBundle; +import org.netbeans.modules.versioning.util.Utils; import javax.swing.*; import java.awt.Image; import java.io.File; import java.text.MessageFormat; import java.util.*; +import java.util.logging.Level; import java.util.regex.Pattern; +import java.util.concurrent.ConcurrentLinkedQueue; import java.lang.reflect.Field; import java.lang.Exception; import org.netbeans.modules.mercurial.ui.annotate.AnnotateAction; @@ -130,9 +134,14 @@ private MessageFormat format; private String emptyFormat; private Boolean needRevisionForFormat; + private File folderToScan; + private ConcurrentLinkedQueue dirsToScan = new ConcurrentLinkedQueue(); + private RequestProcessor.Task scanTask; + private static final RequestProcessor rp = new RequestProcessor("MercurialAnnotateScan", 1, true); // NOI18N public MercurialAnnotator() { cache = Mercurial.getInstance().getFileStatusCache(); + scanTask = rp.create(new ScanTask()); initDefaults(); } @@ -200,8 +209,15 @@ File mostImportantFile = null; boolean folderAnnotation = false; - for (File file : context.getRootFiles()) { - FileInformation info = cache.getStatus(file); + for (final File file : context.getRootFiles()) { + FileInformation info = cache.getCachedStatus(file); + if (info == null) { + File parentFile = file.getParentFile(); + Mercurial.LOG.log(Level.FINE, "null cached status for: {0} {1} {2}", new Object[] {file, folderToScan, parentFile}); + folderToScan = parentFile; + reScheduleScan(1000); + continue; + } int status = info.getStatus(); if ((status & includeStatus) == 0) continue; @@ -242,7 +258,11 @@ boolean isVersioned = false; for (Iterator i = context.getRootFiles().iterator(); i.hasNext();) { File file = (File) i.next(); - if ((cache.getStatus(file).getStatus() & STATUS_BADGEABLE) != 0) { + // There is an assumption here that annotateName was already + // called and FileStatusCache.getStatus was scheduled if + // FileStatusCache.getCachedStatus returned null. + FileInformation info = cache.getCachedStatus(file); + if ((info != null && (info.getStatus() & STATUS_BADGEABLE) != 0)) { isVersioned = true; break; } @@ -634,4 +654,27 @@ return true; } + private void reScheduleScan(int delayMillis) { + File dirToScan = dirsToScan.peek(); + if (!folderToScan.equals(dirToScan)) { + if (!dirsToScan.offer(folderToScan)) { + Mercurial.LOG.log(Level.FINE, "reScheduleScan failed to add to dirsToScan queue: {0} ", folderToScan); } + } + scanTask.schedule(delayMillis); + } + + private class ScanTask implements Runnable { + public void run() { + Thread.interrupted(); + File dirToScan = dirsToScan.poll(); + if (dirToScan != null) { + cache.getScannedFiles(dirToScan, null); + dirToScan = dirsToScan.peek(); + if (dirToScan != null) { + scanTask.schedule(1000); + } + } + } + } +} Index: versioncontrol/mercurial/src/org/netbeans/modules/mercurial/util/HgCommand.java --- versioncontrol/mercurial/src/org/netbeans/modules/mercurial/util/HgCommand.java Base (1.57) +++ versioncontrol/mercurial/src/org/netbeans/modules/mercurial/util/HgCommand.java Locally Modified (Based On 1.57) @@ -89,7 +89,7 @@ private static final String HG_STATUS_FLAG_INCLUDE_CMD = "-I"; // NOI18N private static final String HG_STATUS_FLAG_INCLUDE_GLOB_CMD = "glob:"; // NOI18N private static final String HG_STATUS_FLAG_INCLUDE_END_CMD = "*"; // NOI18N - private static final String HG_STATUS_FLAG_INTERESTING_CMD = "-marduiC"; // NOI18N + private static final String HG_STATUS_FLAG_INTERESTING_CMD = "-marduC"; // NOI18N private static final String HG_STATUS_FLAG_UNKNOWN_CMD = "-u"; // NOI18N private static final String HG_COMMIT_CMD = "commit"; // NOI18N