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. --- dupfiles | 84 +++++++++++++++++++++++++++++----------------------------------- 1 file changed, 38 insertions(+), 46 deletions(-) (limited to 'dupfiles') 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