From fb8a6a836f09ce1ea23d97da3a3f5e6eda5ec8f7 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Sun, 23 Jan 2011 15:46:50 +0000 Subject: Use cliapp framework. --- debian/control | 2 +- dupfiles | 84 ++++++++++++++++++++++++++-------------------------------- 2 files changed, 39 insertions(+), 47 deletions(-) diff --git a/debian/control b/debian/control index a951e5c..5919bec 100644 --- a/debian/control +++ b/debian/control @@ -8,7 +8,7 @@ Build-Depends: debhelper (>= 7.3.8), python-support (>= 1.0.3), python (>= 2.5) Package: dupfiles Architecture: all Depends: ${python:Depends}, ${misc:Depends}, python (>= 2.5), - python-progressbar + python-progressbar, cliapp Description: find and optionally hard-link duplicate files dupfiles finds files with identical content, and either reports them, or hardlinks them to each other. diff --git a/dupfiles b/dupfiles index 78e4b5f..0fa736b 100755 --- a/dupfiles +++ b/dupfiles @@ -17,6 +17,7 @@ # along with this program. If not, see . +import cliapp import errno import hashlib import optparse @@ -189,55 +190,46 @@ class DuplicateFileFinder(object): else: not_done.append((pathname, f, data)) return done, not_done + + +class Dupfiles(cliapp.Application): + + def add_settings(self): + self.add_boolean_setting(['make-hardlinks'], + 'hardlink duplicate files to each other') + self.add_boolean_setting(['progress'], 'report progress') + self.add_boolean_setting(['remove'], + 'remove all but one copy of identical files') + + def process_args(self, args): + dupfinder = DuplicateFileFinder(self['progress']) + for dirname in sorted(args): + dupfinder.collect(dirname) + + for duplicates in dupfinder.duplicates(): + if self['make-hardlinks']: + self.make_hardlinks(duplicates) + elif self['remove']: + self.remove_all_but_one(duplicates) + else: + self.report(duplicates) + def make_hardlinks(self, duplicates): + canonical = duplicates.pop() + for pathname in duplicates: + os.remove(pathname) + os.link(canonical, pathname) -def make_hardlinks(duplicates): - canonical = duplicates.pop() - for pathname in duplicates: - os.remove(pathname) - os.link(canonical, pathname) - - -def remove_all_but_one(duplicates): - keep = duplicates.pop() - for pathname in duplicates: - os.remove(pathname) - - -def report(duplicates): - sys.stdout.write('\n'.join(duplicates)) - sys.stdout.write('\n\n') - - -def main(): - parser = optparse.OptionParser() - parser.add_option('--make-hardlinks', action='store_true', - help='hardlink duplicate files to each other') - parser.add_option('--progress', action='store_true', - help='report progress') - parser.add_option('--remove', action='store_true', - help='remove all but one copy of identical files') - - opts, args = parser.parse_args() - - dupfinder = DuplicateFileFinder(opts.progress) - for dirname in sorted(args): - dupfinder.collect(dirname) - + def remove_all_but_one(self, duplicates): + keep = duplicates.pop() + for pathname in duplicates: + os.remove(pathname) - for duplicates in dupfinder.duplicates(): - if opts.make_hardlinks: - make_hardlinks(duplicates) - elif opts.remove: - remove_all_but_one(duplicates) - else: - report(duplicates) + def report(self, duplicates): + sys.stdout.write('\n'.join(duplicates)) + sys.stdout.write('\n\n') if __name__ == '__main__': - profname = os.environ.get('DUPFILES_PROFILE') - if profname: - import cProfile - cProfile.run('main()', profname) - else: - main() + Dupfiles().run() + -- cgit v1.2.1