mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-24 11:58:10 +01:00
CLI/git: add --format-version argument to init subcommand
This is primarily intended to support testing upward compatibility with legacy repos.
This commit is contained in:
parent
6219e7380a
commit
bf5eacbe7e
3 changed files with 83 additions and 12 deletions
|
@ -125,13 +125,19 @@ Fetch changes from the remote repository.
|
||||||
|
|
||||||
Show brief help for an `notmuch git` command.
|
Show brief help for an `notmuch git` command.
|
||||||
|
|
||||||
.. option:: init
|
.. option:: init [--format-version=N]
|
||||||
|
|
||||||
Create an empty `notmuch git` repository.
|
Create an empty `notmuch git` repository.
|
||||||
|
|
||||||
This wraps 'git init' with a few extra steps to support subsequent
|
This wraps 'git init' with a few extra steps to support subsequent
|
||||||
status and commit commands.
|
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 ...]
|
.. option:: log [arg ...]
|
||||||
|
|
||||||
A wrapper for 'git log'.
|
A wrapper for 'git log'.
|
||||||
|
|
|
@ -46,7 +46,7 @@ _LOG.addHandler(_logging.StreamHandler())
|
||||||
|
|
||||||
NOTMUCH_GIT_DIR = None
|
NOTMUCH_GIT_DIR = None
|
||||||
TAG_PREFIX = None
|
TAG_PREFIX = None
|
||||||
FORMAT_VERSION = 0
|
FORMAT_VERSION = 1
|
||||||
|
|
||||||
_HEX_ESCAPE_REGEX = _re.compile('%[0-9A-F]{2}')
|
_HEX_ESCAPE_REGEX = _re.compile('%[0-9A-F]{2}')
|
||||||
_TAG_DIRECTORY = 'tags/'
|
_TAG_DIRECTORY = 'tags/'
|
||||||
|
@ -452,7 +452,7 @@ def fetch(remote=None):
|
||||||
_git(args=args, wait=True)
|
_git(args=args, wait=True)
|
||||||
|
|
||||||
|
|
||||||
def init(remote=None):
|
def init(remote=None,format_version=None):
|
||||||
"""
|
"""
|
||||||
Create an empty notmuch-git repository.
|
Create an empty notmuch-git repository.
|
||||||
|
|
||||||
|
@ -466,22 +466,34 @@ def init(remote=None):
|
||||||
except FileExistsError:
|
except FileExistsError:
|
||||||
pass
|
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',
|
_spawn(args=['git', '--git-dir', NOTMUCH_GIT_DIR, 'init',
|
||||||
'--initial-branch=master', '--quiet', '--bare'], wait=True)
|
'--initial-branch=master', '--quiet', '--bare'], wait=True)
|
||||||
_git(args=['config', 'core.logallrefupdates', 'true'], wait=True)
|
_git(args=['config', 'core.logallrefupdates', 'true'], wait=True)
|
||||||
# create an empty blob (e69de29bb2d1d6434b8b29ae775ad8c2e48c5391)
|
# create an empty blob (e69de29bb2d1d6434b8b29ae775ad8c2e48c5391)
|
||||||
_git(args=['hash-object', '-w', '--stdin'], input='', wait=True)
|
_git(args=['hash-object', '-w', '--stdin'], input='', wait=True)
|
||||||
# create a blob for the FORMAT file
|
allow_empty=('--allow-empty',)
|
||||||
(status, stdout, _) = _git(args=['hash-object', '-w', '--stdin'], stdout=_subprocess.PIPE,
|
if format_version >= 1:
|
||||||
input='1\n', wait=True)
|
allow_empty=()
|
||||||
verhash=stdout.rstrip()
|
# create a blob for the FORMAT file
|
||||||
_LOG.debug('hash of FORMAT blob = {:s}'.format(verhash))
|
(status, stdout, _) = _git(args=['hash-object', '-w', '--stdin'], stdout=_subprocess.PIPE,
|
||||||
# Add FORMAT to the index
|
input='{:d}\n'.format(format_version), wait=True)
|
||||||
_git(args=['update-index', '--add', '--cacheinfo', '100644,{:s},FORMAT'.format(verhash)], 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(
|
_git(
|
||||||
args=[
|
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},
|
additional_env={'GIT_WORK_TREE': NOTMUCH_GIT_DIR},
|
||||||
wait=True)
|
wait=True)
|
||||||
|
@ -1043,6 +1055,11 @@ if __name__ == '__main__':
|
||||||
subparser.add_argument(
|
subparser.add_argument(
|
||||||
'command', metavar='COMMAND', nargs='?',
|
'command', metavar='COMMAND', nargs='?',
|
||||||
help='The command to show help for.')
|
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':
|
elif command == 'log':
|
||||||
subparser.add_argument(
|
subparser.add_argument(
|
||||||
'args', metavar='ARG', nargs='*',
|
'args', metavar='ARG', nargs='*',
|
||||||
|
@ -1139,7 +1156,9 @@ if __name__ == '__main__':
|
||||||
_LOG.debug('prefix = {:s}'.format(TAG_PREFIX))
|
_LOG.debug('prefix = {:s}'.format(TAG_PREFIX))
|
||||||
_LOG.debug('repository = {:s}'.format(NOTMUCH_GIT_DIR))
|
_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))
|
_LOG.debug('FORMAT_VERSION={:d}'.format(FORMAT_VERSION))
|
||||||
|
|
||||||
if args.func == help:
|
if args.func == help:
|
||||||
|
|
|
@ -347,4 +347,50 @@ prefix = test::
|
||||||
EOF
|
EOF
|
||||||
test_expect_equal_file EXPECTED OUTPUT
|
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
|
test_done
|
||||||
|
|
Loading…
Reference in a new issue