]> git.ipfire.org Git - thirdparty/git.git/log
thirdparty/git.git
4 years agoMerge branch 'ma/doc-git-version' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:34 +0000 (13:51 -0700)] 
Merge branch 'ma/doc-git-version' into maint

Doc update.

* ma/doc-git-version:
  documentation: add documentation for 'git version'

4 years agoMerge branch 'rs/drop-core-compression-vars' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:33 +0000 (13:51 -0700)] 
Merge branch 'rs/drop-core-compression-vars' into maint

Code clean-up.

* rs/drop-core-compression-vars:
  compression: drop write-only core_compression_* variables

4 years agoMerge branch 'jk/t5562-racefix' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:33 +0000 (13:51 -0700)] 
Merge branch 'jk/t5562-racefix' into maint

Test update.

* jk/t5562-racefix:
  t5562: use alarm() to interrupt timed child-wait

4 years agoMerge branch 'rs/setup-use-xopen-and-xdup' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:33 +0000 (13:51 -0700)] 
Merge branch 'rs/setup-use-xopen-and-xdup' into maint

Code clean-up.

* rs/setup-use-xopen-and-xdup:
  setup: use xopen and xdup in sanitize_stdfds

4 years agoMerge branch 'jc/prefix-filename-allocates' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:32 +0000 (13:51 -0700)] 
Merge branch 'jc/prefix-filename-allocates' into maint

Leakfix.

* jc/prefix-filename-allocates:
  hash-object: prefix_filename() returns allocated memory these days

4 years agoMerge branch 'ab/no-more-check-bindir' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:32 +0000 (13:51 -0700)] 
Merge branch 'ab/no-more-check-bindir' into maint

Build simplification.

* ab/no-more-check-bindir:
  Makefile: remove the check_bindir script

4 years agoMerge branch 'bs/doc-bugreport-outdir' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:32 +0000 (13:51 -0700)] 
Merge branch 'bs/doc-bugreport-outdir' into maint

Docfix.

* bs/doc-bugreport-outdir:
  Documentation: fix default directory of git bugreport -o

4 years agoMerge branch 'cb/ci-build-pedantic' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:31 +0000 (13:51 -0700)] 
Merge branch 'cb/ci-build-pedantic' into maint

CI update.

* cb/ci-build-pedantic:
  ci: run a pedantic build as part of the GitHub workflow

4 years agoMerge branch 'rs/archive-use-object-id' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:31 +0000 (13:51 -0700)] 
Merge branch 'rs/archive-use-object-id' into maint

Code cleanup.

* rs/archive-use-object-id:
  archive: convert queue_directory to struct object_id

4 years agoMerge branch 'rs/show-branch-simplify' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:31 +0000 (13:51 -0700)] 
Merge branch 'rs/show-branch-simplify' into maint

Code cleanup.

* rs/show-branch-simplify:
  show-branch: simplify rev_is_head()

4 years agoMerge branch 'cb/remote-ndebug-fix' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:30 +0000 (13:51 -0700)] 
Merge branch 'cb/remote-ndebug-fix' into maint

Build fix.

* cb/remote-ndebug-fix:
  remote: avoid -Wunused-but-set-variable in gcc with -DNDEBUG

4 years agoMerge branch 'ab/mailmap-leakfix' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:30 +0000 (13:51 -0700)] 
Merge branch 'ab/mailmap-leakfix' into maint

Leakfix.

* ab/mailmap-leakfix:
  mailmap.c: fix a memory leak in free_mailap_{info,entry}()

4 years agoMerge branch 'ab/gc-log-rephrase' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:30 +0000 (13:51 -0700)] 
Merge branch 'ab/gc-log-rephrase' into maint

A pathname in an advice message has been made cut-and-paste ready.

* ab/gc-log-rephrase:
  gc: remove trailing dot from "gc.log" line

4 years agoMerge branch 'ba/object-info' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:29 +0000 (13:51 -0700)] 
Merge branch 'ba/object-info' into maint

Leakfix.

* ba/object-info:
  protocol-caps.c: fix memory leak in send_info()

4 years agoMerge branch 'es/walken-tutorial-fix' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:29 +0000 (13:51 -0700)] 
Merge branch 'es/walken-tutorial-fix' into maint

Typofix.

* es/walken-tutorial-fix:
  doc: fix syntax error and the format of printf

4 years agoMerge branch 'rs/xopen-reports-open-failures' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:28 +0000 (13:51 -0700)] 
Merge branch 'rs/xopen-reports-open-failures' into maint

Error diagnostics improvement.

* rs/xopen-reports-open-failures:
  use xopen() to handle fatal open(2) failures
  xopen: explicitly report creation failures

4 years agoMerge branch 'dd/t6300-wo-gpg-fix' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:28 +0000 (13:51 -0700)] 
Merge branch 'dd/t6300-wo-gpg-fix' into maint

Test fix.

* dd/t6300-wo-gpg-fix:
  t6300: check for cat-file exit status code
  t6300: don't run cat-file on non-existent object

4 years agoMerge branch 'mh/credential-leakfix' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:28 +0000 (13:51 -0700)] 
Merge branch 'mh/credential-leakfix' into maint

Leak fix.

* mh/credential-leakfix:
  credential: fix leak in credential_apply_config()

4 years agoMerge branch 'jk/t5323-no-pack-test-fix' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:27 +0000 (13:51 -0700)] 
Merge branch 'jk/t5323-no-pack-test-fix' into maint

Test fix.

* jk/t5323-no-pack-test-fix:
  t5323: drop mentions of "master"

4 years agoMerge branch 'js/maintenance-launchctl-fix' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:27 +0000 (13:51 -0700)] 
Merge branch 'js/maintenance-launchctl-fix' into maint

"git maintenance" scheduler fix for macOS.

* js/maintenance-launchctl-fix:
  maintenance: skip bootout/bootstrap when plist is registered
  maintenance: create `launchctl` configuration using a lock file

4 years agoMerge branch 'ab/rebase-fatal-fatal-fix' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:27 +0000 (13:51 -0700)] 
Merge branch 'ab/rebase-fatal-fatal-fix' into maint

Error message fix.

* ab/rebase-fatal-fatal-fix:
  rebase: emit one "fatal" in "fatal: fatal: <error>"

4 years agoMerge branch 'ab/ls-remote-packet-trace' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:26 +0000 (13:51 -0700)] 
Merge branch 'ab/ls-remote-packet-trace' into maint

