add cargo-git.eclass to handle git dependencies for rust ebuilds

Signed-off-by: Alfred Wingate <parona@protonmail.com>
This commit is contained in:
Alfred Wingate 2021-06-10 19:44:11 +03:00
parent 74ad1fd99b
commit d212c1386e
No known key found for this signature in database
GPG Key ID: A12750536B5E7010

103
eclass/cargo-git.eclass Normal file
View File

@ -0,0 +1,103 @@
# Copyright 1999-2021 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
# @ECLASS: cargo-git.eclass
# @MAINTAINER:
# parona@protonmail.com
# @AUTHOR:
# Alfred Wingate <parona@protonmail.com>
# @SUPPORTED_EAPIS: 7
# @BLURB: extend cargo.eclass to support git dependencies
case "${EAPI:-0}" in
0|1|2|3|4|5|6)
die "Unsupported EAPI=${EAPI:-0} (too old) for ${ECLASS}"
;;
7)
;;
*)
die "Unsupported EAPI=${EAPI} (unknown) for ${ECLASS}"
;;
esac
inherit cargo git-r3
EXPORT_FUNCTIONS src_unpack
# @ECLASS-VARIABLE: CARGO_GIT
# @DEFAULT_UNSET
# @DESCRIPTION:
# Array with the syntax "repourl oid identifier" (still not sure where the oid comes from :/)
# Fetches the repo with git-r3 and then checksout them for cargo in ECARGO_HOME
# Several checkouts arent possible at this moment, only one checkout per repository.
# @FUNCTION: cargo-git_src_unpack
# @DESCRIPTION:
# Fetches and checksout git repositories specified in CARGO_GIT and sets up correct file structure for cargo so that it wont try to break the network sandbox
cargo-git_src_unpack() {
debug-print-function ${FUNCNAME} "$@"
for line in "${CARGO_GIT[@]}"; do
local giturl oid identifier
read -r giturl oid identifier <<< "${line}"
git-r3_fetch "${giturl}" "${identifier}"
done
cargo_src_unpack
ECARGO_GIT="${ECARGO_HOME}/git"
for line in "${CARGO_GIT[@]}"; do
local giturl oid identifier
read -r giturl oid identifier <<< "${line}"
name=$(basename "${giturl}" .git || die)
repodir=$(get_gitdir "${giturl}" || die)
shortid=$(git --git-dir="${repodir}" rev-parse --short "${identifier}" || die)
git clone --bare "${repodir}" "${ECARGO_GIT}/db/${name}-${oid}" || die
mkdir -p "${ECARGO_GIT}/checkouts/${name}-${oid}/${shortid}" || die
git-r3_checkout "${giturl}" "${ECARGO_GIT}/checkouts/${name}-${oid}/${shortid}"
# Make cargo happy with the checkout so that it doesnt try to update it
touch "${ECARGO_GIT}/checkouts/${name}-${oid}/${shortid}/.cargo-ok" || die
done
}
# @FUNCTION: get_gitdir
# @DESCRIPTION:
# Ripped out from git-r3.eclass to get the correct dir
get_gitdir() {
debug-print-function ${FUNCNAME} "$@"
local repo_name=${1#*://*/}
# strip the trailing slash
repo_name=${repo_name%/}
# strip common prefixes to make paths more likely to match
# e.g. git://X/Y.git vs https://X/git/Y.git
# (but just one of the prefixes)
case "${repo_name}" in
# gnome.org... who else?
browse/*) repo_name=${repo_name#browse/};;
# cgit can proxy requests to git
cgit/*) repo_name=${repo_name#cgit/};;
# pretty common
git/*) repo_name=${repo_name#git/};;
# gentoo.org
gitroot/*) repo_name=${repo_name#gitroot/};;
# sourceforge
p/*) repo_name=${repo_name#p/};;
# kernel.org
pub/scm/*) repo_name=${repo_name#pub/scm/};;
esac
# ensure a .git suffix, same reason
repo_name=${repo_name%.git}.git
# now replace all the slashes
repo_name=${repo_name//\//_}
echo "${EGIT3_STORE_DIR}/${repo_name}"
}