Skip to content

Tags: GitoxideLabs/gitoxide

Tags

gix-testtools-v0.16.1

Toggle gix-testtools-v0.16.1's commit message

Unverified

This tag is not signed, but one or more authors requires that any tag attributed to them is signed.
### Bug Fixes

 - unify the dependency graph by choosing the right versions, upgrading to `gix-features 0.42`
   This is what should silence audit failures.

### Commit Statistics

 - 1 commit contributed to the release.
 - 1 commit was understood as [conventional](https://www.conventionalcommits.org).
 - 0 issues like '(#ID)' were seen in commit messages

### Commit Details

 * **Uncategorized**
    - Unify the dependency graph by choosing the right versions, upgrading to `gix-features 0.42` (9b12d50)

gix-testtools-v0.16.0

Toggle gix-testtools-v0.16.0's commit message

Unverified

This tag is not signed, but one or more authors requires that any tag attributed to them is signed.
### Changed

 - In gix-testtools use `ignore` and `index` via `gix_worktree`
   This removes the `gix-ignore` and `gix-index` direct dependencies
   of `gix-testtools`, by having `gix_testtools` use them through
   `gix-worktree`, accessing `gix_worktree::ignore` for `gix_ignore`
   and `gix_worktree::index` for `gix_index`.
   
   The rationale is that various other gix-* dependencies were used
   this way already, and also that this specific change appears to
   have been planned, based on the TODO comment in ddaacda (#1413).

### New Features

 - Show unexpected stderr in `umask` panic message
   Because `gix_testtools::umask()` is only suitable for use in tests,
   where signaling an error with a panic is typically acceptable, it
   panics rather than returning an `Error` to indicate errors. To
   avoid leading to the use of a potentially inaccurate umask value,
   it treats as an error any departure from the typical output of
   the `umask` command: in addition to treating a nonzero exit status
   as an error, it also treats anything it cannot strictly parse on
   stdout as an error, as well as anything at all written to stderr as
   an error. The latter is to avoid a situation where a warning is
   printed that is could be significant to some umask use cases.
   
   Warnings from `umask` are rare, as well as from the shell that is
   used as an intermediary for running the command (since no external
   `umask` command need exist and, often, does not) when it is used
   just to run `umask`. When they do occur, they are sometimes from
   the dynamic linker, such as a warning about a shared library listed
   in the `LD_PRELOAD` environment variable that cannot be used by
   the shell program. To understand and distinguish such errors, it is
   useful to show the text that was sent to stderr, since tests are
   sometimes run in environments that are nontrivial to reproduce
   otherwise. For example, running tests with `cross` produces an
   environment that is not in all respects the same as what one gets
   with `docker exec -it <container>`, even if `<container>` is the
   same still-running container being used to run the tests.
   
   This modifies `gix_testtools::umask()` so that when it panics due
   anything being written to stderr, it shows what was written.
 - Add `jtt bash-program` (`jtt bp`) to show `bash_program()`
   This adds a `bash-program` subcommand, abbreviated `bp`, to the
   `gix-testools` program (`jtt`) to check what the `bash_program()`
   library function gives.
   
   This is intended for diagnostic use and should probably not be used
   in scripting. Currently it shows the quoted debug repreesentation
   of the path.
 - Document `gix_testtools::bash_program()` and make it public
   To make it easier for users of `gix-testtools` to diagnose problems
   or verify that the fallback for running fixutre scripts without
   usable shebangs (which is effectively how any fixture shell script
   is run on Windows), the formerly private `bash_program()` is now
   public.
   
   However, it is not recommend to rely on this specific value or on
   observed behavior of how it is computed. The details may change at
   any time.
   
   The purpose of `bash_program()` and how it is used internally by
   `gix-testtools` is also now documented explicitly. Broad details of
   how it searches or guesses what path to use are likewise documented,
   with a caveat that changes to them are not considered breaking.
 - Look for bash in `(git root)/bin`, then `(git root)/usr/bin`
   This changes `bash_program()` so that it will find the `bash.exe`
   provided by Git for Windows that is most reliable for our use in
   runinng test fixture scripts, of those that are available. First
   it uses the shim, but falls back to the non-shim if the shim is
   not available. If neither is found, then the fallback of using the
   simple command `bash.exe` (which triggers a path search when run)
   continues to be used.
 - Prefer `/` over `\` in `bash.exe` path (for fixtures)
   Starting in #1712, `gix-testtools` looks for `bash.exe` on Windows
   in one of its common locations as provided by Git for Windows, by
   taking the path given by `git --exec-path`, going up by three
   components, and going down to `bin/bash.exe` under that. But the
   `bin` and `bash.exe` components were appended in a way that used
   `\` directory separators.
   
   Ordinarily, that would be ideal, since `\` is the primary directory
   separator on Windows. However, in this case, appending with `\`
   produces a path that is harder to read (especially in diagostic
   messages), and that may cause problems if it is processed by a
   shell or in a way that is intended to operate similarly to shell
   processing of `\`.
   
   A path that does not explicitly prefer `/` but instead uses
   `PathBuf::push` will have `\` in front of the new components, but
   will still usually have `/` in front of the old components. This is
   because, aside from the unusual case that the `GIT_EXEC_PATH`
   environment vairable is set explicitly and its value uses all `\`
   separators, the output of `git --exec-path`, which we use to find
   where `git` installed on Windows, uses `/` separators.
   
   The effect of this change seems to be fairly minor, with existing
   test fixtures having worked before it was done. This is partly
   because, on Windows, the value of `argv[0]` that the shell
   actually sees -- and that populates `$0` when no script name is
   available, as happens in `bash -c '...'` with no subsequent
   arguments -- is translated by an MSYS DLL such as `msys-2.0.dll`
   (or, for Cygwin, `cygwin1.dll`) into a Unix-style path meaningful
   to the shell.
   
   This also refactors for clarity, and adds new tests related to the
   change.
 - Add `gix_testtools::umask`, safe but only meant for tests
   This implements a function for tests to safely read the current
   process umask without the usual race condition of doing so, at the
   expense of using subprocesses to do it. This just calls a shell and
   runs `umask` from it (which is expected to be a builtin and, on
   many systems, is available as a builtin but not an executable).
   
   Even though this is safe, including thread-safe, it is unlikely to
   be suitable for use outside of tests, because of its use of
   `expect` and assertions when there are errors, combined with the
   possibly slow speed of using subprocesses.
   
   Given that this is effecitvely running a tiny shell script to do
   the work, why is it not instead a fixture script that is named in
   a `.gitignore` file so that it is not tracked? The reason is that
   the outcomes of running such fixture scripts are still saved across
   separate test runs, but it is useful to be able to run the tests
   with differnt umasks, e.g. `(umask 077; cargo nextest run ...)`.
   
   The immediate purpose is in forthcoming tests that, when checkout
   sets +x on an existing file, it doesn't set excessive permissions.
   The fix to pass such a test is not currently planned to use the
   umask explicitly. But the tests will use it, at least to detect
   when they cannot really verify the code under test on the grounds
   that they are running with an excessively permissive umask that
   doesn't allow behavior that only occurs with a generally reasonable
   umask to be observed.
 - Add `size_ok` for asserting size is not too big
   This compares using `==` on 64-bit targets and `<=` on 32-bit
   targets.
   
   As noted in the documentation comment, when assertions about data
   stuructures' sizes are being done to safeguard against them growing
   too big, then it may be acceptable to use `<=` if the structure is
   smaller on 32-bit targets, but it is still valuable to be able to
   use `==` on 64-bit targets in the same assertions, since this
   guards against a data structure becoming smaller, other changes
   causing the smaller size to be important for memory usage or speed,
   but then the data structure growing again, up to its original size.
   An unconditional `<=` will not catch this, while `size_ok` usually
   will.
   
   A related reason to do a `==` on 64-bit systems is so that the
   expected value being compared to remains tied to the code. It can
   otherwise become unclear what the expected value's significance is
   and whether it ought to be updated.
 - Recognize `GIX_TEST_CREATE_ARCHIVES_EVEN_ON_CI`
   When `gix-testtools` runs fixtures, it now recognizes a new
   environment variable, `GIX_TEST_CREATE_ARCHIVES_EVEN_ON_CI`,
   specifying that archives should be generated even when on CI.
   
   By default, they are still not generated when on CI. It may make
   sense to enable this:
   
   - If automatically testing archive creation, or
   
   - As a way to check that all intended generated arhives are committed
     (which is the motivating use case for this feature), or
   
   - If actually using CI to generate archives that will be uploaded
     as artifacts, or
   
   - In unusual non-CI environments that are mis-detected as CI
     (though that should usually be investigated and fixed, since some
     software performs destructive operations more readily without
     interactive checks when CI is detected).
   
   The usual reason for not generating archives on CI is that they
   would not typically be preserved. Thus refraining from generating
   them on CI remains the default behavior.
   
   Like the `GIX_TEST_IGNORE_ARCHIVES` environment variable, the new
   variable `GIX_TEST_CREATE_ARCHIVES_EVEN_ON_CI` is currently
   interpreted as "true" based solely on its presence. This is to say
   that is actual value is currently not examined.

### Bug Fixes

 - fix check to detect `git-lfs` managed files that weren't checked out.
   Previously it would detect them incorrectly due to a find-and-replace
   error.
 - create a more local lock when creating writable fixtures.
   Previously, the lock location would block all writers from executing
   a fixture even though they wouldn't step on each others feet.
   
   Now, a script destination is used to assure locks are created close
   to the destination when creating writable fixtures, typically removing
   the need for multiple writers to wait on each other unnecessarily.
 - Run test fixture scripts on Windows with Git Bash
   Rather than hard-coding `bash` on all systems as the fallback
   interpreter when a fixture script cannot be run directly, this
   falls back in an operating system specific manner:
   
   - Except on Windows, always fall back to `bash`, as before.
   
   - On Windows, run `git --exec-path` to find the `git-core`
     directory. Then check if a `bash.exe` exists at the expected
     location relative to that. In Git for Windows installations,
     this will usually work. If so, use that path (with `..`
     components resolved away).
   
   - On Windows, if a specific `bash.exe` is not found in that way,
     then fall back to using the relative path `bash.exe`. This is to
     preserve the ability to run `bash` on Windows systems where it
     may have worked before even without `bash.exe` in an expected
     location provided by a Git for Windows installation.
   
   (The distinction between `bash` and `bash.exe` is only slightly
   significant: we check for the existence of the interpreter without
   initially running it, and that check requires the full filename.
   It is called `bash.exe` elsewhere for consistency both with the
   checked-for executable and for consistencey with how we run most
   other programs on Windows, e.g., the `git` vs. `git.exe`.)
   
   This fixes #1359. That bug is not currently observed on CI, but
   this change is verified to fix it on a local test system where it
   previously always occurred when running the test suite from
   PowerShell in an unmodified environment. The fix applies both with
   `GIX_TEST_IGNORE_ARCHIVES` unset, in which case there are now no
   failures, and with `GIX_TEST_IGNORE_ARCHIVES=1`, in which case the
   failures are now limited to the 15 cases tracked in #1358.
   
   Previously, fixture scripts had been run on Windows with whatever
   `bash` was found in a `PATH` search, which had two problems:
   
   - On most Windows systems, even if no WSL distribution is installed
     and even if WSL itself is not set up, the `System32` directory
     contains a `bash.exe` program associated with WSL. This program
     attempts to use WSL to run `bash` in an installed distribution.
     The `wsl.exe` program also provides this functionality and is
     favored for this purpose, but the `bash.exe` program is still
     present and is likely to remain for many years for compatibility.
   
     Even when this `bash` is usable, it is not suited for running
     most shell scripts meant to operate on the native Windows system.
     In particular, it is not suitable for running our fixture
     scripts, which need to use the native `git` to prepare fixtures
     to be used natively, among other requirements that would not be
     satisfied with WSL (except when the tests are actually running in
     WSL).
   
     Since some fixtures are `.gitignore`d because creating them on
     the test system (rather than another system) is part of the test,
     this has caused breakage in most Windows environments unless
     `PATH` is modified -- either explicitly or by testing in an MSYS2
     environment, such as the Git Bash environment -- whether or not
     `GIX_TEST_IGNORE_ARCHIVES` is set. This was the cause of #1359.
   
   - Although using a Git Bash environment or otherwise adjusting the
     path *currently* works, the reasons it works are subtle and rely
     on non-guaranteed behavior of `std::process::Command` path search
     that may change without warning.
   
     On Windows, processes are created by calling the `CreateProcessW`
     API function. `CreateProcessW` is capable of performing a `PATH`
     search, but this `PATH` search is not secure in most uses, since
     it includes the current directory (and searches it before `PATH`
     directories) unless `NoDefaultCurrentDirectoryInExePath` is set
     in the caller's environment.
   
     While it is the most relevant to security, the CWD is not the
     only location `CreateProcessW` searches before searching `PATH`
     directories (and regardless of where, if anywhere, they may also
     appear in `PATH`). Another such location is the `System32`
     directory. This is to say that, even when another directory with
     `bash.exe` precedes `System32` in `PATH`, an executable search
     will still find the WSL-associated `bash.exe` in `System32`
     unless it deviates from the algorithm `CreateProcessW` uses.
   
     To avoid including the CWD in the search, `std::process::Command`
     performs its own path search, then passes the resolved path to
     `CreateProcessW`. The path search it performs is currently almost
     the same the algorithm `CreateProcessW` uses, other than not
     automatically including the CWD. But there are some other subtle
     differences.
   
     One such difference is that, when the `Command` instance is
     configured to create a modified child environment (for example,
     by `env` calls), the `PATH` for the child is searched early on.
     This precedes a search of the `System32` directory. It is done
     even if none of the customizations of the child environment
     modify its `PATH`.
   
     This behavior is not guaranteed, and it may change at any time.
     It is also the behavior we rely on inadvertently every time we
     run `bash` on Windows with a `std::process::Command` instance
     constructed by passing `bash` or `bash.exe` as the `program`
     argument: it so happens that we are also customizing the child
     environment, and due to implementation details in the Rust
     standard library, this manages to find a non-WSL `bash` when
     the tests are run in Git Bash, in GitHub Actions jobs, and in
     some other cases.
   
     If in the future this is not done, or narrowed to be done only
     when `PATH` is one of the environment variables customized for
     the child process, then putting the directory with the desired
     `bash.exe` earlier than the `System32` directory in `PATH` will
     no longer prevent `std::proces::Command` from finding the
     `bash.exe` in `System32` as `CreateProcessW` would and using it.
     Then it would be nontrivial to run the test suite on Windows.
   
   For references and other details, see #1359 and comments including:
   #1359 (comment)
   
   On the approach of finding the Git for Windows `bash.exe` relative
   to the `git-core` directory, see the GitPython pull request
   gitpython-developers/GitPython#1791, its
   comments, and the implementation of the approach by @emanspeaks:
   https://github.com/gitpython-developers/GitPython/blob/f065d1fba422a528a133719350e027f1241273df/git/cmd.py#L398-L403
   
   Two possible future enhancements are *not* included in this commit:
   
   1. This only modifies how test fixture scripts are run. It only
      affects the behavior of `gix-testtools`, and not of any other
      gitoxide crates such as `gix-command`. This is because:
   
      - While gitoxide uses information from `git` to find out where
        it is installed, mainly so we know where to find installation
        level configuration, we cannot in assume that `git` is present
        at all. Unlike GitPython, gitoxide is usable without `git`.
   
      - We know our test fixture scripts are all (at least currently)
        `bash` scripts, and this seems likely for other software that
        currently uses this functionality of `gix-testtools`. But
        scripts that are run as hooks, or as custom commands, or
        filters, etc., are often written in other languages, such as
        Perl. (The fallback here does not examine leading `#!` lines.)
   
      - Although a `bash.exe` located at the usual place relative to
        (but outside of) the `git-core` directory is usually suitable,
        there may be scenarios where running an executable found this
        way is not safe. Limiting it to `gix-testtools` pending
        further research may help mitigate this risk.
   
   2. As in other runs of `git` by `gix-testools`, this calls
      `git.exe`, letting `std::process::Command` do an executable
      search, but not trying any additional locations where Git is
      known sometimes to be installed. This does not find `git.exe` in
      as many situations as `gix_path::env::exe_invocation` does.
   
      The reasons for not (or not quite yet) including that change are:
   
      - It would add `gix-path` as a dependency of `gix-testtools`.
   
      - Finding `git` in a `std::process::Command` path search is an
        established (though not promised) approach in `gix-testtools`,
        including to run `git --exec-path` (to find `git-daemon`).
   
      - It is not immediately obvious that `exe_invocation` behavior
        is semantically correct for `gix-testtools`, though it most
        likely is reasonable.
   
        The main issue is that, in many cases where `git` itself runs
        scripts, it prepends the path to the `git-core` directory to
        the `PATH` environment variable for the script. This directory
        has a `git` (or `git.exe`) executable in it, so scripts run
        an equivalent `git` associated with the same installation.
   
        In contrast, when we run test fixture scripts with a
        `bash.exe` associated with a Git for Windows installation, we
        do not customize its path. Since top-level scripts written to
        use `git` but not to be used *by* `git` are usually written
        without the expectation of such an environment, prepending
        this will not necessarily be an improvement.
 - Double the fixture lock timeout
   This increases the lock timeout used in `gix-testtools` from 3 min
   6 min. This seems to fix #1605.
 - Unset other env vars related to `GIT_DIR` for fixtures
   This removes other environment variables that have an effect
   conceptually related to `GIT_DIR` even when `GIT_DIR` is not set.
   Most of them change where `git` will look for files that are
   ordinarily in a repository's `.git` directory. In contrast,
   `GIT_WORK_TREE` changes where the working tree is found.
   
   These would rarely be set in the environment in which the tests are
   run, but it makes sense to unset them for the same reason as
   unsetting `GIT_DIR`, which is already done.
   
   The new `remove_env` calls are roughly in the order in which the
   variables they unset are listed in git(1).
   
   This deliberately does not attempt to unset every possible
   environment variable that git(1) documents as affecting its
   behavior. This is for four reasons:
   
   - Some variables may be set on the test machine without envisioning
     this usage, but should still be kept, such as those that cause
     more or less traversal than usual to be done. For example, if
     `GIT_CEILING_DIRECTORIES` or even `GIT_DISCOVERY_ACROSS_FILESYSTEM`
     are set, it may be for a good reason.
   
   - Some variables will have no default unless other variables that
     are being modified here are changed again after the changes here.
     In particular, `GIT_CONFIG_SYSTEM` only has an effect if
     `GIT_CONFIG_NOSYSTEM` is not set. We set `GIT_CONFIG_NOSYSTEM` to
     `1`, so if it is unset then a fixture script has unset it, in
     which case it is presumably intended that `GIT_CONFIG_SYSTEM`
     have some effect (if the fixture script doesn't change/unset it).
   
   - Some variables are useful for extra debugging and make sense to
     set when running the test fixtures under foreseeable conditions.
     For example, the effects of all `GIT_TRACE*` variables are
     intentionally preserved.
   
   - For a few variables, such as `GIT_DEFAULT_HASH`, it is unlikely
     that they would be wanted in the test environment, but even more
     unlikely that they would be set in that environment without the
     intention of experimenting with their effect on fixtures.
   
   However, this is not to say that all environment variables that
   would make sense to remove have necessarily been removed.
   
   The removed variables here differ from those removed for the `git`
   invocation in `gix-path/src/env/git/mod.rs` for two reasons:
   
   - That is a single `git` invocation for a specific command, so the
     environment variables that ought to affect it must be kept, and
     others can be removed. But here, arbitrary fixtures need to work,
     and they provide almost all of their own environment as needed.
   
   - Setting an unusual value of `GIT_DIR` there that `git` cannot
     take to be a usable repository also prevents the variables
     that override `GIT_DIR` for specific files from being used. (But
     maybe those should be unset there anyway, for clarity?)
 - Append to preexisting `MSYS` env var even if ill-formed
   The value of an environment variable as obtained by the facilities
   in `std::env` is not always well-formed Unicode. Specifically, on
   Windows the values of environment variables, like paths, are
   natively UTF-16LE strings except that unpaired surrogate code
   points can also occur. An `&OsStr` on Windows may accordingly not
   quite be UTF-8.
   
   When the `MSYS` variable is absent, we treat this the same as when
   it is present but empty. However, as described in #1574, an `MSYS`
   variable that is present but whose value contains an unpaired
   surrogate would also be replaced entirely, rather than appending to
   its old value.
   
   This changes that, to instead append, retaining whatever was there
   even if it was ill-formed Unicode.
   
   An alternative change could be to panic when the old value is
   ill-formed Unicode. This commit allows and appends to the old
   value, rather than panicking or keeping and documenting the
   previous behavior of discarding the old value, because the appended
   sequence ` winsymlinks:nativestrict` is effective at causing
   fixture scripts to attempt to create actual symlinks even if
   the preceding code point is an unpaired Unicode high surrogate.
 - Omit other high-scoped config in fixtures
   In addition to keeping fixture scripts from receiving global and
   system scope Git configuration variables, as was already done, this
   also omits configuration variables from high scopes similar to or
   above the system scope, associated with the Git installation but
   separate from the system scope.
   
   The main and possibly only case where this happens is the "unknown"
   scope associated with an Apple Git installation on macOS. This is a
   file usually located under `/Library` or `/Applications`.
   
   This is done by using `GIT_CONFIG_NOSYSTEM`, which suppresses both
   the system scope and this separate "unknown" scope, instead of by
   settng `GIT_CONFIG_SYSTEM` to a path like `/dev/null`. The latter
   approach continues to be used to omit global scope config via
   `GIT_CONFIG_GLOBAL` (as `git` recognized no `GIT_CONFIG_NOGLOBAL`).
 - Omit system/global config in fixtures regardless of contents
   This uses the null device, `/dev/null` on Unix-like systems and
   `NUL` on Windows, as the value of `GIT_CONFIG_SYSTEM` and
   `GIT_CONFIG_GLOBAL` when `gix-testtols` runs test fixture shell
   scripts.
   
   `/dev/null` is explicitly recommended for this purpose, when
   setting those environment variables for the purpose of preventing
   configuration files from being read, in the Git documentation:
   
   - https://git-scm.com/docs/git#Documentation/git.txt-codeGITCONFIGGLOBALcode
   
   On Windows, `NUL` is an analogue of `/dev/null`. Even in the
   unusual scenario that a `\\?\` prefixed UNC path is used to create
   an actual file named `NUL` in the directory the fixture script
   operates in, the relative path `NUL` still resolves to the null
   device and not to that file.
   
   The previous behavior was to use a value of `:` on Unix-like
   systems or `-` on Windows. But these were really just unusual but
   valid paths, such that files of those names could exist in any
   location. `git` furthermore treats them as paths: a `:` is not
   special in these environment variables because they hold a single
   path rather than a list of paths, and a `-` is not special (for
   example, it does not specify stdin) because it appears in an
   environment variable rather than a command-line argument.
   
   While `:` and `-` are unusual filenames, this code is used in
   testing, including of edge cases where unusual files may be used.
   So this change may make the test tools slightly more robust.
 - Let `gix_testtools::Env` undo multiple changes to the same var
   Previously, an `Env` instance would restore the original state on
   drop if no more than one modification was made to any one variable
   through it, but would restore an intermediate state if the same
   variable was ever set multiple times, unset multiple times, or both
   set and unset in any order.
   
   The state it would restore for each variable was its state
   immediately before the most recent modification (through the `Env`
   instance) that affected it, rather than its original state before
   the first time it was modified through that `Env` instance.
   
   This fixes that by undoing the changes in the opposite of the order
   they were made.
 - assure archives are unique if their generator-scripts are called with arguments.
   Previously there was a race condition that would cause archives to be created either with
   or without arguments, depending on which test was run first.
   
   After its creation, they wouldn't be looked at again as on disk they would already be available
   in their usable form.

### Other

 - Fix description of `gix_testtools::Env::unset`
   The `unset` method inadvertently had the same docstring as `set`,
   even though this was not correct for `unset`. This fixes that, and
   also rewords the `Env` docstring to better account for the ability
   to unset.

### New Features (BREAKING)

 - on Windows, also instruct msys to create real symlinks
   This will only reliably work on with developer setups, but that
   seems fair to assume.
   If this causes problems, it's fine to make it opt-in as well.

### Bug Fixes (BREAKING)

 - don't panic, instead provide an error when fixture script fails.
   This makes introspection easier, even though we still have to print to
   script output to stderr in order to make it legible.

### Commit Statistics

 - 104 commits contributed to the release over the course of 296 calendar days.
 - 307 days passed between releases.
 - 22 commits were understood as [conventional](https://www.conventionalcommits.org).
 - 2 unique issues were worked on: #1440, #1443

### Thanks Clippy

[Clippy](https://github.com/rust-lang/rust-clippy) helped 6 times to make code idiomatic. 

### Commit Details

 * **#1440**
    - Assure archives are unique if their generator-scripts are called with arguments. (8a0fedb)
 * **#1443**
    - On Windows, also instruct msys to create real symlinks (0899c2e)
 * **Uncategorized**
    - Prepare new testtools release (070f5f6)
    - Merge pull request #1935 from pierrechevalier83/fix_1923 (3b1bef7)
    - J fmt (c3c6504)
    - Thanks clippy (6f009d7)
    - Merge pull request #1968 from GitoxideLabs/dependabot/cargo/cargo-bd18780e40 (46227e6)
    - Bump the cargo group with 40 updates (06bf1e1)
    - Merge pull request #1825 from DianaNites/diananites-reftable (edb449c)
    - Don't panic, instead provide an error when fixture script fails. (692caeb)
    - Merge pull request #1949 from GitoxideLabs/dependabot/cargo/cargo-6893e2988a (b5e9059)
    - Bump the cargo group with 21 updates (68e6b2e)
    - Merge pull request #1895 from EliahKagan/run-ci/s390x (705b86d)
    - Move `env` subcommand to `internal-tools` (809fb2f)
    - Test `gix_testtools::umask()` on Android targets (c19bf1d)
    - Add `env` testtools subcommand to show the environment (8d596b4)
    - Show unexpected stderr in `umask` panic message (07022ee)
    - Merge pull request #1864 from EliahKagan/run-ci/bash-program (97d50a3)
    - Add `jtt bash-program` (`jtt bp`) to show `bash_program()` (720a23f)
    - Document `gix_testtools::bash_program()` and make it public (47234b6)
    - Look for bash in `(git root)/bin`, then `(git root)/usr/bin` (0b45baf)
    - Look for bash in `(git root)/usr/bin`, not `(git root)/bin` (73d30d7)
    - Prefer `/` over `\` in `bash.exe` path (for fixtures) (ba76201)
    - Merge pull request #1854 from GitoxideLabs/montly-report (16a248b)
    - Thanks clippy (8e96ed3)
    - Merge pull request #1822 from epage/w7 (11ac79c)
    - Upgrade to Winnow 0.7 (fdc57e7)
    - Upgrade to Winnow 0.6.26 (783c4e6)
    - Merge pull request #1815 from EliahKagan/quadratic (ffb73b5)
    - Comment forthcoming dependency changes for gix-testtools (6990f76)
    - Merge pull request #1764 from EliahKagan/finalize-entry (12f672f)
    - Refactor (4d5e656)
    - Fix an MSRV incompatibility (61174e5)
    - Add `gix_testtools::umask`, safe but only meant for tests (8e7fb99)
    - Merge pull request #1752 from GitoxideLabs/git-shell (1ca480a)
    - Make a note to use `env::git_login_shell()` in testtools when available. (3aff1e5)
    - Thanks clippy (9193b05)
    - Merge pull request #1733 from GitoxideLabs/fix-testools (df5cead)
    - Fix check to detect `git-lfs` managed files that weren't checked out. (93cb5ba)
    - Merge pull request #1705 from GitoxideLabs/merge (520c832)
    - Create a more local lock when creating writable fixtures. (8b694a6)
    - Merge pull request #1712 from EliahKagan/run-ci/git-bash (fadf106)
    - Fix an ambiguous `expect` message (1f6a866)
    - Run test fixture scripts on Windows with Git Bash (fe3f2d1)
    - Refine `EXEC_PATH` validation in `spawn_git_daemon` (479c06b)
    - Run `cargo fmt` (da03932)
    - Use consistent `git` command name in gix-testtools (e30c070)
    - Rename `parse_gix_version` to `parse_git_version` (01737ad)
    - Merge pull request #1687 from EliahKagan/run-ci/32bit (aeaebec)
    - Add `size_ok` for asserting size is not too big (77c3c59)
    - Merge pull request #1612 from Byron/merge (37c1e4c)
    - Thanks clippy (af03832)
    - Merge pull request #1606 from EliahKagan/fixture-timeout (8c9e827)
    - Double the fixture lock timeout (39323c3)
    - Merge pull request #1594 from EliahKagan/comments (ab8880f)
    - Copyedit `configure_command` comment (56dbcd5)
    - Merge pull request #1592 from EliahKagan/tools-cfgcmd (5e783de)
    - Note that how we set `MSYS` ignores `env`/`env_remove` calls (4a25ef5)
    - Use more compact notation (0e1e6a9)
    - Broaden `args` param of `configure_command` (c202084)
    - Merge pull request #1590 from EliahKagan/run-ci/check-clean (4f92140)
    - Merge pull request #1591 from EliahKagan/run-ci/deps-via-worktree (c485a2b)
    - Thanks clippy (94c6d70)
    - Recognize `GIX_TEST_CREATE_ARCHIVES_EVEN_ON_CI` (03d5a68)
    - Rename create_archive_if_{not_on_ci -> we_should} (8b51b3a)
    - Copyedit `create_archive_if_not_on_ci` comments (6963b37)
    - In gix-testtools use `ignore` and `index` via `gix_worktree` (f7f24e5)
    - Merge pull request #1581 from EliahKagan/fixture-env (4044ffb)
    - Merge pull request #1580 from EliahKagan/msys (d00235a)
    - Unset other env vars related to `GIT_DIR` for fixtures (9d4dd12)
    - Remove `configure_command_msys*` tests at least for now (c38d9b9)
    - Append to preexisting `MSYS` env var even if ill-formed (8dc5d7a)
    - Start testing how the MSYS env var is customized (fbd4908)
    - Merge pull request #1571 from EliahKagan/fixture-config (0e2f831)
    - Run `cargo fmt` (91e065c)
    - Omit other high-scoped config in fixtures (a879d22)
    - Test that env for fixture scripts has only command-scope config (d576b32)
    - Merge pull request #1570 from EliahKagan/tools-nulldev (6f128dd)
    - Minor refactors (50fcd7e)
    - Don't assert that `tempfile::TempDir` cleans up (15bb2e3)
    - Avoid `File::create_new` for compatibility with project MSRV (40ac226)
    - Thanks clippy (2d7abaf)
    - Omit system/global config in fixtures regardless of contents (3cf9fc1)
    - Verify that we really write the strangely named test files (d7dca27)
    - Test on Windows with an actual file called `NUL` (f71d596)
    - Refactor the test for readability (7186eed)
    - Fix assertion messages and expected exit status (a2dc5d8)
    - Test that the system/global scopes are really cleared (d5b61df)
    - Start testing that we clear system/global scopes for fixtures (85c5e2f)
    - Merge pull request #1560 from EliahKagan/run-ci/env-lifo (2972ea8)
    - Merge pull request #1557 from Byron/merge-base (649f588)
    - Move new tests up into a `tests` subdirectory (555164f)
    - Let `gix_testtools::Env` undo multiple changes to the same var (581957e)
    - Add tests for `gix_testtools::Env` (505151c)
    - Fix description of `gix_testtools::Env::unset` (3b17305)
    - Allow empty-docs (beba720)
    - Merge branch 'global-lints' (37ba461)
    - Workspace Clippy lint management (2e0ce50)
    - Merge pull request #1546 from nyurik/semilocons (f992fb7)
    - Add missing semicolons (ec69c88)
    - Update manifests (by cargo-smart-release) (0470df3)
    - Merge branch 'fix-windows-tests' (c2753b8)
    - Fix gix-archive tests for when symlinks are allowed (93e088a)
    - Merge branch 'fix-1440' (f87322e)

v0.44.0

Toggle v0.44.0's commit message

Unverified

This tag is not signed, but one or more authors requires that any tag attributed to them is signed.

gix-worktree-v0.41.0

Toggle gix-worktree-v0.41.0's commit message

Unverified

This tag is not signed, but one or more authors requires that any tag attributed to them is signed.
### Commit Statistics

 - 1 commit contributed to the release.
 - 0 commits were understood as [conventional](https://www.conventionalcommits.org).
 - 0 issues like '(#ID)' were seen in commit messages

### Commit Details

 * **Uncategorized**
    - Bump all prior pratch levels to majors (5f7f805)

gix-worktree-stream-v0.21.1

Toggle gix-worktree-stream-v0.21.1's commit message

Unverified

This tag is not signed, but one or more authors requires that any tag attributed to them is signed.
### Commit Statistics

 - 1 commit contributed to the release.
 - 0 commits were understood as [conventional](https://www.conventionalcommits.org).
 - 0 issues like '(#ID)' were seen in commit messages

### Commit Details

 * **Uncategorized**
    - Bump all prior pratch levels to majors (5f7f805)

gix-worktree-state-v0.19.0

Toggle gix-worktree-state-v0.19.0's commit message

Unverified

This tag is not signed, but one or more authors requires that any tag attributed to them is signed.
### Commit Statistics

 - 1 commit contributed to the release.
 - 0 commits were understood as [conventional](https://www.conventionalcommits.org).
 - 0 issues like '(#ID)' were seen in commit messages

### Commit Details

 * **Uncategorized**
    - Bump all prior pratch levels to majors (5f7f805)

gix-validate-v0.10.0

Toggle gix-validate-v0.10.0's commit message

Unverified

This tag is not signed, but one or more authors requires that any tag attributed to them is signed.
### Commit Statistics

 - 1 commit contributed to the release.
 - 0 commits were understood as [conventional](https://www.conventionalcommits.org).
 - 0 issues like '(#ID)' were seen in commit messages

### Commit Details

 * **Uncategorized**
    - Bump all prior pratch levels to majors (5f7f805)

gix-v0.72.1

Toggle gix-v0.72.1's commit message

Unverified

This tag is not signed, but one or more authors requires that any tag attributed to them is signed.
### Commit Statistics

 - 1 commit contributed to the release.
 - 0 commits were understood as [conventional](https://www.conventionalcommits.org).
 - 0 issues like '(#ID)' were seen in commit messages

### Commit Details

 * **Uncategorized**
    - Bump all prior pratch levels to majors (5f7f805)

gix-utils-v0.3.0

Toggle gix-utils-v0.3.0's commit message

Unverified

This tag is not signed, but one or more authors requires that any tag attributed to them is signed.
### Commit Statistics

 - 1 commit contributed to the release.
 - 0 commits were understood as [conventional](https://www.conventionalcommits.org).
 - 0 issues like '(#ID)' were seen in commit messages

### Commit Details

 * **Uncategorized**
    - Bump all prior pratch levels to majors (5f7f805)

gix-url-v0.31.0

Toggle gix-url-v0.31.0's commit message

Unverified

This tag is not signed, but one or more authors requires that any tag attributed to them is signed.
### Commit Statistics

 - 1 commit contributed to the release.
 - 0 commits were understood as [conventional](https://www.conventionalcommits.org).
 - 0 issues like '(#ID)' were seen in commit messages

### Commit Details

 * **Uncategorized**
    - Bump all prior pratch levels to majors (5f7f805)