#!/usr/bin/env sh # hash-id — 產生完整 40 碼大寫 SHA-1 hash。 # 用法: # hash-id # hash-id key <計畫名稱> # printf '%s' | hash-id # key 子命令的參數: # 計畫名稱: 交給 normalize-name.sh 正規化後再接字串,同名不同打法算出同一把 key。 # owner/repo: 存取庫識別,原樣接上,不經正規化。 # 規則: # 取完整 SHA-1 四十碼,a-f 轉大寫,不截短、不加前綴。 # 輸入為空即 exit 2。空字串本身也有合法的 SHA-1,靜靜回傳它就會生出 # 一個看起來正常的頁名,把內容寫到沒有人讀的那一頁。 # key 子命令把多個欄位接成雜湊輸入的組法收在這裡當單一入口:固定用 `|` # 分隔,避免各技能各自接字串各接各的。正規化規則本身不是雜湊職責,收在 # 獨立那支工具,這裡只管接字串。 # 結束碼: 0=成功 1=這台機器沒有 sha1sum 也沒有 shasum,算不出雜湊 # 2=用法錯誤:沒有給文字,或給的是空字串 set -eu dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) input='' if [ "${1:-}" = 'key' ]; then shift name="${1:-}"; repo="${2:-}" if [ -z "$name" ] || [ -z "$repo" ]; then echo 'usage: hash-id key <計畫名稱> ' >&2 exit 2 fi # 正規化計畫名稱,讓「我的 計畫」與「我的 計畫」這類同名不同打法算出同一把 key。 name=$(sh "$dir/normalize-name.sh" "$name") input="${name}|${repo}" elif [ "$#" -gt 0 ]; then input=$* elif [ -t 0 ]; then input='' else input=$(cat) fi if [ -z "$input" ]; then echo 'usage: hash-id ' >&2 exit 2 fi if command -v sha1sum >/dev/null 2>&1; then raw=$(printf '%s' "$input" | sha1sum | awk '{print $1}') elif command -v shasum >/dev/null 2>&1; then raw=$(printf '%s' "$input" | shasum -a 1 | awk '{print $1}') else echo 'no SHA-1 helper found' >&2 exit 1 fi printf '%s\n' "$raw" | tr a-f A-F