pray-cli 1.15.0 → 1.17.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.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +17 -0
  3. data/lib/pray/apply_report.rb +49 -0
  4. data/lib/pray/cli/commands/init.rb +1 -20
  5. data/lib/pray/cli/commands/init_prayer.rb +76 -0
  6. data/lib/pray/cli/commands/init_prayer_manifest.rb +102 -0
  7. data/lib/pray/cli/commands/packages.rb +13 -2
  8. data/lib/pray/cli/commands/workflow.rb +5 -0
  9. data/lib/pray/cli/help.rb +52 -15
  10. data/lib/pray/cli/helpers.rb +13 -5
  11. data/lib/pray/cli/parse.rb +21 -1
  12. data/lib/pray/cli.rb +3 -1
  13. data/lib/pray/constraint.rb +17 -4
  14. data/lib/pray/dependency_graph.rb +43 -0
  15. data/lib/pray/destination.rb +32 -2
  16. data/lib/pray/distribution.rb +94 -0
  17. data/lib/pray/format_serialize.rb +1 -4
  18. data/lib/pray/git_sources.rb +11 -10
  19. data/lib/pray/local_prayer.rb +38 -0
  20. data/lib/pray/lockfile.rb +8 -2
  21. data/lib/pray/manifest.rb +6 -3
  22. data/lib/pray/manifest_json.rb +1 -0
  23. data/lib/pray/manifest_parser_blocks.rb +15 -15
  24. data/lib/pray/materialize.rb +8 -1
  25. data/lib/pray/package_spec.rb +25 -13
  26. data/lib/pray/package_spec_render.rb +4 -3
  27. data/lib/pray/package_spec_version.rb +33 -0
  28. data/lib/pray/plan.rb +2 -1
  29. data/lib/pray/publish.rb +27 -2
  30. data/lib/pray/registry.rb +12 -0
  31. data/lib/pray/registry_paths.rb +14 -0
  32. data/lib/pray/render.rb +6 -36
  33. data/lib/pray/render_managed.rb +64 -0
  34. data/lib/pray/render_patch.rb +63 -12
  35. data/lib/pray/resolve.rb +17 -50
  36. data/lib/pray/resolve_context.rb +7 -0
  37. data/lib/pray/resolve_deps.rb +18 -0
  38. data/lib/pray/resolve_local.rb +39 -0
  39. data/lib/pray/resolve_source.rb +5 -0
  40. data/lib/pray/resolve_tarball.rb +66 -0
  41. data/lib/pray/serve.rb +15 -4
  42. data/lib/pray/serve_range.rb +36 -0
  43. data/lib/pray/torrent_manifest.rb +78 -0
  44. data/lib/pray/upstream_drift.rb +42 -0
  45. data/lib/pray/upstream_merge.rb +25 -0
  46. data/lib/pray/upstream_refresh.rb +28 -2
  47. data/lib/pray/verify.rb +2 -2
  48. data/lib/pray/verify_locked_dest.rb +47 -0
  49. data/lib/pray/version.rb +2 -2
  50. data/lib/pray.rb +15 -1
  51. metadata +17 -1
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+ require "fileutils"
5
+
6
+ module Pray
7
+ TORRENT_MANIFEST_SPEC = "pray-torrent-v1"
8
+ DEFAULT_TORRENT_PIECE_SIZE = 16 * 1024
9
+
10
+ module TorrentManifest
11
+ module_function
12
+
13
+ def path_for(artifact_path)
14
+ "#{artifact_path}.praytorrent.json"
15
+ end
16
+
17
+ def payload(name:, version:, artifact_path:, archive_bytes:, trackers: [])
18
+ {
19
+ "spec" => TORRENT_MANIFEST_SPEC,
20
+ "name" => name,
21
+ "version" => version,
22
+ "artifact_url" => artifact_path,
23
+ "artifact_hash" => Hashing.sha256_prefixed(archive_bytes),
24
+ "piece_size" => DEFAULT_TORRENT_PIECE_SIZE,
25
+ "length" => archive_bytes.bytesize,
26
+ "pieces" => piece_hashes(archive_bytes),
27
+ "sources" => [artifact_path],
28
+ "trackers" => Array(trackers)
29
+ }
30
+ end
31
+
32
+ def bytes(name:, version:, artifact_path:, archive_bytes:, trackers: [])
33
+ JSON.pretty_generate(
34
+ payload(
35
+ name: name,
36
+ version: version,
37
+ artifact_path: artifact_path,
38
+ archive_bytes: archive_bytes,
39
+ trackers: trackers
40
+ )
41
+ )
42
+ end
43
+
44
+ def write(root, name:, version:, artifact_path:, archive_bytes:, settings:)
45
+ return unless settings.allows_torrent?
46
+
47
+ path = File.join(root, path_for(artifact_path))
48
+ FileUtils.mkdir_p(File.dirname(path))
49
+ File.write(
50
+ path,
51
+ bytes(
52
+ name: name,
53
+ version: version,
54
+ artifact_path: artifact_path,
55
+ archive_bytes: archive_bytes,
56
+ trackers: settings.bootstrap_trackers
57
+ )
58
+ )
59
+ end
60
+
61
+ def piece_hashes(archive_bytes)
62
+ length = archive_bytes.bytesize
63
+ return [] if length.zero?
64
+
65
+ hashes = []
66
+ start = 0
67
+ while start < length
68
+ hashes << Hashing.sha256_prefixed(archive_bytes.byteslice(start, DEFAULT_TORRENT_PIECE_SIZE))
69
+ start += DEFAULT_TORRENT_PIECE_SIZE
70
+ end
71
+ hashes
72
+ end
73
+
74
+ def descriptor_present?(root, artifact_path, settings)
75
+ !settings.allows_torrent? || File.file?(File.join(root, path_for(artifact_path)))
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pray
4
+ module Upstream
5
+ module_function
6
+
7
+ def path_fork_drift_lines(project, previous, options)
8
+ user_config = Config.load_user_config
9
+ git_sources = GitSources.prepare_git_sources(
10
+ project.project_root,
11
+ project.manifest.sources,
12
+ previous,
13
+ refresh: options.refresh || options.refresh_source_revisions
14
+ )
15
+ sources = Resolve.source_map(project.manifest.sources)
16
+ lines = []
17
+ project.packages.each do |package|
18
+ next unless package.declaration.path
19
+ next unless package.upstream
20
+
21
+ upstream = package.upstream
22
+ resolved = resolve_named(
23
+ project.project_root, sources, git_sources, user_config, previous, options,
24
+ upstream.name, "= #{upstream.version}", upstream.source
25
+ )
26
+ upstream_content = content_file_bytes(resolved.root, resolved.spec)
27
+ local_content = local_content_for_refresh(package.root, package.spec)
28
+ if local_content.empty?
29
+ lines << "#{package.declaration.name} has no content files; run pray install to copy #{upstream.name} #{upstream.version}"
30
+ next
31
+ end
32
+
33
+ overlay_file_changes(local_content, upstream_content).each do |path, change|
34
+ lines << overlay_drift_line(
35
+ package.declaration.name, upstream.name, upstream.version, path, change
36
+ )
37
+ end
38
+ end
39
+ lines
40
+ end
41
+ end
42
+ end
@@ -76,6 +76,31 @@ module Pray
76
76
 
