mirror of
https://github.com/ivuorinen/dotfiles.git
synced 2026-01-26 11:14:08 +00:00
chore(lint): shfmt local/bin/*
This commit is contained in:
@@ -11,10 +11,10 @@ set -euo pipefail
|
||||
VERBOSE=0
|
||||
CHECK_PATTERN="text: auto"
|
||||
EXIT_ON_MISSING=0
|
||||
SUGGEST_RULES=1 # Suggestions enabled by default
|
||||
WRITE_RULES=0 # Writing to file is opt-in
|
||||
FORMAT_WIDTH=0 # Auto-width by default (0 means auto)
|
||||
MIN_FORMAT_WIDTH=20 # Minimum format width
|
||||
SUGGEST_RULES=1 # Suggestions enabled by default
|
||||
WRITE_RULES=0 # Writing to file is opt-in
|
||||
FORMAT_WIDTH=0 # Auto-width by default (0 means auto)
|
||||
MIN_FORMAT_WIDTH=20 # Minimum format width
|
||||
|
||||
DEBUG="${DEBUG:-0}"
|
||||
|
||||
@@ -23,27 +23,33 @@ if [ "$DEBUG" -eq 1 ]; then
|
||||
fi
|
||||
|
||||
# Output functions
|
||||
msg_err() {
|
||||
msg_err()
|
||||
{
|
||||
echo -e "\e[31m$@\e[0m" >&2
|
||||
}
|
||||
|
||||
msg_success() {
|
||||
msg_success()
|
||||
{
|
||||
echo -e "\e[32m$@\e[0m"
|
||||
}
|
||||
|
||||
msg_warn() {
|
||||
msg_warn()
|
||||
{
|
||||
echo -e "\e[33m$@\e[0m" >&2
|
||||
}
|
||||
|
||||
msg_info() {
|
||||
msg_info()
|
||||
{
|
||||
echo -e "\e[36m$@\e[0m"
|
||||
}
|
||||
|
||||
msg_debug() {
|
||||
msg_debug()
|
||||
{
|
||||
[[ $VERBOSE -eq 1 ]] && echo -e "\e[35m$@\e[0m"
|
||||
}
|
||||
|
||||
show_help() {
|
||||
show_help()
|
||||
{
|
||||
cat << EOF
|
||||
Usage: $(basename "$0") [OPTIONS]
|
||||
|
||||
@@ -64,31 +70,31 @@ EOF
|
||||
# Parse arguments
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
-h|--help)
|
||||
-h | --help)
|
||||
show_help
|
||||
exit 0
|
||||
;;
|
||||
-v|--verbose)
|
||||
-v | --verbose)
|
||||
VERBOSE=1
|
||||
shift
|
||||
;;
|
||||
-e|--exit)
|
||||
-e | --exit)
|
||||
EXIT_ON_MISSING=1
|
||||
shift
|
||||
;;
|
||||
-p|--pattern)
|
||||
-p | --pattern)
|
||||
CHECK_PATTERN="$2"
|
||||
shift 2
|
||||
;;
|
||||
-n|--no-suggest)
|
||||
-n | --no-suggest)
|
||||
SUGGEST_RULES=0
|
||||
shift
|
||||
;;
|
||||
-w|--write)
|
||||
-w | --write)
|
||||
WRITE_RULES=1
|
||||
shift
|
||||
;;
|
||||
-f|--format-width)
|
||||
-f | --format-width)
|
||||
if [[ $2 =~ ^[0-9]+$ ]]; then
|
||||
FORMAT_WIDTH=$2
|
||||
shift 2
|
||||
@@ -106,7 +112,8 @@ while [[ $# -gt 0 ]]; do
|
||||
done
|
||||
|
||||
# Function to check if git is installed
|
||||
check_git_installed() {
|
||||
check_git_installed()
|
||||
{
|
||||
if ! command -v git &> /dev/null; then
|
||||
msg_err "git could not be found, please install it first"
|
||||
exit 1
|
||||
@@ -114,15 +121,17 @@ check_git_installed() {
|
||||
}
|
||||
|
||||
# Check if we're in a git repository
|
||||
check_git_repo() {
|
||||
if ! git rev-parse --is-inside-work-tree &>/dev/null; then
|
||||
check_git_repo()
|
||||
{
|
||||
if ! git rev-parse --is-inside-work-tree &> /dev/null; then
|
||||
msg_err "Not inside a git repository"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Check if we're in the git root directory
|
||||
check_git_root() {
|
||||
check_git_root()
|
||||
{
|
||||
local git_root
|
||||
git_root=$(git rev-parse --show-toplevel)
|
||||
local current_dir
|
||||
@@ -136,7 +145,8 @@ check_git_root() {
|
||||
}
|
||||
|
||||
# Check if .gitattributes exists
|
||||
check_gitattributes_exists() {
|
||||
check_gitattributes_exists()
|
||||
{
|
||||
if [[ ! -f ".gitattributes" ]]; then
|
||||
msg_err ".gitattributes file not found in the repository root"
|
||||
msg_warn "Create a .gitattributes file before running this command"
|
||||
@@ -145,7 +155,8 @@ check_gitattributes_exists() {
|
||||
}
|
||||
|
||||
# Format rule with proper alignment
|
||||
format_rule() {
|
||||
format_rule()
|
||||
{
|
||||
local pattern="$1"
|
||||
local attributes="$2"
|
||||
local width="$3"
|
||||
@@ -166,7 +177,8 @@ format_rule() {
|
||||
}
|
||||
|
||||
# Get the file extension properly, handling special cases
|
||||
get_file_extension() {
|
||||
get_file_extension()
|
||||
{
|
||||
local file="$1"
|
||||
local basename=$(basename "$file")
|
||||
local extension=""
|
||||
@@ -199,7 +211,8 @@ get_file_extension() {
|
||||
}
|
||||
|
||||
# Suggest appropriate gitattributes rules based on file extension
|
||||
suggest_rule() {
|
||||
suggest_rule()
|
||||
{
|
||||
local file="$1"
|
||||
local extension=""
|
||||
local pattern=""
|
||||
@@ -237,15 +250,15 @@ suggest_rule() {
|
||||
# Common text files
|
||||
case "$extension" in
|
||||
# Shell scripts
|
||||
sh|bash|zsh|fish)
|
||||
sh | bash | zsh | fish)
|
||||
attributes="text eol=lf diff=shell"
|
||||
;;
|
||||
|
||||
# Web development
|
||||
html|htm|xhtml|css|scss|sass|less)
|
||||
html | htm | xhtml | css | scss | sass | less)
|
||||
attributes="text eol=lf diff=html"
|
||||
;;
|
||||
js|jsx|ts|tsx|json|json5)
|
||||
js | jsx | ts | tsx | json | json5)
|
||||
attributes="text eol=lf diff=javascript"
|
||||
;;
|
||||
|
||||
@@ -262,20 +275,20 @@ suggest_rule() {
|
||||
go)
|
||||
attributes="text eol=lf diff=golang"
|
||||
;;
|
||||
java|kt|scala)
|
||||
java | kt | scala)
|
||||
attributes="text eol=lf diff=java"
|
||||
;;
|
||||
c|cpp|h|hpp)
|
||||
c | cpp | h | hpp)
|
||||
attributes="text eol=lf diff=cpp"
|
||||
;;
|
||||
|
||||
# Documentation
|
||||
md|markdown|txt)
|
||||
md | markdown | txt)
|
||||
attributes="text eol=lf"
|
||||
;;
|
||||
|
||||
# Configuration files
|
||||
yml|yaml|toml|ini|cfg|conf)
|
||||
yml | yaml | toml | ini | cfg | conf)
|
||||
attributes="text eol=lf"
|
||||
;;
|
||||
|
||||
@@ -283,24 +296,24 @@ suggest_rule() {
|
||||
git)
|
||||
attributes="text eol=lf"
|
||||
;;
|
||||
gitignore|gitattributes)
|
||||
gitignore | gitattributes)
|
||||
attributes="text eol=lf"
|
||||
;;
|
||||
|
||||
# Binary files
|
||||
png|jpg|jpeg|gif|ico|svg|webp|avif)
|
||||
png | jpg | jpeg | gif | ico | svg | webp | avif)
|
||||
attributes="binary"
|
||||
;;
|
||||
pdf|doc|docx|xls|xlsx|ppt|pptx)
|
||||
pdf | doc | docx | xls | xlsx | ppt | pptx)
|
||||
attributes="binary"
|
||||
;;
|
||||
zip|tar|gz|7z|rar)
|
||||
zip | tar | gz | 7z | rar)
|
||||
attributes="binary"
|
||||
;;
|
||||
mp3|mp4|avi|mov|wav|ogg)
|
||||
mp3 | mp4 | avi | mov | wav | ogg)
|
||||
attributes="binary"
|
||||
;;
|
||||
ttf|otf|woff|woff2|eot)
|
||||
ttf | otf | woff | woff2 | eot)
|
||||
attributes="binary"
|
||||
;;
|
||||
|
||||
@@ -321,7 +334,8 @@ suggest_rule() {
|
||||
}
|
||||
|
||||
# Function to check for missing .gitattributes
|
||||
check_gitattributes() {
|
||||
check_gitattributes()
|
||||
{
|
||||
local missing_attributes
|
||||
msg_info "Checking for pattern: $CHECK_PATTERN"
|
||||
|
||||
@@ -362,7 +376,8 @@ check_gitattributes() {
|
||||
}
|
||||
|
||||
# Parse rule string and extract pattern and attributes
|
||||
parse_rule() {
|
||||
parse_rule()
|
||||
{
|
||||
local rule="$1"
|
||||
|
||||
if [[ "$rule" == "#"* ]]; then
|
||||
@@ -379,7 +394,8 @@ parse_rule() {
|
||||
}
|
||||
|
||||
# Check shell scripts by name regardless of extension
|
||||
detect_shell_scripts() {
|
||||
detect_shell_scripts()
|
||||
{
|
||||
msg_debug "Detecting shell scripts by name regardless of extension..."
|
||||
|
||||
local shell_scripts_rules=""
|
||||
@@ -510,13 +526,14 @@ detect_shell_scripts() {
|
||||
|
||||
# Return the formatted arrays
|
||||
local rules_count=${#patterns[@]}
|
||||
for ((i=0; i<rules_count; i++)); do
|
||||
for ((i = 0; i < rules_count; i++)); do
|
||||
echo "${patterns[$i]}:${attributes[$i]}"
|
||||
done
|
||||
}
|
||||
|
||||
# Function to suggest gitattributes rules
|
||||
suggest_gitattributes() {
|
||||
suggest_gitattributes()
|
||||
{
|
||||
local missing_attributes="$1"
|
||||
local files
|
||||
local extension_suggestions=()
|
||||
@@ -613,7 +630,7 @@ suggest_gitattributes() {
|
||||
# Format and output all suggestions with proper alignment
|
||||
local rule_count=${#all_patterns[@]}
|
||||
|
||||
for ((i=0; i<rule_count; i++)); do
|
||||
for ((i = 0; i < rule_count; i++)); do
|
||||
local pattern="${all_patterns[$i]}"
|
||||
local attributes="${all_attributes[$i]}"
|
||||
|
||||
@@ -637,7 +654,8 @@ suggest_gitattributes() {
|
||||
}
|
||||
|
||||
# Write suggestions to .gitattributes file
|
||||
write_to_gitattributes() {
|
||||
write_to_gitattributes()
|
||||
{
|
||||
local suggestions="$1"
|
||||
local gitattributes=".gitattributes"
|
||||
|
||||
@@ -664,7 +682,8 @@ write_to_gitattributes() {
|
||||
}
|
||||
|
||||
# Main function
|
||||
main() {
|
||||
main()
|
||||
{
|
||||
check_git_installed
|
||||
check_git_repo
|
||||
check_git_root
|
||||
|
||||
@@ -201,7 +201,7 @@ process_args()
|
||||
# Initialize log file if specified
|
||||
if [[ -n "$LOG_FILE" ]]; then
|
||||
# Create log directory if it doesn't exist
|
||||
mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || true
|
||||
mkdir -p "$(dirname "$LOG_FILE")" 2> /dev/null || true
|
||||
# Initialize log file
|
||||
echo "[$(date +"%Y-%m-%d %H:%M:%S")] [INFO] Started git-update-dirs version $VERSION" > "$LOG_FILE"
|
||||
fi
|
||||
@@ -375,7 +375,7 @@ cleanup_branches()
|
||||
local cleaned=0
|
||||
local current_branch output
|
||||
|
||||
current_branch=$(git symbolic-ref --short HEAD 2>/dev/null)
|
||||
current_branch=$(git symbolic-ref --short HEAD 2> /dev/null)
|
||||
|
||||
# Skip branch cleanup if we're not on a main branch
|
||||
if [[ ! "$current_branch" =~ ^(master|main|develop)$ ]]; then
|
||||
@@ -397,7 +397,7 @@ cleanup_branches()
|
||||
# Delete branches
|
||||
for branch in $output; do
|
||||
if [[ -n "$branch" ]]; then
|
||||
if git branch -d "$branch" &>/dev/null; then
|
||||
if git branch -d "$branch" &> /dev/null; then
|
||||
((cleaned++))
|
||||
log "INFO" "Deleted merged branch $branch in $(pwd)"
|
||||
else
|
||||
@@ -426,7 +426,7 @@ update_repo()
|
||||
# Show progress before starting the operation
|
||||
show_progress "$PROCESSED" "$TOTAL" "${dir%/}"
|
||||
|
||||
cd "$dir" 2>/dev/null || {
|
||||
cd "$dir" 2> /dev/null || {
|
||||
log "ERROR" "Could not enter directory $dir"
|
||||
echo -e "\n${RED}Error: Could not enter directory $dir${NC}" >&2
|
||||
((FAILED++))
|
||||
@@ -438,37 +438,37 @@ update_repo()
|
||||
log "INFO" "Skipping directory with no remotes: $dir"
|
||||
msg "Skipping directory with no remotes: $dir"
|
||||
((SKIPPED++))
|
||||
cd - >/dev/null || true
|
||||
cd - > /dev/null || true
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Get current branch name
|
||||
current_branch=$(git symbolic-ref --short HEAD 2>/dev/null)
|
||||
current_branch=$(git symbolic-ref --short HEAD 2> /dev/null)
|
||||
if [[ -z "$current_branch" ]]; then
|
||||
log "INFO" "Skipping repository in detached HEAD state: $dir"
|
||||
msg "Skipping repository in detached HEAD state: $dir"
|
||||
((SKIPPED++))
|
||||
cd - >/dev/null || true
|
||||
cd - > /dev/null || true
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Check if current branch has tracking information
|
||||
eval "git rev-parse --abbrev-ref --symbolic-full-name @{u} 2>/dev/null" &>/dev/null || {
|
||||
eval "git rev-parse --abbrev-ref --symbolic-full-name @{u} 2>/dev/null" &> /dev/null || {
|
||||
log "INFO" "Skipping branch '$current_branch' without tracking info in $dir"
|
||||
msg "Skipping branch '$current_branch' without tracking info in $dir"
|
||||
((SKIPPED++))
|
||||
cd - >/dev/null || true
|
||||
cd - > /dev/null || true
|
||||
return 1
|
||||
}
|
||||
|
||||
# Check if remote is accessible
|
||||
remote_name=$(git config --get branch."$current_branch".remote)
|
||||
if [[ -n "$remote_name" ]]; then
|
||||
if ! git ls-remote --exit-code "$remote_name" &>/dev/null; then
|
||||
if ! git ls-remote --exit-code "$remote_name" &> /dev/null; then
|
||||
log "WARNING" "Skipping repository with inaccessible remote '$remote_name': $dir"
|
||||
msg "Skipping repository with inaccessible remote: $dir"
|
||||
((SKIPPED++))
|
||||
cd - >/dev/null || true
|
||||
cd - > /dev/null || true
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
@@ -478,7 +478,7 @@ update_repo()
|
||||
log "WARNING" "Skipping repository with unmerged files: $dir"
|
||||
msg "Skipping repository with unmerged files: $dir"
|
||||
((UNMERGED++))
|
||||
cd - >/dev/null || true
|
||||
cd - > /dev/null || true
|
||||
return 1
|
||||
fi
|
||||
|
||||
@@ -579,7 +579,7 @@ update_repo()
|
||||
fi
|
||||
|
||||
# Return to original directory
|
||||
cd - >/dev/null || true
|
||||
cd - > /dev/null || true
|
||||
|
||||
# Show progress after completion
|
||||
show_progress "$PROCESSED" "$TOTAL" "${dir%/} - Done"
|
||||
|
||||
Reference in New Issue
Block a user