diff options
Diffstat (limited to 'copy-diff.py')
-rwxr-xr-x | copy-diff.py | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/copy-diff.py b/copy-diff.py new file mode 100755 index 0000000..076f2da --- /dev/null +++ b/copy-diff.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python + +import os +import shutil +import sys + +BUFFER_SIZE = 1024 + +def is_file_different(a, b): + if os.path.getsize(a) != os.path.getsize(b): + # If the file size is different, the content must be different. + return True + + # Read the content of the files, and compare them. + result = False + + fa = open(a, 'rb') + fb = open(b, 'rb') + + while True: + buff_a = fa.read(BUFFER_SIZE) + buff_b = fb.read(BUFFER_SIZE) + + if buff_a != buff_b: + # File is different in this block. + result = True + break + + if len(buff_a) < BUFFER_SIZE: + # Finished + break + + fa.close() + fb.close() + + # File is the same. + return result + +def copyfile(src, dest): + if not os.path.exists(src): + raise ValueError('Source file not found') + + # Make parent directory (if necessary) + destdir = os.path.dirname(dest) + if not os.path.exists(destdir): + try: + os.makedirs(destdir) + except os.error, e: + raise ValueError('Unable to create directory ' + destdir) + elif not os.path.isdir(destdir): + raise ValueError(destdir + ' is not a directory') + + if not os.path.exists(dest) or is_file_different(src, dest): + # If the destination file does not exist or the source file is + # different from the destination file, then we copy the file. + shutil.copyfile(src, dest) + +def main(): + if len(sys.argv) < 3: + print >> sys.stderr, 'USAGE:', sys.argv[0], '<srcfile> <destfile>' + sys.exit(1) + + srcfile = os.path.abspath(sys.argv[1]) + destfile = os.path.abspath(sys.argv[2]) + + if srcfile == destfile: + print >> sys.stderr, 'WARNING: <srcfile> is equal to <destfile>' + else: + try: + copyfile(srcfile, destfile) + except ValueError, e: + print >> sys.stderr, 'ERROR: ', e + sys.exit(1) + +if __name__ == '__main__': + main() |