2
0
Antoine Beaupré 9 жил өмнө
parent
commit
a5f32b0a27
1 өөрчлөгдсөн 47 нэмэгдсэн , 0 устгасан
  1. 47 0
      borg/archiver.py

+ 47 - 0
borg/archiver.py

@@ -17,6 +17,7 @@ import traceback
 from . import __version__
 from .archive import Archive, ArchiveChecker, CHUNKER_PARAMS
 from .compress import Compressor, COMPR_BUFFER
+from .converter import AtticRepositoryConverter, NotImplementedException
 from .repository import Repository
 from .cache import Cache
 from .key import key_creator
@@ -462,6 +463,15 @@ Type "Yes I am sure" if you understand this and want to continue.\n""")
             stats.print_('Deleted data:', cache)
         return self.exit_code
 
+    def do_convert(self, parser, commands, args):
+        '''convert a repository from attic to borg'''
+        repo = AtticRepositoryConverter(os.path.join(args.repository, 'repository'), create=False)
+        try:
+            repo.convert(args.dry_run)
+        except NotImplementedException as e:
+            print("warning: %s" % e)
+        return self.exit_code
+
     helptext = {}
     helptext['patterns'] = '''
         Exclude patterns use a variant of shell pattern syntax, with '*' matching any
@@ -896,6 +906,43 @@ Type "Yes I am sure" if you understand this and want to continue.\n""")
                                type=location_validator(archive=False),
                                help='repository to prune')
 
+        convert_epilog = textwrap.dedent("""
+        convert will convert an existing Attic repository to Borg in place.
+
+        it will change the magic numbers in the repository's segments
+        to match the new Borg magic numbers. the keyfiles found in
+        $ATTIC_KEYS_DIR or ~/.attic/keys/ will also be converted and
+        copied to $BORG_KEYS_DIR or ~/.borg/keys.
+
+        the cache files are *not* currently converted, which will
+        result in a much longer backup the first time. you can run
+        `borg check --repair` to rebuild those files after the
+        conversion.
+
+        the conversion can IRREMEDIABLY DAMAGE YOUR REPOSITORY! Attic
+        will also NOT BE ABLE TO READ THE BORG REPOSITORY ANYMORE, as
+        the magic numbers will have changed.
+
+        it is recommended you run this on a copy of the Attic
+        repository, in case something goes wrong, for example:
+
+        cp -a attic borg
+        borg convert -n borg
+        borg convert borg
+
+        you have been warned.""")
+        subparser = subparsers.add_parser('convert', parents=[common_parser],
+                                          description=self.do_convert.__doc__,
+                                          epilog=convert_epilog,
+                                          formatter_class=argparse.RawDescriptionHelpFormatter)
+        subparser.set_defaults(func=self.do_convert)
+        subparser.add_argument('-n', '--dry-run', dest='dry_run',
+                               default=False, action='store_true',
+                               help='do not change repository')
+        subparser.add_argument('repository', metavar='REPOSITORY', nargs='?', default='',
+                               type=location_validator(archive=False),
+                               help='path to the attic repository to be converted')
+
         subparser = subparsers.add_parser('help', parents=[common_parser],
                                           description='Extra help')
         subparser.add_argument('--epilog-only', dest='epilog_only',