Debugging aid fix.

* ab/ls-remote-packet-trace:
  ls-remote: set packet_trace_identity(<name>)

4 years agoMerge branch 'ga/send-email-sendmail-cmd' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:26 +0000 (13:51 -0700)] 
Merge branch 'ga/send-email-sendmail-cmd' into maint

Test fix.

* ga/send-email-sendmail-cmd:
  t9001: PATH must not use Windows-style paths

4 years agoMerge branch 'me/t5582-cleanup' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:25 +0000 (13:51 -0700)] 
Merge branch 'me/t5582-cleanup' into maint

Test fix.

* me/t5582-cleanup:
  t5582: remove spurious 'cd "$D"' line

4 years agoMerge branch 'sg/make-fix-ar-invocation' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:25 +0000 (13:51 -0700)] 
Merge branch 'sg/make-fix-ar-invocation' into maint

Build fix.

* sg/make-fix-ar-invocation:
  Makefile: remove archives before manipulating them with 'ar'

4 years agoMerge branch 'ti/tcsh-completion-regression-fix' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:24 +0000 (13:51 -0700)] 
Merge branch 'ti/tcsh-completion-regression-fix' into maint

Update to the command line completion (in contrib/) for tcsh.

* ti/tcsh-completion-regression-fix:
  completion: tcsh: Fix regression by drop of wrapper functions

4 years agoMerge branch 'fc/completion-updates' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:24 +0000 (13:51 -0700)] 
Merge branch 'fc/completion-updates' into maint

Command line completion updates.

* fc/completion-updates:
  completion: bash: add correct suffix in variables
  completion: bash: fix for multiple dash commands
  completion: bash: fix for suboptions with value
  completion: bash: fix prefix detection in branch.*

4 years agoMerge branch 'cb/ci-freebsd-update' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:24 +0000 (13:51 -0700)] 
Merge branch 'cb/ci-freebsd-update' into maint

Update FreeBSD CI job

* cb/ci-freebsd-update:
  ci: update freebsd 12 cirrus job

4 years agoMerge branch 'cb/builtin-merge-format-string-fix' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:23 +0000 (13:51 -0700)] 
Merge branch 'cb/builtin-merge-format-string-fix' into maint

Code clean-up.

* cb/builtin-merge-format-string-fix:
  builtin/merge: avoid -Wformat-extra-args from ancient Xcode

4 years agoMerge branch 'js/log-protocol-version' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:22 +0000 (13:51 -0700)] 
Merge branch 'js/log-protocol-version' into maint

Debugging aid.

* js/log-protocol-version:
  connect, protocol: log negotiated protocol version

4 years agoMerge branch 'en/merge-strategy-docs' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:22 +0000 (13:51 -0700)] 
Merge branch 'en/merge-strategy-docs' into maint

Documentation updates.

* en/merge-strategy-docs:
  Update error message and code comment
  merge-strategies.txt: add coverage of the `ort` merge strategy
  git-rebase.txt: correct out-of-date and misleading text about renames
  merge-strategies.txt: fix simple capitalization error
  merge-strategies.txt: avoid giving special preference to patience algorithm
  merge-strategies.txt: do not imply using copy detection is desired
  merge-strategies.txt: update wording for the resolve strategy
  Documentation: edit awkward references to `git merge-recursive`
  directory-rename-detection.txt: small updates due to merge-ort optimizations
  git-rebase.txt: correct antiquated claims about --rebase-merges

4 years agoMerge branch 'ab/bundle-doc' into maint
Junio C Hamano [Tue, 12 Oct 2021 20:51:22 +0000 (13:51 -0700)] 
Merge branch 'ab/bundle-doc' into maint

Doc update.

* ab/bundle-doc:
  bundle doc: replace "basis" with "prerequsite(s)"
  bundle doc: elaborate on rev<->ref restriction
  bundle doc: elaborate on object prerequisites
  bundle doc: rewrite the "DESCRIPTION" section

4 years agoadd: don't write objects with --dry-run
René Scharfe [Tue, 12 Oct 2021 19:15:50 +0000 (21:15 +0200)] 
add: don't write objects with --dry-run

When the option --dry-run/-n is given, "git add" doesn't change the
index, but still writes out new object files.  Only hash the latter
without writing instead to make the run as dry as possible.

Use this opportunity to also make the hash_flags variable unsigned,
to match the index_path() parameter it is used as.

Reported-by: git.mexon@spamgourmet.com
Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agocommit: fix duplication regression in permission error output
Ævar Arnfjörð Bjarmason [Tue, 12 Oct 2021 14:30:49 +0000 (16:30 +0200)] 
commit: fix duplication regression in permission error output

Fix a regression in the error output emitted when .git/objects can't
be written to. Before 9c4d6c0297b (cache-tree: Write updated
cache-tree after commit, 2014-07-13) we'd emit only one "insufficient
permission" error, now we'll do so again.

The cause is rather straightforward, we've got WRITE_TREE_SILENT for
the use-case of wanting to prepare an index silently, quieting any
permission etc. error output. Then when we attempt to update to
that (possibly broken) index we'll run into the same errors again.

But with 9c4d6c0297b the gap between the cache-tree API and the object
store wasn't closed in terms of asking write_object_file() to be
silent. I.e. post-9c4d6c0297b the first call is to prepare_index(),
and after that we'll call prepare_to_commit(). We only want verbose
error output from the latter.

So let's add and use that facility with a corresponding HASH_SILENT
flag, its only user is cache-tree.c's update_one(), which will set it
if its "WRITE_TREE_SILENT" flag is set.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agounwritable tests: assert exact error output
Ævar Arnfjörð Bjarmason [Tue, 12 Oct 2021 14:30:48 +0000 (16:30 +0200)] 
unwritable tests: assert exact error output

In preparation for fixing a regression where we started emitting some
of these error messages twice, let's assert what the output from "git
commit" and friends is now in the case of permission errors.

