[PATCH 8/8] Treat all cli parse_num ValueErrors as misuses

0 views
Skip to first unread message

Rob Browning

unread,
Mar 27, 2026, 7:09:04 PM (12 days ago) Mar 27
to bup-...@googlegroups.com
Previously, we'd just crash with a backtrace. Catch the anticipated
ValueErrors and treat them as what they are, usage errors.

Signed-off-by: Rob Browning <r...@defaultvalue.org>
Tested-by: Rob Browning <r...@defaultvalue.org>
---
lib/bup/cmd/get.py | 7 +++++--
lib/bup/cmd/random.py | 5 ++++-
lib/bup/cmd/save.py | 11 +++++++++--
lib/bup/cmd/split.py | 15 +++++++++++----
4 files changed, 29 insertions(+), 9 deletions(-)

diff --git a/lib/bup/cmd/get.py b/lib/bup/cmd/get.py
index cf648121..2c3fe9b0 100644
--- a/lib/bup/cmd/get.py
+++ b/lib/bup/cmd/get.py
@@ -290,7 +290,10 @@ def parse_args(args):
opt.compress = int(opt.compress)
elif arg == b'--bwlimit':
(opt.bwlimit,), remaining = require_n_args_or_die(1, remaining)
- opt.bwlimit = int(opt.bwlimit)
+ try:
+ opt.bwlimit = parse_num(opt.bwlimit)
+ except ValueError as ex:
+ misuse(f'invalid --bwlimit ({str(ex)})')
elif arg.startswith(b'-') and len(arg) > 2 and arg[1] != b'-'[0]:
# Try to interpret this as -xyz, i.e. "-xyz -> -x -y -z".
# We do this last so that --foo -bar is valid if --foo
@@ -962,7 +965,7 @@ def main(argv):
opt = parse_args(argv)
git.check_repo_or_die()
if opt.bwlimit:
- client.bwlimit = parse_num(opt.bwlimit)
+ client.bwlimit = opt.bwlimit
if not opt.target_specs:
misuse('no methods specified')

diff --git a/lib/bup/cmd/random.py b/lib/bup/cmd/random.py
index 1d571f4e..33caa321 100644
--- a/lib/bup/cmd/random.py
+++ b/lib/bup/cmd/random.py
@@ -20,7 +20,10 @@ def main(argv):
if len(extra) != 1:
o.fatal("exactly one argument expected")

- total = parse_num(extra[0])
+ try:
+ total = parse_num(extra[0])
+ except ValueError as ex:
+ o.fatal(f'invalid data size ({str(ex)})')

handle_ctrl_c()

diff --git a/lib/bup/cmd/save.py b/lib/bup/cmd/save.py
index 25112bbf..592d3933 100644
--- a/lib/bup/cmd/save.py
+++ b/lib/bup/cmd/save.py
@@ -90,10 +90,17 @@ def opts_from_cmdline(o, argv):
opt.date = time.time()

opt.progress = (istty2 and not opt.quiet)
- opt.smaller = parse_num(opt.smaller or 0)
+
+ try:
+ opt.smaller = parse_num(opt.smaller or 0)
+ except ValueError as ex:
+ o.fatal(f'invalid --smaller ({str(ex)})')

if opt.bwlimit:
- opt.bwlimit = parse_num(opt.bwlimit)
+ try:
+ opt.bwlimit = parse_num(opt.bwlimit)
+ except ValueError as ex:
+ o.fatal(f'invalid --bwlimit ({str(ex)})')

if opt.strip and opt.strip_path:
o.fatal("--strip is incompatible with --strip-path")
diff --git a/lib/bup/cmd/split.py b/lib/bup/cmd/split.py
index 55fc6619..892f2d88 100644
--- a/lib/bup/cmd/split.py
+++ b/lib/bup/cmd/split.py
@@ -58,6 +58,13 @@ def opts_from_cmdline(o, argv):
opt, flags_, extra = o.parse_bytes(argv[1:])
opt.sources = extra

+ def require_num(arg, val):
+ try:
+ return parse_num(val)
+ except ValueError as ex:
+ o.fatal(f'invalid {arg} ({str(ex)})')
+ assert False # pylint
+
if opt.name: opt.name = argv_bytes(opt.name)
if opt.remote: opt.remote = argv_bytes(opt.remote)
if opt.verbose is None: opt.verbose = 0
@@ -77,13 +84,13 @@ def opts_from_cmdline(o, argv):
git.verbose = opt.verbose - 1
opt.bench = 1
if opt.max_pack_size:
- opt.max_pack_size = parse_num(opt.max_pack_size)
+ opt.max_pack_size = require_num('--max-pack-size', opt.max_pack_size)
if opt.max_pack_objects:
- opt.max_pack_objects = parse_num(opt.max_pack_objects)
+ opt.max_pack_size = require_num('--max-pack-objects', opt.max_pack_objects)
if opt.fanout:
- opt.fanout = parse_num(opt.fanout)
+ opt.fanout = require_num('--fanout', opt.fanout)
if opt.bwlimit:
- opt.bwlimit = parse_num(opt.bwlimit)
+ opt.bwlimit = require_num('--bwlimit', opt.bwlimit)
if opt.date:
try:
opt.date = parse_date_arg(b'--date', opt.date)
--
2.47.3

Reply all
Reply to author
Forward
0 new messages