#!/usr/bin/python import sys, os, os.path, re class Fluffler(object): def __init__(self, f): self.f=f def getFluffleLevel(self): mo=re.match('^.* :(\\)+)$', self.f) if mo: return len(mo.group(1)) mo=re.match('^.* :(\\(+)$', self.f) if mo: return -len(mo.group(1)) return 0 def getBaseName(self): mo=re.match('^(.*) :(\\)+|\\(+)$', self.f) if mo: return mo.group(1) return self.f def setFluffleLevel(self, level): base=self.getBaseName() if level > 0: dest=base+' :'+(level*')') elif level < 0: dest=base+' :'+((-level)*'(') else: dest=base if not os.path.exists(dest): try: os.rename(self.f, dest) except OSError: pass def fluffle(self, levels=1): self.setFluffleLevel(self.getFluffleLevel()+levels) def pointle(self, levels=1): self.setFluffleLevel(self.getFluffleLevel()-levels) def unfluffle(self): self.setFluffleLevel(0) def usage(): print "Usage: fluffle [-z|-q|-p|-h] [-n ] [--] " print print "Fluffle or pointle files to make them happy or sad. Default behaviour is to" print "fluffle, unless -p (--pointle) is set, or the program is called as `pointle'." print print " -r, --restore Restore original filenames" print " -q, --query Query how happy files are" print " -p, --pointle Pointle, rather than fluffle" print " -h, -?, --help Print these usage instructions" print " -n NUM, --levels=NUM Fluffle/pointle this number of levels" sys.exit(0) op='fluffle' if sys.argv[0].endswith('/pointle'): op='pointle' levels=1 tofluffle=[] nextarg=None for ai,a in enumerate(sys.argv[1:]): if a == '--': tofluffle+=sys.argv[ai+1:] break elif nextarg == '-n': levels=int(a) nextarg=None elif a.startswith('-'): if a == '-n': nextarg=a elif a.startswith('--levels='): levels=int(a[len('--levels='):]) elif a == '-r' or a == '--restore': op='zero' elif a == '-q' or a == '--query': op='query' elif a == '-p' or a == '--pointle': op='pointle' elif a == '-h' or a == '-?' or a == '--help': usage() else: print "Unknown option `"+a+"'" usage() else: tofluffle.append(a) if op == 'fluffle': for f in tofluffle: Fluffler(f).fluffle(levels) elif op == 'pointle': for f in tofluffle: Fluffler(f).pointle(levels) elif op == 'zero': for f in tofluffle: Fluffler(f).unfluffle() elif op == 'query': for f in tofluffle: fl=Fluffler(f) print str(fl.getFluffleLevel()).rjust(3)," ",fl.getBaseName()