As noted in [1] using test_expect_failure to mark up a TODO test has
some unexpected edge cases, e.g. we don't want to break --run=3 by
skipping the "test_lazy_prereq" here. This pattern allows us to test
just the test_cmp (and the "cat", which shouldn't fail) with the added
"test_expect_failure", we'll flip that to a "test_expect_success" in
the next commit.

1. https://lore.kernel.org/git/87tuhmk19c.fsf@evledraar.gmail.com/T/#u

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agossh signing: fmt-merge-msg tests & config parse
Fabian Stelzer [Tue, 12 Oct 2021 09:22:35 +0000 (11:22 +0200)] 
ssh signing: fmt-merge-msg tests & config parse

When merging a signed tag fmt-merge-msg was unable to verify its
validity missing the necessary ssh allowedSignersFile config.

Adds gpg config parsing to fmt-merge-msg.
Adds tests for ssh signed tags to fmt-merge-msg tests.

Signed-off-by: Fabian Stelzer <fs@gigacodes.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoMerge branch 'fs/ssh-signing' into fs/ssh-signing-fix
Junio C Hamano [Tue, 12 Oct 2021 17:35:19 +0000 (10:35 -0700)] 
Merge branch 'fs/ssh-signing' into fs/ssh-signing-fix

* fs/ssh-signing:
  ssh signing: test that gpg fails for unknown keys
  ssh signing: tests for logs, tags & push certs
  ssh signing: duplicate t7510 tests for commits
  ssh signing: verify signatures using ssh-keygen
  ssh signing: provide a textual signing_key_id
  ssh signing: retrieve a default key from ssh-agent
  ssh signing: add ssh key format and signing code
  ssh signing: add test prereqs
  ssh signing: preliminary refactoring and clean-up

4 years agoperf: disable automatic housekeeping
René Scharfe [Sat, 9 Oct 2021 14:39:24 +0000 (16:39 +0200)] 
perf: disable automatic housekeeping

Turn off automatic background maintenance for perf tests by default to
avoid interference with performance measurements.  Do that by using the
new file t/perf/config and using it as the system config file for perf
tests.  Future tests intended to measure gc performance can override
the setting locally or call "git gc" explicitly.

This fixes a breakage in p2000 caused by gc automatically emptying the
reflog due its fake dates from 2005 being older than 90 days.

Helped-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoTwelfth batch
Junio C Hamano [Mon, 11 Oct 2021 17:22:14 +0000 (10:22 -0700)] 
Twelfth batch

Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoMerge branch 'tb/aggregate-ignore-leading-whitespaces'
Junio C Hamano [Mon, 11 Oct 2021 17:21:49 +0000 (10:21 -0700)] 
Merge branch 'tb/aggregate-ignore-leading-whitespaces'

Test portability update.

* tb/aggregate-ignore-leading-whitespaces:
  t/perf/aggregate.perl: tolerate leading spaces

4 years agoMerge branch 'rs/p3400-lose-tac'
Junio C Hamano [Mon, 11 Oct 2021 17:21:49 +0000 (10:21 -0700)] 
Merge branch 'rs/p3400-lose-tac'

Test portability update.

* rs/p3400-lose-tac:
  p3400: stop using tac(1)

4 years agoMerge branch 'mr/bisect-in-c-4'
Junio C Hamano [Mon, 11 Oct 2021 17:21:49 +0000 (10:21 -0700)] 
Merge branch 'mr/bisect-in-c-4'

Message fix.

* mr/bisect-in-c-4:
  bisect--helper: add space between colon and following sentence

4 years agoMerge branch 'da/difftool'
Junio C Hamano [Mon, 11 Oct 2021 17:21:48 +0000 (10:21 -0700)] 
Merge branch 'da/difftool'

Code clean-up in "git difftool".

* da/difftool:
  difftool: add a missing space to the run_dir_diff() comments
  difftool: remove an unnecessary call to strbuf_release()
  difftool: refactor dir-diff to write files using helper functions
  difftool: create a tmpdir path without repeated slashes

4 years agoMerge branch 'ab/designated-initializers'
Junio C Hamano [Mon, 11 Oct 2021 17:21:48 +0000 (10:21 -0700)] 
Merge branch 'ab/designated-initializers'

Code clean-up.

* ab/designated-initializers:
  cbtree.h: define cb_init() in terms of CBTREE_INIT
  *.h: move some *_INIT to designated initializers
  *.h _INIT macros: don't specify fields equal to 0
  *.[ch] *_INIT macros: use { 0 } for a "zero out" idiom
  submodule-config.h: remove unused SUBMODULE_INIT macro

4 years agoMerge branch 'ab/sanitize-leak-ci'
Junio C Hamano [Mon, 11 Oct 2021 17:21:47 +0000 (10:21 -0700)] 
Merge branch 'ab/sanitize-leak-ci'

CI learns to run the leak sanitizer builds.

* ab/sanitize-leak-ci:
  tests: add a test mode for SANITIZE=leak, run it in CI
  Makefile: add SANITIZE=leak flag to GIT-BUILD-OPTIONS

4 years agoMerge branch 'ab/retire-git-config-key-is-valid'
Junio C Hamano [Mon, 11 Oct 2021 17:21:47 +0000 (10:21 -0700)] 
Merge branch 'ab/retire-git-config-key-is-valid'

Code cleanup.

* ab/retire-git-config-key-is-valid:
  config.c: remove unused git_config_key_is_valid()

4 years agoMerge branch 'jk/ref-paranoia'
Junio C Hamano [Mon, 11 Oct 2021 17:21:47 +0000 (10:21 -0700)] 
Merge branch 'jk/ref-paranoia'

The ref iteration code used to optionally allow dangling refs to be
shown, which has been tightened up.

* jk/ref-paranoia:
  refs: drop "broken" flag from for_each_fullref_in()
  ref-filter: drop broken-ref code entirely
  ref-filter: stop setting FILTER_REFS_INCLUDE_BROKEN
  repack, prune: drop GIT_REF_PARANOIA settings
  refs: turn on GIT_REF_PARANOIA by default
  refs: omit dangling symrefs when using GIT_REF_PARANOIA
  refs: add DO_FOR_EACH_OMIT_DANGLING_SYMREFS flag
  refs-internal.h: reorganize DO_FOR_EACH_* flag documentation
  refs-internal.h: move DO_FOR_EACH_* flags next to each other
  t5312: be more assertive about command failure
  t5312: test non-destructive repack
  t5312: create bogus ref as necessary
  t5312: drop "verbose" helper
  t5600: provide detached HEAD for corruption failures
  t5516: don't use HEAD ref for invalid ref-deletion tests
  t7900: clean up some more broken refs

4 years agoMerge branch 'ab/http-pinned-public-key-mismatch'
Junio C Hamano [Mon, 11 Oct 2021 17:21:47 +0000 (10:21 -0700)] 
Merge branch 'ab/http-pinned-public-key-mismatch'

HTTPS error handling updates.

* ab/http-pinned-public-key-mismatch:
  http: check CURLE_SSL_PINNEDPUBKEYNOTMATCH when emitting errors

4 years agoMerge branch 'js/win-lazyload-buildfix'
Junio C Hamano [Mon, 11 Oct 2021 17:21:47 +0000 (10:21 -0700)] 
Merge branch 'js/win-lazyload-buildfix'

Compilation fix.

* js/win-lazyload-buildfix:
  Makefile: restrict -Wpedantic and -Wno-pedantic-ms-format better
  lazyload.h: use an even more generic function pointer than FARPROC
  lazyload.h: fix warnings about mismatching function pointer types

4 years agoMerge branch 'sg/test-split-index-fix'
Junio C Hamano [Mon, 11 Oct 2021 17:21:47 +0000 (10:21 -0700)] 
Merge branch 'sg/test-split-index-fix'

Test updates.

* sg/test-split-index-fix:
  read-cache: fix GIT_TEST_SPLIT_INDEX
  tests: disable GIT_TEST_SPLIT_INDEX for sparse index tests
  read-cache: look for shared index files next to the index, too
  t1600-index: disable GIT_TEST_SPLIT_INDEX
  t1600-index: don't run git commands upstream of a pipe
  t1600-index: remove unnecessary redirection

4 years agoMerge branch 'tb/midx-write-propagate-namehash'
Junio C Hamano [Mon, 11 Oct 2021 17:21:46 +0000 (10:21 -0700)] 
Merge branch 'tb/midx-write-propagate-namehash'

"git multi-pack-index write --bitmap" learns to propagate the
hashcache from original bitmap to resulting bitmap.

* tb/midx-write-propagate-namehash:
  t5326: test propagating hashcache values
  p5326: generate pack bitmaps before writing the MIDX bitmap
  p5326: don't set core.multiPackIndex unnecessarily
  p5326: create missing 'perf-tag' tag
  midx.c: respect 'pack.writeBitmapHashcache' when writing bitmaps
  pack-bitmap.c: propagate namehash values from existing bitmaps
  t/helper/test-bitmap.c: add 'dump-hashes' mode

4 years agouserdiff-cpp: learn the C++ spaceship operator
Johannes Sixt [Sun, 10 Oct 2021 17:03:04 +0000 (17:03 +0000)] 
userdiff-cpp: learn the C++ spaceship operator

Since C++20, the language has a generalized comparison operator <=>.
Teach the cpp driver not to separate it into <= and > tokens.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agouserdiff-cpp: permit the digit-separating single-quote in numbers
Johannes Sixt [Sun, 10 Oct 2021 17:03:03 +0000 (17:03 +0000)] 
userdiff-cpp: permit the digit-separating single-quote in numbers

Since C++17, the single-quote can be used as digit separator:

   3.141'592'654
   1'000'000
   0xdead'beaf

Make it known to the word regex of the cpp driver, so that numbers are
not split into separate tokens at the single-quotes.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agouserdiff-cpp: prepare test cases with yet unsupported features
Johannes Sixt [Sun, 10 Oct 2021 17:03:02 +0000 (17:03 +0000)] 
userdiff-cpp: prepare test cases with yet unsupported features

We are going to add support for C++'s digit-separating single-quote and
the spaceship operator. By adding the test cases in this separate
commit, the effect on the word highlighting will become more obvious
as the features are implemented and the file cpp/expect is updated.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agocat-file: use packed_object_info() for --batch-all-objects
Jeff King [Tue, 5 Oct 2021 20:38:04 +0000 (16:38 -0400)] 
cat-file: use packed_object_info() for --batch-all-objects

When "cat-file --batch-all-objects" iterates over each object, it knows
where to find each one. But when we look up details of the object, we
don't use that information at all.

This patch teaches it to use the pack/offset pair when we're iterating
over objects in a pack. This yields a measurable speed improvement
(timings on a fully packed clone of linux.git):

  Benchmark #1: ./git.old cat-file --batch-all-objects --unordered --batch-check="%(objecttype) %(objectname)"
    Time (mean ± σ):      8.128 s ±  0.118 s    [User: 7.968 s, System: 0.156 s]
    Range (min … max):    8.007 s …  8.301 s    10 runs

  Benchmark #2: ./git.new cat-file --batch-all-objects --unordered --batch-check="%(objecttype) %(objectname)"
    Time (mean ± σ):      4.294 s ±  0.064 s    [User: 4.167 s, System: 0.125 s]
    Range (min … max):    4.227 s …  4.457 s    10 runs

  Summary
    './git.new cat-file --batch-all-objects --unordered --batch-check="%(objecttype) %(objectname)"' ran
      1.89 ± 0.04 times faster than './git.old cat-file --batch-all-objects --unordered --batch-check="%(objecttype) %(objectname)"

The implementation is pretty simple: we just call packed_object_info()
instead of oid_object_info_extended() when we can. Most of the changes
are just plumbing the pack/offset pair through the callstack. There is
one subtlety: replace lookups are not handled by packed_object_info().
But since those are disabled for --batch-all-objects, and since we'll
only have pack info when that option is in effect, we don't have to
worry about that.

There are a few limitations to this optimization which we could address
with further work:

 - I didn't bother recording when we found an object loose. Technically
   this could save us doing a fruitless lookup in the pack index. But
   opening and mmap-ing a loose object is so expensive in the first
   place that this doesn't matter much. And if your repository is large
   enough to care about per-object performance, most objects are going
   to be packed anyway.

 - This works only in --unordered mode. For the sorted mode, we'd have
   to record the pack/offset pair as part of our oid-collection. That's
   more code, plus at least 16 extra bytes of heap per object. It would
   probably still be a net win in runtime, but we'd need to measure.

 - For --batch, this still helps us with getting the object metadata,
   but we still do a from-scratch lookup for the object contents. This
   probably doesn't matter that much, because the lookup cost will be
   much smaller relative to the cost of actually unpacking and printing
   the objects.

   For small objects, we could probably swap out read_object_file() for
   using packed_object_info() with a "object_info.contentp" to get the
   contents. But we'd still need to deal with streaming for larger
   objects. A better path forward here is to teach the initial
   oid_object_info_extended() / packed_object_info() calls to retrieve
   the contents of smaller objects while they are already being
   accessed. That would save the extra lookup entirely. But it's a
   non-trivial feature to add to the object_info code, so I left it for
   now.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agocat-file: split ordered/unordered batch-all-objects callbacks
Jeff King [Tue, 5 Oct 2021 20:36:17 +0000 (16:36 -0400)] 
cat-file: split ordered/unordered batch-all-objects callbacks

When we originally added --batch-all-objects, it stuffed everything into
an oid_array(), and then iterated over that array with a callback to
write the actual output.

When we later added --unordered, that code path writes immediately as we
discover each object, but just calls the same batch_object_cb() as our
entry point to the writing code. That callback has a narrow interface;
it only receives the oid, but we know much more about each object in the
unordered write (which we'll make use of in the next patch). So let's
just call batch_object_write() directly. The callback wasn't saving us
much effort.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agocat-file: disable refs/replace with --batch-all-objects
Jeff King [Tue, 5 Oct 2021 20:36:07 +0000 (16:36 -0400)] 
cat-file: disable refs/replace with --batch-all-objects

When we're enumerating all objects in the object database, it doesn't
make sense to respect refs/replace. The point of this option is to
enumerate all of the objects in the database at a low level. By
definition we'd already show the replacement object's contents (under
its real oid), and showing those contents under another oid is almost
certainly working against what the user is trying to do.

Note that you could make the same argument for something like:

  git show-index <foo.idx |
  awk '{print $2}' |
  git cat-file --batch

but there we can't know in cat-file exactly what the user intended,
because we don't know the source of the input. They could be trying to
do low-level debugging, or they could be doing something more high-level
(e.g., imagine a porcelain built around cat-file for its object
accesses). So in those cases, we'll have to rely on the user specifying
"git --no-replace-objects" to tell us what to do.

One _could_ make an argument that "cat-file --batch" is sufficiently
low-level plumbing that it should not respect replace-objects at all
(and the caller should do any replacement if they want it).  But we have
been doing so for some time. The history is a little tangled:

  - looking back as far as v1.6.6, we would not respect replace refs for
    --batch-check, but would for --batch (because the former used
    sha1_object_info(), and the replace mechanism only affected actual
    object reads)

  - this discrepancy was made even weirder by 98e2092b50 (cat-file:
    teach --batch to stream blob objects, 2013-07-10), where we always
    output the header using the --batch-check code, and then printed the
    object separately. This could lead to "cat-file --batch" dying (when
    it notices the size or type changed for a non-blob object) or even
    producing bogus output (in streaming mode, we didn't notice that we
    wrote the wrong number of bytes).

  - that persisted until 1f7117ef7a (sha1_file: perform object
    replacement in sha1_object_info_extended(), 2013-12-11), which then
    respected replace refs for both forms.

So it has worked reliably this way for over 7 years, and we should make
sure it continues to do so. That could also be an argument that
--batch-all-objects should not change behavior (which this patch is
doing), but I really consider the current behavior to be an unintended
bug. It's a side effect of how the code is implemented (feeding the oids
back into oid_object_info() rather than looking at what we found while
reading the loose and packed object storage).

The implementation is straight-forward: we just disable the global
read_replace_refs flag when we're in --batch-all-objects mode. It would
perhaps be a little cleaner to change the flag we pass to
oid_object_info_extended(), but that's not enough. We also read objects
via read_object_file() and stream_blob_to_fd(). The former could switch
to its _extended() form, but the streaming code has no mechanism for
disabling replace refs. Setting the global flag works, and as a bonus,
it's impossible to have any "oops, we're sometimes replacing the object
and sometimes not" bugs in the output (like the ones caused by
98e2092b50 above).

