lib/bones/app/git.rb



require 'git'

module Bones::App::Git

  def self.initialize_git
    Bones::App::Create.class_eval {
      include ::Bones::App::Git

      option
      option('Git Options:')
      option('--git', 'Initialize a git repository for the project.',
             lambda { config[:git] = true }
      )
      option('--github DESCRIPTION', 'Create a new GitHub project.',
             'Requires a project description.',
             lambda { |desc|
               config[:git] = true,
               config[:github] = true,
               config[:github_desc] = desc
             }
      )

      in_output_directory :initialize_git, :initialize_github
    }
  end

  def initialize_git
    return unless @config[:git]

    File.rename('.bnsignore', '.gitignore') if test ?f, '.bnsignore'

    author = Git.global_config['user.name']
    email  = Git.global_config['user.email']

    if test ?f, 'Rakefile'
      lines = File.readlines 'Rakefile'

      lines.each do |line|
        case line
        when %r/^\s*authors\s+/
          line.replace "  authors  '#{author}'" unless author.nil? or line !~ %r/FIXME/
        when %r/^\s*email\s+/
          line.replace "  email  '#{email}'" unless email.nil? or line !~ %r/FIXME/
        when %r/^\s*url\s+/
          next unless @config[:github]
          url = github_url
          line.replace "  url  '#{url}'" unless url.nil? or line !~ %r/FIXME/
        when %r/^\s*\}\s*$/
          line.insert 0, "  ignore_file  '.gitignore'\n" if test ?f, '.gitignore'
        end
      end

      File.open('Rakefile', 'w') {|fd| fd.puts lines}
    end

    @git = Git.init
    @git.add
    @git.commit "Initial commit to #{name}."
  end

  def initialize_github
    return unless @config[:github]

    user = Git.global_config['github.user']
    token = Git.global_config['github.token']

    raise ::Bones::App::Error, 'A GitHub username was not found in the global configuration.' unless user
    raise ::Bones::App::Error, 'A GitHub token was not found in the global configuration.' unless token

    Net::HTTP.post_form(
        URI.parse('http://github.com/api/v2/yaml/repos/create'),
        'login' => user,
        'token' => token,
        'name' => name,
        'description' => @config[:github_desc]
    )

    @git.add_remote 'origin', "git@github.com:#{user}/#{name}.git"
    @git.config 'branch.master.remote', 'origin'
    @git.config 'branch.master.merge', 'refs/heads/master'
    @git.push 'origin'
  end

  def github_url
    user = Git.global_config['github.user']
    return unless user
    "http://github.com/#{user}/#{name}"
  end

end  # module Bones::App::Git

# EOF