mirror of https://github.com/bpkg/bpkg
Support wiki-based repository index
New Plugins: - bpkg-update: sync repo listings locally - bpkg-list: list the repo names, with -d flag for details - bpkg-utils: source-only shared utilities for bpkg plugins Change-Id: I9ef04a86efa35c61cabd7c4ecfa7c7a134b41c6cpull/24/head
parent
8f1e597c8d
commit
e25906484f
@ -0,0 +1 @@
|
||||
lib/update/update.sh
|
@ -0,0 +1 @@
|
||||
lib/utils/utils.sh
|
@ -0,0 +1,79 @@
|
||||
#!/bin/bash
|
||||
|
||||
VERSION="0.0.1"
|
||||
|
||||
if ! type -f bpkg-utils &>/dev/null; then
|
||||
echo "error: bpkg-utils not found, aborting"
|
||||
exit 1
|
||||
else
|
||||
source `which bpkg-utils`
|
||||
fi
|
||||
|
||||
bpkg_initrc
|
||||
|
||||
usage () {
|
||||
echo "bpkg-list [-h|--help] [-V|--version] [-d|--details]"
|
||||
echo
|
||||
echo "List all known bash packages from the repo. You first must run \`bpkg update' to sync the repo locally."
|
||||
|
||||
echo "Options:"
|
||||
echo " --help|-h Print this help dialogue"
|
||||
echo " --version|-V Print version and exit"
|
||||
echo " --details|-d More verbose output"
|
||||
}
|
||||
|
||||
bpkg_list () {
|
||||
local verbose=0
|
||||
for opt in "${@}"; do
|
||||
case "$opt" in
|
||||
-V|--version)
|
||||
echo "${VERSION}"
|
||||
return 0
|
||||
;;
|
||||
-h|--help)
|
||||
usage
|
||||
return 0
|
||||
;;
|
||||
-d|--details)
|
||||
verbose=1
|
||||
;;
|
||||
*)
|
||||
if [ "${opt:0:1}" == "-" ]; then
|
||||
bpkg_error "unknown option: $opt"
|
||||
return 1
|
||||
fi
|
||||
esac
|
||||
done
|
||||
|
||||
local i=0
|
||||
for remote in "${BPKG_REMOTES[@]}"; do
|
||||
local git_remote="${BPKG_GIT_REMOTES[$i]}"
|
||||
bpkg_select_remote "$remote" "$git_remote"
|
||||
if [ ! -f "$BPKG_REMOTE_INDEX_FILE" ]; then
|
||||
bpkg_warn "no index file found for remote: ${remote}"
|
||||
bpkg_warn "You should run \`bpkg update' before running this command."
|
||||
continue
|
||||
fi
|
||||
OLDIFS="$IFS"
|
||||
IFS=$'\n'
|
||||
for line in $(cat $BPKG_REMOTE_INDEX_FILE); do
|
||||
local name=$(echo "$line" | cut -d\| -f1 | tr -d ' ')
|
||||
local desc=$(echo "$line" | cut -d\| -f2)
|
||||
local host=$BPKG_REMOTE_HOST
|
||||
if [ "$verbose" == "1" ]; then
|
||||
echo "$name [$host] - $desc"
|
||||
else
|
||||
echo $name
|
||||
fi
|
||||
done
|
||||
IFS="$OLDIFS"
|
||||
i=$((i+1))
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
if [[ ${BASH_SOURCE[0]} != $0 ]]; then
|
||||
export -f bpkg_list
|
||||
elif bpkg_validate; then
|
||||
bpkg_list "${@}"
|
||||
fi
|
@ -0,0 +1,82 @@
|
||||
#!/bin/bash
|
||||
|
||||
VERSION="0.0.1"
|
||||
|
||||
if ! type -f bpkg-utils &>/dev/null; then
|
||||
echo "error: bpkg-utils not found, aborting"
|
||||
exit 1
|
||||
else
|
||||
source `which bpkg-utils`
|
||||
fi
|
||||
|
||||
bpkg_initrc
|
||||
|
||||
usage () {
|
||||
echo "bpkg-update [-h] [-V]"
|
||||
echo
|
||||
echo "Update local bpkg index for listing and searching packages"
|
||||
}
|
||||
|
||||
bpkg_update_remote() {
|
||||
local remote=$1
|
||||
local git_remote=$2
|
||||
local wiki_url=""
|
||||
local wiki=""
|
||||
|
||||
bpkg_select_remote "$remote" "$git_remote"
|
||||
|
||||
local index=$BPKG_REMOTE_INDEX
|
||||
mkdir -p "$index"
|
||||
|
||||
local index_file="$index/index.txt"
|
||||
local auth=$BPKG_CURL_AUTH_PARAM
|
||||
|
||||
if [ "$auth" == "" ]; then
|
||||
wiki_url="$BPKG_REMOTE/wiki/bpkg/bpkg/index.md"
|
||||
else
|
||||
# GHE wiki urls have a unique path structure
|
||||
wiki_url="$BPKG_REMOTE/raw/wiki/bpkg/bpkg/index.md"
|
||||
fi
|
||||
|
||||
#echo "curl -slo- $auth '$wiki_url' | grep -o '\[.*\](.*).*'"
|
||||
repo_list=$(curl -sLo- $auth "$wiki_url" | grep -o '\[.*\](.*).*' | sed 's/\[\(.*\)\](.*)[ \-]*/\1|/' )
|
||||
|
||||
num_repos=$(echo "$repo_list" | wc -l | tr -d ' ')
|
||||
bpkg_info "indexing ${num_repos} repos from $BPKG_REMOTE_HOST to $index_file"
|
||||
echo "$repo_list" > $index_file
|
||||
}
|
||||
|
||||
bpkg_update () {
|
||||
for opt in "${@}"; do
|
||||
case "$opt" in
|
||||
-V|--version)
|
||||
echo "${VERSION}"
|
||||
return 0
|
||||
;;
|
||||
-h|--help)
|
||||
usage
|
||||
return 0
|
||||
;;
|
||||
*)
|
||||
if [ "${opt:0:1}" == '-' ]; then
|
||||
bpkg_error "unknown option: $opt"
|
||||
return 1
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
local let i=0
|
||||
for remote in "${BPKG_REMOTES[@]}"; do
|
||||
local git_remote=${BPKG_GIT_REMOTES[$i]}
|
||||
bpkg_update_remote "$remote" "$git_remote"
|
||||
i=$((i+1))
|
||||
done
|
||||
}
|
||||
|
||||
if [[ ${BASH_SOURCE[0]} != $0 ]]; then
|
||||
export -f bpkg_update
|
||||
elif bpkg_validate; then
|
||||
bpkg_update "${@}"
|
||||
fi
|
||||
|
@ -0,0 +1,133 @@
|
||||
#!/bin/bash
|
||||
|
||||
## Collection of shared bpkg functions
|
||||
|
||||
## Init local config and set environmental defaults
|
||||
bpkg_initrc() {
|
||||
local config=${BPKG_CONFIG:-"$HOME/.bpkgrc"}
|
||||
[ -f "$config" ] && source "$config"
|
||||
## set defaults
|
||||
if [ ${#BPKG_REMOTES[@]} -eq 0 ]; then
|
||||
BPKG_REMOTES[0]=${BPKG_REMOTE-https://raw.githubusercontent.com}
|
||||
BPKG_GIT_REMOTES[0]=${BPKG_GIT_REMOTE-https://github.com}
|
||||
fi
|
||||
BPKG_USER="${BPKG_USER:-"bpkg"}"
|
||||
BPKG_INDEX=${BPKG_INDEX-"$HOME/.bpkg/index"}
|
||||
}
|
||||
|
||||
## check parameter consistency
|
||||
bpkg_validate () {
|
||||
bpkg_initrc
|
||||
if [ ${#BPKG_GIT_REMOTES[@]} -ne ${#BPKG_REMOTES[@]} ]; then
|
||||
mesg='BPKG_GIT_REMOTES[%d] differs in size from BPKG_REMOTES[%d] array'
|
||||
fmesg=$(printf "$mesg" "${#BPKG_GIT_REMOTES[@]}" "${#BPKG_REMOTES[@]}")
|
||||
error "$fmesg"
|
||||
return 1
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
## format and output message
|
||||
bpkg_message () {
|
||||
if type -f bpkg-term > /dev/null 2>&1; then
|
||||
bpkg-term color "${1}"
|
||||
fi
|
||||
|
||||
shift
|
||||
printf " ${1}"
|
||||
shift
|
||||
|
||||
if type -f bpkg-term > /dev/null 2>&1; then
|
||||
bpkg-term reset
|
||||
fi
|
||||
|
||||
printf ": "
|
||||
|
||||
if type -f bpkg-term > /dev/null 2>&1; then
|
||||
bpkg-term reset
|
||||
bpkg-term bright
|
||||
fi
|
||||
|
||||
printf "%s\n" "${@}"
|
||||
|
||||
if type -f bpkg-term > /dev/null 2>&1; then
|
||||
bpkg-term reset
|
||||
fi
|
||||
}
|
||||
|
||||
## output error
|
||||
bpkg_error () {
|
||||
{
|
||||
bpkg_message "red" "error" "${@}"
|
||||
} >&2
|
||||
}
|
||||
|
||||
## output warning
|
||||
bpkg_warn () {
|
||||
{
|
||||
bpkg_message "yellow" "warn" "${@}"
|
||||
} >&2
|
||||
}
|
||||
|
||||
## output info
|
||||
bpkg_info () {
|
||||
local title="info"
|
||||
if (( "${#}" > 1 )); then
|
||||
title="${1}"
|
||||
shift
|
||||
fi
|
||||
bpkg_message "cyan" "${title}" "${@}"
|
||||
}
|
||||
|
||||
## takes a remote and git-remote and sets the globals:
|
||||
## BPKG_REMOTE: remote URI
|
||||
## BPKG_GIT_REMOTE: git remote with oauth info embedded,
|
||||
## BPKG_OAUTH_TOKEN: token for x-oauth-basic
|
||||
bpkg_select_remote () {
|
||||
local remote=$1
|
||||
local git_remote=$2
|
||||
BPKG_REMOTE_HOST=$(echo "$git_remote" | sed 's/.*:\/\///' | sed 's/\/$//' | tr '/' '_')
|
||||
BPKG_REMOTE_INDEX="$BPKG_INDEX/$BPKG_REMOTE_HOST"
|
||||
BPKG_REMOTE_INDEX_FILE="$BPKG_REMOTE_INDEX/index.txt"
|
||||
BPKG_OAUTH_TOKEN=""
|
||||
BPKG_CURL_AUTH_PARAM=""
|
||||
if [ "${remote:0:10}" == "raw-oauth|" ]; then
|
||||
OLDIFS="${IFS}"
|
||||
IFS="|"
|
||||
local remote_parts=($remote)
|
||||
IFS="${OLDIFS}"
|
||||
BPKG_OAUTH_TOKEN=${remote_parts[1]}
|
||||
BPKG_CURL_AUTH_PARAM="-u $BPKG_OAUTH_TOKEN:x-oauth-basic"
|
||||
BPKG_REMOTE=${remote_parts[2]}
|
||||
if [[ "$git_remote" == https://* ]] && [[ "$git_remote" != *x-oauth-basic* ]] && [[ "$git_remote" != *${BPKG_OAUTH_TOKEN}* ]]; then
|
||||
git_remote=${git_remote/https:\/\//https:\/\/$BPKG_OAUTH_TOKEN:x-oauth-basic@}
|
||||
fi
|
||||
else
|
||||
BPKG_REMOTE=$remote
|
||||
fi
|
||||
BPKG_GIT_REMOTE=$git_remote
|
||||
}
|
||||
|
||||
## given a user and name, sets BPKG_RAW_PATH using the available
|
||||
## BPKG_REMOTE and BPKG_OAUTH_TOKEN details
|
||||
bpkg_select_raw_path() {
|
||||
local user=$1
|
||||
local name=$2
|
||||
if [ "$BPKG_OAUTH_TOKEN" == "" ]; then
|
||||
BPKG_RAW_PATH="$BPKG_REMOTE/$user/$name"
|
||||
else
|
||||
BPKG_RAW_PATH="$BPKG_REMOTE/$user/$name/raw"
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
export -f bpkg_initrc
|
||||
export -f bpkg_validate
|
||||
|
||||
export -f bpkg_message
|
||||
export -f bpkg_warn
|
||||
export -f bpkg_error
|
||||
export -f bpkg_info
|
||||
|
||||
export -f bpkg_select_remote
|
||||
export -f bpkg_select_raw_path
|
Loading…
Reference in New Issue