2
0
Эх сурвалжийг харах

Rename several configuration options to match Borg 2 (#557).

Dan Helfman 2 жил өмнө
parent
commit
f47c98c4a5

+ 9 - 0
NEWS

@@ -4,6 +4,15 @@
    repository info). If you install Borg 2, you'll need to manually "borg transfer" or "borgmatic
    repository info). If you install Borg 2, you'll need to manually "borg transfer" or "borgmatic
    transfer" your existing Borg 1 repositories before use. See the Borg 2.0 changelog for more
    transfer" your existing Borg 1 repositories before use. See the Borg 2.0 changelog for more
    information about Borg 2: https://www.borgbackup.org/releases/borg-2.0.html
    information about Borg 2: https://www.borgbackup.org/releases/borg-2.0.html
+ * #557: Rename several configuration options to match Borg 2: "remote_rate_limit" is now
+   "upload_rate_limit", "numeric_owner" is "numeric_ids", and "bsd_flags" is "flags". borgmatic
+   still works with the old options.
+ * #557: Remote repository paths without the "ssh://" syntax are deprecated but still supported for
+   now. However, remote repository paths containing "~" will no longer work.
+ * #557: Omitting the "--archive" flag on the "list" action is deprecated when using Borg 2. Use
+   the new "rlist" action instead. And when using the "--archive" or "--find" flags on the "list"
+   action with Borg 2, several flags are no longer supported: "--prefix", "--glob-archives",
+   "--sort-by", "--first", and "--last".
  * #565: Fix handling of "repository" and "data" consistency checks to prevent invalid Borg flags.
  * #565: Fix handling of "repository" and "data" consistency checks to prevent invalid Borg flags.
  * #566: Modify "mount" and "extract" actions to require the "--repository" flag when multiple
  * #566: Modify "mount" and "extract" actions to require the "--repository" flag when multiple
    repositories are configured.
    repositories are configured.

+ 7 - 7
borgmatic/borg/create.py