The tests here cover the regular-input and --batch-all-objects cases,
for both --batch-check and --batch. There is a test in t6050 that covers
the regular-input case with --batch already, but this new one goes much
further in actually verifying the output (plus covering --batch-check
explicitly). This is perhaps a little overkill and the tests would be
simpler just covering --batch-check, but I wanted to make sure we're
checking that --batch output is consistent between the header and the
content. The global-flag technique used here makes that easy to get
right, but this is future-proofing us against regressions.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agocat-file: mention --unordered along with --batch-all-objects
Jeff King [Tue, 5 Oct 2021 20:31:08 +0000 (16:31 -0400)] 
cat-file: mention --unordered along with --batch-all-objects

The note on ordering for --batch-all-objects was written when that was
the only possible ordering. These days we have --unordered, too, so
let's point to it.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agot1006: clean up broken objects
Jeff King [Tue, 5 Oct 2021 20:30:36 +0000 (16:30 -0400)] 
t1006: clean up broken objects

A few of the tests create intentionally broken objects with broken
types. Let's clean them up after we're done with them, so that later
tests don't get confused (we hadn't noticed because this only affects
tests which use --batch-all-objects, but I'm about to add more).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agosubmodule: trace adding submodule ODB as alternate
Jonathan Tan [Fri, 8 Oct 2021 21:08:20 +0000 (14:08 -0700)] 
submodule: trace adding submodule ODB as alternate

