Преглед изворни кода

Merge pull request #8053 from ThomasWaldmann/remote-version-1.4

implement "borg version", fixes #7829
TW пре 1 година
родитељ
комит
266c9f6e8f
1 измењених фајлова са 45 додато и 0 уклоњено
  1. 45 0
      src/borg/archiver.py

+ 45 - 0
src/borg/archiver.py

@@ -288,6 +288,17 @@ class Archiver:
             storage_quota=args.storage_quota,
         ).serve()
 
+    def do_version(self, args):
+        """Display the borg client / borg server version"""
+        from borg.version import parse_version, format_version
+        client_version = parse_version(__version__)
+        if args.location.proto == 'ssh':
+            with RemoteRepository(args.location.omit_archive(), lock=False, args=args) as repository:
+                server_version = repository.server_version
+        else:
+            server_version = client_version
+        print(f"{format_version(client_version)} / {format_version(server_version)}")
+
     @with_repository(create=True, exclusive=True, manifest=False)
     def do_init(self, args, repository):
         """Initialize an empty repository"""
@@ -4134,6 +4145,40 @@ class Archiver:
                                help='format output as JSON')
         define_archive_filters_group(subparser)
 
+        # borg version
+        version_epilog = process_epilog("""
+        This command displays the borg client version / borg server version.
+
+        If a local repo is given, the client code directly accesses the repository,
+        thus we show the client version also as the server version.
+
+        If a remote repo is given (e.g. ssh:), the remote borg is queried and
+        its version is displayed as the server version.
+
+        Examples::
+
+            # local repo (client uses 1.4.0 alpha version)
+            $ borg version /mnt/backup
+            1.4.0a / 1.4.0a
+
+            # remote repo (client uses 1.4.0 alpha, server uses 1.2.7 release)
+            $ borg version ssh://borg@borgbackup:repo
+            1.4.0a / 1.2.7
+
+        Due to the version tuple format used in borg client/server negotiation, only
+        a simplified version is displayed (as provided by borg.version.format_version).
+
+        There is also borg --version to display a potentially more precise client version.
+        """)
+        subparser = subparsers.add_parser('version', parents=[common_parser], add_help=False,
+                                          description=self.do_version.__doc__, epilog=version_epilog,
+                                          formatter_class=argparse.RawDescriptionHelpFormatter,
+                                          help='display borg client version / borg server version')
+        subparser.set_defaults(func=self.do_version)
+        subparser.add_argument('location', metavar='REPOSITORY', nargs='?', default='',
+                               type=location_validator(archive=False),
+                               help='repository (used to determine client/server situation)')
+
         # borg init
         init_epilog = process_epilog("""
         This command initializes an empty repository. A repository is a filesystem