Hi All,

I just wrote an SCM module for Capistrano that lets it interface with
git.  More info is here:

http://scie.nti.st/2007/3/16/capistrano-with-git-shared-repository

Here's the code:

require 'capistrano/scm/base'

module Capistrano
  module SCM

    # An SCM module for using git as your source control tool. Assumes
you
    # are using a shared git repository. Use it by specifying the
following
    # line in your configuration:
    #
    #   set :scm, :git
    #
    # You must set <tt>:branch</tt>, which is the reference to the
branch
    # you are deploying, for example:
    #
    #   set :branch, "remotes/origin/master"
    #
    # Also, this module accepts a <tt>:git</tt> configuration
variable,
    # which (if specified) will be used as the full path to the git
    # executable on the remote machine:
    #
    #   set :git, "/opt/local/bin/git"
    #
    # Remember to set <tt>:repository</tt> to the path of your git
repo:
    #
    #   set :repository, "[EMAIL PROTECTED]:/home/myproject"
    class Git < Base
      def current_revision(actor)
        git  = configuration[:git] ? configuration[:git] : "git"
        exec = "cd #{actor.current_path} && git rev-parse HEAD"

        result = ""
        actor.run(exec, :once => true) do |ch, str, out|
          result = out if str == :out
          raise "Could not determine current revision" if str == :err
        end

        result
      end

      def checkout(actor)
        git      = configuration[:git] ? configuration[:git] : "git"
        branch   = configuration[:branch]

        fail "No branch specified, use for example 'set :branch,
\"remotes/origin/master\"' in your deploy.rb" unless branch

        execute  = "#{git} clone #{configuration.repository}
#{actor.release_path}; "
        execute += "cd #{actor.release_path} ; #{git} checkout -b
deploy #{branch}; "

        run_checkout(actor, execute, &git_stream_handler(actor))
      end

      private

      def git_stream_handler(actor)
        Proc.new do |ch, stream, out|
          prefix = "#{stream} :: #{ch[:host]}"
          actor.logger.info out, prefix
          if out =~ %r{password:}
            actor.logger.info "git is asking for a password", prefix
            ch.send_data "#{actor.password}\n"
          elsif out =~ %r{\(yes/no\)}
            actor.logger.info "git is asking whether to connect or
not", prefix
            ch.send_data "yes\n"
          elsif out =~ %r{passphrase}
            message = "git needs your key's passphrase, sending empty
string"
            actor.logger.info message, prefix
            ch.send_data "\n"
          end
        end
      end
    end

  end
end


If the Capistrano team would like to include it as part of the main
build, I have no problem with that.  It's all MIT.


--~--~---------~--~----~------------~-------~--~----~
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/capistrano
-~----------~----~----~----~------~----~------~--~---

Reply via email to