X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=sync.sh;h=6600c889344ea4e21bdcaf554eb373d701bbd95f;hb=8be2b1483db3489180e0e44f6a466b5c9d70d75e;hp=31084e59fc5b3c4beba68503ad88c42dd7f3ba13;hpb=5846c6d81fe821017396caf101bf9f3c0ac2e24a;p=config%2Fdotfiles.git diff --git a/sync.sh b/sync.sh index 31084e5..6600c88 100755 --- a/sync.sh +++ b/sync.sh @@ -1,21 +1,68 @@ #!/bin/sh -# Fetches the current master from all remotes. Used to sync with all remote -# hosts. No merging is done. +# Syncs with remote hosts in the git (sub)directories. +# +# Allows fetching (no merge) and pushing at the moment. -# Fetch from each remote of each git subdirectory. +# Select the method: fetch, push and status is possible. +if [ x$1 = x -o x$1 = xstatus -o x$1 = xst ]; then + method=status +elif [ $1 = fetch -o $1 = fe ]; then + method=fetch +elif [ $1 = push -o $1 = pu ]; then + method=push +else + echo "Usage: sync.sh [fetch | fe | push | pu | status | st]" + echo + echo "fetch: Fetch from all remotes." + echo "push: Push to all remotes." + echo "status: Display status for all git repositories." + exit 1 +fi + +# Execute the given method for each git subdirectory. for project in `find . -name .git -type d`; do - if [ -d "$project" ]; then - pwd=`pwd` - cd "$project" + pwd=`pwd` + cd "$project" - # Fetch from all remotes. - for remote in `git remote`; do - echo "$project: fetching $remote ..." - git fetch "$remote" + # Remove .git from repository name. + project=`echo "$project" | sed "s|.git||"` + + # Display all commits not in the master branch (which have to be merged + # from the remote branches) or not in the remote branches (which have to + # be pushed to the remote hosts). + if [ $method = status ]; then + # Display a log similar to gitk but for the console. + git_log() { + output=`git log --graph --all --pretty=oneline --color $1` + if [ "x$output" != x ]; then + echo $2 + echo "$output" + fi + } + + # Display unmerged commits. + git_log master.. "$project needs merge:" + + # Display not pushed commits. + for branch in `git branch -r`; do + branch=`echo "$branch" | sed 's|* ||g'` + git_log "$branch.." "$project ($branch) needs push:" done - cd "$pwd" + # Fetch from/Push to all remotes. + else + for remote in `git remote`; do + echo "$project: ${method}ing $remote ..." + git $method "$remote" + done fi + + cd "$pwd" done + +# Run status after a fetch to see new changes. +if [ $method = fetch ]; then + ./sync.sh status +fi