Compare commits
5 commits
1724222a6c
...
7d394abcd3
Author | SHA1 | Date | |
---|---|---|---|
7d394abcd3 | |||
ecad407e19 | |||
794e204891 | |||
517f637c16 | |||
599b189fc5 |
2 changed files with 333 additions and 283 deletions
11
bin/jaaj
11
bin/jaaj
|
@ -2446,16 +2446,19 @@ ___ _ _ ___
|
||||||
""",
|
""",
|
||||||
"""
|
"""
|
||||||
;_][ //-\\ //-\\ ;_][
|
;_][ //-\\ //-\\ ;_][
|
||||||
"""
|
""",
|
||||||
]
|
]
|
||||||
|
|
||||||
from random import choice
|
from random import choice
|
||||||
|
|
||||||
|
|
||||||
def terminal_size():
|
def terminal_size():
|
||||||
import fcntl, termios, struct
|
import fcntl, termios, struct
|
||||||
th, tw, hp, wp = struct.unpack('HHHH',
|
|
||||||
fcntl.ioctl(0, termios.TIOCGWINSZ,
|
th, tw, hp, wp = struct.unpack(
|
||||||
struct.pack('HHHH', 0, 0, 0, 0)))
|
"HHHH", fcntl.ioctl(0, termios.TIOCGWINSZ, struct.pack("HHHH", 0, 0, 0, 0))
|
||||||
|
)
|
||||||
return tw, th
|
return tw, th
|
||||||
|
|
||||||
|
|
||||||
print(choice(jaajs))
|
print(choice(jaajs))
|
||||||
|
|
61
sync
61
sync
|
@ -1,13 +1,24 @@
|
||||||
#!venv/bin/python
|
#!venv/bin/python
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
import filecmp
|
||||||
import argparse
|
import argparse
|
||||||
|
from enum import Enum
|
||||||
|
|
||||||
|
|
||||||
|
class SyncStatus:
|
||||||
|
SAME = 1
|
||||||
|
DIFF = 2
|
||||||
|
SRC_MISSING = 3
|
||||||
|
DEST_MISSING = 4
|
||||||
|
|
||||||
|
|
||||||
# https://stackoverflow.com/a/287944
|
# https://stackoverflow.com/a/287944
|
||||||
class bcolors:
|
class bcolors:
|
||||||
BLUE = "\033[94m"
|
RED = "\033[91m"
|
||||||
GREEN = "\033[92m"
|
GREEN = "\033[92m"
|
||||||
|
YELLOW = "\033[93m"
|
||||||
|
BLUE = "\033[94m"
|
||||||
PURPLE = "\033[95m"
|
PURPLE = "\033[95m"
|
||||||
ENDC = "\033[0m"
|
ENDC = "\033[0m"
|
||||||
BOLD = "\033[1m"
|
BOLD = "\033[1m"
|
||||||
|
@ -20,9 +31,9 @@ parser = argparse.ArgumentParser(
|
||||||
)
|
)
|
||||||
parser.add_argument("action", choices=["save", "restore"])
|
parser.add_argument("action", choices=["save", "restore"])
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-s",
|
"-a",
|
||||||
"--select",
|
"--all",
|
||||||
help="Select the files and folders to sync",
|
help="Sync all files",
|
||||||
action="store_true",
|
action="store_true",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -72,17 +83,53 @@ def restore(fd: tuple[str, str]):
|
||||||
os.system(f"rsync -r {fd[0]} {fd[1]}")
|
os.system(f"rsync -r {fd[0]} {fd[1]}")
|
||||||
|
|
||||||
|
|
||||||
|
def get_sync_status(fd: tuple[str, str]) -> SyncStatus:
|
||||||
|
f1 = fd[0]
|
||||||
|
f2 = os.path.expanduser(fd[1])
|
||||||
|
|
||||||
|
def has_differences(dcmp):
|
||||||
|
differences = dcmp.left_only + dcmp.right_only + dcmp.diff_files
|
||||||
|
if differences:
|
||||||
|
return True
|
||||||
|
return any([has_differences(subdcmp) for subdcmp in dcmp.subdirs.values()])
|
||||||
|
|
||||||
|
if not os.path.exists(f1):
|
||||||
|
return SyncStatus.SRC_MISSING
|
||||||
|
elif not os.path.exists(f2):
|
||||||
|
return SyncStatus.DEST_MISSING
|
||||||
|
elif os.path.isfile(f1) and filecmp.cmp(f1, f2):
|
||||||
|
return SyncStatus.SAME
|
||||||
|
elif os.path.isdir(f1) and not has_differences(filecmp.dircmp(f1, f2)):
|
||||||
|
return SyncStatus.SAME
|
||||||
|
else:
|
||||||
|
return SyncStatus.DIFF
|
||||||
|
|
||||||
|
|
||||||
def list_files(reverse: bool = False) -> list[int]:
|
def list_files(reverse: bool = False) -> list[int]:
|
||||||
len_len = len(str(len(synced_files)))
|
len_len = len(str(len(synced_files)))
|
||||||
for i, f in enumerate(synced_files):
|
for i, f in enumerate(synced_files):
|
||||||
i = str(i)
|
i = str(i)
|
||||||
i = " " * (len_len - len(i)) + i
|
i = " " * (len_len - len(i)) + i
|
||||||
|
|
||||||
|
status = get_sync_status(f)
|
||||||
|
f1_c, f2_c = bcolors.GREEN, bcolors.GREEN
|
||||||
|
|
||||||
|
if status == SyncStatus.DIFF:
|
||||||
|
f1_c, f2_c = bcolors.YELLOW, bcolors.YELLOW
|
||||||
|
elif status == SyncStatus.SRC_MISSING:
|
||||||
|
f1_c = bcolors.RED if not reverse else f1_c
|
||||||
|
f2_c = bcolors.RED if reverse else f2_c
|
||||||
|
elif status == SyncStatus.DEST_MISSING:
|
||||||
|
f1_c = bcolors.RED if reverse else f1_c
|
||||||
|
f2_c = bcolors.RED if not reverse else f2_c
|
||||||
|
|
||||||
print(
|
print(
|
||||||
f"{bcolors.PURPLE}{i} {bcolors.GREEN}{f[int(reverse)]} {bcolors.ENDC}-> {bcolors.GREEN}{f[int(not reverse)]}{bcolors.ENDC}"
|
f"{bcolors.PURPLE}{i} {f1_c}{f[int(reverse)]} {bcolors.ENDC}-> {f2_c}{f[int(not reverse)]}{bcolors.ENDC}"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
colon = ":" * len_len
|
||||||
user_action = input(
|
user_action = input(
|
||||||
f"{bcolors.BOLD}{bcolors.BLUE}::{bcolors.ENDC} {bcolors.BOLD}Files to sync (eg: 1 2 3, 1-3):\n{bcolors.BLUE}::{bcolors.ENDC} "
|
f"{bcolors.BOLD}{bcolors.BLUE}{colon}{bcolors.ENDC} {bcolors.BOLD}Files to sync (eg: 1 2 3, 1-3):\n{bcolors.BLUE}{colon}{bcolors.ENDC} "
|
||||||
)
|
)
|
||||||
|
|
||||||
# Parse input
|
# Parse input
|
||||||
|
@ -102,7 +149,7 @@ if __name__ == "__main__":
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
msg = ""
|
msg = ""
|
||||||
r = list_files(args.action == "save") if args.select else range(len(synced_files))
|
r = range(len(synced_files)) if args.all else list_files(args.action == "save")
|
||||||
for ri, i in enumerate(r):
|
for ri, i in enumerate(r):
|
||||||
if args.action == "save":
|
if args.action == "save":
|
||||||
save(synced_files[i])
|
save(synced_files[i])
|
||||||
|
|
Loading…
Reference in a new issue