Refactoring

This commit is contained in:
Maks Snegov 2021-06-21 10:25:13 +03:00
parent 874f2de9ff
commit 5e042a73c1
2 changed files with 19 additions and 25 deletions

View File

@ -30,17 +30,14 @@ def _get_latest_backup(backup_dir: pathlib.Path) -> Optional[pathlib.Path]:
backups = sorted(os.listdir(backup_dir), reverse=True) backups = sorted(os.listdir(backup_dir), reverse=True)
for b_ent in backups: for b_ent in backups:
b_ent_abs = pathlib.Path(os.path.join(backup_dir, b_ent)) b_ent_abs = backup_dir / b_ent
if not _is_backup_entity(b_ent_abs): if not _is_backup_entity(b_ent_abs):
continue continue
if not os.listdir(b_ent_abs): if not os.listdir(b_ent_abs):
_lg.info("Removing empty backup entity: %s", b_ent_abs.name) _lg.info("Removing empty backup entity: %s", b_ent_abs.name)
_lg.debug("Removing directory %s", b_ent_abs) _lg.debug("Removing directory %s", b_ent_abs)
os.rmdir(b_ent_abs) os.rmdir(b_ent_abs)
continue continue
return b_ent_abs return b_ent_abs
return None return None
@ -56,21 +53,16 @@ def initiate_backup(sources, backup_dir: pathlib.Path, dry_run=False):
latest_backup = _get_latest_backup(backup_dir) latest_backup = _get_latest_backup(backup_dir)
if cur_backup == latest_backup: if cur_backup == latest_backup:
_lg.warning( _lg.warning("Latest backup %s was created less than minute ago, exiting",
"Latest backup %s was created less than minute ago, exiting", latest_backup.name)
latest_backup.name,
)
return return
if latest_backup is None: if latest_backup is None:
_lg.info("Creating empty directory for current backup: %s", cur_backup.name) _lg.info("Creating empty directory for current backup: %s", cur_backup.name)
os.mkdir(cur_backup) os.mkdir(cur_backup)
else: else:
_lg.info( _lg.info("Copying data from latest backup %s to current backup %s",
"Copying data from latest backup %s to current backup %s", latest_backup.name, cur_backup.name)
latest_backup.name,
cur_backup.name,
)
hl_res = fs.hardlink_dir(latest_backup, cur_backup) hl_res = fs.hardlink_dir(latest_backup, cur_backup)
if not hl_res: if not hl_res:

View File

@ -6,7 +6,6 @@ import enum
import glob import glob
import logging import logging
import os import os
import shutil
import subprocess import subprocess
import sys import sys
from typing import Iterable from typing import Iterable
@ -18,16 +17,18 @@ def rsync_ext(src, dst, dry_run=False):
"""Call external rsync command""" """Call external rsync command"""
rsync_args = ["rsync"] rsync_args = ["rsync"]
if dry_run: if dry_run:
rsync_args.append("-n") rsync_args.append("--dry-run")
rsync_args.append("-a") # archive rsync_args.append("--archive")
rsync_args.append("-z") # compress # rsync_args.append("--compress")
rsync_args.append("-h") # human-readable # rsync_args.append("--inplace")
rsync_args.append("-v") # verbose rsync_args.append("--whole-file")
rsync_args.append("-u") # don't touch new files on receiver rsync_args.append("--human-readable")
rsync_args.append("--progress") rsync_args.append("--delete-during")
rsync_args.append("--del") # delete during rsync_args.append("--itemize-changes")
rsync_args.append(src) rsync_args.append(f"{src}/")
rsync_args.append(dst) rsync_args.append(str(dst))
_lg.info("Executing external command: %s", " ".join(rsync_args))
res = subprocess.run(rsync_args) res = subprocess.run(rsync_args)
return res return res
@ -144,7 +145,7 @@ def rsync(src_dir, dst_dir, dry_run=False):
# remove dst entries not existing in source # remove dst entries not existing in source
if src_entry is None: if src_entry is None:
_lg.debug("deleting %s", rel_path) _lg.info("deleting %s", rel_path)
rm_direntry(dst_entry) rm_direntry(dst_entry)
continue continue
@ -203,6 +204,7 @@ def rsync(src_dir, dst_dir, dry_run=False):
_lg.info("updating owners %s", rel_path) _lg.info("updating owners %s", rel_path)
os.chown(dst_entry.path, src_stat.st_uid, src_stat.st_gid) os.chown(dst_entry.path, src_stat.st_uid, src_stat.st_gid)
# process remained source entries
for rel_path, src_entry in src_files_map.items(): for rel_path, src_entry in src_files_map.items():
dst_path = os.path.join(dst_root_abs, rel_path) dst_path = os.path.join(dst_root_abs, rel_path)
_lg.info("creating %s", rel_path) _lg.info("creating %s", rel_path)