penguin/utils

my env utils

bash/core/40_sources.bash

raw ยท 2518 bytes

rbash_sources_list() {
  printf '%s/%s/raw/master/bash/dist/sources.list\n' \
    "$RBASH_REMOTE" "$RBASH_REPO"
}

declare -gA _RBASH_DICT
declare -gA _RBASH_SOURCES_SUM

rbash_sources_load() {
	local hash path item key sources_list

	_RBASH_DICT=()
	_RBASH_SOURCES_SUM=()

	sources_list=$(rbash_cache "$RBASH_SOURCES_SUM" "$(rbash_sources_list)" "sources.list")

	while read -r hash path; do
		[ -n "$hash" ] || continue
		[ -n "$path" ] || continue

		item="${path#sources/}"

		key="$(printf '%s' "$item" | grep -o '^[0-9]\+' || true)"
		[ -n "$key" ] || continue

		_RBASH_DICT["s$key"]="$item"
		_RBASH_SOURCES_SUM["s$key"]="$hash"
	done < "$sources_list"
}

rbash-list() {
	local key item enabled_marker

	rbash_sources_load || return 1

	echo "Available sources:"

	while IFS= read -r key; do
		item="${_RBASH_DICT[$key]}"

		enabled_marker=" "
		if grep -q -F "rbash_load \"sources/$item\"" "$RBASH_CONFIG"; then
			enabled_marker="*"
		fi

		printf '  %s %s\n' "$enabled_marker" "$item"
	done < <(printf '%s\n' "${!_RBASH_DICT[@]}" | sort -V)
}

r2ensource() {

	if [ "$1" = "-f" ]; then
		sources_list=$(rbash_cache -r "$RBASH_SOURCES_SUM" "$(rbash_sources_list)" "sources.list")
	fi

	rbash-list || return 1

	local ids id selected tmp
	local -a enable=()

	read -r -p "Enter the script id XX, delimited by space: " ids

	for id in $ids; do
		selected="${_RBASH_DICT["s$id"]}"

		if [ -z "$selected" ]; then
			echo "No such id: $id" >&2
			return 1
		fi

		if grep -q -F "rbash_load \"sources/$selected\"" "$RBASH_CONFIG"; then
			echo "$selected is already enabled."
			continue
		fi

		enable+=("$selected")
	done

	tmp="$(mktemp)"
	cp "$RBASH_CONFIG" "$tmp"

	for selected in "${enable[@]}"; do
		echo "rbash_load \"sources/$selected\"" >> "$tmp"
		echo "Enabling $selected"
	done

	sort -u "$tmp" > "$RBASH_CONFIG"
	rm -f "$tmp"
	rm -rf "$RBASH_CACHE_DIR"
}

r2dissource() {
	local ids id tmp pattern

	echo "Currently enabled sources:"
	grep -E '^rbash_load "sources/' "$RBASH_CONFIG" |
		sed 's/^rbash_load "sources\///; s/"$//' |
		sed 's/^/		/'

	read -r -p "Enter the script id XX, delimited by space: " ids

	tmp="$(mktemp)"
	cp "$RBASH_CONFIG" "$tmp"

	for id in $ids; do
		pattern="rbash_load \"sources/${id}_"

		if ! grep -q -F "$pattern" "$tmp"; then
			echo "No such id: $id" >&2
			rm -f "$tmp"
			return 1
		fi

		echo "Disabling $id"
		grep -v -F "$pattern" "$tmp" > "$tmp.next"
		mv "$tmp.next" "$tmp"
	done

	sort -u "$tmp" > "$RBASH_CONFIG"
	rm -f "$tmp"
	rm -rf "$RBASH_CACHE_DIR"
}