summaryrefslogblamecommitdiff
path: root/scripts/fetch_version
blob: a0325f632789f5a7689bc199768547c4474eaa74 (plain) (tree)












































































































































































                                                                                                        
#!/bin/bash

usage() {
  echo "$0 file.json"
  echo "$0 [-n|--name name] [-b|--branch branch_or_rev] [-f|--file out_file] [-h|--help] (-u|--url) url"
  exit
}

branch="master"
while [[ $# -gt 0 ]]; do
  a="$1"
  shift
  case "$a" in
    *.json)
      file=$a
      content=$(cat $a)
      name="$(echo "$content" | jq -r ".meta.name")"
      url="$(echo "$content" | jq -r ".meta.url")"
      branch="$(echo "$content" | jq -r ".meta.branch")"
      ;;
    -n|--name)
      name=$1
      shift
      ;;
    -u|--url)
      url=$1
      shift
      ;;
    -b|--branch)
      branch=$1
      shift
      ;;
    -f|--file)
      file=$1
      shift
      ;;
    -h|--help)
      usage
      ;;
  esac
done
if [ -z "$url" ]; then
  usage
fi
if [ -z "$name" ]; then
  name=$(echo "$url" | cut -d"/" -f5)
fi
if [ -z "$file" ]; then
  file=$name.json
fi

# function fetch_ledger () {
#   pushd $HOME/projets/ledger >/dev/null 2>/dev/null
#   git fetch origin
#   tag="$(git describe origin/next | sed -e "s/^v//")"
#   rev="$(git show-ref -s refs/remotes/origin/next)"
#   sha="$(nix-prefetch-url --unpack file://<(git archive --format=tar.gz HEAD) 2>/dev/null)"
#   popd >/dev/null 2>/dev/null
# }

# awk_describe='BEGIN {
#   FS = "[ /^]+"
#   while ("git ls-remote " ARGV[1] "| sort -Vk2" | getline) {
#     if (!sha)
#       sha = substr($0, 1, 7)
#     tag = $3
#   }
#   while ("curl -s " ARGV[1] "/releases/tag/" tag | getline)
#     if ($3 ~ "commits")
#       com = $2
#   printf com ? "%s-%s-g%s\n" : "%s\n", tag, com, sha
# }'

function get_ref () {
  case "$1" in
    refs/*)
      echo "$1"
      ;;
    *)
      echo "refs/heads/$1"
      ;;
  esac
}

function get_name () {
  branch="$1"
  rev="$2"
  minirev=${rev:0:7}

  case "$branch" in
    refs/tags/*)
      b="${branch#refs/tags/}"
      echo "${b//\//-}"
      ;;
    refs/heads/*)
      b=${branch#refs/heads/}
      echo "$minirev-${b//\//-}"
      ;;
    refs/*)
      b=${branch#refs/}
      echo "$minirev-${b//\//-}"
      ;;
    *)
      echo "$minirev-${branch//\//-}"
      ;;
  esac
}

function fetch_github () {
  rev="$(git ls-remote --refs $url $(get_ref $branch) | head -n1 | cut -f1)"
  sha="$(nix-prefetch-url --unpack $url/archive/$rev.tar.gz)"
  # Différent du git-describe et github-spécifique
  #tag=$(echo "$awk_describe" | awk -f - $url | sed -e "s/^v//")
  tag=$(get_name $branch $rev)
}

function fetch_other () {
  rev="$(git ls-remote --refs $url $(get_ref $branch) | head -n1 | cut -f1)"
  sha="$(nix-prefetch-git --url $url --rev $(get_ref $branch) | jq -r '.sha256')"
  tag=$(get_name $branch $rev)
}

case "$url" in
  https://*github.com/*)
    fetch_github 2>/dev/null
    owner=$(echo "$url" | cut -d"/" -f4)
    repo=$(echo "$url" | cut -d"/" -f5)

    F='{
      "tag": $tag,
      "meta": {
        "name": $name,
        "url": $url,
        "branch": $branch
      },
      "github": {
        "owner": $owner,
        "repo": $repo,
        "rev": $rev,
        "sha256": $sha,
        "fetchSubmodules": true
      }
    }'
    ;;
  *)
    fetch_other 2>/dev/null
    F='{
      "tag": $tag,
      "meta": {
        "name": $name,
        "url": $url,
        "branch": $branch
      },
      "git": {
        "url": $url,
        "rev": $rev,
        "sha256": $sha,
        "fetchSubmodules": true
      }
    }'
    ;;
esac

jq -n \
  --arg name "$name" \
  --arg owner "$owner" \
  --arg repo "$repo" \
  --arg tag "$tag" \
  --arg rev "$rev" \
  --arg url "$url" \
  --arg branch "$branch" \
  --arg sha "$sha" \
  "$F" > $file