packaging 0.99.61 → 0.99.66

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ad27ca2f1724bfea741b3e69538fdb238acc76ea1662a6e40a44f433eb66e457
4
- data.tar.gz: 87aad9c6e3f8e13abcaf437fbe1fceb113ee596073d04a3e997f4d12c38d6edc
3
+ metadata.gz: 47aedaa86f3b67d8c5c0dac793bdc7ba76098d59a69a371d686ad040a82bcad7
4
+ data.tar.gz: 46903f549c65511da61bc15448809e2442d8569b9cc7c318b3a44c9d1389a4a8
5
5
  SHA512:
6
- metadata.gz: d6af0709a72179d3489e2ea6c3940be0f69d715e34c81cd19e5378badd136d7ec6db068d18d610cbb8448ba4053aa04f5fdda4708e273d27b38ffb786cd55da2
7
- data.tar.gz: 22f8aab7c11a57fa87f836047b5ee441a1cfbaf04df579b00b3cb15d8eeec2a7c32500ec56d9c2edf86e2c4e4b267076cc345e2bd8731962a904046b2d4219fd
6
+ metadata.gz: 2a4f6a1f1135c242cb3561b609943a44715f9bbf45653f76548c2682819dbf14c1a1f1909380a70b7c5b054eebbd871c0572760c8d76e104fae19b9fedb330d5
7
+ data.tar.gz: 69bb9b00a3e3711911fc98a4b68d175f9e79553e4c100db4a02ab4e57be3a6ed71c00b0014b19ff5ef5c30c22796e22db73efff32f9775ddf05b9204c12c6885
@@ -2,67 +2,7 @@ require 'artifactory'
2
2
  require 'uri'
3
3
  require 'open-uri'
4
4
  require 'digest'
