#!/usr/bin/python # Copyright (C) 2010, 2011 Lars Wirzenius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import cliapp import os import sys import summainlib class Summain(cliapp.Application): def add_settings(self): self.settings.boolean(['relative-paths', 'r'], 'print paths relative to arguments') self.settings.boolean(['mangle-paths', 'm'], 'mangle (obfuscate) paths') self.settings.string_list(['exclude'], 'do not output or compute FIELD', metavar='FIELD') self.settings.string_list(['checksum', 'c'], 'which checksums to compute: ' 'MD5, SHA1, SHA224, SHA256, SHA384, SHA512; ' 'use once per checksum type ' '(default is SHA1)') def files(self, root): if os.path.isdir(root): for dirname, dirnames, filenames in os.walk(root): yield dirname dirname.sort() for filename in sorted(filenames): yield os.path.join(dirname, filename) else: yield root def process_args(self, args): relative = self.settings['relative-paths'] exclude = self.settings['exclude'] nn = summainlib.NumberNormalizer() if self.settings['mangle-paths']: pn = summainlib.PathNormalizer() else: pn = summainlib.SamePath() checksums = [x.upper() for x in self.settings['checksum'] or ['SHA1']] o = summainlib.FilesystemObject('.', nn, pn, exclude, checksums) for checksum in checksums: try: o[checksum] except KeyError: raise cliapp.AppException('Unknown checksum %s' % checksum) for root in args: for filename in self.files(root): o = summainlib.FilesystemObject(filename, nn, pn, exclude, checksums) self.output.write(o.format(root if relative else None)) self.output.write('\n') Summain(version=summainlib.__version__).run()