--- /dev/null
+#!/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