Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions tests/functional/git/meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
suites += {
'name' : 'git',
'deps' : [],
'tests' : [ 'packed-refs-no-cache.sh' ],
'workdir' : meson.current_source_dir(),
}
81 changes: 81 additions & 0 deletions tests/functional/git/packed-refs-no-cache.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
#!/usr/bin/env bash

# Please see https://github.com/NixOS/nix/issues/13457
# for a higher description of the purpose of the test.
# tl;dr;fetchGit will utilize the git cache and avoid refetching when possible.
# It relies on the presence of either the commit when rev is provided
# or checks if the ref refs/heads/<ref_name> if ref is provided.
#
# Unfortunately, git can occasionally "pack references" which moves the references
# from individual files to a single unifies file.
# When this occurs, nix can no longer check for the presence of the ref to check
# for the mtime and will refetch unnecessarily.

source ../common.sh

requireGit

clearStoreIfPossible

# Intentionally not in a canonical form
# See https://github.com/NixOS/nix/issues/6195
repo=$TEST_ROOT/./git

export _NIX_FORCE_HTTP=1

rm -rf "$repo" "${repo}-tmp" "$TEST_HOME/.cache/nix"

git init --initial-branch="master" "$repo"
git -C "$repo" config user.email "nix-tests@example.com"
git -C "$repo" config user.name "Nix Tests"

echo "hello world" > "$repo/hello_world"
git -C "$repo" add hello_world
git -C "$repo" commit -m 'My first commit.'

# We now do an eval
nix eval --impure --raw --expr "builtins.fetchGit { url = file://$repo; }"

# test that our eval even worked by checking for the presence of the file
[[ $(nix eval --impure --raw --expr "builtins.readFile ((builtins.fetchGit { url = file://$repo; }) + \"/hello_world\")") = 'hello world' ]]

# Validate that refs/heads/master exists
shopt -s nullglob
matches=("$TEST_HOME/.cache/nix/gitv3/*/refs/heads/master")
shopt -u nullglob

if [[ ${#matches[@]} -eq 0 ]]; then
echo "refs/heads/master does not exist."
exit 1
fi
# pack refs
git -C "$TEST_HOME"/.cache/nix/gitv3/*/ pack-refs --all

shopt -s nullglob
matches=("$TEST_HOME"/.cache/nix/gitv3/*/refs/heads/master)
shopt -u nullglob

# ensure refs/heads/master is now gone
if [[ ${#matches[@]} -ne 0 ]]; then
echo "refs/heads/master still exists after pack-refs"
exit 1
fi

# create a new commit
echo "hello again" > "$repo/hello_again"
git -C "$repo" add hello_again
git -C "$repo" commit -m 'Second commit.'

# re-eval — this should return the path to the cached version
store_path=$(nix eval --tarball-ttl 3600 --impure --raw --expr "(builtins.fetchGit { url = file://$repo; }).outPath")
echo "Fetched store path: $store_path"

# Validate that the new file is *not* there
# FIXME: This is a broken test case and we should swap the assertion here.
if [[ -e "$store_path/hello_again" ]]; then
echo "ERROR: Cached fetchGit should not include the new commit."
exit 0
else
echo "PASS: New commit was not fetched due to caching (as expected)."
exit 1
fi
1 change: 1 addition & 0 deletions tests/functional/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,7 @@ endif
subdir('ca')
subdir('dyn-drv')
subdir('flakes')
subdir('git')
subdir('git-hashing')
subdir('local-overlay-store')

Expand Down
Loading