Submodule ODBs are never added as alternates during the execution of the
test suite, but there may be a rare interaction that the test suite does
not have coverage of. Add a trace message when this happens, so that
users who trace their commands can notice such occurrences.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agosubmodule: pass repo to check_has_commit()
Jonathan Tan [Fri, 8 Oct 2021 21:08:19 +0000 (14:08 -0700)] 
submodule: pass repo to check_has_commit()

Pass the repo explicitly when calling check_has_commit() to avoid
relying on add_submodule_odb(). With this commit and the parent commit,
the last remaining tests no longer rely on add_submodule_odb(), so mark
these tests accordingly.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoobject-file: only register submodule ODB if needed
Jonathan Tan [Fri, 8 Oct 2021 21:08:18 +0000 (14:08 -0700)] 
object-file: only register submodule ODB if needed

In a35e03dee0 ("submodule: lazily add submodule ODBs as alternates",
2021-09-08), Git was taught to add all known submodule ODBs as
alternates when attempting to read an object that doesn't exist, as a
fallback for when a submodule object is read as if it were in
the_repository. However, this behavior wasn't restricted to happen only
when reading from the_repository. Fix this.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agomerge-{ort,recursive}: remove add_submodule_odb()
Jonathan Tan [Fri, 8 Oct 2021 21:08:17 +0000 (14:08 -0700)] 
merge-{ort,recursive}: remove add_submodule_odb()

