changeset 20112:02a9b5d77964

improved fsckprojects to take into account hg tracked files
author Doug Simon <doug.simon@oracle.com>
date Wed, 01 Apr 2015 13:07:22 +0200
parents 2c65cac3d940
children 92f5fdad19e3
files mxtool/mx.py
diffstat 1 files changed, 32 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/mxtool/mx.py	Tue Mar 31 19:15:45 2015 -0700
+++ b/mxtool/mx.py	Wed Apr 01 13:07:22 2015 +0200
@@ -836,6 +836,22 @@
                 abort('failed to get status')
             else:
                 return None
+            
+    def locate(self, sDir, patterns=[], abortOnError=True):
+        try:
+            if not isinstance(patterns, list):
+                patterns = [patterns]
+            return subprocess.check_output(['hg', 'locate', '-R', sDir] + patterns).split('\n')
+        except OSError:
+            warn(self.missing)
+        except subprocess.CalledProcessError as e:
+            if e.returncode == 1:
+                # hg locate returns 1 if no matches were found
+                return []
+            if abortOnError:
+                abort('failed to locate')
+            else:
+                return None
 
 def _load_suite_dict(mxDir):
 
@@ -4664,8 +4680,13 @@
 
 def fsckprojects(args):
     """find directories corresponding to deleted Java projects and delete them"""
+    if not sys.stdout.isatty():
+        log('fsckprojects command must be run in an interactive shell')
+        return
+    hg = HgConfig()
     for suite in suites(True):
         projectDirs = [p.dir for p in suite.projects]
+        distIdeDirs = [d.get_ide_project_dir() for d in suite.dists if d.get_ide_project_dir() is not None]
         for dirpath, dirnames, files in os.walk(suite.dir):
             if dirpath == suite.dir:
                 # no point in traversing .hg or lib/
@@ -4673,13 +4694,20 @@
             elif dirpath in projectDirs:
                 # don't traverse subdirs of an existing project in this suite
                 dirnames[:] = []
+            elif dirpath in distIdeDirs:
+                # don't traverse subdirs of an existing distributions in this suite
+                dirnames[:] = []
             else:
-                projectConfigFiles = frozenset(['.classpath', 'nbproject'])
+                projectConfigFiles = frozenset(['.classpath', '.project', 'nbproject'])
                 indicators = projectConfigFiles.intersection(files)
                 if len(indicators) != 0:
-                    if not sys.stdout.isatty() or ask_yes_no(dirpath + ' looks like a removed project -- delete it', 'n'):
-                        shutil.rmtree(dirpath)
-                        log('Deleted ' + dirpath)
+                    indicators = [os.path.relpath(join(dirpath, i), suite.dir) for i in indicators]
+                    indicatorsInHg = hg.locate(suite.dir, indicators)
+                    # Only proceed if there are indicator files that are not under HG
+                    if len(indicators) > len(indicatorsInHg):
+                        if not sys.stdout.isatty() or ask_yes_no(dirpath + ' looks like a removed project -- delete it', 'n'):
+                            shutil.rmtree(dirpath)
+                            log('Deleted ' + dirpath)
 
 def javadoc(args, parser=None, docDir='javadoc', includeDeps=True, stdDoclet=True):
     """generate javadoc for some/all Java projects"""