2021SC@SDUSC
resolver.sh代码如下:
#!/bin/bash require 'styles' # a recipe order takes the form # <github-user>/<repository-name>@<branch>:<recipe>:key=value,... # # the "<github-user>/" and/or "@<branch>", ":<recipe>..." parts can be omitted resolve_user_name() { local package="${1%%[@:]*}" local user_name='rime' if [[ "${package}" =~ / ]]; then user_name="${package%/*}" fi echo "${user_name}" } resolve_package_name() { local package="${1%%[@:]*}" local repo_name="${package##*/}" local package_name="${repo_name#rime-}" echo "${package_name}" } resolve_package() { local package="${1%%[@:]*}" echo "${package}" } # returns empty string if not specified resolve_branch() { local package="${1%%:*}" if [[ "${package}" =~ @ ]]; then echo "${package##*@}" fi } # returns empty string if not specified resolve_recipe() { local rx="$1" if [[ "${rx}" =~ : ]]; then rx="${rx#*:}" echo "${rx%%:*}" fi } resolve_recipe_options() { local rx="$1" if [[ "${rx}" =~ : ]]; then rx="${rx#*:}" if [[ "${rx}" =~ : ]]; then echo "${rx#*:}" | sed 's/[:,]/ /g' fi fi } expand_configuration_url() { if [[ "$1" =~ ^https:// ]]; then echo "$1" elif [[ "$1" =~ ^([^/@:]*)/([^/@:]*)(@[^/@:]*)?/([^@:]*-packages.conf)$ ]]; then local user="${BASH_REMATCH[1]}" local repo="${BASH_REMATCH[2]}" local branch="${BASH_REMATCH[3]#@}" local filepath="${BASH_REMATCH[4]}" echo "https://github.com/${user}/${repo}/raw/${branch:-master}/${filepath}" fi } load_package_list_from_target() { local target="$1" case "${target}" in */*/*-packages.conf |\ https://github.com/*/raw/*-packages.conf |\ https://raw.githubusercontent.com/*-packages.conf) local configuration_url="$(expand_configuration_url "${target}")" if [[ -z "${configuration_url}" ]]; then echo $(error 'ERROR:') "unable to recognize configuration: ${target}" >&2 exit 1 fi echo $(info 'Fetching') "${configuration_url}" curl -fLO "${configuration_url}" source "$(basename "${configuration_url}")" ;; *.conf) source "${target}" ;; :*) source "${root_dir:-.}/${target#:}"-packages.conf ;; *) package_list=("${target}") ;; esac } provide 'resolver'
同样的,开头和结尾各调用一个require和provide函数,分别创建新的模块和将模块加载入已加载模块数组。
前六个resolve函数主要用来解析。其分别解析用户姓名,包名,包,包下的分支,方法,方法选项。
resolve_user_name函数用来解析用户姓名。如果包名含有/,用户的名字为package%/后跟所有参数。然后输出用户姓名。
resolve_package_name函数用来解析包名。通过正则表达式进行匹配后将package_name的值输出。
resolve_package函数用来解析包。将package匹配后输出package的值。
resolve_branch函数用来解析包的分支。