#!/usr/local/cpython-3.4/bin/python3 # pylint: disable=superfluous-parens # superfluous-parens: Parentheses are good for portability and readability ''' Copy stat data from --source to --dest. This pretty much just wraps shutil.copystat() ''' import os import sys # port pprint import shutil def usage(retval): # pylint: disable=invalid-name # invalid-name: I want a short name here; it's still clear '''Output a usage message''' w = sys.stderr.write w('Usage: {}\n'.format(sys.argv[0])) w(' --source source/filename\n') w(' --dest dest/filename\n') w(' --prefix /common/prefix\n') w(' --help\n') w(' -h\n') w(' --verbose\n') w(' -v\n') w('\n') w('Copy stat data from /source/filename to /dest/filename.\n') w('If --prefix is given, copy stat data from /common/prefix/source/filename to /common/prefix/dest/filename.\n') sys.exit(retval) class Options(object): # pylint: disable=too-few-public-methods # too-few-public-methods: We're primarily a container; # of course we don't need a lot of public methods ''' Parse command line options. We don't do it a shorter way to maximize the benefits of pylint. ''' def __init__(self): self.source = None self.dest = None self.prefix = None self.verbose = False while sys.argv[1:]: if sys.argv[1] == '--prefix': self.prefix = sys.argv[2] del sys.argv[1] elif sys.argv[1] == '--source': self.source = sys.argv[2] del sys.argv[1] elif sys.argv[1] == '--dest': self.dest = sys.argv[2] del sys.argv[1] elif sys.argv[1] in ['-h', '--help']: usage(0) elif sys.argv[1] in ['-v', '--verbose']: self.verbose = True else: sys.stderr.write('{}: Unrecognized option: {}\n'.format(sys.argv[0], sys.argv[1])) usage(1) del sys.argv[1] if self.source is None: sys.stderr.write('{}: --source is required\n'.format(sys.argv[0])) usage(1) if self.dest is None: sys.stderr.write('{}: --dest is required\n'.format(sys.argv[0])) usage(1) if self.prefix is not None: self.source = os.path.join(self.prefix, self.source) self.dest = os.path.join(self.prefix, self.dest) def main(): '''Main function''' options = Options() if os.path.isfile(options.source) and os.path.isfile(options.dest): if options.verbose: print('Copying stat data from {} to {}'.format(options.source, options.dest)) shutil.copystat(options.source, options.dest) else: if options.verbose: print('--source filename or --dest filename not extent') main()