From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp12.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms5.migadu.com with LMTPS id +FxWExpdtGLFiQAAbAwnHQ (envelope-from ) for ; Thu, 23 Jun 2022 14:31:22 +0200 Received: from aspmx1.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp12.migadu.com with LMTPS id gMYeExpdtGIG2wAAauVa8A (envelope-from ) for ; Thu, 23 Jun 2022 14:31:22 +0200 Received: from mail.notmuchmail.org (yantan.tethera.net [135.181.149.255]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id E80AF15AF5 for ; Thu, 23 Jun 2022 14:31:21 +0200 (CEST) Received: from yantan.tethera.net (localhost [127.0.0.1]) by mail.notmuchmail.org (Postfix) with ESMTP id D9E2E5F767; Thu, 23 Jun 2022 12:31:16 +0000 (UTC) Received: from fethera.tethera.net (fethera.tethera.net [198.245.60.197]) by mail.notmuchmail.org (Postfix) with ESMTP id 941735F6DA for ; Thu, 23 Jun 2022 12:31:13 +0000 (UTC) Received: by fethera.tethera.net (Postfix, from userid 1001) id DA17C5FBD7; Thu, 23 Jun 2022 08:31:12 -0400 (EDT) Received: (nullmailer pid 1287101 invoked by uid 1000); Thu, 23 Jun 2022 12:31:10 -0000 From: David Bremner To: notmuch@notmuchmail.org Subject: [PATCH 2/2] CLI/git: add --format-version argument to init subcommand Date: Thu, 23 Jun 2022 09:30:45 -0300 Message-Id: <20220623123044.1283154-3-david@tethera.net> X-Mailer: git-send-email 2.35.2 In-Reply-To: <20220623123044.1283154-1-david@tethera.net> References: <20220623123044.1283154-1-david@tethera.net> MIME-Version: 1.0 Message-ID-Hash: LJXJUS4AVMUX2ZVUC3DP5CFZLZIN6LV7 X-Message-ID-Hash: LJXJUS4AVMUX2ZVUC3DP5CFZLZIN6LV7 X-MailFrom: bremner@tethera.net X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-notmuch.notmuchmail.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.3 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Migadu-Flow: FLOW_IN X-Migadu-To: larch@yhetil.org X-Migadu-Country: DE ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1655987482; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-owner:list-unsubscribe:list-subscribe:list-post; bh=czNJ9B79zuuzHkph47Rr3oryaxbo98KWpEEYYGs57Bg=; b=CYXmFRRqBX7ztR+ijNvu8hAKr0ZDYlx7OSeCbxd/Z2bnWX0eXHybNybBWqULMO1oVyyHie 5bW53behohCo+impE77zvHck0Eng7dDZ0vpzkhPl/V/0UFUl2JVC5a7ojxBHjrSiKjIlus tDqdgidaxPdj4mSPBtX9DwJzA4h2G0PKsgXsjU9Cecd09am8upwAZcRgl3kMXZI6mrTqL2 0QeOrQZA47UjbJJb1olsqoGWalR34yujxzH7bn+P4XdkihHLawMiG5n0fBerYiMiMm3ITi /zSyYAawge95H5Tf24R9VIGoowYk1n08UoKzBCzsNKAHXZso98jNXpRKd6kjcw== ARC-Seal: i=1; s=key1; d=yhetil.org; t=1655987482; a=rsa-sha256; cv=none; b=BqD7ge5aQ0p0Cp3tgxBI3eBA7aUxykPu/xx1rY8P0zTxe4zJPjc2KzRvVyBNNSUsHv1lGn KaC1fL+4Z8kRqxFwgwY6O2JnLhVGDDDjsSAZlEhexzNOyBDhxvEhJpCePr7IsacdbQRDWc +aH0moZnwZFqcJa3ZVCcMDrU5juVtUujEZBAG9lO8T+HE4V0+3Pd0LtPpFa5VYecH2kDoQ q3qYX6Yh4WJWCXc39mbceRylPFXcHE+B6bsl9i3uBn+UgM9pY0t0QQGbUA48C8zdvJqUCV FtyQ4O14bp+KYclr2Q/Bsyl5JBj18DpCSOJd35Psc17fxCYVfnmJwa0tlcNz4g== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=none; dmarc=none; spf=pass (aspmx1.migadu.com: domain of notmuch-bounces@notmuchmail.org designates 135.181.149.255 as permitted sender) smtp.mailfrom=notmuch-bounces@notmuchmail.org X-Migadu-Spam-Score: -1.65 Authentication-Results: aspmx1.migadu.com; dkim=none; dmarc=none; spf=pass (aspmx1.migadu.com: domain of notmuch-bounces@notmuchmail.org designates 135.181.149.255 as permitted sender) smtp.mailfrom=notmuch-bounces@notmuchmail.org X-Migadu-Queue-Id: E80AF15AF5 X-Spam-Score: -1.65 X-Migadu-Scanner: scn0.migadu.com X-TUID: tE3xWb/RZBuB This is primarily intended to support testing upward compatibility with legacy repos. --- doc/man1/notmuch-git.rst | 8 ++++++- notmuch-git.py | 43 ++++++++++++++++++++++++++----------- test/T850-git.sh | 46 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 13 deletions(-) diff --git a/doc/man1/notmuch-git.rst b/doc/man1/notmuch-git.rst index 389371bf..76fa9625 100644 --- a/doc/man1/notmuch-git.rst +++ b/doc/man1/notmuch-git.rst @@ -125,13 +125,19 @@ Fetch changes from the remote repository. Show brief help for an `notmuch git` command. -.. option:: init +.. option:: init [--format-version=N] Create an empty `notmuch git` repository. This wraps 'git init' with a few extra steps to support subsequent status and commit commands. + .. describe:: --format-version=N + + Create a repo in format version N. By default :any:`notmuch-git` + uses the highest supported version, which is the best choice for + most use-cases. + .. option:: log [arg ...] A wrapper for 'git log'. diff --git a/notmuch-git.py b/notmuch-git.py index 8781e3d1..b3ae044e 100644 --- a/notmuch-git.py +++ b/notmuch-git.py @@ -46,7 +46,7 @@ _LOG.addHandler(_logging.StreamHandler()) NOTMUCH_GIT_DIR = None TAG_PREFIX = None -FORMAT_VERSION = 0 +FORMAT_VERSION = 1 _HEX_ESCAPE_REGEX = _re.compile('%[0-9A-F]{2}') _TAG_DIRECTORY = 'tags/' @@ -452,7 +452,7 @@ def fetch(remote=None): _git(args=args, wait=True) -def init(remote=None): +def init(remote=None,format_version=None): """ Create an empty nmbug repository. @@ -466,22 +466,34 @@ def init(remote=None): except FileExistsError: pass + if not format_version: + format_version = 1 + + format_version=int(format_version) + + if format_version > 1 or format_version < 0: + _LOG.error("Illegal format version {:d}".format(format_version)) + _sys.exit(1) + _spawn(args=['git', '--git-dir', NOTMUCH_GIT_DIR, 'init', '--initial-branch=master', '--quiet', '--bare'], wait=True) _git(args=['config', 'core.logallrefupdates', 'true'], wait=True) # create an empty blob (e69de29bb2d1d6434b8b29ae775ad8c2e48c5391) _git(args=['hash-object', '-w', '--stdin'], input='', wait=True) - # create a blob for the FORMAT file - (status, stdout, _) = _git(args=['hash-object', '-w', '--stdin'], stdout=_subprocess.PIPE, - input='1\n', wait=True) - verhash=stdout.rstrip() - _LOG.debug('hash of FORMAT blob = {:s}'.format(verhash)) - # Add FORMAT to the index - _git(args=['update-index', '--add', '--cacheinfo', '100644,{:s},FORMAT'.format(verhash)], wait=True) - + allow_empty=('--allow-empty',) + if format_version >= 1: + allow_empty=() + # create a blob for the FORMAT file + (status, stdout, _) = _git(args=['hash-object', '-w', '--stdin'], stdout=_subprocess.PIPE, + input='{:d}\n'.format(format_version), wait=True) + verhash=stdout.rstrip() + _LOG.debug('hash of FORMAT blob = {:s}'.format(verhash)) + # Add FORMAT to the index + _git(args=['update-index', '--add', '--cacheinfo', '100644,{:s},FORMAT'.format(verhash)], wait=True) + _git( args=[ - 'commit', '-m', 'Start a new notmuch-git repository' + 'commit', *allow_empty, '-m', 'Start a new notmuch-git repository' ], additional_env={'GIT_WORK_TREE': NOTMUCH_GIT_DIR}, wait=True) @@ -1043,6 +1055,11 @@ if __name__ == '__main__': subparser.add_argument( 'command', metavar='COMMAND', nargs='?', help='The command to show help for.') + elif command == 'init': + subparser.add_argument( + '--format-version', metavar='VERSION', + default = None, + help='create format VERSION repository.') elif command == 'log': subparser.add_argument( 'args', metavar='ARG', nargs='*', @@ -1139,7 +1156,9 @@ if __name__ == '__main__': _LOG.debug('prefix = {:s}'.format(TAG_PREFIX)) _LOG.debug('repository = {:s}'.format(NOTMUCH_GIT_DIR)) - FORMAT_VERSION = read_format_version() + if args.func != init: + FORMAT_VERSION = read_format_version() + _LOG.debug('FORMAT_VERSION={:d}'.format(FORMAT_VERSION)) if args.func == help: diff --git a/test/T850-git.sh b/test/T850-git.sh index 342cc31b..81400328 100755 --- a/test/T850-git.sh +++ b/test/T850-git.sh @@ -347,4 +347,50 @@ prefix = test:: EOF test_expect_equal_file EXPECTED OUTPUT +test_begin_subtest "default version is 1" +notmuch git -l debug -C default-version.git init +output=$(git -C default-version.git cat-file blob HEAD:FORMAT) +test_expect_equal "${output}" 1 + +test_begin_subtest "illegal version" +test_expect_code 1 "notmuch git -l debug -C default-version.git init --format-version=42" + +hash=("" "8d/c3/") # for use in synthetic repo contents. +for ver in {0..1}; do + test_begin_subtest "init version=${ver}" + notmuch git -C version-${ver}.git -p "test${ver}::" init --format-version=${ver} + output=$(git -C version-${ver}.git ls-tree -r --name-only HEAD) + expected=("" "FORMAT") + test_expect_equal "${output}" "${expected[${ver}]}" + + test_begin_subtest "initial commit version=${ver}" + notmuch tag "+test${ver}::a" "+test${ver}::b" id:20091117190054.GU3165@dottiness.seas.harvard.edu + notmuch git -C version-${ver}.git -p "test${ver}::" commit --force + git -C version-${ver}.git ls-tree -r --name-only HEAD | grep -v FORMAT > OUTPUT +cat < EXPECTED +tags/${hash[${ver}]}20091117190054.GU3165@dottiness.seas.harvard.edu/a +tags/${hash[${ver}]}20091117190054.GU3165@dottiness.seas.harvard.edu/b +EOF + test_expect_equal_file_nonempty EXPECTED OUTPUT + + test_begin_subtest "second commit repo=${ver}" + notmuch tag "+test${ver}::c" "+test${ver}::d" id:20091117190054.GU3165@dottiness.seas.harvard.edu + notmuch git -C version-${ver}.git -p "test${ver}::" commit --force + git -C version-${ver}.git ls-tree -r --name-only HEAD | grep -v FORMAT > OUTPUT +cat < EXPECTED +tags/${hash[$ver]}20091117190054.GU3165@dottiness.seas.harvard.edu/a +tags/${hash[$ver]}20091117190054.GU3165@dottiness.seas.harvard.edu/b +tags/${hash[$ver]}20091117190054.GU3165@dottiness.seas.harvard.edu/c +tags/${hash[$ver]}20091117190054.GU3165@dottiness.seas.harvard.edu/d +EOF + test_expect_equal_file_nonempty EXPECTED OUTPUT + + test_begin_subtest "checkout repo=${ver} " + notmuch dump > BEFORE + notmuch tag -test::${ver}::a '*' + notmuch git -C version-${ver}.git -p "test${ver}::" checkout --force + notmuch dump > AFTER + test_expect_equal_file_nonempty BEFORE AFTER +done + test_done -- 2.35.2