Class: Whisk::Provider::Ingredient

Inherits:
Whisk::Provider show all
Includes:
Mixin::ShellOut
Defined in:
lib/whisk/provider/ingredient.rb

Instance Attribute Summary

Attributes inherited from Whisk::Provider

#resource

Instance Method Summary collapse

Methods included from Mixin::ShellOut

#run_command, #run_command!, #shell_out, #shell_out!

Methods inherited from Whisk::Provider

#action_nothing, #initialize

Constructor Details

This class inherits a constructor from Whisk::Provider

Instance Method Details

#action_destroyObject



144
145
146
# File 'lib/whisk/provider/ingredient.rb', line 144

def action_destroy
  destroy
end

#action_diffObject



148
149
150
151
# File 'lib/whisk/provider/ingredient.rb', line 148

def action_diff
  Whisk.ui.info "Diff for ingredient '#{resource.name}'"
  shell_out!("git diff", :cwd => resource.path)
end

#action_prepareObject



153
154
155
156
157
# File 'lib/whisk/provider/ingredient.rb', line 153

def action_prepare
  self.clone
  self.checkout
  self.add_remotes
end

#action_statusObject



159
160
161
162
163
164
165
166
167
168
169
# File 'lib/whisk/provider/ingredient.rb', line 159

def action_status
  Whisk.ui.info "Status for ingredient '#{resource.name}'"
  cmd = run_command!("git status", :cwd => resource.path)
  cmd.stdout.lines.each do |line|
    Whisk.ui.info "\s\s#{line}"
  end
  cmd.stderr.lines.each do |line|
    Whisk.ui.info "\s\s#{line}"
  end
  Whisk.ui.info "\n"
end

#action_updateObject



171
172
173
174
175
176
177
178
179
180
# File 'lib/whisk/provider/ingredient.rb', line 171

def action_update
  Whisk.ui.info "Updating ingredient '#{resource.name}'"
  cmd = run_command!("git remote update", :cwd => resource.path)
  cmd.stdout.lines.each do |line|
    Whisk.ui.info "\s\s#{line}"
  end
  cmd.stderr.lines.each do |line|
    Whisk.ui.info "\s\s#{line}"
  end
end

#add_remote(remote, url) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/whisk/provider/ingredient.rb', line 34

def add_remote(remote, url)
  ::Dir.chdir resource.path
  if repo.config.keys.include?("remote.#{remote}.url")
    if remote_changed? remote
      Whisk.ui.info "Remote #{remote} points to a different url"
      a = Whisk.ui.ask_question("Would you like to change it to point to #{url} ?",
            {:default => 'y'}
      )
      if a =~ /y/i
        run_command!("git remote rm #{remote}")
      else
        Whisk.ui.info("Skipping out of date remote #{remote}")
        return
      end
    else
      Whisk.ui.info "Remote #{remote} already added"
      return
    end
  end
  Whisk.ui.info "Adding remote #{remote} to ingredient #{resource.name}"
  run_command!("git remote add #{remote} #{url}")
end

#add_remotesObject



28
29
30
31
32
# File 'lib/whisk/provider/ingredient.rb', line 28

def add_remotes
  resource.remotes.each_pair do |remote, url|
    add_remote(remote, url)
  end
end

#checkoutObject



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/whisk/provider/ingredient.rb', line 57

def checkout
  if resource.ref
    if self.current_ref == resource.ref
      Whisk.ui.info "Ingredient '#{resource.name}' already at ref '#{resource.ref}'"
    else
      Whisk.ui.info "Checking out ref '#{resource.ref}' for ingredient '#{resource.name}'"
      cmd = run_command!("git checkout #{resource.ref}", :cwd => resource.path)
      cmd.stdout.lines.each do |line|
        Whisk.ui.info "\s\s#{line}"
      end
      cmd.stderr.lines.each do |line|
        Whisk.ui.info "\s\s#{line}"
      end
    end
  end
end

#cloneObject



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/whisk/provider/ingredient.rb', line 74

def clone
  if git.exist?
    if remote_changed?("origin", resource.source)
      reset_origin
    else
      Whisk.ui.info "Ingredient '#{resource.name}' already prepared"
    end
  else
    Whisk.ui.info "Cloning ingredient '#{resource.name}', " + "from url #{resource.source}"
    cmd = run_command!("git clone #{resource.source} #{resource.path}")
    cmd.stdout.lines.each do |line|
      Whisk.ui.info "\s\s#{line}"
    end
    cmd.stderr.lines.each do |line|
      Whisk.ui.info "\s\s#{line}"
    end
  end
end

#current_refObject



93
94
95
96
97
98
99
100
# File 'lib/whisk/provider/ingredient.rb', line 93

def current_ref
  cref = run_command!("git rev-parse --abbrev-ref HEAD", :cwd => resource.path).stdout.chomp
  if cref == 'HEAD'
    return run_command!("git describe --tags", :cwd => resource.path).stdout.chomp
  else
    return cref
  end
end

#destroyObject



102
103
104
105
106
107
108
109
# File 'lib/whisk/provider/ingredient.rb', line 102

def destroy
  if git.exist?
    Whisk.ui.info "Destroying Ingredient #{resource.name}"
    ::FileUtils.rm_rf resource.path
  else
    Whisk.ui.info "Ingredient #{resource.name} already destroyed"
  end
end

#gitObject



111
112
113
# File 'lib/whisk/provider/ingredient.rb', line 111

def git
  Grit::Git.new(resource.path)
end

#remote_changed?(remote, source) ⇒ Boolean

Returns:

  • (Boolean)


119
120
121
122
123
124
125
126
# File 'lib/whisk/provider/ingredient.rb', line 119

def remote_changed?(remote, source)
  if git.exist? and resource.source != repo.config["remote.#{remote}.url"]
    Whisk.ui.info "Remote origin has changed for ingredient #{resource.name}"
    true
  else
    false
  end
end

#repoObject



115
116
117
# File 'lib/whisk/provider/ingredient.rb', line 115

def repo
  Grit::Repo.new(resource.path)
end

#reset_originObject



128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'lib/whisk/provider/ingredient.rb', line 128

def reset_origin
  if remote_changed?("origin", new_source.source)
    a = Whisk.ui.ask_question(
      "Would you like to remove ingredient #{resource.name} before proceeding ?",
      { :default => 'y' }
    )
    if a =~ /y/i
      destroy
      clone
    else
      Whisk.ui.warn "Aborting whisk"
      exit 1
    end
  end
end