Report abuse


			
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