fetch_package.sh代码解析

2021SC@SDUSC

fetch_package.sh的代码如下:

#!/bin/bash
#
# Fetch a Rime data package from GitHub
#

package_name="$1"
shift

if [[ -z "${package_name}" ]]; then
    echo "Usage: $(basename "$0") <package-name> [<directory>] [-b <branch>]"
    exit 1
fi

resolve_package_name() {
    local name="$1"
    if [[ ${name} =~ [^/]*/[^/]* ]]; then
        echo ${name}
    elif [[ ${name} =~ rime-[^/]* ]]; then
        echo rime/${name}
    else
        echo rime/rime-${name}
    fi
}

package_url="https://github.com/$(resolve_package_name "${package_name}").git"

git_version_greater_or_equal() {
    local target_major="$1"
    local target_minor="$2"
    local git_version_pattern='^git version ([0-9]*)\.([0-9]*).*$'
    if [[ "$(git --version | grep '^git version')" =~ $git_version_pattern ]]; then
        local major="${BASH_REMATCH[1]}"
        local minor="${BASH_REMATCH[2]}"
        [[ "${major}" -gt "${target_major}" ]] || (
            [[ "${major}" -eq "${target_major}" ]] && [[ "${minor}" -ge "${target_minor}" ]]
        )
    else
        return 1
    fi
}

clone_options=(
    --depth 1
    --recurse-submodules
)

if git_version_greater_or_equal 2 9; then
    clone_options+=(
        --shallow-submodules
    )
fi

git clone ${clone_options[@]} "${package_url}" "$@"

这个脚本文件是用来从GitHub中获取Rime数据包的。

开始定义了一个变量package_name,它的值为传入的第一个参数。然后shift将参数左移。也就是第二个参数变成第一个参数,第三个参数变成第二个参数,依次类推……

接下来判断package_name是否为零。

如果为零,将 "Usage: $(basename "$0") <package-name> [<directory>] [-b <branch>]"输出。其中"$0"为这个shell的文件名。并且以异常状态退出。

然后看resolve_package_name这个函数。函数中定义了一个本地变量name,赋值为第一个参数。

然后通过正则表达式进行筛选。[^/]匹配除了'/'以外的任意一个字符。也就是说这个name不以/开头。*将[^/]匹配任意多次。如果name匹配a/a,a为除了'/'以外的任意一个字符。就直接输出name.如果name匹配rime-a,a为除了'/'以外的任意一个字符,输出rime/rime-a.除了这两种情况,直接就直接输出rime/rime-a(a为name的值)。

package_url定义为"https://github.com/$(resolve_package_name "${package_name}").git",是将该数据的定位给储存起来。

再看git_version_greater_or_equal函数,这个函数用来判断当前版本是更新的还是相同的。target_major赋值为第一个变量,target_minor赋值为第二个变量。git_version_pattern为git version打头紧接数字和.以及另一个数字。由于.*匹配任意内容。所以可以以任意内容结尾。如果git的version是匹配的,将major和minor将bash_rematch[ ]的第二个和第三个元素赋值给major和minor。如果major是大于target_major或者major和target_major相等时minor大于等于target_minor,则返回true.如果版本不匹配,异常状态退出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值