bin/repo-sync ports the Alphalink dotfiles repo/repo-reset zsh functions to bash + zsh on Linux and macOS, for several forges at once: GitLab, GitHub (+GHES), Gitea/Forgejo, Bitbucket Cloud, via curl + jq (no per-forge CLI). Tokens live in ~/.config/repos/forges.conf (0600, parsed line by line, never tracked), written by `repo-sync add`. Cache ~/.cache/repos/list refreshed at most once a day (mkdir lock: flock is not on macOS), same namespace/project on two forges kept once, archived and mirrors skipped. Layout ~/repos/<namespace with / as @>/<project>. rc files: `repo <project> [namespace]` clones on demand and cd's, with completion (bash compgen, zsh _describe), background refresh at shell start. install.sh: jq in the apt and brew lists, chmod repo-sync. Verified: shellcheck + bash -n, zsh -n; stub-curl harness over the four forges (pagination, dedup, auth headers, lock, stale cache, path/clone); live GitLab refresh (139 projects, 3s).
94 lines
3.3 KiB
Plaintext
94 lines
3.3 KiB
Plaintext
# zshrc for macOS: zsh + oh-my-zsh counterpart of bash/bashrc-osx (same env,
|
|
# aliases and dtach menu; the prompt lives in bchanot.zsh-theme).
|
|
# Machine-specific lines (nvm, bun, tokens...) go in ~/.zshrc.local, never here.
|
|
|
|
# Homebrew on PATH (Apple Silicon: /opt/homebrew, Intel: /usr/local).
|
|
for brew_bin in /opt/homebrew/bin/brew /usr/local/bin/brew; do
|
|
if [ -x "$brew_bin" ]; then
|
|
eval "$("$brew_bin" shellenv)"
|
|
break
|
|
fi
|
|
done
|
|
unset brew_bin
|
|
|
|
## oh-my-zsh (loaded first: the aliases below override its defaults, e.g. `d`)
|
|
export ZSH="$HOME/.oh-my-zsh"
|
|
ZSH_THEME="bchanot"
|
|
plugins=(git)
|
|
source "$ZSH/oh-my-zsh.sh"
|
|
|
|
## Enable color support of ls and also add handy aliases
|
|
# Some colors (BSD ls: -G instead of GNU --color)
|
|
alias ls='ls -G'
|
|
alias grep='grep --color=auto'
|
|
|
|
## Some export
|
|
# colored GCC warnings and errors
|
|
export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
|
|
|
|
# XDG cache dir: tmux.conf saves resurrect/continuum sessions under it
|
|
export XDG_CACHE_HOME="${XDG_CACHE_HOME:-$HOME/.cache}"
|
|
|
|
# Ensure ~/.local/bin is on PATH (pipx CLIs + personal scripts from bin/)
|
|
case ":$PATH:" in
|
|
*":$HOME/.local/bin:"*) ;;
|
|
*) export PATH="$HOME/.local/bin:$PATH" ;;
|
|
esac
|
|
|
|
# History: none for root, near-unlimited otherwise (zsh has no -1 = unlimited).
|
|
if [[ $EUID == 0 ]] ; then
|
|
HISTSIZE=0
|
|
SAVEHIST=0
|
|
else
|
|
HISTSIZE=10000000
|
|
SAVEHIST=10000000
|
|
fi
|
|
|
|
# Identity for git commits and vim headers. Filled by install.sh (asked once,
|
|
# reused from an existing ~/.bashrc / ~/.zshrc on re-runs), never stored here.
|
|
export USER="@USER@"
|
|
export EMAIL="@EMAIL@"
|
|
|
|
# claude-dans-dtach : creer une session (claude tournant dans dtach, detache via Ctrl-\).
|
|
# Usage : cd ~/projets/seo && cc seo -> session nommee "seo".
|
|
# Pas de systemd sur macOS : dtach est lance directement (pas de slice cgroup).
|
|
dtach_claude() {
|
|
local name="${1:-claude-$(date +%H%M%S)}"
|
|
mkdir -p "$HOME/.dtach"
|
|
dtach -c "$HOME/.dtach/${name}" -e '^\' \
|
|
bash -c 'set -a; [ -f "$HOME/.claude/.env" ] && . "$HOME/.claude/.env"; set +a; exec claude'
|
|
}
|
|
alias cc='dtach_claude'
|
|
|
|
# Rappeler a la demande le menu de reprise.
|
|
alias d='source ~/.local/bin/dtach-router'
|
|
|
|
# repo-sync : un arbre local (~/repos) pour tous les depots des forges declarees
|
|
# dans ~/.config/repos/forges.conf. `repo <projet> [namespace]` clone si besoin
|
|
# puis s'y place ; la liste se rafraichit en arriere-plan, au plus 1 fois par jour.
|
|
repo() {
|
|
local dir
|
|
dir="$(repo-sync path "$@")" && cd "$dir" || return
|
|
}
|
|
_repo() {
|
|
local cache="${REPOS_CACHE:-${XDG_CACHE_HOME:-$HOME/.cache}/repos/list}"
|
|
local -a items
|
|
[[ -f "$cache" ]] || return 0
|
|
if (( CURRENT == 2 )); then
|
|
items=(${(f)"$(cut -f1 "$cache" | sort -u)"})
|
|
_describe 'project' items
|
|
elif (( CURRENT == 3 )); then
|
|
items=(${(f)"$(awk -F'\t' -v p="$words[2]" '$1 == p { print $2 }' "$cache")"})
|
|
_describe 'namespace' items
|
|
fi
|
|
}
|
|
compdef _repo repo
|
|
[[ -o interactive ]] && command -v repo-sync >/dev/null && (repo-sync refresh --quiet >/dev/null 2>&1 &)
|
|
|
|
# Reglages propres a cette machine (non versionnes).
|
|
[ -f "$HOME/.zshrc.local" ] && source "$HOME/.zshrc.local"
|
|
|
|
# Au demarrage d'un shell interactif, proposer de reprendre une session dtach existante
|
|
# (silencieux si aucune).
|
|
case $- in *i*) [ -x "$HOME/.local/bin/dtach-router" ] && . "$HOME/.local/bin/dtach-router" ;; esac
|