|
@@ -218,6 +218,14 @@ def get_func(args):
|
|
raise Exception('expected func attributes not found')
|
|
raise Exception('expected func attributes not found')
|
|
|
|
|
|
|
|
|
|
|
|
+class Highlander(argparse.Action):
|
|
|
|
+ """make sure some option is only given once"""
|
|
|
|
+ def __call__(self, parser, namespace, values, option_string=None):
|
|
|
|
+ if getattr(namespace, self.dest, None) != self.default:
|
|
|
|
+ raise argparse.ArgumentError(self, 'There can be only one.')
|
|
|
|
+ setattr(namespace, self.dest, values)
|
|
|
|
+
|
|
|
|
+
|
|
class Archiver:
|
|
class Archiver:
|
|
|
|
|
|
def __init__(self, lock_wait=None, prog=None):
|
|
def __init__(self, lock_wait=None, prog=None):
|
|
@@ -2841,10 +2849,10 @@ class Archiver:
|
|
filters_group = subparser.add_argument_group('Archive filters',
|
|
filters_group = subparser.add_argument_group('Archive filters',
|
|
'Archive filters can be applied to repository targets.')
|
|
'Archive filters can be applied to repository targets.')
|
|
group = filters_group.add_mutually_exclusive_group()
|
|
group = filters_group.add_mutually_exclusive_group()
|
|
- group.add_argument('-P', '--prefix', metavar='PREFIX', dest='prefix', type=PrefixSpec, default=None,
|
|
|
|
|
|
+ group.add_argument('-P', '--prefix', metavar='PREFIX', dest='prefix', type=PrefixSpec, action=Highlander,
|
|
help='only consider archive names starting with this prefix.')
|
|
help='only consider archive names starting with this prefix.')
|
|
group.add_argument('-a', '--glob-archives', metavar='GLOB', dest='glob_archives',
|
|
group.add_argument('-a', '--glob-archives', metavar='GLOB', dest='glob_archives',
|
|
- type=GlobSpec, default=None,
|
|
|
|
|
|
+ type=GlobSpec, action=Highlander,
|
|
help='only consider archive names matching the glob. '
|
|
help='only consider archive names matching the glob. '
|
|
'sh: rules apply, see "borg help patterns". '
|
|
'sh: rules apply, see "borg help patterns". '
|
|
'``--prefix`` and ``--glob-archives`` are mutually exclusive.')
|
|
'``--prefix`` and ``--glob-archives`` are mutually exclusive.')
|
|
@@ -2874,7 +2882,7 @@ class Archiver:
|
|
parser.add_argument('-f', '--foreground', dest='foreground',
|
|
parser.add_argument('-f', '--foreground', dest='foreground',
|
|
action='store_true',
|
|
action='store_true',
|
|
help='stay in foreground, do not daemonize')
|
|
help='stay in foreground, do not daemonize')
|
|
- parser.add_argument('-o', dest='options', type=str,
|
|
|
|
|
|
+ parser.add_argument('-o', dest='options', type=str, action=Highlander,
|
|
help='Extra mount options')
|
|
help='Extra mount options')
|
|
parser.add_argument('--numeric-owner', dest='numeric_ids', action='store_true',
|
|
parser.add_argument('--numeric-owner', dest='numeric_ids', action='store_true',
|
|
help='deprecated, use ``--numeric-ids`` instead')
|
|
help='deprecated, use ``--numeric-ids`` instead')
|
|
@@ -3423,7 +3431,7 @@ class Archiver:
|
|
|
|
|
|
subparser.add_argument('--list', dest='output_list', action='store_true',
|
|
subparser.add_argument('--list', dest='output_list', action='store_true',
|
|
help='output verbose list of items (files, dirs, ...)')
|
|
help='output verbose list of items (files, dirs, ...)')
|
|
- subparser.add_argument('--filter', metavar='STATUSCHARS', dest='output_filter',
|
|
|
|
|
|
+ subparser.add_argument('--filter', metavar='STATUSCHARS', dest='output_filter', action=Highlander,
|
|
help='only display items with the given status characters (see description)')
|
|
help='only display items with the given status characters (see description)')
|
|
subparser.add_argument('--json', action='store_true',
|
|
subparser.add_argument('--json', action='store_true',
|
|
help='output stats as JSON. Implies ``--stats``.')
|
|
help='output stats as JSON. Implies ``--stats``.')
|
|
@@ -3479,7 +3487,7 @@ class Archiver:
|
|
help='do not read and store xattrs into archive')
|
|
help='do not read and store xattrs into archive')
|
|
fs_group.add_argument('--sparse', dest='sparse', action='store_true',
|
|
fs_group.add_argument('--sparse', dest='sparse', action='store_true',
|
|
help='detect sparse holes in input (supported only by fixed chunker)')
|
|
help='detect sparse holes in input (supported only by fixed chunker)')
|
|
- fs_group.add_argument('--files-cache', metavar='MODE', dest='files_cache_mode',
|
|
|
|
|
|
+ fs_group.add_argument('--files-cache', metavar='MODE', dest='files_cache_mode', action=Highlander,
|
|
type=FilesCacheMode, default=DEFAULT_FILES_CACHE_MODE_UI,
|
|
type=FilesCacheMode, default=DEFAULT_FILES_CACHE_MODE_UI,
|
|
help='operate files cache in MODE. default: %s' % DEFAULT_FILES_CACHE_MODE_UI)
|
|
help='operate files cache in MODE. default: %s' % DEFAULT_FILES_CACHE_MODE_UI)
|
|
fs_group.add_argument('--read-special', dest='read_special', action='store_true',
|
|
fs_group.add_argument('--read-special', dest='read_special', action='store_true',
|
|
@@ -3497,7 +3505,7 @@ class Archiver:
|
|
type=int, default=1800,
|
|
type=int, default=1800,
|
|
help='write checkpoint every SECONDS seconds (Default: 1800)')
|
|
help='write checkpoint every SECONDS seconds (Default: 1800)')
|
|
archive_group.add_argument('--chunker-params', metavar='PARAMS', dest='chunker_params',
|
|
archive_group.add_argument('--chunker-params', metavar='PARAMS', dest='chunker_params',
|
|
- type=ChunkerParams, default=CHUNKER_PARAMS,
|
|
|
|
|
|
+ type=ChunkerParams, default=CHUNKER_PARAMS, action=Highlander,
|
|
help='specify the chunker parameters (ALGO, CHUNK_MIN_EXP, CHUNK_MAX_EXP, '
|
|
help='specify the chunker parameters (ALGO, CHUNK_MIN_EXP, CHUNK_MAX_EXP, '
|
|
'HASH_MASK_BITS, HASH_WINDOW_SIZE). default: %s,%d,%d,%d,%d' % CHUNKER_PARAMS)
|
|
'HASH_MASK_BITS, HASH_WINDOW_SIZE). default: %s,%d,%d,%d,%d' % CHUNKER_PARAMS)
|
|
archive_group.add_argument('-C', '--compression', metavar='COMPRESSION', dest='compression',
|
|
archive_group.add_argument('-C', '--compression', metavar='COMPRESSION', dest='compression',
|
|
@@ -4478,7 +4486,7 @@ class Archiver:
|
|
subparser.set_defaults(func=self.do_recreate)
|
|
subparser.set_defaults(func=self.do_recreate)
|
|
subparser.add_argument('--list', dest='output_list', action='store_true',
|
|
subparser.add_argument('--list', dest='output_list', action='store_true',
|
|
help='output verbose list of items (files, dirs, ...)')
|
|
help='output verbose list of items (files, dirs, ...)')
|
|
- subparser.add_argument('--filter', metavar='STATUSCHARS', dest='output_filter',
|
|
|
|
|
|
+ subparser.add_argument('--filter', metavar='STATUSCHARS', dest='output_filter', action=Highlander,
|
|
help='only display items with the given status characters (listed in borg create --help)')
|
|
help='only display items with the given status characters (listed in borg create --help)')
|
|
subparser.add_argument('-n', '--dry-run', dest='dry_run', action='store_true',
|
|
subparser.add_argument('-n', '--dry-run', dest='dry_run', action='store_true',
|
|
help='do not change anything')
|
|
help='do not change anything')
|
|
@@ -4517,7 +4525,7 @@ class Archiver:
|
|
'recompression). '
|
|
'recompression). '
|
|
'If no MODE is given, `if-different` will be used. '
|
|
'If no MODE is given, `if-different` will be used. '
|
|
'Not passing --recompress is equivalent to "--recompress never".')
|
|
'Not passing --recompress is equivalent to "--recompress never".')
|
|
- archive_group.add_argument('--chunker-params', metavar='PARAMS', dest='chunker_params',
|
|
|
|
|
|
+ archive_group.add_argument('--chunker-params', metavar='PARAMS', dest='chunker_params', action=Highlander,
|
|
type=ChunkerParams, default=CHUNKER_PARAMS,
|
|
type=ChunkerParams, default=CHUNKER_PARAMS,
|
|
help='specify the chunker parameters (ALGO, CHUNK_MIN_EXP, CHUNK_MAX_EXP, '
|
|
help='specify the chunker parameters (ALGO, CHUNK_MIN_EXP, CHUNK_MAX_EXP, '
|
|
'HASH_MASK_BITS, HASH_WINDOW_SIZE) or `default` to use the current defaults. '
|
|
'HASH_MASK_BITS, HASH_WINDOW_SIZE) or `default` to use the current defaults. '
|
|
@@ -4768,7 +4776,7 @@ class Archiver:
|
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
help=self.do_import_tar.__doc__)
|
|
help=self.do_import_tar.__doc__)
|
|
subparser.set_defaults(func=self.do_import_tar)
|
|
subparser.set_defaults(func=self.do_import_tar)
|
|
- subparser.add_argument('--tar-filter', dest='tar_filter', default='auto',
|
|
|
|
|
|
+ subparser.add_argument('--tar-filter', dest='tar_filter', default='auto', action=Highlander,
|
|
help='filter program to pipe data through')
|
|
help='filter program to pipe data through')
|
|
subparser.add_argument('-s', '--stats', dest='stats',
|
|
subparser.add_argument('-s', '--stats', dest='stats',
|
|
action='store_true', default=False,
|
|
action='store_true', default=False,
|
|
@@ -4776,7 +4784,7 @@ class Archiver:
|
|
subparser.add_argument('--list', dest='output_list',
|
|
subparser.add_argument('--list', dest='output_list',
|
|
action='store_true', default=False,
|
|
action='store_true', default=False,
|
|
help='output verbose list of items (files, dirs, ...)')
|
|
help='output verbose list of items (files, dirs, ...)')
|
|
- subparser.add_argument('--filter', dest='output_filter', metavar='STATUSCHARS',
|
|
|
|
|
|
+ subparser.add_argument('--filter', dest='output_filter', metavar='STATUSCHARS', action=Highlander,
|
|
help='only display items with the given status characters')
|
|
help='only display items with the given status characters')
|
|
subparser.add_argument('--json', action='store_true',
|
|
subparser.add_argument('--json', action='store_true',
|
|
help='output stats as JSON (implies --stats)')
|
|
help='output stats as JSON (implies --stats)')
|
|
@@ -4792,7 +4800,7 @@ class Archiver:
|
|
archive_group.add_argument('-c', '--checkpoint-interval', dest='checkpoint_interval',
|
|
archive_group.add_argument('-c', '--checkpoint-interval', dest='checkpoint_interval',
|
|
type=int, default=1800, metavar='SECONDS',
|
|
type=int, default=1800, metavar='SECONDS',
|
|
help='write checkpoint every SECONDS seconds (Default: 1800)')
|
|
help='write checkpoint every SECONDS seconds (Default: 1800)')
|
|
- archive_group.add_argument('--chunker-params', dest='chunker_params',
|
|
|
|
|
|
+ archive_group.add_argument('--chunker-params', dest='chunker_params', action=Highlander,
|
|
type=ChunkerParams, default=CHUNKER_PARAMS,
|
|
type=ChunkerParams, default=CHUNKER_PARAMS,
|
|
metavar='PARAMS',
|
|
metavar='PARAMS',
|
|
help='specify the chunker parameters (ALGO, CHUNK_MIN_EXP, CHUNK_MAX_EXP, '
|
|
help='specify the chunker parameters (ALGO, CHUNK_MIN_EXP, CHUNK_MAX_EXP, '
|