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 <<EOF > 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 <<EOF > 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
_______________________________________________
notmuch mailing list -- notmuch@notmuchmail.org
To unsubscribe send an email to notmuch-leave@notmuchmail.org