#!/bin/sh
-[ "$VCSH_DEBUG" = '1' ] && set -x
+[ -n "$VCSH_DEBUG" ] && set -x
SELF=$(basename $0)
[ -z "$XDG_CONFIG_HOME" ] && XDG_CONFIG_HOME="$HOME/.config"
-for check_directory in "$XDG_CONFIG_HOME" "$XDG_CONFIG_HOME/vcsh" "$XDG_CONFIG_HOME/vcsh/repo.d"
+[ -z "$VCSH_BASE" ] && VCSH_BASE="$XDG_CONFIG_HOME/vcsh/repo.d"
+for check_directory in "$VCSH_BASE" "$HOME/.gitignore.d"
do
if [ ! -d "$check_directory" ]; then
if [ -e "$check_directory" ]; then
echo "$SELF: error: $check_directory exists but is not a directory" >&2
exit 2
else
- mkdir "$check_directory" || (echo "$SELF: error: could not create $check_directory" >&2; exit 2)
+ echo "$SELF: info: attempting to create $check_directory"
+ mkdir -p "$check_directory" || (echo "$SELF: error: could not create $check_directory" >&2; exit 2)
fi
fi
done
-VCSH_BASE="$XDG_CONFIG_HOME/vcsh/repo.d"
-
debug() {
- [ "$VCSH_DEBUG" = '1' ] && echo "$SELF: debug: $1"
+ [ -n "$VCSH_DEBUG" ] && echo "$SELF: debug: $1"
}
verbose() {
- if [ "$VCSH_DEBUG" = '1' ] || [ "$VCSH_VERBOSE" = '1' ]; then echo "$SELF: verbose: $1"; fi
+ if [ -n "$VCSH_DEBUG" ] || [ -n "$VCSH_VERBOSE" ]; then echo "$SELF: verbose: $1"; fi
}
# use <repo> Use this repository
init <repo> Initialize a new repository
clone <remote> \\
[<repo>] Clone from an existing repository
+ seed-gitignore \\
+ <repo> Seed .gitignore.d/<repo> from git ls-files" >&2
}
use() {
exit 20) || exit 20
cd "$GIT_WORK_TREE"
git init
- git config core.worktree "$GIT_WORK_TREE"
+ git config core.worktree "$GIT_WORK_TREE"
+ git config core.excludesfile ".gitignore.d/$REPO_NAME"
+ touch "$HOME/.gitignore.d/$REPO_NAME"
+ git add "$HOME/.gitignore.d/$REPO_NAME"
verbose "init() end"
}
git remote add origin "$GIT_REMOTE"
git config branch.master.remote origin
git config branch.master.merge refs/heads/master
+ git config core.excludesfile ".gitignore.d/$REPO_NAME"
git fetch
for object in $(git ls-tree -r origin/master | awk '{print $4}'); do
[ -e "$object" ] &&
done
[ "$VCSH_CONFLICT" = '1' ] &&
echo "$SELF: fatal: will stop after fetching and not try to merge!\n" &&
+ echo " Once this situation has been resolved, run 'vcsh run <foo> git pull' to finish cloning.\n" &&
exit 3
git merge origin/master
# vcsh use $REPO_NAME
elif [ "$1" = 'init' ]; then
verbose "init begin"
- [ -z $2 ] && help; return 0
+ [ -z $2 ] && help && echo && echo "$SELF $1: error: please specify repository to work on" && return 0
export REPO_NAME="$2"
export GIT_DIR="$VCSH_BASE/$REPO_NAME.git"
init
# verbose "exit end"
# exit 0
+elif [ "$1" = 'seed-gitignore' ]; then
+ verbose "seed-gitignore begin"
+ [ -z $2 ] && help && echo && echo "$SELF $1: error: please specify repository to work on" && return 0
+ use "$2"
+ git config core.excludesfile ".gitignore.d/$REPO_NAME"
+ files=$(git ls-files)
+ gitignores=$(for file in $(git ls-files); do
+ while true; do
+ echo $file; new="${file%/*}"
+ [ "$file" = "$new" ] && break
+ file="$new"
+ done;
+ done | sort -u | sed 's/^/!/')
+ [ -e .gitignore.d/$2 ] &&
+ echo "$SELF: info: .gitignore.d/$2 exists, moving it to .gitignore.d/$2.bak" &&
+ mv -f .gitignore.d/$2 .gitignore.d/$2.bak
+ echo '*' > .gitignore.d/$2
+ for gitignore in $gitignores; do
+ echo $gitignore >> .gitignore.d/$2
+ done
+
else
verbose "defaulting to calling help()"
help