penguin/utils

my env utils

bash/core/40_sources.bash

raw ยท 2246 bytes

rbash_sources_json_url() {
  printf '%s/%s/tree/%s/tree.json\n' \
    "$RBASH_REMOTE" "$RBASH_REPO" "$RBASH_REF"
}

declare -gA _RBASH_DICT

rbash-list() {
  _require_jq || return 1

  local item key enabled_marker
  echo "Available sources:"

  while IFS= read -r item; do
    key="$(printf '%s' "$item" | grep -o '^[0-9]\+' || true)"
    [ -n "$key" ] && _RBASH_DICT["s$key"]="$item"

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

    printf '  %s %s\n' "$enabled_marker" "$item"
  done < <(
    rbash_download "$(rbash_sources_json_url)" |
      jq -r '
        .[]
        | select(.path == "bash/sources" or (.path | startswith("bash/sources/")))
        | .path
        | sub("^bash/sources/?"; "")
        | select(length > 0)
      '
  )
}

r2ensource() {
  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"
}