Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: better support for dangling revisions #11753

Open
wants to merge 1 commit into
base: 2.18-maintenance
Choose a base branch
from

Commits on Nov 11, 2024

  1. fix: better support dangling revisions

    The submodules branch generates a checkout which depends on only the
    references, not all revisions. If there are dangling revisions in the
    bare fetcher clone (a correctness issue itself) then the subsequent
    temporary directory clone will disastrously fail with messages like
    ```
    fatal: reference is not a tree: 2da0785fa32ce4c628d501c8743c88be00835b50
    ```
    You should be able to reproduce this behavior with
    ```bash
    
    this_nixpkgs='github:nixos/nixpkgs?rev=36ac8d7e411eeb11ac0998d5a39e329c1226e541';
    this_git=$(nix build --print-out-paths "$this_nixpkgs#git")/bin/git;
    
    export GIT_AUTHOR_NAME=foo \
    	[email protected] \
    	GIT_AUTHOR_DATE=100000000 \
    	GIT_COMMITER_NAME=foo \
    	[email protected] \
    	GIT_COMMITTER_DATE=100000000;
    
    tmpgit=$(mktemp -d);
    echo "Repo'll be at $tmpgit";
    
    "$this_git" init "$tmpgit";
    
    "$this_git" -C "$tmpgit" commit --allow-empty -m "foo"; # 8c2146823865b76da067b3bb458611a0a19ede3b
    "$this_git" -C "$tmpgit" commit --allow-empty -m "foo"; # 2da0785fa32ce4c628d501c8743c88be00835b50
    "$this_git" -C "$tmpgit" reset --hard HEAD~1; # 8c2146823865b76da067b3bb458611a0a19ede3b
    
    for version in 18 19 20 21 22 23 24; do
        echo "Checking nix version 2.$version";
        this_nix=$(nix build "$this_nixpkgs#nixVersions.nix_2_$version^out" --print-out-paths)/bin/nix;
    
        url="file:///$tmpgit";
    
        # populate fetcher-v1.sqlite and the gitv3/ dir
        "$this_nix-build" --expr $'builtins.fetchGit {
            url = \"'"$url"$'\";
            rev = \"8c2146823865b76da067b3bb458611a0a19ede3b\";
            submodules = true;
        }';
    
        # put the "corrupted" git dir in place of the fetched one
        cache_dir="${XDG_CONFIG_HOME:-$HOME}"/.cache/nix/gitv3;
        tmp=$(mktemp);
        printf "%s" "$url" >"$tmp";
        fetched_dir="$cache_dir"/$(printf "%s" "$url" | $this_nix --extra-experimental-features nix-command hash file --type sha256 --base32 "$tmp");
        rm -rf "$fetched_dir";
        git clone --bare "$tmpgit" "$fetched_dir";
    
        # See if we can realise the derivation pointing to the dangling commit
        _NIX_FORCE_HTTP=1 "$this_nix-build" --impure --expr $'
        { pkgs ? (import <nixpkgs> { }) }: pkgs.stdenv.mkDerivation {
          pname = "foo";
          version = "1.0.0";
          dontUnpack = true;
    
          '"
          src = builtins.fetchGit {
            url = \"file:///$tmpgit\";
            rev = \"2da0785fa32ce4c628d501c8743c88be00835b50\";
            submodules = true;
          };
    
          buildPhase = ''
            touch \$out;
            exit 0;
          '';
        }
        "
    done
    ```
    This solution attempts to avoid the issue in the submodules path by
    simply checking out the specified revision (in addition to all
    references to preserve the original behavior - although, I think _only_
    the revision is necessary).
    johnrichardrinehart committed Nov 11, 2024
    Configuration menu
    Copy the full SHA
    591a826 View commit details
    Browse the repository at this point in the history