| #!/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() |