After the parent commit and some of its ancestors, the only place
commits are being accessed through alternates is in the user-facing
message formatting code. Fix those, and remove the add_submodule_odb()
calls.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agorefs: peeling non-the_repository iterators is BUG
Jonathan Tan [Fri, 8 Oct 2021 21:08:16 +0000 (14:08 -0700)] 
refs: peeling non-the_repository iterators is BUG

There is currently no support for peeling the current ref of an iterator
iterating over a non-the_repository ref store, and none is needed. Thus,
for now, BUG() if that happens.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agorefs: teach arbitrary repo support to iterators
Jonathan Tan [Fri, 8 Oct 2021 21:08:15 +0000 (14:08 -0700)] 
refs: teach arbitrary repo support to iterators

Note that should_pack_ref() is called when writing refs, which is only
supported for the_repository, hence the_repository is hardcoded there.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agorefs: plumb repo into ref stores
Jonathan Tan [Fri, 8 Oct 2021 21:08:14 +0000 (14:08 -0700)] 
refs: plumb repo into ref stores

In preparation for the next 2 patches that adds (partial) support for
arbitrary repositories to ref iterators, plumb a repository into all ref
stores. There are no changes to program logic.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agopretty: colorize pattern matches in commit messages
Hamza Mahfooz [Thu, 7 Oct 2021 20:31:47 +0000 (16:31 -0400)] 
pretty: colorize pattern matches in commit messages

The "git log" command limits its output to the commits that contain strings
matched by a pattern when the "--grep=<pattern>" option is used, but unlike
output from "git grep -e <pattern>", the matches are not highlighted,
making them harder to spot.

Teach the pretty-printer code to highlight matches from the
"--grep=<pattern>", "--author=<pattern>" and "--committer=<pattern>"
options (to view the last one, you may have to ask for --pretty=fuller).

Also, it must be noted that we are effectively greping the content twice
(because it would be a hassle to rework the existing matching code to do
a /g match and then pass it all down to the coloring code), however it only
slows down "git log --author=^H" on this repository by around 1-2%
(compared to v2.33.0), so it should be a small enough slow down to justify
the addition of the feature.

Signed-off-by: Hamza Mahfooz <someguy@effective-light.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoparse-options: change OPT_{SHORT,UNSET} to an enum
Ævar Arnfjörð Bjarmason [Fri, 8 Oct 2021 19:07:46 +0000 (21:07 +0200)] 
parse-options: change OPT_{SHORT,UNSET} to an enum

Change the comparisons against OPT_SHORT and OPT_UNSET to an enum
which keeps track of how a given option got parsed. The case of "0"
was an implicit OPT_LONG, so let's add an explicit label for it.

Due to the xor in 0f1930c5875 (parse-options: allow positivation of
options starting, with no-, 2012-02-25) the code already relied on
this being set back to 0. To avoid refactoring the logic involved in
that let's just start the enum at "0" instead of the usual "1<<0" (1),
but BUG() out if we don't have one of our expected flags.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoparse-options tests: test optname() output
Ævar Arnfjörð Bjarmason [Fri, 8 Oct 2021 19:07:45 +0000 (21:07 +0200)] 
parse-options tests: test optname() output

There were no tests for checking the specific output that we'll
generate in optname(), let's add some. That output was added back in
4a59fd13122 (Add a simple option parser., 2007-10-15).

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoparse-options.[ch]: make opt{bug,name}() "static"
Ævar Arnfjörð Bjarmason [Fri, 8 Oct 2021 19:07:44 +0000 (21:07 +0200)] 
parse-options.[ch]: make opt{bug,name}() "static"

Change these two functions to "static", the last user of "optname()"
outside of parse-options.c itself went away in the preceding commit,
for the reasons noted in 9440b831ad5 (parse-options: replace
opterror() with optname(), 2018-11-10) we shouldn't be adding any more
users of it.

The "optbug()" function was never used outside of parse-options.c, but
was made non-static in 1f275b7c4ca (parse-options: export opterr,
optbug, 2011-08-11). I think the only external user of optname() was
the commit-graph.c caller added in 09e0327f57 (builtin/commit-graph.c:
introduce '--max-new-filters=<n>', 2020-09-18).

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agocommit-graph: stop using optname()
Ævar Arnfjörð Bjarmason [Fri, 8 Oct 2021 19:07:43 +0000 (21:07 +0200)] 
commit-graph: stop using optname()

Stop using optname() in builtin/commit-graph.c to emit an error with
the --max-new-filters option. This changes code added in 809e0327f57
(builtin/commit-graph.c: introduce '--max-new-filters=<n>',
2020-09-18).

