From 575f858c7aa6c1d84ecdb881dffeec5a18ddb703 Mon Sep 17 00:00:00 2001 From: Mohamed Khaled <85366709+Bondo2-1@users.noreply.github.com> Date: Sat, 1 Aug 2026 17:40:59 +0300 Subject: [PATCH] version: add --json output, fixes #9993 --- docs/usage/version.rst.inc | 18 +++++++++++----- src/borg/archiver/version_cmd.py | 11 +++++++++- .../testsuite/archiver/version_cmd_test.py | 21 +++++++++++++++++++ 3 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 src/borg/testsuite/archiver/version_cmd_test.py diff --git a/docs/usage/version.rst.inc b/docs/usage/version.rst.inc index 711addc4bf..9f56303b09 100644 --- a/docs/usage/version.rst.inc +++ b/docs/usage/version.rst.inc @@ -12,11 +12,15 @@ borg version .. class:: borg-options-table - +-------------------------------------------------------+ - | .. class:: borg-common-opt-ref | - | | - | :ref:`common_options` | - +-------------------------------------------------------+ + +-------------------------------------------------------+------------+-----------------------+ + | **options** | + +-------------------------------------------------------+------------+-----------------------+ + | | ``--json`` | format output as JSON | + +-------------------------------------------------------+------------+-----------------------+ + | .. class:: borg-common-opt-ref | + | | + | :ref:`common_options` | + +-------------------------------------------------------+------------+-----------------------+ .. raw:: html @@ -30,6 +34,10 @@ borg version + options + --json format output as JSON + + :ref:`common_options` | diff --git a/src/borg/archiver/version_cmd.py b/src/borg/archiver/version_cmd.py index df5a6f5893..7ca95b312b 100644 --- a/src/borg/archiver/version_cmd.py +++ b/src/borg/archiver/version_cmd.py @@ -1,5 +1,6 @@ from .. import __version__ from ..constants import * # NOQA +from ..helpers import json_print from ..helpers.argparsing import ArgumentParser from ..logger import create_logger @@ -20,7 +21,14 @@ def do_version(self, args): server_version = repository.server_version else: server_version = client_version - print(f"{format_version(client_version)} / {format_version(server_version)}") + + formatted_client_version = format_version(client_version) + formatted_server_version = format_version(server_version) + if args.json: + version_info = {"client": formatted_client_version, "server": formatted_server_version} + json_print(version_info) + else: + print(f"{formatted_client_version} / {formatted_server_version}") def build_parser_version(self, subparsers, common_parser, mid_common_parser): from ._common import process_epilog @@ -53,3 +61,4 @@ def build_parser_version(self, subparsers, common_parser, mid_common_parser): ) subparser = ArgumentParser(parents=[common_parser], description=self.do_version.__doc__, epilog=version_epilog) subparsers.add_subcommand("version", subparser, help="display the Borg client and server versions") + subparser.add_argument("--json", action="store_true", help="format output as JSON") diff --git a/src/borg/testsuite/archiver/version_cmd_test.py b/src/borg/testsuite/archiver/version_cmd_test.py new file mode 100644 index 0000000000..931e016742 --- /dev/null +++ b/src/borg/testsuite/archiver/version_cmd_test.py @@ -0,0 +1,21 @@ +import json + +from ... import __version__ +from ...version import format_version, parse_version +from . import cmd + + +EXPECTED_VERSION = format_version(parse_version(__version__)) + + +def test_version(archiver): + output = cmd(archiver, "version") + + assert output == f"{EXPECTED_VERSION} / {EXPECTED_VERSION}\n" + + +def test_version_json(archiver): + output = cmd(archiver, "version", "--json") + version_info = json.loads(output) + + assert version_info == {"client": EXPECTED_VERSION, "server": EXPECTED_VERSION}