namespace :git do
task :helpers do
def git_branch
`git-branch | grep "*"`.strip[2..-1]
end
def git?
`git-status`
$?.exitstatus != 128
end
def git_stash
`git-diff-files --quiet`
if $?.exitstatus == 1
stash = true
clear = `git-stash list`.scan("\n").size == 0
puts "* Saving changes..."
`git-stash save`
else
stash = false
end
begin
yield
rescue
puts "* Encountered an error, backing out..."
ensure
if stash
puts "* Applying changes..."
sh "git-stash apply"
`git-stash clear` if clear
end
end
end
def git_fetch
sh "git#{'-svn' if git_svn?} fetch"
end
def git_rebase
if git_svn?
sh "git-rebase git-svn"
else
sh "git-rebase origin/master"
end
end
def git_push
if git_svn?
sh "git-svn dcommit"
else
sh "git-push"
end
end
def git_svn?
`git-branch -a` =~ /^\s*git-svn/
end
end
desc "Pull new commits from the repository"
task :update => %w[git:helpers] do
git_stash do
branch = git_branch()
if branch != "master"
switch = true
`git-checkout master`
puts "* Switching back to master..."
else
switch = false
end
puts "* Pulling in new commits..."
git_fetch
git_rebase
if switch
puts "* Porting changes into #{branch}..."
`git-checkout #{branch}`
sh "git-rebase master"
end
end
end
desc "Push local commits into the Wesabe repository"
task :push => %w[git:update] do
git_stash do
puts "* Pushing changes..."
git_push
branch = git_branch()
if branch != "master"
`git-checkout master`
puts "* Porting changes into master"
git_rebase
`git-checkout #{branch}`
end
end
end
desc "Delete the current branch and switch back to master"
task :close => %w[git:helpers] do
branch = git_branch()
if branch == "master"
$stderr.puts "* Cannot delete master branch"
exit 1
end
puts "* Switching to master"
`git-checkout master 2>/dev/null`
puts "* Deleting branch #{branch}"
`git-branch -d #{branch} 2>/dev/null`
if $?.exitstatus == 1
$stderr.puts "* Branch #{branch} isn't a strict subset of master, quitting"
`git-checkout #{branch} 2>/dev/null`
exit 1
end
end
desc "Create a new branch off master"
task :open => %w[git:helpers] do
print "* Name your branch: "
newbranch = $stdin.gets.chomp
branch = git_branch()
if branch != "master"
puts "* Switching to master"
`git-checkout master`
end
`git-checkout -b #{newbranch}`
unless $?.exitstatus.zero?
puts "* Couldn't create branch #{newbranch}, switchin back to #{branch}"
`git-checkout #{branch}`
exit 1
end
end
end