hippo-cli 1.1.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,180 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'hippo/manifest'
4
+ require 'hippo/util'
5
+ require 'hippo/error'
6
+
7
+ module Hippo
8
+ class WorkingDirectory
9
+ attr_reader :root
10
+
11
+ def initialize(root = FileUtils.pwd)
12
+ @root = root
13
+ end
14
+
15
+ # Return the path to the config file in this working directory
16
+ #
17
+ # @return [String]
18
+ def config_path
19
+ File.join(@root, 'manifest.yaml')
20
+ end
21
+
22
+ # Return the path to the local config file
23
+ #
24
+ # @return [String]
25
+ def local_config_path
26
+ File.join(@root, 'manifest.local.yaml')
27
+ end
28
+
29
+ # Return all the options configured in this working directory
30
+ #
31
+ # @return [Hash]
32
+ def options
33
+ return @options if @options
34
+
35
+ if File.file?(config_path)
36
+ @options = YAML.load_file(config_path)
37
+ if File.file?(local_config_path)
38
+ @options = @options.deep_merge(YAML.load_file(local_config_path))
39
+ end
40
+ @options
41
+ else
42
+ raise Error, "No manifest config file found at #{config_path}"
43
+ end
44
+ end
45
+
46
+ # Return the manifest objet for this working directory
47
+ #
48
+ # @return [Hippo::Manifest]
49
+ def manifest(update: true)
50
+ if update && !@updated_manifest
51
+ update_from_remote if can_update?
52
+ @updated_manifest = true
53
+ end
54
+
55
+ raise Error, 'No manifest path could be determined' if manifest_path.nil?
56
+
57
+ @manifest ||= Manifest.load_from_file(File.join(manifest_path, 'Hippofile'))
58
+ end
59
+
60
+ # Return the path to the manifest directory
61
+ #
62
+ # @return [String]
63
+ def manifest_path
64
+ case source_type
65
+ when 'local'
66
+ options.dig('source', 'localOptions', 'path')
67
+ when 'remote'
68
+ path = [remote_path] if remote_path
69
+ File.join(remote_root_path, *path)
70
+ else
71
+ raise Error, "Invalid source.type ('#{source_type}')"
72
+ end
73
+ end
74
+
75
+ # Return the type of manifest
76
+ #
77
+ # @return [String]
78
+ def source_type
79
+ options.dig('source', 'type')
80
+ end
81
+
82
+ # Return the path on the local filesystem that the remote repository
83
+ # should be stored in.
84
+ #
85
+ # @return [String]
86
+ def remote_root_path
87
+ repo_ref = Digest::SHA1.hexdigest([remote_repository, remote_branch].join('---'))
88
+ File.join(Hippo.tmp_root, 'manifests', repo_ref)
89
+ end
90
+
91
+ # Return the branch to use from the remote repository
92
+ #
93
+ # @return [String]
94
+ def remote_branch
95
+ options.dig('source', 'remoteOptions', 'branch') || 'master'
96
+ end
97
+
98
+ # Return the URL to the remote repository
99
+ #
100
+ # @return [String]
101
+ def remote_repository
102
+ options.dig('source', 'remoteOptions', 'repository')
103
+ end
104
+
105
+ # Return the path within the remote repository that we wish to work
106
+ # with.
107
+ #
108
+ # @return [String]
109
+ def remote_path
110
+ options.dig('source', 'remoteOptions', 'path')
111
+ end
112
+
113
+ # Update the local cached copy of the manifest from the remote
114
+ #
115
+ # @return [Boolean]
116
+ def update_from_remote(verbose: false)
117
+ return false unless source_type == 'remote'
118
+
119
+ Util.action "Updating manifest from #{remote_repository}..." do
120
+ if File.directory?(remote_root_path)
121
+ Util.system("git -C #{remote_root_path} fetch")
122
+ else
123
+ FileUtils.mkdir_p(File.dirname(remote_root_path))
124
+ Util.system("git clone #{remote_repository} #{remote_root_path}")
125
+ end
126
+
127
+ Util.system("git -C #{remote_root_path} checkout origin/#{remote_branch}")
128
+ File.open(update_timestamp_path, 'w') { |f| f.write(Time.now.to_i.to_s + "\n") }
129
+ end
130
+
131
+ if verbose
132
+ puts
133
+ puts " Repository....: \e[33m#{wd.remote_repository}\e[0m"
134
+ puts " Branch........: \e[33m#{wd.remote_branch}\e[0m"
135
+ puts " Path..........: \e[33m#{wd.remote_path}\e[0m"
136
+ puts
137
+ end
138
+
139
+ true
140
+ end
141
+
142
+ # Return the time this manifest was last updated
143
+ #
144
+ # @return [Time, nil]
145
+ def last_updated_at
146
+ if File.file?(update_timestamp_path)
147
+ timestamp = File.read(update_timestamp_path)
148
+ Time.at(timestamp.strip.to_i)
149
+ end
150
+ end
151
+
152
+ # Return the path to the file where the last updated timestamp
153
+ # is stored
154
+ #
155
+ # @return [String]
156
+ def update_timestamp_path
157
+ File.join(remote_root_path + '.uptime-timestamp')
158
+ end
159
+
160
+ # Can this working directory be updated?
161
+ #
162
+ # @return [Boolean]
163
+ def can_update?
164
+ source_type == 'remote'
165
+ end
166
+
167
+ # Load all stages that are available in this working directory
168
+ #
169
+ # @return [Hash<Symbol, Hippo::Stage>]
170
+ def stages
171
+ objects = Util.load_objects_from_path(File.join(@root, '**', 'config.{yml,yaml}'))
172
+ objects.each_with_object({}) do |(path, objects), hash|
173
+ objects.each do |obj|
174
+ stage = Stage.new(self, File.dirname(path), obj)
175
+ hash[stage.name] = stage
176
+ end
177
+ end
178
+ end
179
+ end
180
+ end
data/lib/hippo.rb CHANGED
@@ -35,4 +35,11 @@ module Hippo
35
35
 