77
77
  "= #{new_version}"
78
78
  end
79
+
80
+ def overlay_file_changes(local_content, upstream_content)
81
+ (local_content.keys + upstream_content.keys).uniq.sort.filter_map do |path|
82
+ local = local_content[path]
83
+ upstream = upstream_content[path]
84
+ if local && upstream && local != upstream
85
+ [path, :changed]
86
+ elsif local && upstream.nil?
87
+ [path, :local_only]
88
+ elsif local.nil? && upstream
89
+ [path, :missing]
90
+ end
91
+ end
92
+ end
93
+
94
+ def overlay_drift_line(fork, upstream_name, upstream_version, path, change)
95
+ case change
96
+ when :changed
97
+ "#{fork} #{path} differs from #{upstream_name} #{upstream_version}"
98
+ when :local_only
99
+ "#{fork} #{path} local"
100
+ else
101
+ "#{fork} #{path} missing from fork"
102
+ end
103
+ end
79
104
  private_class_method :merge_one_content_path, :merge_all_present
80
105
  end
81
106
  end
@@ -27,6 +27,11 @@ module Pray
27
27
  new_upstream = package.upstream
28
28
  return false unless new_upstream && package.declaration.path
29
29
 
30
+ local_content = local_content_for_refresh(package.root, package.spec)
31
+ if local_content.empty?
32
+ return materialize_empty_path_fork(project, package, previous, sources, git_sources, user_config, options, new_upstream)
33
+ end
34
+
30
35
  old_upstream = previous&.package&.find { |entry| entry.name == package.declaration.name }&.upstream
