# class Chef::Knife::CookbookSCMRepo

### Constants

DIRTY_REPO

### Attributes

default_branch[R]
repo_path[R]
ui[R]
use_current_branch[R]

### Public Class Methods

new(repo_path, ui, opts={}) click to toggle source

    # File lib/chef/knife/core/cookbook_scm_repo.rb, line 34
    def initialize(repo_path, ui, opts={})
      @repo_path = repo_path
      @ui = ui
      @default_branch = 'master'
      @use_current_branch = false
      apply_opts(opts)
    end

### Public Instance Methods

branch_exists?(branch_name) click to toggle source

    # File lib/chef/knife/core/cookbook_scm_repo.rb, line 121
    def branch_exists?(branch_name)
      git("branch --no-color").stdout.lines.any? {|l| l =~ /\s#{Regexp.escape(branch_name)}(?:\s|$)/ }
    end

finalize_updates_to(cookbook_name, version) click to toggle source

    # File lib/chef/knife/core/cookbook_scm_repo.rb, line 88
    def finalize_updates_to(cookbook_name, version)
      if update_count = updated?(cookbook_name)
        ui.info "#{update_count} files updated, committing changes"
        git("add #{cookbook_name}")
        git("commit -m \"Import #{cookbook_name} version #{version}\" -- #{cookbook_name}")
        ui.info("Creating tag cookbook-site-imported-#{cookbook_name}-#{version}")
        git("tag -f cookbook-site-imported-#{cookbook_name}-#{version}")
        true
      else
        ui.info("No changes made to #{cookbook_name}")
        false
      end
    end

get_current_branch() click to toggle source

    # File lib/chef/knife/core/cookbook_scm_repo.rb, line 125
    def get_current_branch()
      ref = git("symbolic-ref HEAD").stdout
      ref.chomp.split('/')[2]
    end

merge_updates_from(cookbook_name, version) click to toggle source

    # File lib/chef/knife/core/cookbook_scm_repo.rb, line 102
    def merge_updates_from(cookbook_name, version)
      branch = "chef-vendor-#{cookbook_name}"
      Dir.chdir(repo_path) do
        if system("git merge #{branch}")
          ui.info("Cookbook #{cookbook_name} version #{version} successfully installed")
        else
          ui.error("You have merge conflicts - please resolve manually")
          ui.info("Merge status (cd #{repo_path}; git status):")
          system("git status")
          exit 3
        end
      end
    end

prepare_to_import(cookbook_name) click to toggle source

    # File lib/chef/knife/core/cookbook_scm_repo.rb, line 77
    def prepare_to_import(cookbook_name)
      branch = "chef-vendor-#{cookbook_name}"
      if branch_exists?(branch)
        ui.info("Pristine copy branch (#{branch}) exists, switching to it.")
        git("checkout #{branch}")
      else
        ui.info("Creating pristine copy branch #{branch}")
        git("checkout -b #{branch}")
      end
    end

reset_to_default_state() click to toggle source

    # File lib/chef/knife/core/cookbook_scm_repo.rb, line 72
    def reset_to_default_state
      ui.info("Checking out the #{default_branch} branch.")
      git("checkout #{default_branch}")
    end

sanity_check() click to toggle source

    # File lib/chef/knife/core/cookbook_scm_repo.rb, line 42
    def sanity_check
      unless ::File.directory?(repo_path)
        ui.error("The cookbook repo path #{repo_path} does not exist or is not a directory")
        exit 1
      end
      unless git_repo?(repo_path)
        ui.error "The cookbook repo #{repo_path} is not a git repository."
        ui.info("Use `git init` to initialize a git repo")
        exit 1
      end
      if use_current_branch
        @default_branch = get_current_branch()
      end
      unless branch_exists?(default_branch)
        ui.error "The default branch '#{default_branch}' does not exist"
        ui.info "If this is a new git repo, make sure you have at least one commit before installing cookbooks"
        exit 1
      end
      cmd = git('status --porcelain')
      if cmd.stdout =~ DIRTY_REPO
        ui.error "You have uncommitted changes to your cookbook repo (#{repo_path}):"
        ui.msg cmd.stdout
        ui.info "Commit or stash your changes before importing cookbooks"
        exit 1
      end
      # TODO: any untracked files in the cookbook directory will get nuked later
      # make this an error condition also.
      true
    end

updated?(cookbook_name) click to toggle source

    # File lib/chef/knife/core/cookbook_scm_repo.rb, line 116
    def updated?(cookbook_name)
      update_count = git("status --porcelain -- #{cookbook_name}").stdout.strip.lines.count
      update_count == 0 ? nil : update_count
    end