#!/bin/bash shopt -s globstar nullglob dotglob REPO="$(realpath "$(dirname "$0")")" ignored() { case $1 in .gitignore|dots|.git|.git/*) return 0;; *) return 1;; esac } get() { for file in **; do ignored "$file" && continue [ -f "$HOME/$file" ] && cp "$HOME/$file" "$REPO/$file" done } put() { for file in **; do ignored "$file" && continue if [ -f "$HOME/$file" ]; then diff "$REPO/$file" "$HOME/$file" >/dev/null 2>/dev/null && continue cp "$HOME/$file" "$HOME/$file.bak.$(date +%Y%m%d)" fi cp "$REPO/$file" "$HOME/$file" done } clear() { for file in **; do ignored "$file" && continue for bak in "$HOME/$file".bak.*; do rm "$bak" done done } list() { for file in **; do ignored "$file" || echo "$file" done } case $1 in get|pull) get;; put|push) put;; clear) clear;; list) list;; *) exit 1;; esac