31
36
  return false unless old_upstream
32
37
  return false if old_upstream.version == new_upstream.version && old_upstream.tree_hash == new_upstream.tree_hash
@@ -40,6 +45,27 @@ module Pray
40
45
  true
41
46
  end
42
47
 
48
+ def materialize_empty_path_fork(project, package, previous, sources, git_sources, user_config, options, new_upstream)
49
+ new_package = resolve_named(
50
+ project.project_root, sources, git_sources, user_config, previous, options,
51
+ new_upstream.name, "= #{new_upstream.version}", new_upstream.source
52
+ )
53
+ new_content = content_file_bytes(new_package.root, new_package.spec)
54
+ write_content_files(package.root, {}, new_content)
55
+ write_refreshed_spec(package, new_package, {}, {}, new_content)
56
+ true
57
+ end
58
+
59
+ def local_content_for_refresh(root, spec)
60
+ paths = content_paths(spec.files)
61
+ return {} if paths.empty?
62
+
63
+ missing = paths.count { |relative| !File.file?(File.join(root, relative)) }
64
+ return {} if missing == paths.length
65
+
66
+ content_file_bytes(root, spec)
67
+ end
68
+
43
69
  def resolve_upstream_pair(project, previous, sources, git_sources, user_config, options, old_upstream, new_upstream)
44
70
  old_package = resolve_named(
45
71
  project.project_root, sources, git_sources, user_config, previous, options,
@@ -80,7 +106,6 @@ module Pray
80
106
  updated = PackageSpecRender.fork_spec_after_refresh(
81
107
  package.spec,
82
108
  new_package.spec,
83
- File.basename(spec_path),
84
109
  clean_replica?(old_content, local_content),
85
110
  merged.keys
86
111
  )
@@ -138,7 +163,8 @@ module Pray
138
163
  Transaction.write_file(File.join(root, relative), bytes)
139
164
  end
140
165
  end
141
- private_class_method :apply_one_path_upstream, :resolve_upstream_pair, :merge_fork_content,
166
+ private_class_method :apply_one_path_upstream, :materialize_empty_path_fork, :local_content_for_refresh,
167
+ :resolve_upstream_pair, :merge_fork_content,
142
168
  :write_refreshed_spec, :resolve_named
143
169
  end
144
170
  end
data/lib/pray/verify.rb CHANGED
@@ -83,10 +83,10 @@ module Pray
83
83
  message: "Package `#{package.declaration.name}` no longer matches the locked tree hash. Run `pray install` to re-resolve packages."
84
84
  )
85
85
  end
86
- if locked.version != package.spec.version
86
+ if locked.version != package.spec.recorded_version
87
87
  report.findings << VerificationFinding.new(
88
88
  kind: "verify_error",
89
- message: "Package `#{package.declaration.name}` resolved to version #{package.spec.version} but `Prayfile.lock` has #{locked.version}. Run `pray install` to refresh the lockfile."
89
+ message: "Package `#{package.declaration.name}` resolved to version #{package.spec.recorded_version} but `Prayfile.lock` has #{locked.version}. Run `pray install` to refresh the lockfile."
90
90
  )
91
91
  end