36
36
  stdout.strip
37
37
  end
38
+
39
+ # Path to store temp files
40
+ #
41
+ # @return [String]
42
+ def self.tmp_root
43
+ File.join(ENV['HOME'], '.hippo')
44
+ end
38
45
  end
data/template/Hippofile CHANGED
@@ -7,7 +7,7 @@ name: myapp
7
7
 
8
8
  images:
9
9
  main:
10
- host: index.docker.io
10
+ host: registry.mycompany.commit
11
11
  name: myorg/myapp
12
12
  tag: latest
13
13
  # Alternatively, load the tag name from the current HEAD commit of a
@@ -17,7 +17,6 @@ images:
17
17
  # fromRepository:
18
18
  # url: git@github.com:myorg/myapp
19
19
  # branch: master
20
-
21
20
  # If you wish, you can define a console command that allows you to easil
22
21
  # open a console using `hippo [stage] console`
23
22
  #
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hippo-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Cooke
@@ -30,7 +30,7 @@ cert_chain:
30
30
  3wUJNGnT5XYq+qvTqmjkTSTfdGvZCM63C6bGdN5CAyMokGOOatGqyCMAONolWnfC
31
31
  gm3t2GWWrxY=
32
32
  -----END CERTIFICATE-----
33
- date: 2020-02-12 00:00:00.000000000 Z
33
+ date: 2020-02-17 00:00:00.000000000 Z
34
34
  dependencies:
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: encryptor
@@ -161,10 +161,14 @@ files:
161
161
  - cli/package_upgrade.rb
162
162
  - cli/package_values.rb
163
163
  - cli/prepare.rb
164
+ - cli/readme.rb
164
165
  - cli/run.rb
165
166
  - cli/secrets.rb
167
+ - cli/setup.rb
166
168
  - cli/stages.rb
167
169
  - cli/status.rb
170
+ - cli/tidy.rb
171
+ - cli/update.rb
168
172
  - cli/vars.rb
169
173
  - cli/version.rb
170
174
  - lib/hippo.rb
@@ -183,6 +187,7 @@ files:
183
187
  - lib/hippo/stage.rb
184
188
  - lib/hippo/util.rb
185
189
  - lib/hippo/version.rb
190
+ - lib/hippo/working_directory.rb
186
191
  - template/Hippofile
187
192
  homepage: https://github.com/adamcooke/hippo
188
193
  licenses:
metadata.gz.sig CHANGED
Binary file