@@ -233,7 +233,7 @@ def create_archive(
     checkpoint_interval = storage_config.get('checkpoint_interval', None)
     checkpoint_interval = storage_config.get('checkpoint_interval', None)
     chunker_params = storage_config.get('chunker_params', None)
     chunker_params = storage_config.get('chunker_params', None)
     compression = storage_config.get('compression', None)
     compression = storage_config.get('compression', None)
-    remote_rate_limit = storage_config.get('remote_rate_limit', None)
+    upload_rate_limit = storage_config.get('upload_rate_limit', None)
     umask = storage_config.get('umask', None)
     umask = storage_config.get('umask', None)
     lock_wait = storage_config.get('lock_wait', None)
     lock_wait = storage_config.get('lock_wait', None)
     files_cache = location_config.get('files_cache')
     files_cache = location_config.get('files_cache')
@@ -246,22 +246,22 @@ def create_archive(
         atime_flags = ('--noatime',) if location_config.get('atime') is False else ()
         atime_flags = ('--noatime',) if location_config.get('atime') is False else ()
 
 
     if feature.available(feature.Feature.NOFLAGS, local_borg_version):
     if feature.available(feature.Feature.NOFLAGS, local_borg_version):
-        noflags_flags = ('--noflags',) if location_config.get('bsd_flags') is False else ()
+        noflags_flags = ('--noflags',) if location_config.get('flags') is False else ()
     else:
     else:
-        noflags_flags = ('--nobsdflags',) if location_config.get('bsd_flags') is False else ()
+        noflags_flags = ('--nobsdflags',) if location_config.get('flags') is False else ()
 
 
     if feature.available(feature.Feature.NUMERIC_IDS, local_borg_version):
     if feature.available(feature.Feature.NUMERIC_IDS, local_borg_version):
-        numeric_ids_flags = ('--numeric-ids',) if location_config.get('numeric_owner') else ()
+        numeric_ids_flags = ('--numeric-ids',) if location_config.get('numeric_ids') else ()
     else:
     else:
-        numeric_ids_flags = ('--numeric-owner',) if location_config.get('numeric_owner') else ()
+        numeric_ids_flags = ('--numeric-owner',) if location_config.get('numeric_ids') else ()
 
 
     if feature.available(feature.Feature.UPLOAD_RATELIMIT, local_borg_version):
     if feature.available(feature.Feature.UPLOAD_RATELIMIT, local_borg_version):
         upload_ratelimit_flags = (
         upload_ratelimit_flags = (
-            ('--upload-ratelimit', str(remote_rate_limit)) if remote_rate_limit else ()
+            ('--upload-ratelimit', str(upload_rate_limit)) if upload_rate_limit else ()
         )
         )
     else:
     else:
         upload_ratelimit_flags = (
         upload_ratelimit_flags = (
-            ('--remote-ratelimit', str(remote_rate_limit)) if remote_rate_limit else ()
+            ('--remote-ratelimit', str(upload_rate_limit)) if upload_rate_limit else ()
         )
         )
 
 
     ensure_files_readable(location_config.get('patterns_from'), location_config.get('exclude_from'))
     ensure_files_readable(location_config.get('patterns_from'), location_config.get('exclude_from'))

+ 2 - 2
borgmatic/borg/extract.py

@@ -83,9 +83,9 @@ def extract_archive(
         raise ValueError('progress and extract_to_stdout cannot both be set')
         raise ValueError('progress and extract_to_stdout cannot both be set')
 
 
     if feature.available(feature.Feature.NUMERIC_IDS, local_borg_version):
     if feature.available(feature.Feature.NUMERIC_IDS, local_borg_version):
-        numeric_ids_flags = ('--numeric-ids',) if location_config.get('numeric_owner') else ()
+        numeric_ids_flags = ('--numeric-ids',) if location_config.get('numeric_ids') else ()
     else:
     else:
-        numeric_ids_flags = ('--numeric-owner',) if location_config.get('numeric_owner') else ()
+        numeric_ids_flags = ('--numeric-owner',) if location_config.get('numeric_ids') else ()
 
 
     full_command = (
     full_command = (
         (local_path, 'extract')
         (local_path, 'extract')

+ 2 - 2
borgmatic/commands/arguments.py

@@ -314,8 +314,8 @@ def make_parsers():
     create_parser = subparsers.add_parser(
     create_parser = subparsers.add_parser(
         'create',
         'create',
         aliases=SUBPARSER_ALIASES['create'],
         aliases=SUBPARSER_ALIASES['create'],
-        help='Create archives (actually perform backups)',
-        description='Create archives (actually perform backups)',
+        help='Create an archive (actually perform a backup)',
+        description='Create an archive (actually perform a backup)',
         add_help=False,
         add_help=False,
     )
     )
     create_group = create_parser.add_argument_group('create arguments')
     create_group = create_parser.add_argument_group('create arguments')

+ 1 - 1
borgmatic/config/generate.py

@@ -283,7 +283,7 @@ def generate_sample_configuration(
 
 
     if source_filename:
     if source_filename:
         source_config = load.load_configuration(source_filename)
         source_config = load.load_configuration(source_filename)
-        normalize.normalize(source_config)
+        normalize.normalize(source_filename, source_config)
 
 
     destination_config = merge_source_configuration_into_destination(
     destination_config = merge_source_configuration_into_destination(
         _schema_to_sample_configuration(schema), source_config
         _schema_to_sample_configuration(schema), source_config

+ 13 - 1
borgmatic/config/normalize.py

@@ -36,12 +36,24 @@ def normalize(config_filename, config):
     if isinstance(checks, list) and len(checks) and isinstance(checks[0], str):
     if isinstance(checks, list) and len(checks) and isinstance(checks[0], str):
         config['consistency']['checks'] = [{'name': check_type} for check_type in checks]
         config['consistency']['checks'] = [{'name': check_type} for check_type in checks]
 
 
+    # Rename various configuration options.
+    numeric_owner = config.get('location', {}).pop('numeric_owner', None)
+    if numeric_owner is not None:
+        config['location']['numeric_ids'] = numeric_owner
+
+    bsd_flags = config.get('location', {}).pop('bsd_flags', None)
+    if bsd_flags is not None:
+        config['location']['flags'] = bsd_flags
+
+    remote_rate_limit = config.get('storage', {}).pop('remote_rate_limit', None)
+    if remote_rate_limit is not None:
+        config['storage']['upload_rate_limit'] = remote_rate_limit
+
     # Upgrade remote repositories to ssh:// syntax, required in Borg 2.
     # Upgrade remote repositories to ssh:// syntax, required in Borg 2.
     repositories = config.get('location', {}).get('repositories')
     repositories = config.get('location', {}).get('repositories')
     if repositories:
     if repositories:
         config['location']['repositories'] = []
         config['location']['repositories'] = []
         for repository in repositories:
         for repository in repositories:
-            # TODO: Instead of logging directly here, return logs and bubble them up to be displayed *after* logging is initialized.
             if '~' in repository:
             if '~' in repository:
                 logs.append(
                 logs.append(
                     logging.makeLogRecord(
                     logging.makeLogRecord(

+ 4 - 4
borgmatic/config/schema.yaml

@@ -58,7 +58,7 @@ properties:
                     database hook is used, the setting here is ignored and
                     database hook is used, the setting here is ignored and
                     one_file_system is considered true.
                     one_file_system is considered true.
                 example: true
                 example: true
-            numeric_owner:
+            numeric_ids:
                 type: boolean
                 type: boolean
                 description: |
                 description: |
                     Only store/extract numeric user and group identifiers.
                     Only store/extract numeric user and group identifiers.
@@ -90,10 +90,10 @@ properties:
                     used, the setting here is ignored and read_special is
                     used, the setting here is ignored and read_special is
                     considered true.
                     considered true.
                 example: false
                 example: false
-            bsd_flags:
+            flags:
                 type: boolean
                 type: boolean
                 description: |
                 description: |
-                    Record bsdflags (e.g. NODUMP, IMMUTABLE) in archive.
+                    Record filesystem flags (e.g. NODUMP, IMMUTABLE) in archive.
                     Defaults to true.
                     Defaults to true.
                 example: true
                 example: true
             files_cache:
             files_cache:
@@ -255,7 +255,7 @@ properties:
                     http://borgbackup.readthedocs.io/en/stable/usage/create.html
                     http://borgbackup.readthedocs.io/en/stable/usage/create.html
                     for details. Defaults to "lz4".
                     for details. Defaults to "lz4".
                 example: lz4
                 example: lz4
-            remote_rate_limit:
+            upload_rate_limit:
                 type: integer
                 type: integer
                 description: |
                 description: |
                     Remote network upload rate limit in kiBytes/second. Defaults
                     Remote network upload rate limit in kiBytes/second. Defaults

+ 6 - 6
tests/unit/borg/test_create.py

@@ -794,7 +794,7 @@ def test_create_archive_with_compression_calls_borg_with_compression_parameters(
 @pytest.mark.parametrize(
 @pytest.mark.parametrize(
     'feature_available,option_flag', ((True, '--upload-ratelimit'), (False, '--remote-ratelimit')),
     'feature_available,option_flag', ((True, '--upload-ratelimit'), (False, '--remote-ratelimit')),
 )
 )
-def test_create_archive_with_remote_rate_limit_calls_borg_with_upload_ratelimit_parameters(
+def test_create_archive_with_upload_rate_limit_calls_borg_with_upload_ratelimit_parameters(
     feature_available, option_flag
     feature_available, option_flag
 ):
 ):
     flexmock(module).should_receive('borgmatic_source_directories').and_return([])
     flexmock(module).should_receive('borgmatic_source_directories').and_return([])
@@ -829,7 +829,7 @@ def test_create_archive_with_remote_rate_limit_calls_borg_with_upload_ratelimit_
             'repositories': ['repo'],
             'repositories': ['repo'],
             'exclude_patterns': None,
             'exclude_patterns': None,
         },
         },
-        storage_config={'remote_rate_limit': 100},
+        storage_config={'upload_rate_limit': 100},
         local_borg_version='1.2.3',
         local_borg_version='1.2.3',
     )
     )
 
 
@@ -917,7 +917,7 @@ def test_create_archive_with_one_file_system_calls_borg_with_one_file_system_par
 @pytest.mark.parametrize(
 @pytest.mark.parametrize(
     'feature_available,option_flag', ((True, '--numeric-ids'), (False, '--numeric-owner')),
     'feature_available,option_flag', ((True, '--numeric-ids'), (False, '--numeric-owner')),
 )
 )
-def test_create_archive_with_numeric_owner_calls_borg_with_numeric_ids_parameter(
+def test_create_archive_with_numeric_ids_calls_borg_with_numeric_ids_parameter(
     feature_available, option_flag
     feature_available, option_flag
 ):
 ):
     flexmock(module).should_receive('borgmatic_source_directories').and_return([])
     flexmock(module).should_receive('borgmatic_source_directories').and_return([])
@@ -950,7 +950,7 @@ def test_create_archive_with_numeric_owner_calls_borg_with_numeric_ids_parameter
         location_config={
         location_config={
             'source_directories': ['foo', 'bar'],
             'source_directories': ['foo', 'bar'],
             'repositories': ['repo'],
             'repositories': ['repo'],
-            'numeric_owner': True,
+            'numeric_ids': True,
             'exclude_patterns': None,
             'exclude_patterns': None,
         },
         },
         storage_config={},
         storage_config={},
@@ -1102,7 +1102,7 @@ def test_create_archive_with_atime_option_calls_borg_with_corresponding_paramete
         (False, False, '--nobsdflags'),
         (False, False, '--nobsdflags'),
     ),
     ),
 )
 )
-def test_create_archive_with_bsd_flags_option_calls_borg_with_corresponding_parameter(
+def test_create_archive_with_flags_option_calls_borg_with_corresponding_parameter(
     option_value, feature_available, option_flag
     option_value, feature_available, option_flag
 ):
 ):
     flexmock(module).should_receive('borgmatic_source_directories').and_return([])
     flexmock(module).should_receive('borgmatic_source_directories').and_return([])
@@ -1135,7 +1135,7 @@ def test_create_archive_with_bsd_flags_option_calls_borg_with_corresponding_para
         location_config={
         location_config={
             'source_directories': ['foo', 'bar'],
             'source_directories': ['foo', 'bar'],
             'repositories': ['repo'],
             'repositories': ['repo'],
-            'bsd_flags': option_value,
+            'flags': option_value,
             'exclude_patterns': None,
             'exclude_patterns': None,
         },
         },
         storage_config={},
         storage_config={},

+ 1 - 1
tests/unit/borg/test_extract.py

@@ -174,7 +174,7 @@ def test_extract_archive_calls_borg_with_numeric_ids_parameter(feature_available
         repository='repo',
         repository='repo',
         archive='archive',
         archive='archive',
         paths=None,
         paths=None,
-        location_config={'numeric_owner': True},
+        location_config={'numeric_ids': True},
         storage_config={},
         storage_config={},
         local_borg_version='1.2.3',
         local_borg_version='1.2.3',
     )
     )

+ 7 - 0
tests/unit/config/test_normalize.py

@@ -51,6 +51,13 @@ from borgmatic.config import normalize as module
             {'consistency': {'checks': [{'name': 'archives'}]}},
             {'consistency': {'checks': [{'name': 'archives'}]}},
             False,
             False,
         ),
         ),
+        ({'location': {'numeric_owner': False}}, {'location': {'numeric_ids': False}}, False,),
+        ({'location': {'bsd_flags': False}}, {'location': {'flags': False}}, False,),
+        (
+            {'storage': {'remote_rate_limit': False}},
+            {'storage': {'upload_rate_limit': False}},
+            False,
+        ),
         (
         (
             {'location': {'repositories': ['foo@bar:/repo']}},
             {'location': {'repositories': ['foo@bar:/repo']}},
             {'location': {'repositories': ['ssh://foo@bar/repo']}},
             {'location': {'repositories': ['ssh://foo@bar/repo']}},