summary refs log blame commit diff
path: root/pkgs/common-updater/unstable-updater.nix
blob: 29b7fcf196795d2c910105e9967d0eecf84c0d16 (plain) (tree)
1
2
3
4
5
6
7
8
9
10

                  







                                                                            
                                                                     
               

                                                                                                 
                     





                                                                

             

                         
                    










                                 





                                     


                           





                                                     
 
                                             

                                                                
                                                                               




                                                  


               

     



                                          





                                                             


                                                                 




















                                                                                        
        
                                       



                                                         
                        


                           

  



                                     


                                  

                                 
 
{ lib
, writeShellScript
, coreutils
, git
, nix
, common-updater-scripts
}:

# This is an updater for unstable packages that should always use the latest
# commit.
{ url ? null # The git url, if empty it will be set to src.gitRepoUrl
, branch ? null
, stableVersion ? false # Use version format according to RFC 107 (i.e. LAST_TAG+date=YYYY-MM-DD)
, tagPrefix ? "" # strip this prefix from a tag name when using stable version
, shallowClone ? true
}:

let
  updateScript = writeShellScript "unstable-update-script.sh" ''
    set -ex

    url=""
    branch=""
    use_stable_version=""
    tag_prefix=""
    shallow_clone=""

    while (( $# > 0 )); do
        flag="$1"
        shift 1
        case "$flag" in
          --url=*)
            url="''${flag#*=}"
            ;;
          --branch=*)
            branch="''${flag#*=}"
            ;;
          --use-stable-version)
            use_stable_version=1
            ;;
          --tag-prefix=*)
            tag_prefix="''${flag#*=}"
            ;;
          --shallow-clone)
            shallow_clone=1
            ;;
          *)
            echo "$0: unknown option ‘''${flag}’"
            exit 1
            ;;
        esac
    done

    # By default we set url to src.gitRepoUrl
    if [[ -z "$url" ]]; then
        url="$(${nix}/bin/nix-instantiate $systemArg --eval -E \
                   "with import ./. {}; $UPDATE_NIX_ATTR_PATH.src.gitRepoUrl" \
            | tr -d '"')"
    fi

    # Get info about HEAD from a shallow git clone
    tmpdir="$(${coreutils}/bin/mktemp -d)"

    cloneArgs=(
      --bare
    )

    if [[ "$shallow_clone" == "1" ]]; then
        cloneArgs+=(--depth=1)
    fi

    if [[ -n "$branch" ]]; then
        cloneArgs+=(--branch="$branch")
    fi

    ${git}/bin/git clone "''${cloneArgs[@]}" "$url" "$tmpdir"

    pushd "$tmpdir"
    commit_date="$(${git}/bin/git show -s --pretty='format:%cs')"
    commit_sha="$(${git}/bin/git show -s --pretty='format:%H')"
    if [[ -z "$use_stable_version" ]]; then
        new_version="unstable-$commit_date"
    else
        depth=100
        while (( $depth < 10000 )); do
            last_tag="$(${git}/bin/git describe --tags --abbrev=0 2> /dev/null || true)"
            if [[ -n "$last_tag" ]]; then
                break
            fi
            ${git}/bin/git fetch --depth="$depth" --tags
            depth=$(( $depth * 2 ))
        done
        if [[ -z "$last_tag" ]]; then
            echo "Cound not found a tag within last 10000 commits" > /dev/stderr
            exit 1
        fi
        if [[ -n "$tag_prefix" ]]; then
          last_tag="''${last_tag#$tag_prefix}"
        fi
        new_version="$last_tag+date=$commit_date"
    fi
    popd
    # ${coreutils}/bin/rm -rf "$tmpdir"

    # update the nix expression
    ${common-updater-scripts}/bin/update-source-version \
        "$UPDATE_NIX_ATTR_PATH" \
        "$new_version" \
        --rev="$commit_sha"
  '';

in
[
  updateScript
  "--url=${builtins.toString url}"
] ++ lib.optionals (branch != null) [
  "--branch=${branch}"
] ++ lib.optionals stableVersion [
  "--use-stable-version"
  "--tag-prefix=${tagPrefix}"
] ++ lib.optionals shallowClone [
  "--shallow-clone"
]