Upload files to "/"
This commit is contained in:
130
sync-file.py
Normal file
130
sync-file.py
Normal file
@@ -0,0 +1,130 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
import getopt
|
||||
import sys
|
||||
import filecmp
|
||||
import shutil
|
||||
|
||||
CRED = '\033[91m'
|
||||
CEND = '\033[0m'
|
||||
CCYAN = '\033[96m'
|
||||
CBLUE = '\033[94m'
|
||||
CGREEN = '\033[92m'
|
||||
|
||||
def _usage():
|
||||
""" print command line options """
|
||||
print("usage sync-file.py -h/--help -c/--compare-path=<path> -p/--print file\n"\
|
||||
"file # input fil , left side of diff\n"\
|
||||
"-c / -compare-path= <path> # <path> to directory to file-sync\n"\
|
||||
"-p / --print # print only, dont do any actual sync\n"\
|
||||
"-h / --help # Help ")
|
||||
|
||||
def _get_last_mod_date(file):
|
||||
try:
|
||||
return int(round(os.path.getmtime(file)))
|
||||
except FileNotFoundError as err:
|
||||
print(err)
|
||||
return None
|
||||
|
||||
def _diff_files(src_file, dst_file):
|
||||
diff_cmd = shutil.which('meld')
|
||||
|
||||
if diff_cmd != None:
|
||||
try:
|
||||
subprocess.run([diff_cmd, src_file, dst_file])
|
||||
except:
|
||||
print("can't start diff tool")
|
||||
else:
|
||||
print("can't find diff tool")
|
||||
|
||||
def _conditional_copy_file(src_file, dst_file):
|
||||
if _ask():
|
||||
os.system('cp ' + src_file + ' ' + dst_file)
|
||||
|
||||
def _ask():
|
||||
try:
|
||||
answer = lower(input('\tproceed with copy? [Y/n]: '))
|
||||
except EOFError:
|
||||
return False
|
||||
|
||||
ret_val = False
|
||||
if answer == '' or answer == 'y' or answer == 'yes':
|
||||
ret_val = True
|
||||
|
||||
return ret_val
|
||||
|
||||
def main():
|
||||
try:
|
||||
opts, args = getopt.getopt(sys.argv[1:], "dphc:", ["diff", "compare-path=", "print", "help"])
|
||||
except getopt.GetoptError as err:
|
||||
# print help information and exit:
|
||||
print(err) # will print something like "option -a not recognized"
|
||||
sys.exit(2)
|
||||
|
||||
file_diff = False
|
||||
dry_run = False
|
||||
compare_path = "."
|
||||
|
||||
### parse input command line
|
||||
for o, a in opts:
|
||||
if o in ("-h", "--help"):
|
||||
_usage()
|
||||
sys.exit()
|
||||
elif o in ("-p", "--print"):
|
||||
dry_run = True
|
||||
elif o in ("-c", "--compare-path"):
|
||||
compare_path = a
|
||||
elif o in ("-d", "--diff"):
|
||||
file_diff = True
|
||||
else:
|
||||
print(o, a)
|
||||
assert False, "unhandled option"
|
||||
|
||||
for left_file in args:
|
||||
#left_file contain the full path + file name. pick out filename only and apply the compare_path
|
||||
right_file = compare_path + '/' + left_file #os.path.basename(left_file)
|
||||
#print(left_file)
|
||||
#print(right_file)
|
||||
left_file_exists = os.path.isfile(left_file)
|
||||
right_file_exists = os.path.isfile(right_file)
|
||||
|
||||
if not left_file_exists:
|
||||
print(CRED + '\tno such file... ' + left_file + CEND)
|
||||
if not right_file_exists:
|
||||
print(CRED + '\tno such file... ' + right_file + CEND)
|
||||
|
||||
if not dry_run:
|
||||
_conditional_copy_file(left_file, right_file)
|
||||
|
||||
if left_file_exists and right_file_exists:
|
||||
#if left and right are different, decide which file is to be copied
|
||||
if not filecmp.cmp(left_file, right_file):
|
||||
left_file_mod_time = _get_last_mod_date(left_file)
|
||||
right_file_mod_time = _get_last_mod_date(right_file)
|
||||
|
||||
if left_file_mod_time < right_file_mod_time: # left file newer
|
||||
src_file = right_file
|
||||
dst_file = left_file
|
||||
color = CBLUE
|
||||
else: # right file newer
|
||||
src_file = left_file
|
||||
dst_file = right_file
|
||||
color = CCYAN
|
||||
|
||||
print(color + '\t' + src_file + ' is newer than ' + dst_file + '...' + CEND)
|
||||
|
||||
if not dry_run:
|
||||
_conditional_copy_file(src_file, dst_file)
|
||||
|
||||
if file_diff:
|
||||
_diff_files(left_file, right_file)
|
||||
|
||||
|
||||
else:
|
||||
print(CGREEN + '\t' + os.path.basename(left_file) + ' same same...' + CEND)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user