5
-
6
- #
7
- # [eric.griswold] This is unfortunate. The 'pattern_search' class method really does belong in
8
- # the Artifactory gem. However, because of some of Chef's social policies,
9
- # I am unwilling to contribute this code there. If that changes, I'll submit a PR. Until
10
- # then, it'll live here.
11
- #
12
- module Artifactory
13
- class Resource::Artifact
14
- #
15
- # Search for an artifact in a repo using an Ant-like pattern.
16
- # Unlike many Artifactory searches, this one is restricted to a single
17
- # repository.
18
- #
19
- # @example Search in a repository named 'foo_local' for an artifact in a directory containing
20
- # the word "recent", named "artifact[0-9].txt"
21
- # Artifact.pattern_search(pattern: '*recent*/artifact[0-9].txt',
22
- # repo: 'foo_local')
23
- #
24
- # @param [Hash] options
25
- # A hash of options, as follows:
26
- #
27
- # @option options [Artifactory::Client] :client
28
- # the client object to make the request with
29
- # @option options [String] :pattern
30
- # the Ant-like pattern to use for finding artifacts within the repos. Note that the
31
- # Ant pattern '**' is barred in this case by JFrog.
32
- # @option options [String] :repo
33
- # the repo to search
34
- #
35
- # @return [Array<Resource::Artifact>]
36
- # a list of artifacts that match the query
37
- #
38
- def self.pattern_search(options = {})
39
- client = extract_client!(options)
40
- params = Util.slice(options, :pattern, :repo)
41
- pattern_search_parameter = { :pattern => "#{params[:repo]}:#{params[:pattern]}" }
42
- response = client.get('/api/search/pattern', pattern_search_parameter)
43
- return [] if response['files'].nil? || response['files'].empty?
44
-
45
- # A typical response:
46
- # {
47
- # "repoUri"=>"https:<artifactory endpoint>/<repo>",
48
- # "sourcePattern"=>"<repo>:<provided search pattern>",
49
- # "files"=>[<filename that matched pattern>, ...]
50
- # }
51
- #
52
- # Inserting '/api/storage' before the repo makes the 'from_url' call work correctly.
53
- #
54
- repo_uri = response['repoUri']
55
- unless repo_uri.include?('/api/storage/')
56
- # rubocop:disable Style/PercentLiteralDelimiters
57
- repo_uri.sub!(%r(/#{params[:repo]}$), "/api/storage/#{params[:repo]}")
58
- end
59
- response['files'].map do |file_path|
60
- from_url("#{repo_uri}/#{file_path}", client: client)
61
- end
62
- end
63
- end
64
- end
65
-
5
+ require 'packaging/artifactory/extensions'
66
6
 
67
7
  module Pkg
68
8
 
@@ -111,7 +51,6 @@ module Pkg
111
51
  def location_for(platform_tag)
112
52
  toplevel_repo = DEFAULT_REPO_TYPE
113
53
  repo_subdirectories = File.join(@repo_base, @project, @project_version)
114
- alternate_subdirectories = repo_subdirectories
115
54
 
116
55
  unless platform_tag == DEFAULT_REPO_TYPE
117
56
  format = Pkg::Platforms.package_format_for_tag(platform_tag)
@@ -122,20 +61,16 @@ module Pkg
122
61
  when 'rpm'
123
62
  toplevel_repo = 'rpm'
124
63
  repo_subdirectories = File.join(repo_subdirectories, "#{platform}-#{version}-#{architecture}")
125
- alternate_subdirectories = repo_subdirectories
126
64
  when 'deb'
127
65
  toplevel_repo = 'debian__local'
128
66
  repo_subdirectories = File.join(repo_subdirectories, "#{platform}-#{version}")
129
- alternate_subdirectories = File.join('pool', repo_subdirectories)
130
67
  when 'swix', 'dmg', 'svr4', 'ips'
131
68
  repo_subdirectories = File.join(repo_subdirectories, "#{platform}-#{version}-#{architecture}")
132
- alternate_subdirectories = repo_subdirectories
133
69
  when 'msi'
134
70
  repo_subdirectories = File.join(repo_subdirectories, "#{platform}-#{architecture}")
135
- alternate_subdirectories = repo_subdirectories
136
71
  end
137
72
 
138
- [toplevel_repo, repo_subdirectories, alternate_subdirectories]
73
+ [toplevel_repo, repo_subdirectories]
139
74
  end
140
75
 
141
76
  # @param platform_tag [String] The platform tag specific to the information
@@ -150,8 +85,8 @@ module Pkg
150
85
  end
151
86
  end
152
87
 
153
- repo_name, repo_subdirectories, alternate_subdirectories = location_for(platform_tag)
154
- full_artifactory_path = File.join(repo_name, alternate_subdirectories)
88
+ repo_name, repo_subdirectories = location_for(platform_tag)
89
+ full_artifactory_path = File.join(repo_name, repo_subdirectories)
155
90
 
156
91
  {
157
92
  platform: platform,
@@ -161,7 +96,6 @@ module Pkg
161
96
  package_format: package_format,
162
97
  repo_name: repo_name,
163
98
  repo_subdirectories: repo_subdirectories,
164
- alternate_subdirectories: alternate_subdirectories,
165
99
  full_artifactory_path: full_artifactory_path
166
100
  }
167
101
  end
@@ -286,7 +220,7 @@ module Pkg
286
220
  headers = { "X-Checksum-Md5" => artifact_md5 }
287
221
  artifact.upload(
288
222
  data[:repo_name],
289
- File.join(data[:alternate_subdirectories], File.basename(package)),
223
+ File.join(data[:repo_subdirectories], File.basename(package)),
290
224
  deploy_properties(platform_tag, File.basename(package)),
291
225
  headers
292
226
  )
@@ -420,21 +354,20 @@ module Pkg
420
354
  manifest.each do |dist, packages|
421
355
  puts "Grabbing the #{dist} packages from artifactory"
422
356
  packages.each do |name, info|
423
- artifacts = Artifactory::Resource::Artifact.checksum_search(md5: "#{info["md5"]}", repos: ["rpm_enterprise__local", "debian_enterprise__local"])
357
+ filename = info['filename']
358
+ artifacts = Artifactory::Resource::Artifact.checksum_search(md5: "#{info["md5"]}", repos: ["rpm_enterprise__local", "debian_enterprise__local"], name: filename)
424
359
  artifact_to_download = artifacts.select { |artifact| artifact.download_uri.include? remote_path }.first
425
360
  # If we found matching artifacts, but not in the correct path, copy the artifact to the correct path
426
361
  # This should help us keep repos up to date with the packages we are expecting to be there
427
362
  # while helping us avoid 'what the hell, could not find package' errors
428
363
  if artifact_to_download.nil? && !artifacts.empty?
429
364
  artifact_to_copy = artifacts.first
430
- filename = info['filename'] || File.basename(artifact_to_copy.download_uri)
431
365
  copy_artifact(artifact_to_copy, artifact_to_copy.repo, "#{remote_path}/#{dist}/#{filename}")
432
- artifacts = Artifactory::Resource::Artifact.checksum_search(md5: "#{info["md5"]}", repos: ["rpm_enterprise__local", "debian_enterprise__local"])
366
+ artifacts = Artifactory::Resource::Artifact.checksum_search(md5: "#{info["md5"]}", repos: ["rpm_enterprise__local", "debian_enterprise__local"], name: filename)
433
367
  artifact_to_download = artifacts.select { |artifact| artifact.download_uri.include? remote_path }.first
434
368
  end
435
369
 
436
370
  if artifact_to_download.nil?
437
- filename = info["filename"] || name
438
371
  message = "Error: what the hell, could not find package #{filename} with md5sum #{info["md5"]}"
439
372
  unless remote_path.empty?
440
373
  message += " in #{remote_path}"
@@ -442,7 +375,6 @@ module Pkg
442
375
  raise message
443
376
  else
444
377
  full_staging_path = "#{staging_directory}/#{dist}"
445
- filename = info['filename'] || File.basename(artifact_to_download.download_uri)
446
378
  puts "downloading #{artifact_to_download.download_uri} to #{File.join(full_staging_path, filename)}"
447
379
  artifact_to_download.download(full_staging_path, filename: filename)
448
380
  end
@@ -599,7 +531,7 @@ module Pkg
599
531
  # @param target_path [String] path copy tarballs to, assumes same repo
600
532
  def copy_final_pe_tarballs(pe_version, repo, remote_path, target_path)
601
533
  check_authorization
602
- final_tarballs = Artifactory::Resource::Artifact.search(name: pe_version, repos: repo)
534
+ final_tarballs = Artifactory::Resource::Artifact.search(name: pe_version, repos: repo, exact_match: false)
603
535
  final_tarballs.each do |artifact|
604
536
  next unless artifact.download_uri.include? remote_path
605
537
  next if artifact.download_uri.include? "-rc"
@@ -646,12 +578,11 @@ module Pkg
646
578
  manifest.each do |dist, packages|
647
579
  puts "Copying #{dist} packages..."
648
580
  packages.each do |name, info|
649
- artifact = Artifactory::Resource::Artifact.checksum_search(md5: "#{info["md5"]}", repos: ["rpm_enterprise__local", "debian_enterprise__local"]).first
581
+ filename = info["filename"]
582
+ artifact = Artifactory::Resource::Artifact.checksum_search(md5: "#{info["md5"]}", repos: ["rpm_enterprise__local", "debian_enterprise__local"], name: filename).first
650
583
  if artifact.nil?
651
- filename = info["filename"] || name
652
584
  raise "Error: what the hell, could not find package #{filename} with md5sum #{info["md5"]}"
653
585
  end
654
- filename = info["filename"] || File.basename(artifact.download_uri)
655
586
  copy_artifact(artifact, artifact.repo, "#{target_path}/#{dist}/#{filename}")
656
587
  end
657
588
  end
@@ -681,7 +612,8 @@ module Pkg
681
612
  manifest.each do |dist, packages|
682
613
  packages.each do |package_name, info|
683
614
  next unless package_name == package
684
- artifacts = Artifactory::Resource::Artifact.checksum_search(md5: "#{info["md5"]}", repos: repos)
615
+ filename = info["filename"]
616
+ artifacts = Artifactory::Resource::Artifact.checksum_search(md5: "#{info["md5"]}", repos: repos, name: filename)
685
617
  artifacts.each do |artifact|
686
618
  next unless artifact.download_uri.include? remote_path
687
619
  puts "Removing reverted package #{artifact.download_uri}"
@@ -701,7 +633,7 @@ module Pkg
701
633
  Dir.foreach("#{tarball_path}/") do |pe_tarball|
702
634
  next if pe_tarball == '.' || pe_tarball == ".."
703
635
  md5 = Digest::MD5.file("#{tarball_path}/#{pe_tarball}").hexdigest
704
- artifacts_to_delete = Artifactory::Resource::Artifact.checksum_search(md5: md5, repos: pe_repo)
636
+ artifacts_to_delete = Artifactory::Resource::Artifact.checksum_search(md5: md5, repos: pe_repo, name: pe_tarball)
705
637
  next if artifacts_to_delete.nil?
706
638
  begin
707
639
  artifacts_to_delete.each do |artifact|
@@ -0,0 +1,94 @@
1
+ require 'artifactory'
2
+
3
+ module ArtifactoryExtensions
4
+ module ClassMethods
5
+ #
6
+ # Search for an artifact in a repo using an Ant-like pattern.
7
+ # Unlike many Artifactory searches, this one is restricted to a single
8
+ # repository.
9
+ #
10
+ # @example Search in a repository named 'foo_local' for an artifact in a directory containing
11
+ # the word "recent", named "artifact[0-9].txt"
12
+ # Artifact.pattern_search(pattern: '*recent*/artifact[0-9].txt',
13
+ # repo: 'foo_local')
14
+ #
15
+ # @param [Hash] options
16
+ # A hash of options, as follows:
17
+ #
18
+ # @option options [Artifactory::Client] :client
19
+ # the client object to make the request with
20
+ # @option options [String] :pattern
21
+ # the Ant-like pattern to use for finding artifacts within the repos. Note that the
22
+ # Ant pattern '**' is barred in this case by JFrog.
23
+ # @option options [String] :repo
24
+ # the repo to search
25
+ #
26
+ # @return [Array<Resource::Artifact>]
27
+ # a list of artifacts that match the query
28
+ #
29
+ def pattern_search(options = {})
30
+ client = extract_client!(options)
31
+ params = Artifactory::Util.slice(options, :pattern, :repo)
32
+ pattern_search_parameter = { :pattern => "#{params[:repo]}:#{params[:pattern]}" }
33
+ response = client.get('/api/search/pattern', pattern_search_parameter)
34
+ return [] if response['files'].nil? || response['files'].empty?
35
+
36
+ # A typical response:
37
+ # {
38
+ # "repoUri"=>"https:<artifactory endpoint>/<repo>",
39
+ # "sourcePattern"=>"<repo>:<provided search pattern>",
40
+ # "files"=>[<filename that matched pattern>, ...]
41
+ # }
42
+ #
43
+ # Inserting '/api/storage' before the repo makes the 'from_url' call work correctly.
44
+ #
45
+ repo_uri = response['repoUri']
46
+ unless repo_uri.include?('/api/storage/')
47
+ # rubocop:disable Style/PercentLiteralDelimiters
48
+ repo_uri.sub!(%r(/#{params[:repo]}$), "/api/storage/#{params[:repo]}")
49
+ end
50
+ response['files'].map do |file_path|
51
+ from_url("#{repo_uri}/#{file_path}", client: client)
52
+ end
53
+ end
54
+
55
+ # This adds the `exact_match` option to artifactory search, and defaults it
56
+ # to true. With `exact_match` set to `true` the artifact will only be
57
+ # returned if the name in the download uri matches the name we're trying to
58
+ # download
59
+ def search(options = {})
60
+ exact_match = options[:exact_match].nil? ? true : options[:exact_match]
61
+ artifacts = super
62
+
63
+ if exact_match
64
+ artifacts.select! { |artifact| File.basename(artifact.download_uri) == options[:name] }
65
+ end
66
+ artifacts
67
+ end
68
+
69
+ # This adds the `name` option to artifactory checksum search. It defaults to
70
+ # unset. If set, the artifact is only returned if the download uri matches
71
+ # the passed name
72
+ def checksum_search(options = {})
73
+ artifacts = super
74
+ if options[:name]
75
+ artifacts.select! { |artifact| File.basename(artifact.download_uri) == options[:name] }
76
+ end
77
+ artifacts
78
+ end
79
+ end
80
+
81
+ # needed to prepend class methods, see https://stackoverflow.com/questions/18683750/how-to-prepend-classmethods
82
+ def self.prepended(base)
83
+ class << base
84
+ prepend ClassMethods
85
+ end
86
+ end
87
+ end
88
+
89
+ module Artifactory
90
+ class Resource::Artifact
91
+ # use prepend instead of monkeypatching so we can call `super`
92
+ prepend ArtifactoryExtensions
93
+ end
94
+ end
@@ -70,15 +70,6 @@ module Pkg::Paths
70
70
  end
71
71
  end
72
72
 
73
- # Method to determine if files should be shipped to legacy or current path
74
- # structures. Any repo name matching /^puppet/ is a current repo, everything
75
- # else is should be shipped to legacy paths.
76
- #
77
- # @param repo_name The repo name to check
78
- def is_legacy_repo?(repo_name)
79
- repo_name !~ /^puppet/
80
- end
81
-
82
73
  # Method to determine the yum repo name. Maintains compatibility with legacy
83
74
  # projects, where `Pkg::Config.yum_repo_name` is set instead of
84
75
  # `Pkg::Config.repo_name`. Defaults to 'products' if nothing is set.
@@ -110,65 +101,83 @@ module Pkg::Paths
110
101
  return Pkg::Config.repo_link_target
111
102
  end
112
103
 
113
- # TODO: please please please clean this up
114
- # This is so terrible. I really dislike it. But in order to maintain backward
115
- # compatibility, we need to maintain these path differences between PC1 and
116
- # everything else. Once we stop shipping things to PC1, we can remove all the
117
- # PC1 specific cases. That's likely to not happen until the current LTS
118
- # (2016.4) is EOL'd. Hopefully also we do not choose to further change these
119
- # path structures, as it is no bueno.
120
- # --MAS 2017-08-16
121
- def artifacts_base_path_and_link_path(platform_tag, path_prefix = 'artifacts', nonfinal = false)
122
- platform, version, architecture = Pkg::Platforms.parse_platform_tag(platform_tag)
123
- package_format = Pkg::Platforms.package_format_for_tag(platform_tag)
104
+ # Construct a platform-dependent symlink target path.
105
+ def construct_base_path(path_data)
106
+ package_format = path_data[:package_format]
107
+ prefix = path_data[:prefix]
108
+ is_nonfinal = path_data[:is_nonfinal]
109
+ platform_name = path_data[:platform_name]
110
+ platform_tag = path_data[:platform_tag]
124
111
 
125
112
  case package_format
113
+ when 'deb'
114
+ debian_code_name = Pkg::Platforms.get_attribute(platform_tag, :codename)
115
+ return File.join(prefix, debian_code_name, apt_repo_name(is_nonfinal))
116
+ when 'dmg'
117
+ return File.join(prefix, 'mac', repo_name(is_nonfinal))
118
+ when 'msi'
119
+ return File.join(prefix, platform_name, repo_name(is_nonfinal))
126
120
  when 'rpm'
127
- if is_legacy_repo?(yum_repo_name(nonfinal))
128
- [File.join(path_prefix, platform, version, yum_repo_name(nonfinal)), nil]
129
- else
130
- [File.join(path_prefix, yum_repo_name(nonfinal)), link_name(nonfinal).nil? ? nil : File.join(path_prefix, link_name(nonfinal))]
131
- end
121
+ return File.join(prefix, yum_repo_name(is_nonfinal))
132
122
  when 'swix'
133
- if is_legacy_repo?(repo_name(nonfinal))
134
- [File.join(path_prefix, platform, version, repo_name(nonfinal)), nil]
135
- else
136
- [File.join(path_prefix, platform, repo_name(nonfinal)), link_name(nonfinal).nil? ? nil : File.join(path_prefix, platform, link_name(nonfinal))]
137
- end
123
+ return File.join(prefix, platform_name, repo_name(is_nonfinal))
124
+ when 'svr4', 'ips'
125
+ return File.join(prefix, 'solaris', repo_name(is_nonfinal))
126
+ else
127
+ raise "Error: Unknown package format '#{package_format}'"
128
+ end
129
+ end
130
+
131
+ # Construct a platform-dependent link path
132
+ def construct_link_path(path_data)
133
+ package_format = path_data[:package_format]
134
+ prefix = path_data[:prefix]
135
+ platform_name = path_data[:platform_name]
136
+ platform_tag = path_data[:platform_tag]
137
+ link = path_data[:link]
138
+
139
+ return nil if link.nil?
140
+
141
+ case package_format
142
+ when 'rpm'
143
+ return File.join(prefix, link)
144
+ when 'swix'
145
+ return File.join(prefix, platform_name, link)
138
146
  when 'deb'
139
- [File.join(path_prefix, Pkg::Platforms.get_attribute(platform_tag, :codename), apt_repo_name(nonfinal)),
140
- link_name(nonfinal).nil? ? nil : File.join(path_prefix, Pkg::Platforms.get_attribute(platform_tag, :codename), link_name(nonfinal))]
147
+ debian_code_name = Pkg::Platforms.get_attribute(platform_tag, :codename)
148
+ return File.join(prefix, debian_code_name, link)
141
149
  when 'svr4', 'ips'
142
- if is_legacy_repo?(repo_name(nonfinal))
143
- [File.join(path_prefix, 'solaris', repo_name(nonfinal), version), nil]
144
- else
145
- [File.join(path_prefix, 'solaris', repo_name(nonfinal)), link_name(nonfinal).nil? ? nil : File.join(path_prefix, 'solaris', link_name(nonfinal))]
146
- end
150
+ return File.join(prefix, 'solaris', link)
147
151
  when 'dmg'
148
- if is_legacy_repo?(repo_name(nonfinal))
149
- [File.join(path_prefix, 'mac', version, repo_name(nonfinal)), nil]
150
- else
151
- [File.join(path_prefix, 'mac', repo_name(nonfinal)), link_name(nonfinal).nil? ? nil : File.join(path_prefix, 'mac', link_name(nonfinal))]
152
- end
152
+ return File.join(prefix, 'mac', link)
153
153
  when 'msi'
154
- if is_legacy_repo?(repo_name(nonfinal))
155
- [File.join(path_prefix, 'windows'), nil]
156
- else
157
- [File.join(path_prefix, platform, repo_name(nonfinal)), link_name(nonfinal).nil? ? nil : File.join(path_prefix, platform, link_name(nonfinal))]
158
- end
154
+ return File.join(prefix, platform_name, link)
159
155
  else
160
- raise "Not sure where to find packages with a package format of '#{package_format}'"
156
+ raise "Error: Unknown package format '#{package_format}'"
161
157
  end
162
158
  end
163
159
 
164
- # TODO: please please please clean this up
165
- # This is so terrible. I really dislike it. But in order to maintain backward
166
- # compatibility, we need to maintain these path differences between PC1 and
167
- # everything else. Once we stop shipping things to PC1, we can remove all the
168
- # PC1 specific cases. That's likely to not happen until the current LTS
169
- # (2016.4) is EOL'd. Hopefully also we do not choose to further change these
170
- # path structures, as it is no bueno.
171
- # --MAS 2017-08-16
160
+ # Given platform information, create symlink target (base_path) and link path in the
161
+ # form of a 2-element array
162
+ def artifacts_base_path_and_link_path(platform_tag, prefix = 'artifacts', is_nonfinal = false)
163
+ platform_name, _ = Pkg::Platforms.parse_platform_tag(platform_tag)
164
+ package_format = Pkg::Platforms.package_format_for_tag(platform_tag)
165
+
166
+ path_data = {
167
+ is_nonfinal: is_nonfinal,
168
+ link: link_name(is_nonfinal),
169
+ package_format: package_format,
170
+ platform_name: platform_name,
171
+ platform_tag: platform_tag,
172
+ prefix: prefix
173
+ }
174
+
175
+ return [
176
+ construct_base_path(path_data),
177
+ construct_link_path(path_data)
178
+ ]
179
+ end
180
+
172
181
  def artifacts_path(platform_tag, path_prefix = 'artifacts', nonfinal = false)
173
182
  base_path, _ = artifacts_base_path_and_link_path(platform_tag, path_prefix, nonfinal)
174
183
  platform, version, architecture = Pkg::Platforms.parse_platform_tag(platform_tag)
@@ -176,31 +185,15 @@ module Pkg::Paths
176
185
 
177
186
  case package_format
178
187
  when 'rpm'
179
- if is_legacy_repo?(yum_repo_name(nonfinal))
180
- File.join(base_path, architecture)
181
- else
182
- File.join(base_path, platform, version, architecture)
183
- end
188
+ File.join(base_path, platform, version, architecture)
184
189
  when 'swix'
185
- if is_legacy_repo?(repo_name(nonfinal))
186
- File.join(base_path, architecture)
187
- else
188
- File.join(base_path, version, architecture)
189
- end
190
+ File.join(base_path, version, architecture)
190
191
  when 'deb'
191
192
  base_path
192
193
  when 'svr4', 'ips'
193
- if is_legacy_repo?(repo_name(nonfinal))
194
- base_path
195
- else
196
- File.join(base_path, version)
197
- end
194
+ File.join(base_path, version)
198
195
  when 'dmg'
199
- if is_legacy_repo?(repo_name(nonfinal))
200
- File.join(base_path, architecture)
201
- else
202
- File.join(base_path, version, architecture)
203
- end
196
+ File.join(base_path, version, architecture)
204
197
  when 'msi'
205
198
  base_path
206
199
  else
@@ -268,16 +261,33 @@ module Pkg::Paths
268
261
  end
269
262
  end
270
263
 
271
- def remote_repo_base(platform_tag, nonfinal = false)
272
- package_format = Pkg::Platforms.package_format_for_tag(platform_tag)
273
- case package_format
264
+ def remote_repo_base(platform_tag = nil, nonfinal: false, package_format: nil)
265
+ if platform_tag.nil? && package_format.nil?
266
+ raise "Pkg::Paths.remote_repo_base must have `platform_tag` or `package_format` specified."
267
+ end
268
+
269
+ package_format ||= Pkg::Platforms.package_format_for_tag(platform_tag)
270
+
271
+ repo_base = case package_format
274
272
  when 'rpm'
275
273
  nonfinal ? Pkg::Config.nonfinal_yum_repo_path : Pkg::Config.yum_repo_path
276
274
  when 'deb'
277
275
  nonfinal ? Pkg::Config.nonfinal_apt_repo_path : Pkg::Config.apt_repo_path
276
+ when 'dmg'
277
+ nonfinal ? Pkg::Config.nonfinal_dmg_path : Pkg::Config.dmg_path
278
+ when 'swix'
279
+ nonfinal ? Pkg::Config.nonfinal_swix_path : Pkg::Config.swix_path
280
+ when 'msi'
281
+ nonfinal ? Pkg::Config.nonfinal_msi_path : Pkg::Config.msi_path
278
282
  else
279
283
  raise "Can't determine remote repo base path for package format '#{package_format}'."
280
284
  end
285
+
286
+ # normalize the path for things shipping to the downloads server
287
+ if repo_base.match(/^\/opt\/downloads\/\w+$/)
288
+ repo_base = '/opt/downloads'
289
+ end
290
+ repo_base
281
291
  end
282
292
 
283
293
  # This is where deb packages end up after freight repo updates
@@ -285,7 +295,7 @@ module Pkg::Paths
285
295
  fail "Can't determine path for non-debian platform #{platform_tag}." unless Pkg::Platforms.package_format_for_tag(platform_tag) == 'deb'
286
296
  platform, version, _ = Pkg::Platforms.parse_platform_tag(platform_tag)
287
297
  codename = Pkg::Platforms.codename_for_platform_version(platform, version)
288
- return File.join(remote_repo_base(platform_tag, nonfinal), 'pool', codename, repo_name, project[0], project)
298
+ return File.join(remote_repo_base(platform_tag, nonfinal: nonfinal), 'pool', codename, repo_name, project[0], project)
289
299
  end
290
300
 
291
301
  def release_package_link_path(platform_tag, nonfinal = false)
@@ -293,10 +303,10 @@ module Pkg::Paths
293
303
  package_format = Pkg::Platforms.package_format_for_tag(platform_tag)
294
304
  case package_format
295
305
  when 'rpm'
296
- return File.join(remote_repo_base(platform_tag, nonfinal), "#{repo_name(nonfinal)}-release-#{platform}-#{version}.noarch.rpm")
306
+ return File.join(remote_repo_base(platform_tag, nonfinal: nonfinal), "#{repo_name(nonfinal)}-release-#{platform}-#{version}.noarch.rpm")
297
307
  when 'deb'
298
308
  codename = Pkg::Platforms.codename_for_platform_version(platform, version)
299
- return File.join(remote_repo_base(platform_tag, nonfinal), "#{repo_name(nonfinal)}-release-#{codename}.deb")
309
+ return File.join(remote_repo_base(platform_tag, nonfinal: nonfinal), "#{repo_name(nonfinal)}-release-#{codename}.deb")
300
310
  else
301
311
  warn "No release packages for package format '#{package_format}', skipping . . ."
302
312
  return nil