packaging 0.99.61 → 0.99.66

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.
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