92
92
  else
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pray
4
+ module Verify
5
+ module_function
6
+
7
+ def inspect_locked_destinations(project_root, lockfile)
8
+ report = VerificationReport.new
9
+ lockfile.managed_span.group_by(&:target).each do |target_path, spans|
10
+ absolute_path = File.join(project_root, target_path)
11
+ unless File.exist?(absolute_path)
12
+ report.findings << VerificationFinding.new(
13
+ kind: "verify_error",
14
+ message: "Rendered file `#{target_path}` is missing. Run `pray install` to generate it."
15
+ )
16
+ next
17
+ end
18
+
19
+ text = RenderDest.decode_utf8(
20
+ RenderDest.read_regular_bytes(absolute_path, target_path),
21
+ target_path
22
+ )
23
+ markers = marker_positions(text.lines(chomp: true))
24
+ spans.each do |span|
25
+ marker = markers[span.id]
26
+ unless marker
27
+ report.findings << VerificationFinding.new(
28
+ kind: "removed_prayer",
29
+ message: "`#{target_path}` is missing managed marker `#{span.id}` for `#{span.package}::#{span.export}`. Run `pray install` to restore the managed span."
30
+ )
31
+ next
32
+ end
33
+ next if marker[2] == span.ideal_checksum
34
+
35
+ report.findings << VerificationFinding.new(
36
+ kind: "custom_implementation",
37
+ message: "`#{target_path}` marker `#{span.id}` (`#{span.package}::#{span.export}`) was edited. Restore the managed block or run `pray install` to regenerate it."
38
+ )
39
+ end
40
+ find_orphan_marker_findings(spans, markers, target_path).each do |finding|
41
+ report.findings << finding
42
+ end
43
+ end
44
+ report
45
+ end
46
+ end
47
+ end
data/lib/pray/version.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Pray
4
- VERSION = "1.15.0"
5
- GENERATED_BY = "pray 1.15.0"
4
+ VERSION = "1.17.0"
5
+ GENERATED_BY = "pray 1.17.0"
6
6
  end
data/lib/pray.rb CHANGED
@@ -13,7 +13,13 @@ require_relative "pray/manifest"
13
13
  require_relative "pray/format_serialize"
14
14
  require_relative "pray/format_manifest"
15
15
  require_relative "pray/package_spec"
16
+ require_relative "pray/package_spec_version"
17
+ require_relative "pray/local_prayer"
16
18
  require_relative "pray/lockfile"
19
+ require_relative "pray/distribution"
20
+ require_relative "pray/torrent_manifest"
21
+ require_relative "pray/serve_range"
22
+ require_relative "pray/apply_report"
17
23
  require_relative "pray/config"
18
24
  require_relative "pray/dotenv"
19
25
  require_relative "pray/project_context"
@@ -21,16 +27,23 @@ require_relative "pray/environment"
21
27
  require_relative "pray/resolve_context"
22
28
  require_relative "pray/resolve_source"
23
29
  require_relative "pray/resolve_exports"
30
+ require_relative "pray/dependency_graph"
31
+ require_relative "pray/resolve_deps"
32
+ require_relative "pray/resolve_tarball"
24
33
  require_relative "pray/invocation"
25
34
  require_relative "pray/git_refresh"
26
35
  require_relative "pray/resolve"
36
+ require_relative "pray/resolve_local"
27
37
  require_relative "pray/upstream"
28
38
  require_relative "pray/upstream_merge"
29
39
  require_relative "pray/package_spec_render"
30
40
  require_relative "pray/upstream_refresh"
41
+ require_relative "pray/upstream_drift"
31
42
  require_relative "pray/upstream_latest"
32
43
  require_relative "pray/compose_dest"
33
44
  require_relative "pray/render_patch"
45
+ require_relative "pray/render_content"
46
+ require_relative "pray/render_managed"
34
47
  require_relative "pray/render"
35
48
  require_relative "pray/render_dest"
36
49
  require_relative "pray/transaction"
@@ -38,6 +51,7 @@ require_relative "pray/render_layout"
38
51
  require_relative "pray/verify_position"
39
52
  require_relative "pray/verify_provisioned"
40
53
  require_relative "pray/verify"
54
+ require_relative "pray/verify_locked_dest"
41
55
  require_relative "pray/resource_limits"
42
56
  require_relative "pray/http_body"
43
57
  require_relative "pray/registry_install"
@@ -61,6 +75,6 @@ class << Pray
61
75
  :parse_package_spec, :parse_lockfile, :read_lockfile, :serialize_lockfile, :lockfile_hash,
62
76
  :write_lockfile, :write_lockfile_if_changed, :lockfiles_equivalent?, :build_lockfile,
63
77
  :resolve_project, :render_project, :materialize_project,
64
- :inspect_project, :verify_project, :drift_project,
78
+ :inspect_project, :inspect_locked_destinations, :verify_project, :drift_project,
65
79
  :default_manifest_path, :default_lockfile_path, :project_root_from_manifest
66
80
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pray-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.15.0
4
+ version: 1.17.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrei Makarov
@@ -102,6 +102,7 @@ files:
102
102
  - bin/pray
103
103
  - lib/pray-cli.rb
104
104
  - lib/pray.rb
