class Nanoc::Deploying::Deployers::Git

A deployer that deploys a site using [Git](git-scm.com).

@example A deployment configuration for GitHub Pages:

deploy:
  default:
    kind:       git
    remote:     git@github.com:myself/myproject.git
    branch:     gh-pages
    forced:     true

Public Instance Methods

run() click to toggle source
# File lib/nanoc/deploying/deployers/git.rb, line 49
def run
  unless File.exist?(source_path)
    raise Errors::OutputDirDoesNotExist.new(source_path)
  end

  remote = config.fetch(:remote, 'origin')
  branch = config.fetch(:branch, 'master')
  forced = config.fetch(:forced, false)

  puts "Deploying via Git to branch “#{branch}” on remote “#{remote}”…"

  Dir.chdir(source_path) do
    unless File.exist?('.git')
      raise Errors::OutputDirIsNotAGitRepo.new(source_path)
    end

    # Verify existence of remote, if remote is not a URL
    if remote_is_name?(remote)
      begin
        run_cmd(%W[git config --get remote.#{remote}.url])
      rescue TTY::Command::ExitError
        raise Errors::RemoteDoesNotExist.new(remote)
      end
    end

    # If the branch exists then switch to it, otherwise prompt the user to create one.
    begin
      run_cmd_unless_dry(%W[git checkout #{branch}])
    rescue TTY::Command::ExitError
      raise Errors::BranchDoesNotExist.new(branch)
    end

    return if clean_repo?

    msg = "Automated commit at #{Time.now.utc} by Nanoc #{Nanoc::VERSION}"
    author = 'Nanoc <>'
    run_cmd_unless_dry(%w[git add -A])
    run_cmd_unless_dry(%W[git commit -a --author #{author} -m #{msg}])

    if forced
      run_cmd_unless_dry(%W[git push -f #{remote} #{branch}])
    else
      run_cmd_unless_dry(%W[git push #{remote} #{branch}])
    end
  end
end

Private Instance Methods

clean_repo?() click to toggle source
# File lib/nanoc/deploying/deployers/git.rb, line 110
def clean_repo?
  TTY::Command.new(printer: :null).run('git status --porcelain').out.empty?
end
remote_is_name?(remote) click to toggle source
# File lib/nanoc/deploying/deployers/git.rb, line 98
def remote_is_name?(remote)
  remote !~ /:\/\/|@.+:/
end
run_cmd(cmd, dry_run: false) click to toggle source
# File lib/nanoc/deploying/deployers/git.rb, line 102
def run_cmd(cmd, dry_run: false)
  TTY::Command.new(printer: :null).run(*cmd, dry_run: dry_run)
end
run_cmd_unless_dry(cmd) click to toggle source
# File lib/nanoc/deploying/deployers/git.rb, line 106
def run_cmd_unless_dry(cmd)
  run_cmd(cmd, dry_run: dry_run)
end