87 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
#!/usr/bin/env python 
 | 
						|
 | 
						|
"""\
 | 
						|
py.cleanup [PATH] ...
 | 
						|
 | 
						|
Delete typical python development related files recursively under the specified PATH (which defaults to the current working directory). Don't follow links and don't recurse into directories with a dot.  Optionally remove setup.py related files and empty
 | 
						|
directories. 
 | 
						|
 | 
						|
"""
 | 
						|
import py
 | 
						|
import sys, subprocess
 | 
						|
 | 
						|
def main():
 | 
						|
    parser = py.std.optparse.OptionParser(usage=__doc__)
 | 
						|
    parser.add_option("-e", metavar="ENDING", 
 | 
						|
        dest="endings", default=[".pyc", "$py.class"], action="append", 
 | 
						|
        help=("(multi) recursively remove files with the given ending." 
 | 
						|
             " '.pyc' and '$py.class' are in the default list."))
 | 
						|
    parser.add_option("-d", action="store_true", dest="removedir",
 | 
						|
                      help="remove empty directories.")
 | 
						|
    parser.add_option("-s", action="store_true", dest="setup",
 | 
						|
                      help="remove 'build' and 'dist' directories next to setup.py files")
 | 
						|
    parser.add_option("-a", action="store_true", dest="all",
 | 
						|
                      help="synonym for '-S -d -e pip-log.txt'")
 | 
						|
    parser.add_option("-n", "--dryrun", dest="dryrun", default=False, 
 | 
						|
        action="store_true", 
 | 
						|
        help="don't actually delete but display would-be-removed filenames.")
 | 
						|
    (options, args) = parser.parse_args()
 | 
						|
 | 
						|
    Cleanup(options, args).main()
 | 
						|
 | 
						|
class Cleanup:
 | 
						|
    def __init__(self, options, args):
 | 
						|
        if not args:
 | 
						|
            args = ["."]
 | 
						|
        self.options = options
 | 
						|
        self.args = [py.path.local(x) for x in args]
 | 
						|
        if options.all:
 | 
						|
            options.setup = True
 | 
						|
            options.removedir = True
 | 
						|
            options.endings.append("pip-log.txt")
 | 
						|
 | 
						|
    def main(self):
 | 
						|
        if self.options.setup:
 | 
						|
            for arg in self.args:
 | 
						|
                self.setupclean(arg)
 | 
						|
        
 | 
						|
        for path in self.args:
 | 
						|
            py.builtin.print_("cleaning path", path, 
 | 
						|
                "of extensions", self.options.endings)
 | 
						|
            for x in path.visit(self.shouldremove, self.recursedir):
 | 
						|
                self.remove(x)
 | 
						|
        if self.options.removedir:
 | 
						|
            for x in path.visit(lambda x: x.check(dir=1), self.recursedir):
 | 
						|
                if not x.listdir():
 | 
						|
                    self.remove(x)
 | 
						|
 | 
						|
    def shouldremove(self, p):
 | 
						|
        for ending in self.options.endings:
 | 
						|
            if p.basename.endswith(ending):
 | 
						|
                return True
 | 
						|
 | 
						|
    def recursedir(self, path):
 | 
						|
        return path.check(dotfile=0, link=0)
 | 
						|
 | 
						|
    def remove(self, path):
 | 
						|
        if not path.check():
 | 
						|
            return
 | 
						|
        if self.options.dryrun:
 | 
						|
            py.builtin.print_("would remove", path)
 | 
						|
        else:
 | 
						|
            py.builtin.print_("removing", path)
 | 
						|
            path.remove()
 | 
						|
 | 
						|
    def XXXcallsetup(self, setup, *args):
 | 
						|
        old = setup.dirpath().chdir()
 | 
						|
        try:
 | 
						|
            subprocess.call([sys.executable, str(setup)] + list(args))
 | 
						|
        finally:
 | 
						|
            old.chdir()
 | 
						|
            
 | 
						|
    def setupclean(self, path):
 | 
						|
        for x in path.visit("setup.py", self.recursedir):
 | 
						|
            basepath = x.dirpath()
 | 
						|
            self.remove(basepath / "build")
 | 
						|
            self.remove(basepath / "dist")
 |