105
+ - lib/pray/apply_report.rb
105
106
  - lib/pray/archive.rb
106
107
  - lib/pray/archive_unpack.rb
107
108
  - lib/pray/auth_client.rb
@@ -110,6 +111,8 @@ files:
110
111
  - lib/pray/cli/commands/auth.rb
111
112
  - lib/pray/cli/commands/distribution.rb
112
113
  - lib/pray/cli/commands/init.rb
114
+ - lib/pray/cli/commands/init_prayer.rb
115
+ - lib/pray/cli/commands/init_prayer_manifest.rb
113
116
  - lib/pray/cli/commands/meta.rb
114
117
  - lib/pray/cli/commands/packages.rb
115
118
  - lib/pray/cli/commands/trust.rb
@@ -125,7 +128,9 @@ files:
125
128
  - lib/pray/confess.rb
126
129
  - lib/pray/config.rb
127
130
  - lib/pray/constraint.rb
131
+ - lib/pray/dependency_graph.rb
128
132
  - lib/pray/destination.rb
133
+ - lib/pray/distribution.rb
129
134
  - lib/pray/dotenv.rb
130
135
  - lib/pray/environment.rb
131
136
  - lib/pray/error.rb
@@ -137,6 +142,7 @@ files:
137
142
  - lib/pray/http_body.rb
138
143
  - lib/pray/invocation.rb
139
144
  - lib/pray/literal.rb
145
+ - lib/pray/local_prayer.rb
140
146
  - lib/pray/lockfile.rb
141
147
  - lib/pray/lockfile_serialize.rb
142
148
  - lib/pray/manifest.rb
@@ -149,6 +155,7 @@ files:
149
155
  - lib/pray/materialize.rb
150
156
  - lib/pray/package_spec.rb
151
157
  - lib/pray/package_spec_render.rb
158
+ - lib/pray/package_spec_version.rb
152
159
  - lib/pray/path_safety.rb
153
160
  - lib/pray/plan.rb
154
161
  - lib/pray/project_context.rb
@@ -156,18 +163,24 @@ files:
156
163
  - lib/pray/registry.rb
157
164
  - lib/pray/registry_install.rb
158
165
  - lib/pray/registry_integrity.rb
166
+ - lib/pray/registry_paths.rb
159
167
  - lib/pray/render.rb
160
168
  - lib/pray/render_content.rb
161
169
  - lib/pray/render_dest.rb
162
170
  - lib/pray/render_layout.rb
171
+ - lib/pray/render_managed.rb
163
172
  - lib/pray/render_patch.rb
164
173
  - lib/pray/resolve.rb
165
174
  - lib/pray/resolve_context.rb
175
+ - lib/pray/resolve_deps.rb
166
176
  - lib/pray/resolve_exports.rb
177
+ - lib/pray/resolve_local.rb
167
178
  - lib/pray/resolve_source.rb
179
+ - lib/pray/resolve_tarball.rb
168
180
  - lib/pray/resource_limits.rb
169
181
  - lib/pray/serve.rb
170
182
  - lib/pray/serve_federation.rb
183
+ - lib/pray/serve_range.rb
171
184
  - lib/pray/session.rb
172
185
  - lib/pray/ssh_agent.rb
173
186
  - lib/pray/statement_surface.rb
@@ -175,6 +188,7 @@ files:
175
188
  - lib/pray/sync.rb
176
189
  - lib/pray/tar_validation.rb
177
190
  - lib/pray/terminal.rb
191
+ - lib/pray/torrent_manifest.rb
178
192
  - lib/pray/transaction.rb
179
193
  - lib/pray/transaction/journal.rb
180
194
  - lib/pray/transaction/owner.rb
@@ -183,10 +197,12 @@ files:
183
197
  - lib/pray/trust_feed.rb
184
198
  - lib/pray/trust_ops.rb
185
199
  - lib/pray/upstream.rb
200
+ - lib/pray/upstream_drift.rb
186
201
  - lib/pray/upstream_latest.rb
187
202
  - lib/pray/upstream_merge.rb
188
203
  - lib/pray/upstream_refresh.rb
189
204
  - lib/pray/verify.rb
205
+ - lib/pray/verify_locked_dest.rb
190
206
  - lib/pray/verify_position.rb
191
207
  - lib/pray/verify_provisioned.rb
192
208
  - lib/pray/version.rb