3 # Runs setup.sh in all configuration directories. Must be run in the main
4 # configuration directory.
7 # Creates a new git repository in $1, adds a new remote named $2 and fetches
8 # the master on $3. If the git repository already exists a new remote $2 for
9 # $3 is added. If the remote already exists nothing happens.
10 function git_remote_init_update() {
11 # Make sure the requested directory exists.
13 # Go to the target directory.
17 # Create the git repository if it doesn't exist yet.
19 if [ ! -d .git ]; then
20 echo "Creating new git repository in '$1'."
25 # If the remote doesn't exist add it and fetch from remote.
26 git remote | grep "$2" > /dev/null
27 if [ "$?" -ne "0" ]; then
28 echo "Adding remote '$2' to '$1'."
29 git remote add -t master "$2" "$3/$1"
30 git fetch "$2" > /dev/null
31 # Remove the remote and abort if the fetch was unsuccessful.
32 if [ "$?" -ne "0" ]; then
37 # Pushing to the remote pushes only the master branch in remotes named
38 # the hostname of this machine. This makes it easy to see where
40 echo " push = +refs/heads/master:refs/remotes/`hostname`/master" \
43 echo "Remote '$2' already exists in '$1'."
46 # Merge with remote master if the repository was just created, otherwise
47 # the repository starts empty. Also run gc to compress the new repository.
48 if [ $new = yes ]; then
53 # Go back to the starting directory.
58 # Run setup.sh in each project.
59 if [ "$#" -eq "0" ]; then
60 for project in `find . -name .git -type d`; do
61 # Skip this directory to prevent an infinite loop.
62 [ "$project" = "./.git" ] && continue
64 [ -d "$project" ] && (echo "running setup.sh in '$project'";
65 cd "$project/.."; ./setup.sh > /dev/null)
67 # Create git repository if necessary and/or additional remotes and fetch them.
68 elif [ "$#" -ge "2" ]; then
69 # Get name of the remote and the remote location.
72 # Remove $1 and $2 to get the possible subdirectories in $@.
76 # Create the git repository if necessary and add the remotes.
77 git_remote_init_update . "$name" "$remote"
79 git_remote_init_update "$project" "$name" "$remote"
83 echo "Usage: ./setup.sh <remote-name> <git-repository> [subdirectories]*
86 ./setup.sh nightwish ssh://user@nightwish/home/user/dotfiles shell vcs
88 This will add the remote nightwish given by the ssh URL and fetch the master
89 for dotfiles, dotfiles/shell and dotfiles/vcs if they don't exist already. If
90 the remotes exist already nothing happens. This also sets up fetching/pushing
91 settings so only the master is fetched and pushed."