]> ruderich.org/simon Gitweb - config/dotfiles.git/blob - setup.sh
8bb651c8f83c50ebf0a4b621b072e730484b4d61
[config/dotfiles.git] / setup.sh
1 #!/bin/sh
2
3 # Runs setup.sh in all configuration directories. Must be run in the main
4 # configuration directory.
5
6
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.
12     mkdir -p "$1"
13     # Go to the target directory.
14     pwd=`pwd`
15     cd "$1"
16
17     # Create the git repository if it doesn't exist yet.
18     new=no
19     if [ ! -d .git ]; then
20         echo "Creating new git repository in '$1'."
21         git init > /dev/null
22         new=yes
23     fi
24
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         # Pushing to the remote pushes only the master branch in remotes named
32         # the hostname of this machine. This makes it easy to see where
33         # changes came from.
34         echo "  push = +refs/heads/master:refs/remotes/`hostname`/master" \
35             >> .git/config
36     else
37         echo "Remote '$2' already exists in '$1'."
38     fi
39
40     # Merge with remote master if the repository was just created, otherwise
41     # the repository starts empty.
42     if [ $new = yes ]; then
43         git merge "$2/master"
44     fi
45
46     # Go back to the starting directory.
47     cd "$pwd"
48     unset pwd
49 }
50
51 # Run setup.sh in each project.
52 if [ "$#" -eq "0" ]; then
53     for project in `find . -name .git -type d`; do
54         # Skip this directory to prevent an infinite loop.
55         [ "$project" = "./.git" ] && continue
56
57         [ -d "$project" ] && (echo "running setup.sh in '$project'";
58                             cd "$project/.."; ./setup.sh > /dev/null)
59     done
60 # Create git repository if necessary and/or additional remotes and fetch them.
61 elif [ "$#" -ge "2" ]; then
62     # Get name of the remote and the remote location.
63     name="$1"
64     remote="$2"
65     # Remove $1 and $2 to get the possible subdirectories in $@.
66     shift
67     shift
68
69     # Create the git repository if necessary and add the remotes.
70     git_remote_init_update . "$name" "$remote"
71     for project in $@; do
72         git_remote_init_update "$project" "$name" "$remote"
73     done
74 # Usage message.
75 else
76     echo "Usage: ./setup.sh <remote-name> <git-repository> [subdirectories]*
77
78 Example:
79 ./setup.sh nightwish ssh://user@nightwish/home/user/dotfiles shell vcs
80
81 This will add the remote nightwish given by the ssh URL and fetch the master
82 for dotfiles, dotfiles/shell and dotfiles/vcs if they don't exist already. If
83 the remotes exist already nothing happens. This also sets up fetching/pushing
84 settings so only the master is fetched and pushed."
85 fi