See 9440b831ad5 (parse-options: replace opterror() with optname(),
2018-11-10) for why using optname() like this is considered bad,
i.e. it's assembling human-readable output piecemeal, and the "option
`X'" at the start can't be translated.

It didn't matter in this case, but this code was also buggy in its use
of "opt->flags" to optname(), that function expects flags, but not
*those* flags.

Let's pass "max-new-filters" to the new error because the option name
isn't translatable, and because we can re-use a translation added in
f7e68a08780 (parse-options: check empty value in OPT_INTEGER and
OPT_ABBREV, 2019-05-29).

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoparse-options.c: move optname() earlier in the file
Ævar Arnfjörð Bjarmason [Fri, 8 Oct 2021 19:07:42 +0000 (21:07 +0200)] 
parse-options.c: move optname() earlier in the file

In preparation for making "optname" a static function move it above
its first user in parse-options.c.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoparse-options.h: make the "flags" in "struct option" an enum
Ævar Arnfjörð Bjarmason [Fri, 8 Oct 2021 19:07:41 +0000 (21:07 +0200)] 
parse-options.h: make the "flags" in "struct option" an enum

Change the "flags" members of "struct option" to refer to their
corresponding "enum" defined earlier in the file.

The benefit of changing this to an enum isn't as great as with some
"enum parse_opt_type" as we'll always check this as a bitfield, so we
can't rely on the compiler checking "case" arms for us. But let's do
it for consistency with the rest of the file.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoparse-options.c: use exhaustive "case" arms for "enum parse_opt_result"
Ævar Arnfjörð Bjarmason [Fri, 8 Oct 2021 19:07:40 +0000 (21:07 +0200)] 
parse-options.c: use exhaustive "case" arms for "enum parse_opt_result"

Change the "default" case in parse_options() that handles the return
value of parse_options_step() to simply have a "case" arm for
PARSE_OPT_UNKNOWN, instead of leaving it to a comment. This means the
compiler can warn us about any missing case arms.

This adjusts code added in ff43ec3e2d2 (parse-opt: create
parse_options_step., 2008-06-23), given its age it may pre-date the
existence (or widespread use) of this coding style, which we've since
adopted more widely.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoparse-options.[ch]: consistently use "enum parse_opt_result"
Ævar Arnfjörð Bjarmason [Fri, 8 Oct 2021 19:07:39 +0000 (21:07 +0200)] 
parse-options.[ch]: consistently use "enum parse_opt_result"

Use the "enum parse_opt_result" instead of an "int flags" as the
return value of the applicable functions in parse-options.c.

This will help catch future bugs, such as the missing "case" arms in
the two existing users of the API in "blame.c" and "shortlog.c". A
third caller in 309be813c9b (update-index: migrate to parse-options
API, 2010-12-01) was already checking for these.

As can be seen when trying to sort through the deluge of warnings
produced when compiling this with CC=g++ (mostly unrelated to this
change) we're not consistently using "enum parse_opt_result" even now,
i.e. we'll return error() and "return 0;". See f41179f16ba
(parse-options: avoid magic return codes, 2019-01-27) for a commit
which started changing some of that.

I'm not doing any more of that exhaustive migration here, and it's
probably not worthwhile past the point of being able to check "enum
parse_opt_result" in switch().

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoparse-options.[ch]: consistently use "enum parse_opt_flags"
Ævar Arnfjörð Bjarmason [Fri, 8 Oct 2021 19:07:38 +0000 (21:07 +0200)] 
parse-options.[ch]: consistently use "enum parse_opt_flags"

Use the "enum parse_opt_flags" instead of an "int flags" as arguments
to the various functions in parse-options.c.

Even though this is an enum bitfield there's there's a benefit to
doing this when it comes to the wider C ecosystem. E.g. the GNU
debugger (gdb) will helpfully detect and print out meaningful enum
labels in this case. Here's the output before and after when breaking
in "parse_options()" after invoking "git stash show":

Before:

    (gdb) p flags
    $1 = 9

After:

    (gdb) p flags
    $1 = (PARSE_OPT_KEEP_DASHDASH | PARSE_OPT_KEEP_UNKNOWN)

Of course as noted in[1] there's a limit to this smartness,
i.e. manually setting it with unrelated enum labels won't be
caught. There are some third-party extensions to do more exhaustive
checking[2], perhaps we'll be able to make use of them sooner than
later.

We've also got prior art using this pattern in the codebase. See
e.g. "enum bloom_filter_computed" added in 312cff52074 (bloom: split
'get_bloom_filter()' in two, 2020-09-16) and the "permitted" enum
added in ce910287e72 (add -p: fix checking of user input, 2020-08-17).

1. https://lore.kernel.org/git/87mtnvvj3c.fsf@evledraar.gmail.com/
2. https://github.com/sinelaw/elfs-clang-plugins/blob/master/enums_conversion/README.md

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoblame: document --color-* options
Bagas Sanjaya [Fri, 8 Oct 2021 09:16:14 +0000 (16:16 +0700)] 
blame: document --color-* options

Commit cdc2d5f11f1a (builtin/blame: dim uninteresting metadata lines,
2018-04-23) and 25d5f52901f0 (builtin/blame: highlight recently changed
lines, 2018-04-23) introduce --color-lines and --color-by-age options to
git blame, respectively. While both options are mentioned in usage help,
they aren't documented in git-blame(1). Document them.

Co-authored-by: Dr. Matthias St. Pierre <m.st.pierre@ncp-e.com>
Signed-off-by: Dr. Matthias St. Pierre <m.st.pierre@ncp-e.com>
Signed-off-by: Bagas Sanjaya <bagasdotme@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agouserdiff-cpp: tighten word regex
Johannes Sixt [Fri, 8 Oct 2021 19:09:55 +0000 (19:09 +0000)] 
userdiff-cpp: tighten word regex

Generally, word regex can be written such that they match tokens
liberally and need not model the actual syntax because it can be assumed
that the regex will only be applied to syntactically correct text.

The regex for cpp (C/C++) is too liberal, though. It regards these
sequences as single tokens:

   1+2
   1.5-e+2+f

and the following amalgams as one token:

   .l      as in str.length
   .f      as in str.find
   .e      as in str.erase

Tighten the regex in the following way:

- Accept + and - only in one position in the exponent. + and - are no
  longer regarded as the sign of a number and are treated by the
  catcher-all that is not visible in the driver's regex.

- Accept a leading decimal point only when it is followed by a digit.

For readability, factor hex- and binary numbers into an own term.

As a drive-by, this fixes that floating point numbers such as 12E5
(with upper-case E) were split into two tokens.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agot4034: add tests showing problematic cpp tokenizations
Johannes Sixt [Fri, 8 Oct 2021 19:09:54 +0000 (19:09 +0000)] 
t4034: add tests showing problematic cpp tokenizations

The word regex is too loose and matches long streaks of characters
that should actually be separate tokens.  Add these problematic test
cases. Separate the lines with text that will remain identical in the
pre- and post-image so that the diff algorithm will not lump removals
and additions of consecutive lines together. This makes the expected
output easier to read.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agot4034/cpp: actually test that operator tokens are not split
Johannes Sixt [Fri, 8 Oct 2021 19:09:53 +0000 (19:09 +0000)] 
t4034/cpp: actually test that operator tokens are not split

8d96e7288f2b (t4034: bulk verify builtin word regex sanity, 2010-12-18)
added many tests with the intent to verify that operators consisting of
more than one symbol are kept together. These are tested by probing a
transition from, e.g., a!=b to x!=y, which results in the word-diff

  [-a-]{+x+}!=[-b-]{+y+}

But that proves only that the letters and operators are separate tokens.
To prove that != is an unseparable token, we have to probe a transition
from, e.g., a=b to a!=b having a word-diff

  a[-=-]{+!=+}b

that proves that the ! is not separate from the =.

In the post-image, add to or remove from operators a character that
turns it into another valid operator.

Change the identifiers used around operators such that the diff
algorithm does not have an incentive to match, e.g., a<b in one spot
in the pre-image with a<b elsewhere in the post-image.

Adjust the expected output to match the new differences. Notice that
there are some undesirable tokenizations around e, ., and -.  This will
be addressed in a later change.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoAdd "test-tool dump-reftable" command.
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:15 +0000 (20:25 +0000)] 
Add "test-tool dump-reftable" command.

This command dumps individual tables or a stack of of tables.

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: add dump utility
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:14 +0000 (20:25 +0000)] 
reftable: add dump utility

provide a command-line utility for inspecting individual tables, and
inspecting a complete ref database

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Helped-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: implement stack, a mutable database of reftable files.
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:13 +0000 (20:25 +0000)] 
reftable: implement stack, a mutable database of reftable files.

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: implement refname validation
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:12 +0000 (20:25 +0000)] 
reftable: implement refname validation

The packed/loose format has restrictions on refnames: a and a/b cannot
coexist. This limitation does not apply to reftable per se, but must be
maintained for interoperability. This code adds validation routines to
abort transactions that are trying to add invalid names.

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: add merged table view
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:11 +0000 (20:25 +0000)] 
reftable: add merged table view

This adds an abstract, read-only interface to the ref database.

This primitive is used to construct the read view of the ref database
(the read view is constructed by merging several *.ref files). It also
provides the mechanism to provide a unified view of the refs in the main
repository and the per-worktree refs.

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: add a heap-based priority queue for reftable records
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:10 +0000 (20:25 +0000)] 
reftable: add a heap-based priority queue for reftable records

This is needed to create a merged view multiple reftables

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: reftable file level tests
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:09 +0000 (20:25 +0000)] 
reftable: reftable file level tests

With support for reading and writing files in place, we can construct files (in
memory) and attempt to read them back.

Because some sections of the format are optional (eg. indices, log entries), we
have to exercise this code using multiple sizes of input data

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: read reftable files
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:08 +0000 (20:25 +0000)] 
reftable: read reftable files

This supports reading a single reftable file.

The commit introduces an abstract iterator type, which captures the usecases
both of reading individual refs, and iterating over a segment of the ref
namespace.

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: generic interface to tables
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:07 +0000 (20:25 +0000)] 
reftable: generic interface to tables

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: write reftable files
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:06 +0000 (20:25 +0000)] 
reftable: write reftable files

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: a generic binary tree implementation
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:05 +0000 (20:25 +0000)] 
reftable: a generic binary tree implementation

The reftable format includes support for an (OID => ref) map. This map can speed
up visibility and reachability checks. In particular, various operations along
the fetch/push path within Gerrit have ben sped up by using this structure.

The map is constructed with help of a binary tree. Object IDs are hashes, so
they are uniformly distributed. Hence, the tree does not attempt forced
rebalancing.

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: reading/writing blocks
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:04 +0000 (20:25 +0000)] 
reftable: reading/writing blocks

The reftable format is structured as a sequence of block. Within a block,
records are prefix compressed, with an index of offsets for fully expand keys to
enable binary search within blocks.

This commit provides the logic to read and write these blocks.

Helped-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoProvide zlib's uncompress2 from compat/zlib-compat.c
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:03 +0000 (20:25 +0000)] 
Provide zlib's uncompress2 from compat/zlib-compat.c

This will be needed for reading reflog blocks in reftable.

Helped-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: (de)serialization for the polymorphic record type.
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:02 +0000 (20:25 +0000)] 
reftable: (de)serialization for the polymorphic record type.

The reftable format is structured as a sequence of blocks, and each block
contains a sequence of prefix-compressed key-value records. There are 4 types of
records, and they have similarities in how they must be handled. This is
achieved by introducing a polymorphic 'record' type that encapsulates ref, log,
index and object records.

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: add blocksource, an abstraction for random access reads
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:01 +0000 (20:25 +0000)] 
reftable: add blocksource, an abstraction for random access reads

The reftable format is usually used with files for storage. However, we abstract
away this using the blocksource data structure. This has two advantages:

* log blocks are zlib compressed, and handling them is simplified if we can
  discard byte segments from within the block layer.

* for unittests, it is useful to read and write in-memory. The blocksource
  allows us to abstract the data away from on-disk files.

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: utility functions
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:25:00 +0000 (20:25 +0000)] 
reftable: utility functions

This commit provides basic utility classes for the reftable library.

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Helped-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: add error related functionality
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:24:59 +0000 (20:24 +0000)] 
reftable: add error related functionality

The reftable/ directory is structured as a library, so it cannot
crash on misuse. Instead, it returns an error code.

In addition to signaling errors, the error code can be used to signal
conditions from lower levels of the library to be handled by higher
levels of the library. For example, in a transaction we might
legitimately write an empty reftable file, but in that case, we want to
shortcut the transaction.

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreftable: add LICENSE
Han-Wen Nienhuys [Thu, 7 Oct 2021 20:24:58 +0000 (20:24 +0000)] 
reftable: add LICENSE

The objective of this code is to be usable as a C library, so it can be reused
in libgit2.

This is currently using a BSD license as it is the liberal license I could find,
but this could be changed to whatever fits the stated goal above.

This code is currently imported from github.com/hanwen/reftable. Once this code
lands in git.git, the C code will be removed from github.com/hanwen/reftable,
and the git.git code will be the source of truth.

Signed-off-by: Han-Wen Nienhuys <hanwen@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agotest-mergesort: use repeatable random numbers
René Scharfe [Fri, 8 Oct 2021 04:04:42 +0000 (06:04 +0200)] 
test-mergesort: use repeatable random numbers

Use MINSTD to generate pseudo-random numbers consistently instead of
using rand(3), whose output can vary from system to system, and reset
its seed before filling in the test values.  This gives repeatable
results across versions and systems, which simplifies sharing and
comparing of results between developers.

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 years agoreset: rename is_missing to !is_in_reset_tree
Victoria Dye [Thu, 7 Oct 2021 21:15:31 +0000 (21:15 +0000)] 
reset: rename is_missing to !is_in_reset_tree

Rename and invert value of `is_missing` to `is_in_reset_tree` to make the
variable more descriptive of what it represents.

Signed-off-by: Victoria Dye <vdye@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>