116 lines
2.7 KiB
Bash
116 lines
2.7 KiB
Bash
#!/bin/bash
|
|
|
|
exec 3>&1
|
|
exec >&2
|
|
|
|
dir=$1
|
|
vcs=$2
|
|
get_tags=$3
|
|
|
|
parse_vcs_url() {
|
|
local _url=$1
|
|
local _out_var=$2
|
|
# remove folder::
|
|
[[ $_url =~ ^[^/:]*::(.*)$ ]] && _url=${BASH_REMATCH[1]}
|
|
[[ $_url =~ ^(bzr|git|hg|svn)([+:])(.*) ]] || return 1
|
|
local _proto=${BASH_REMATCH[1]}
|
|
[[ ${BASH_REMATCH[2]} = + ]] && _url=${BASH_REMATCH[3]}
|
|
local _real_url=${_url%\#*}
|
|
local _frag=''
|
|
[[ $_real_url = $_url ]] || _frag=${_url##*\#}
|
|
eval "${_out_var}"'=("${_proto}" "${_real_url}" "${_frag}")'
|
|
}
|
|
|
|
get_vcs() {
|
|
local _vcs=$1
|
|
local _out_var=$2
|
|
if [[ -z $_vcs ]]; then
|
|
_vcs=$(. "${dir}"/PKGBUILD &> /dev/null
|
|
for src in "${source[@]}"; do
|
|
parse_vcs_url "$src" _ && {
|
|
echo "$src"
|
|
exit 0
|
|
}
|
|
done
|
|
exit 1) || return 1
|
|
fi
|
|
parse_vcs_url "$_vcs" "$_out_var"
|
|
}
|
|
|
|
git_get_version() {
|
|
local _url=$1
|
|
local _frag=$2
|
|
local _ref=''
|
|
if [[ -z $_frag ]]; then
|
|
_ref=HEAD
|
|
elif [[ $_frag =~ ^commit=(.*)$ ]]; then
|
|
echo "${BASH_REMATCH[1]}"
|
|
return 0
|
|
elif [[ $_frag =~ ^branch=(.*)$ ]]; then
|
|
_ref=refs/heads/${BASH_REMATCH[1]}
|
|
elif [[ $_frag =~ ^tag=(.*)$ ]]; then
|
|
_ref=refs/tags/${BASH_REMATCH[1]}
|
|
else
|
|
return 1
|
|
fi
|
|
local _res=$(git ls-remote "$_url" "$_ref")
|
|
[[ $_res =~ ^([a-fA-F0-9]*)[[:blank:]] ]] || return 1
|
|
echo "${BASH_REMATCH[1]}"
|
|
}
|
|
|
|
hg_get_version() {
|
|
local _url=$1
|
|
local _frag=$2
|
|
local _ref
|
|
if [[ -z $_frag ]]; then
|
|
_ref=default
|
|
elif [[ $_frag =~ ^(revision|tag|branch)=(.*)$ ]]; then
|
|
_ref=${BASH_REMATCH[2]}
|
|
else
|
|
return 1
|
|
fi
|
|
hg identify "${_url}#${_ref}"
|
|
}
|
|
|
|
svn_get_version() {
|
|
local _url=$1
|
|
local _frag=$2
|
|
local _extra_arg=()
|
|
if [[ -z $_frag ]]; then
|
|
true
|
|
elif [[ $_frag =~ ^(revision)=(.*)$ ]]; then
|
|
_extra_arg=(-r "${BASH_REMATCH[2]}")
|
|
else
|
|
return 1
|
|
fi
|
|
# Get rid of locale
|
|
env -i PATH="${PATH}" svn info "${_extra_arg[@]}" "${_url}" | \
|
|
sed -n 's/^Revision:[[:blank:]]*\([0-9]*\)/\1/p'
|
|
}
|
|
|
|
bzr_get_version() {
|
|
local _url=$1
|
|
local _frag=$2
|
|
local _extra_arg=()
|
|
if [[ -z $_frag ]]; then
|
|
true
|
|
elif [[ $_frag =~ ^(revision)=(.*)$ ]]; then
|
|
_extra_arg=(-r "${BASH_REMATCH[2]}")
|
|
else
|
|
return 1
|
|
fi
|
|
bzr revno -q "${_extra_arg[@]}" "${_url}"
|
|
}
|
|
|
|
git_get_tags() {
|
|
local _url=$1
|
|
git ls-remote "$_url" | grep -oP '(?<=refs/tags/)[^^]*$'
|
|
}
|
|
|
|
get_vcs "${vcs}" components || exit 1
|
|
if [[ "x$get_tags" == "xget_tags" ]]; then
|
|
eval "${components[0]}_get_tags"' ${components[@]:1}' >&3
|
|
else
|
|
eval "${components[0]}_get_version"' ${components[@]:1}' >&3
|
|
fi
|