From: Ruben Beltran del Rio Date: Wed, 18 Dec 2024 20:26:19 +0000 (+0100) Subject: Add repo sync functionality X-Git-Url: https://git.r.bdr.sh/rbdr/dotfiles/commitdiff_plain/fe17fef03f8c2bb44f0c2dc8f2185db6f33145f4?hp=f3e9f5c17a6ba27ae5715a566b1454031f5a10da Add repo sync functionality --- diff --git a/runcoms/zshrc b/runcoms/zshrc index 068e2be..ebf6bf1 100644 --- a/runcoms/zshrc +++ b/runcoms/zshrc @@ -7,6 +7,8 @@ source "${ZDOTDIR:-$HOME}/.dotfiles/zsh/functions/short-uptime.zsh" source "${ZDOTDIR:-$HOME}/.dotfiles/zsh/functions/figlet-sample.zsh" source "${ZDOTDIR:-$HOME}/.dotfiles/zsh/functions/prettify-json.zsh" source "${ZDOTDIR:-$HOME}/.dotfiles/zsh/functions/status.zsh" +source "${ZDOTDIR:-$HOME}/.dotfiles/zsh/functions/sync-repos.zsh" +source "${ZDOTDIR:-$HOME}/.dotfiles/zsh/functions/check-repos.zsh" ################################################################################ # Load Modules diff --git a/zsh/functions/check-repos.zsh b/zsh/functions/check-repos.zsh new file mode 100644 index 0000000..c5a9a10 --- /dev/null +++ b/zsh/functions/check-repos.zsh @@ -0,0 +1,42 @@ +#!/usr/bin/env zsh + +# Function to check status of a git repository +check-repo() { + local repo_path="$1" + local relative_path="${repo_path#$PWD/}" + + pushd "$repo_path" >/dev/null + + print -n "${relative_path}: " + + local status_output=$(git status --porcelain) + + if [[ -z "$status_output" ]]; then + print -P "%F{green}CLEAN%f" + popd >/dev/null + return + fi + + local messages=() + + # Check for untracked files (??), modified files (M or space+M), and staged files (non-? non-space in first column) + if echo "$status_output" | grep -q "^??"; then + messages+=("%F{yellow}UNTRACKED%f") + fi + if echo "$status_output" | grep -q "^.[M]" || echo "$status_output" | grep -q "^M"; then + messages+=("%F{red}MODIFIED%f") + fi + if echo "$status_output" | grep -q "^[^? ]"; then + messages+=("%F{blue}STAGED%f") + fi + + print -P "${(j: :)messages}" + popd >/dev/null +} + +check-repos() { + local start_dir="${1:-.}" + fd -H -t d '^\.git$' -x echo {} | sort | sed 's/\/\.git$//' | rg -v "${SYNC_REPOS_IGNORE}" | while read -r repo_path; do + check-repo "$repo_path" + done +} diff --git a/zsh/functions/sync-repos.zsh b/zsh/functions/sync-repos.zsh new file mode 100644 index 0000000..fdc0876 --- /dev/null +++ b/zsh/functions/sync-repos.zsh @@ -0,0 +1,52 @@ +#!/usr/bin/env zsh + +# Function to check and process git repositories +sync-repo() { + local repo_path="$1" + local relative_path="${repo_path#$PWD/}" + + pushd "$repo_path" + + print -n "${relative_path}: " + + local remotes=($(git remote)) + + if [[ ${#remotes[@]} -eq 0 ]]; then + print -P "%F{red}NO REMOTES%f" + popd + return + fi + + # Check for required remotes + local has_origin=0 + local has_conchos=0 + local existing_remotes="" + + for remote in $remotes; do + [[ $remote == "origin" ]] && has_origin=1 + [[ $remote == "conchos" ]] && has_conchos=1 + existing_remotes="${existing_remotes:+$existing_remotes,}$remote" + done + + # If missing any required remote + if [[ $has_origin -eq 0 || $has_conchos -eq 0 ]]; then + print -P "%F{yellow}MISSING REMOTES ${existing_remotes}%f" + popd + return + fi + + # Try pushing to both remotes + if git push --all origin >/dev/null 2>&1 && git push --all conchos >/dev/null 2>&1; then + print -P "%F{green}UPDATED%f" + else + print -P "%F{red}OUTDATED%f" + fi + popd +} + +sync-repos() { + local start_dir="${1:-.}" + fd -H -t d '^\.git$' -x echo {} | sort | sed 's/\/\.git$//' | rg -v "${SYNC_REPOS_IGNORE}" | while read -r repo_path; do + sync-repo "$repo_path" + done +}