#!/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