From 2a61549feb63117b5ffaa6fef5f80feb293b3dbe Mon Sep 17 00:00:00 2001
From: Richard Hartmann <richih.mailinglist@gmail.com>
Date: Wed, 16 Nov 2011 22:29:16 +0100
Subject: [PATCH] Introduce seed-gitignore to, well, seed gitignore..

---
 _vcsh           |  1 +
 doc/vcsh.1.ronn | 13 +++++++++----
 vcsh            | 27 ++++++++++++++++++++++++---
 3 files changed, 34 insertions(+), 7 deletions(-)

diff --git a/_vcsh b/_vcsh
index 4fe1e5f..5a14f64 100644
--- a/_vcsh
+++ b/_vcsh
@@ -9,4 +9,5 @@ _arguments \
 		run\:"run command on repo"
 		init\:"init & clone from repo"
 		clone\:"clone from repo"
+		seed-gitignore\:"seed .gitignore.d/foo from git ls-files"
 	))'
diff --git a/doc/vcsh.1.ronn b/doc/vcsh.1.ronn
index 541dba0..2705377 100644
--- a/doc/vcsh.1.ronn
+++ b/doc/vcsh.1.ronn
@@ -11,6 +11,8 @@ vcsh(1) - manage and sync config files via git
 
 `vcsh` list
 
+`vcsh` seed-gitignore
+
 `vcsh` help
 
 ## DESCRIPTION
@@ -34,20 +36,23 @@ A sample configuration for `vcsh` and `mr` can be found at
 ## OPTIONS
 
 * init:
-  Initialize an empty repository
+  Initialize an empty repository.
 
 * clone:
-  Clone an existing repository
+  Clone an existing repository.
 
 * run:
   Run command with <$GIT_DIR> and <$GIT_WORK_TREE> set. Allows you to run any
   and all commands without any restrictions. Use with care.
 
 * list:
-  List all local vcsh repositories
+  List all local vcsh repositories.
+
+* seed-gitignore:
+  Seed .gitignore.d/<repo> from git ls-files.
 
 * help:
-  Display help
+  Display help.
 
 ## ENVIRONMENT
 
diff --git a/vcsh b/vcsh
index c1b4874..1828880 100755
--- a/vcsh
+++ b/vcsh
@@ -18,7 +18,6 @@ do
 	fi
 done
 
-
 debug() {
 	[ -n "$VCSH_DEBUG" ] && echo "$SELF: debug: $1"
 }
@@ -42,7 +41,9 @@ help() {
 
    init <repo>       Initialize a new repository
    clone <remote> \\
-         [<repo>]    Clone from an existing repository" >&2
+         [<repo>]    Clone from an existing repository
+   seed-gitignore \\
+   <repo>            Seed .gitignore.d/<repo> from git ls-files" >&2
 }
 
 use() {
@@ -152,7 +153,7 @@ elif [ "$1" = 'clone' ]; then
 
 elif [ "$1" = 'init' ]; then
 	verbose "init begin"
-	[ -z $2 ] && help && return 0
+	[ -z $2 ] && help && echo && echo "$SELF $1: please specify repository to work on" && return 0
 	export REPO_NAME="$2"
 	export GIT_DIR="$VCSH_BASE/$REPO_NAME.git"
 	init
@@ -170,6 +171,26 @@ elif [ "$1" = 'init' ]; then
 #	verbose "exit end"
 #	exit 0
 
+elif [ "$1" = 'seed-gitignore' ]; then
+	verbose "seed-gitignore begin"
+	[ -z $2 ] && help && echo && echo "$SELF $1: please specify repository to work on" && return 0
+	use "$2"
+	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: .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
-- 
GitLab