Delete backup_folder.py, add missing functionality to rarpar.py.

This commit is contained in:
voussoir 2021-05-06 19:42:05 -07:00
parent e546499e25
commit fdfbf12fab
No known key found for this signature in database
GPG key ID: 5F7554F8C26DACCB
2 changed files with 56 additions and 73 deletions

View file

@ -1,41 +0,0 @@
import argparse
import rarpar
import sys
import time
from voussoirkit import pathclass
def backup_folder_argparse(args):
date = time.strftime('%Y-%m-%d')
folder = pathclass.Path(args.folder)
folder.correct_case()
if args.basename:
basename = args.basename.strip()
else:
basename = folder.basename
rar_name = f'{basename} {date}'
rarpar.rarpar(
path=folder,
basename=rar_name,
compression=rarpar.COMPRESSION_MAX,
dictionary_size='128m',
rec=5,
solid=True,
workdir=args.destination_folder,
)
def main(argv):
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('folder')
parser.add_argument('destination_folder')
parser.add_argument('--basename', default=None)
parser.set_defaults(func=backup_folder_argparse)
args = parser.parse_args(argv)
return args.func(args)
if __name__ == '__main__':
raise SystemExit(main(sys.argv[1:]))

View file

@ -6,9 +6,11 @@ import shutil
import subprocess
import sys
import time
import traceback
from voussoirkit import betterhelp
from voussoirkit import bytestring
from voussoirkit import operatornotify
from voussoirkit import pathclass
from voussoirkit import subproctools
from voussoirkit import vlogging
@ -151,13 +153,13 @@ def assert_enough_space(pathsize, workdir, moveto, rec, rev, par):
message = ' '.join([
f'For {bytestring.bytestring(pathsize)},',
f'Reserving {bytestring.bytestring(reserve)} /',
f'{bytestring.bytestring(free_space)}.',
f'reserve {bytestring.bytestring(reserve)}',
f'out of {bytestring.bytestring(free_space)}.',
])
log.debug(message)
if reserve > free_space:
raise NotEnoughSpace('Please leave more space')
raise NotEnoughSpace(message)
def move(pattern, directory):
files = winglob.glob(pattern)
@ -282,11 +284,11 @@ def run_script(script, dry=False):
for command in script:
if isinstance(command, str):
print(command)
log.info(command)
elif isinstance(command, list):
subproctools.print_command(command)
log.info(subproctools.format_command(command))
else:
print(command)
log.info(command)
if dry:
continue
@ -300,7 +302,7 @@ def run_script(script, dry=False):
else:
status = command()
if status not in [0, None]:
print('!!!! error status:', status)
log.error('!!!! error status: %s', status)
break
return status
@ -328,6 +330,7 @@ def rarpar(
# Validation ###################################################################################
path.assert_exists()
path.correct_case()
workdir = pathclass.Path(workdir)
workdir.assert_is_directory()
@ -362,11 +365,12 @@ def rarpar(
par=par or 0,
)
timestamp = time.strftime('%Y-%m-%d')
date = time.strftime('%Y-%m-%d')
timestamp = time.strftime('%Y-%m-%d_%H-%M-%S')
if not basename:
basename = f'{path.basename} ({timestamp})'
else:
basename = basename.format(timestamp=timestamp)
basename = basename.format(basename=path.basename, date=date, timestamp=timestamp)
existing = None
if workdir:
@ -375,7 +379,7 @@ def rarpar(
existing = existing or moveto.glob(f'{basename}*.rar')
if existing:
raise RarExists(f'{existing[0]} already exists.')
raise RarExists(f'{existing[0].absolute_path} already exists.')
# Script building ##############################################################################
@ -450,11 +454,11 @@ path:
A string "min(A, B)" or "max(A, B)" where A and B follow the above rules.
--rec X:
A integer to generate X% recovery record in the rars.
An integer to generate X% recovery record in the rars.
See winrar documentation for information about recovery records.
--rev X:
A integer to generate X% recovery volumes.
An integer to generate X% recovery volumes.
Note that winrar's behavior is the number of revs will always be less than
the number of rars. If you don't split volumes, you will have 1 rar and
thus 0 revs even if you ask for 100% rev.
@ -466,9 +470,12 @@ path:
--basename X:
A basename for the rar and par files. You will end up with
basename.partXX.rar and basename.par2.
Without this argument, the default basename is "basename ({timestamp})".
Your string may include {timestamp} including the braces to get the
timestamp there.
Without this argument, the default basename is "{basename} ({timestamp})".
Your string may include {basename}, {timestamp} and/or {date} including the
braces to insert that value there.
--compression X:
Level of compression. Can be "store" or "max" or integer 0-5.
--password X:
A password with which to encrypt the rar files.
@ -489,10 +496,19 @@ path:
'''
def rarpar_argparse(args):
compression = args.compression.lower() if args.compression is not None else None
if compression == 'max':
compression = COMPRESSION_MAX
if compression == 'store':
compression = COMPRESSION_STORE
status = 0
try:
return rarpar(
path=args.path,
volume=args.volume,
basename=args.basename,
compression=compression,
dictionary_size=args.dictionary_size,
dry=args.dry,
moveto=args.moveto,
@ -505,9 +521,15 @@ def rarpar_argparse(args):
solid=args.solid,
workdir=args.workdir,
)
except (RarExists, NotEnoughSpace) as exc:
log.fatal(exc)
status = 1
return status
def main(argv):
argv = vlogging.set_level_by_argv(log, argv)
(notify_context, argv) = operatornotify.main_log_context(argv, subject='rarpar warnings')
parser = argparse.ArgumentParser(description=__doc__)
@ -517,6 +539,7 @@ def main(argv):
parser.add_argument('--rev')
parser.add_argument('--par')
parser.add_argument('--basename')
parser.add_argument('--compression')
parser.add_argument('--password')
parser.add_argument('--profile', dest='rar_profile')
parser.add_argument('--workdir', default='.')
@ -527,6 +550,7 @@ def main(argv):
parser.add_argument('--dry', action='store_true')
parser.set_defaults(func=rarpar_argparse)
with notify_context:
return betterhelp.single_main(argv, parser, DOCSTRING)
if __name__ == '__main__':