#!/bin/bash # Script: GitHubFileDownloader.sh # Author: electblake # Version: 1.0 # Description: This script converts a GitHub repository file URL to its GitHub API URL for file contents, checks if the user is logged into GitHub CLI, and downloads the file. # Source: https://gist.github.com/electblake/7ef3a63e20b3c8db67d9d66f7021d727 # Credits: Utilized OpenAI "Bash Script" GPT by Widenex for script creation assistance. # # MIT License # Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # Requires: jq, curl, and GitHub CLI (gh) installed and configured. # Installation: # 1. Place this script in a directory included in your $PATH, e.g., /usr/local/bin or ~/bin. # 2. Ensure it is executable: chmod +x GitHubFileDownloader.sh # 3. You must be logged into the GitHub CLI. If not, the script will initiate the login flow. # Usage: # ./GitHubFileDownloader.sh # Example: # ./GitHubFileDownloader.sh https://github.com/kepano/obsidian-minimal/blob/master/src/scss/features/checklist-icons.scss # Function to check if the user is logged into the GitHub CLI check_gh_cli_login() { if ! gh auth status &> /dev/null; then printf "You are not logged into the GitHub CLI. Starting login flow...\n" if ! gh auth login --web; then printf "GitHub CLI login failed.\n" >&2 return 1 fi fi } # Function to convert a GitHub file URL to its corresponding GitHub API URL convert_url_to_api() { local input_url="$1" local regex='https://github\.com/([^/]+)/([^/]+)/blob/([^/]+)/(.+)' if [[ $input_url =~ $regex ]]; then local user="${BASH_REMATCH[1]}" local repo="${BASH_REMATCH[2]}" local branch="${BASH_REMATCH[3]}" local path="${BASH_REMATCH[4]}" printf "https://api.github.com/repos/%s/%s/contents/%s?ref=%s\n" "$user" "$repo" "$path" "$branch" else printf "Invalid URL format.\n" >&2 return 1 fi } # Function to download the file using GitHub API URL download_file_using_api() { local api_url="$1" local original_file_name=$(basename "$2") # Ensure jq and curl are installed if ! command -v jq &> /dev/null || ! command -v curl &> /dev/null; then printf "Error: jq and curl are required.\n" >&2 return 1 fi # Fetch the download URL using GitHub CLI and jq local download_url if ! download_url=$(gh api "$api_url" --jq .download_url); then printf "Failed to fetch download URL.\n" >&2 return 1 fi # Download the file if ! curl -sL "$download_url" -o "$original_file_name"; then printf "Failed to download the file.\n" >&2 return 1 fi printf "File downloaded successfully: %s\n" "$original_file_name" } main() { local url="$1" if [[ -z $url ]]; then printf "Usage: $0 \nExample: $0 https://github.com/kepano/obsidian-minimal/blob/master/src/scss/features/checklist-icons.scss\n" >&2 return 1 fi # Check if the user is logged into GitHub CLI if ! check_gh_cli_login; then return 1 fi local api_url if ! api_url=$(convert_url_to_api "$url"); then printf "Failed to convert URL to API URL.\n" >&2 return 1 fi download_file_using_api "$api_url" "$url" } main "$@"