# HG changeset patch # User Doug Simon # Date 1427886442 -7200 # Node ID 02a9b5d77964b4946b51d5af7caffbb335bdd183 # Parent 2c65cac3d9403994050fa0bf0c8f65084659bd86 improved fsckprojects to take into account hg tracked files diff -r 2c65cac3d940 -r 02a9b5d77964 mxtool/mx.py --- 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"""