Unverified Commit 5e2c16f7 authored by éclairevoyant's avatar éclairevoyant Committed by GitHub
Browse files

Merge pull request #280501 from OPNA2608/fix/unstableGitUpdater-stableVersion

unstableGitUpdater: Use stableVersion, update to new format, offer hardcoded 0 version
parents 880bc0e4 c4019f81
Loading
Loading
Loading
Loading
+136 −88
Original line number Diff line number Diff line
{ lib
, writeShellScript
, writeShellApplication
, coreutils
, git
, nix
@@ -10,20 +10,35 @@
# 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
, hardcodeZeroVersion ? false # Use a made-up version "0" instead of latest tag. Use when there is no previous release, or the project's tagging system is incompatible with what we expect from versions
, tagFormat ? "*" # A `git describe --tags --match '<format>'` pattern that tags must match to be considered
, tagPrefix ? null # strip this prefix from a tag name
, tagConverter ? null # A command to convert more complex tag formats. It receives the git tag via stdin and should convert it into x.y.z format to stdout
, shallowClone ? true
}:

assert lib.asserts.assertMsg (tagPrefix == null || tagConverter == null) "Can only use either tagPrefix or tagConverter!";

let
  updateScript = writeShellScript "unstable-update-script.sh" ''
  updateScript = writeShellApplication {
    name = "unstable-update-script";
    runtimeInputs = [
      common-updater-scripts
      coreutils
      git
      nix
    ];
    text = ''
      set -ex

      url=""
      branch=""
    use_stable_version=""
      hardcode_zero_version=""
      tag_format=""
      tag_prefix=""
      tag_converter=""
      shallow_clone=""
      : "''${systemArg:=}"

      while (( $# > 0 )); do
          flag="$1"
@@ -35,12 +50,18 @@ let
            --branch=*)
              branch="''${flag#*=}"
              ;;
          --use-stable-version)
            use_stable_version=1
            --hardcode-zero-version)
              hardcode_zero_version=1
              ;;
            --tag-format=*)
              tag_format="''${flag#*=}"
              ;;
            --tag-prefix=*)
              tag_prefix="''${flag#*=}"
              ;;
            --tag-converter=*)
              tag_converter="''${flag#*=}"
              ;;
            --shallow-clone)
              shallow_clone=1
              ;;
@@ -53,17 +74,17 @@ let

      # By default we set url to src.gitRepoUrl
      if [[ -z "$url" ]]; then
        url="$(${nix}/bin/nix-instantiate $systemArg --eval -E \
          # system argument cannot be passed as 1 argument
          # shellcheck disable=SC2086
          url="$(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)"
      tmpdir="$(mktemp -d)"

    cloneArgs=(
      --bare
    )
      cloneArgs=()

      if [[ "$shallow_clone" == "1" ]]; then
          cloneArgs+=(--depth=1)
@@ -73,51 +94,78 @@ let
          cloneArgs+=(--branch="$branch")
      fi

    ${git}/bin/git clone "''${cloneArgs[@]}" "$url" "$tmpdir"
      git clone "''${cloneArgs[@]}" "$url" "$tmpdir"
      getLatestVersion() {
          git describe --tags --abbrev=0 --match "''${tag_format}" 2> /dev/null || true
      }

      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
      commit_date="$(git show -s --pretty='format:%cs')"
      commit_sha="$(git show -s --pretty='format:%H')"
      last_tag=""
      if [[ -z "$hardcode_zero_version" ]]; then
          if [[ "$shallow_clone" == "1" ]]; then
              depth=100
        while (( $depth < 10000 )); do
            last_tag="$(${git}/bin/git describe --tags --abbrev=0 2> /dev/null || true)"
              while (( depth < 10000 )); do
                  last_tag="$(getLatestVersion)"
                  if [[ -n "$last_tag" ]]; then
                      break
                  fi
            ${git}/bin/git fetch --depth="$depth" --tags
            depth=$(( $depth * 2 ))
                  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
                  # To be extra sure, check if full history helps with finding a tag
                  git fetch --tags
                  last_tag="$(getLatestVersion)"
              fi
          else
              last_tag="$(getLatestVersion)"
          fi
          if [[ -z "$last_tag" ]]; then
              last_tag="0"
          fi
          if [[ -n "$tag_prefix" ]]; then
          last_tag="''${last_tag#$tag_prefix}"
              echo "Stripping prefix '$tag_prefix' from tag '$last_tag'"
              last_tag="''${last_tag#"''${tag_prefix}"}"
          fi
          if [[ -n "$tag_converter" ]]; then
              echo "Running '$last_tag' through: $tag_converter"
              last_tag="$(echo "''${last_tag}" | ''${tag_converter})"
          fi
        new_version="$last_tag+date=$commit_date"
      else
          last_tag="0"
      fi
      if [[ ! "$last_tag" =~ ^[[:digit:]] ]]; then
          echo "Last tag '$last_tag' does not start with a digit" > /dev/stderr
          exit 1
      fi
      new_version="$last_tag-unstable-$commit_date"
      popd
    # ${coreutils}/bin/rm -rf "$tmpdir"
      # rm -rf "$tmpdir"

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

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