Skip to content

Commit 89a5b00

Browse files
committed
Rely on global Go environment variables for all commands
This makes it easier to configure things correctly once, since the local variables would otherwise override what is configured via go.env
1 parent 2898822 commit 89a5b00

File tree

13 files changed

+163
-87
lines changed

13 files changed

+163
-87
lines changed

go_modules/lib/dependabot/go_modules/file_parser.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ def set_go_environment_variables
6868
ENV["GOENV"] = go_env_path
6969
end
7070

71+
# Set GOPRIVATE from options if provided and not already set in go.env
72+
goprivate = options.fetch(:goprivate, "*")
73+
ENV["GOPRIVATE"] = goprivate if goprivate && (!go_env || !T.must(go_env).content&.include?("GOPRIVATE"))
74+
7175
# We set the GOPROXY environment variable if there are any
7276
# goproxy_server credentials, from here the Go toolchain will
7377
# use the configured proxy to fetch dependencies.

go_modules/lib/dependabot/go_modules/file_updater.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ class FileUpdater < Dependabot::FileUpdaters::Base
2929
def initialize(dependencies:, dependency_files:, credentials:, repo_contents_path: nil, options: {})
3030
super
3131

32-
@goprivate = T.let(options.fetch(:goprivate, "*"), String)
3332
use_repo_contents_stub if repo_contents_path.nil?
3433
end
3534

@@ -149,7 +148,7 @@ def file_updater
149148
credentials: credentials,
150149
repo_contents_path: repo_contents_path,
151150
directory: T.must(directory),
152-
options: { tidy: tidy?, vendor: vendor?, goprivate: @goprivate }
151+
options: { tidy: tidy?, vendor: vendor? }
153152
),
154153
T.nilable(Dependabot::GoModules::FileUpdater::GoModUpdater)
155154
)

go_modules/lib/dependabot/go_modules/file_updater/go_mod_updater.rb

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@ def initialize(dependencies:, dependency_files:, credentials:, repo_contents_pat
9696
@directory = directory
9797
@tidy = T.let(options.fetch(:tidy, false), T::Boolean)
9898
@vendor = T.let(options.fetch(:vendor, false), T::Boolean)
99-
@goprivate = T.let(options.fetch(:goprivate), T.nilable(String))
10099
end
101100

102101
sig { returns(T.nilable(String)) }
@@ -188,7 +187,7 @@ def run_go_mod_tidy
188187
# continue with an info log here. `go mod tidy` shouldn't block
189188
# updating versions because there are some edge cases where it's OK to fail
190189
# (such as generated files not available yet to us).
191-
_, stderr, status = Open3.capture3(environment, command)
190+
_, stderr, status = Open3.capture3(command)
192191
if status.success?
193192
Dependabot.logger.info "`go mod tidy` succeeded"
194193
else
@@ -201,7 +200,7 @@ def run_go_vendor
201200
return unless vendor?
202201

203202
command = "go mod vendor"
204-
_, stderr, status = Open3.capture3(environment, command)
203+
_, stderr, status = Open3.capture3(command)
205204
handle_subprocess_error(stderr) unless status.success?
206205
end
207206

@@ -225,7 +224,7 @@ def run_go_get(dependencies = [])
225224
end
226225
command = SharedHelpers.escape_command(command)
227226

228-
_, stderr, status = Open3.capture3(environment, command)
227+
_, stderr, status = Open3.capture3(command)
229228
handle_subprocess_error(stderr) unless status.success?
230229
ensure
231230
FileUtils.rm_f(T.must(tmp_go_file))
@@ -234,7 +233,7 @@ def run_go_get(dependencies = [])
234233
sig { returns(T::Hash[String, T.untyped]) }
235234
def parse_manifest
236235
command = "go mod edit -json"
237-
stdout, stderr, status = Open3.capture3(environment, command)
236+
stdout, stderr, status = Open3.capture3(command)
238237
handle_subprocess_error(stderr) unless status.success?
239238

240239
JSON.parse(stdout) || {}
@@ -305,7 +304,7 @@ def handle_subprocess_error(stderr) # rubocop:disable Metrics/AbcSize
305304
end
306305

307306
repo_error_regex = REPO_RESOLVABILITY_ERROR_REGEXES.find { |r| stderr =~ r }
308-
ResolvabilityErrors.handle(stderr, goprivate: @goprivate) if repo_error_regex
307+
ResolvabilityErrors.handle(stderr) if repo_error_regex
309308

310309
path_regex = MODULE_PATH_MISMATCH_REGEXES.find { |r| stderr =~ r }
311310
if path_regex
@@ -366,11 +365,6 @@ def tidy?
366365
def vendor?
367366
!!@vendor
368367
end
369-
370-
sig { returns(T::Hash[String, T.untyped]) }
371-
def environment
372-
{ "GOPRIVATE" => @goprivate }
373-
end
374368
end
375369
end
376370
end
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# typed: strict
2+
# frozen_string_literal: true
3+
4+
require "sorbet-runtime"
5+
6+
module Dependabot
7+
module GoModules
8+
module GoEnvironmentHelpers
9+
extend T::Sig
10+
11+
sig { returns(T::Hash[String, T.untyped]) }
12+
def go_environment
13+
@go_environment ||= T.let(begin
14+
existing_goprivate = `go env GOPRIVATE`.strip
15+
return {} unless existing_goprivate.empty?
16+
17+
{ "GOPRIVATE" => @goprivate }
18+
end, T.nilable(T::Hash[T.untyped, T.untyped]))
19+
end
20+
end
21+
end
22+
end

go_modules/lib/dependabot/go_modules/package/package_details_fetcher.rb

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,13 @@ class PackageDetailsFetcher
4141
params(
4242
dependency: Dependabot::Dependency,
4343
dependency_files: T::Array[Dependabot::DependencyFile],
44-
credentials: T::Array[Dependabot::Credential],
45-
goprivate: String
44+
credentials: T::Array[Dependabot::Credential]
4645
).void
4746
end
48-
def initialize(dependency:, dependency_files:, credentials:, goprivate:)
47+
def initialize(dependency:, dependency_files:, credentials:)
4948
@dependency = dependency
5049
@dependency_files = dependency_files
5150
@credentials = credentials
52-
@goprivate = T.let(goprivate, String)
5351

5452
@source_type = T.let(nil, T.nilable(String))
5553
end
@@ -63,9 +61,6 @@ def initialize(dependency:, dependency_files:, credentials:, goprivate:)
6361
sig { returns(T::Array[T.untyped]) }
6462
attr_reader :credentials
6563

66-
sig { returns(String) }
67-
attr_reader :goprivate
68-
6964
# rubocop:disable Metrics/AbcSize,Metrics/PerceivedComplexity
7065
sig { returns(T::Array[Dependabot::Package::PackageRelease]) }
7166
def fetch_available_versions
@@ -82,12 +77,9 @@ def fetch_available_versions
8277
end
8378

8479
# Turn off the module proxy for private dependencies
85-
env = { "GOPRIVATE" => @goprivate }
86-
8780
versions_json = SharedHelpers.run_shell_command(
8881
"go list -m -versions -json #{dependency.name}",
89-
fingerprint: "go list -m -versions -json <dependency_name>",
90-
env: env
82+
fingerprint: "go list -m -versions -json <dependency_name>"
9183
)
9284
version_strings = JSON.parse(versions_json)["Versions"]
9385

@@ -112,7 +104,7 @@ def fetch_available_versions
112104
retry_count += 1
113105
retry if transitory_failure?(e) && retry_count < 2
114106

115-
ResolvabilityErrors.handle(e.message, goprivate: @goprivate)
107+
ResolvabilityErrors.handle(e.message)
116108
[package_release(version: T.must(dependency.version))]
117109
end
118110
# rubocop:enable Metrics/AbcSize,Metrics/PerceivedComplexity

go_modules/lib/dependabot/go_modules/resolvability_errors.rb

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ module ResolvabilityErrors
1010

1111
GITHUB_REPO_REGEX = %r{github.com/[^:@]*}
1212

13-
sig { params(message: String, goprivate: T.untyped).void }
14-
def self.handle(message, goprivate:)
13+
sig { params(message: String).void }
14+
def self.handle(message)
1515
mod_path = message.scan(GITHUB_REPO_REGEX).last
1616
unless mod_path && message.include?("If this is a private repository")
1717
raise Dependabot::DependencyFileNotResolvable, message
@@ -30,8 +30,7 @@ def self.handle(message, goprivate:)
3030
mod_path
3131
end
3232

33-
env = { "GOPRIVATE" => goprivate }
34-
_, _, status = Open3.capture3(env, SharedHelpers.escape_command("go list -m -versions #{repo_path}"))
33+
_, _, status = Open3.capture3(SharedHelpers.escape_command("go list -m -versions #{repo_path}"))
3534
raise Dependabot::DependencyFileNotResolvable, message if status.success?
3635

3736
raise Dependabot::GitDependenciesNotReachable, [repo_path]

go_modules/lib/dependabot/go_modules/update_checker.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,7 @@ def latest_version_finder
6666
ignored_versions: ignored_versions,
6767
security_advisories: security_advisories,
6868
raise_on_ignored: raise_on_ignored,
69-
cooldown_options: update_cooldown,
70-
goprivate: options.fetch(:goprivate, "*")
69+
cooldown_options: update_cooldown
7170
),
7271
T.nilable(Dependabot::GoModules::UpdateChecker::LatestVersionFinder)
7372
)

go_modules/lib/dependabot/go_modules/update_checker/latest_version_finder.rb

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ class LatestVersionFinder < Dependabot::Package::PackageLatestVersionFinder
4646
credentials: T::Array[Dependabot::Credential],
4747
ignored_versions: T::Array[String],
4848
security_advisories: T::Array[Dependabot::SecurityAdvisory],
49-
goprivate: String,
5049
raise_on_ignored: T::Boolean,
5150
cooldown_options: T.nilable(Dependabot::Package::ReleaseCooldownOptions)
5251
)
@@ -58,7 +57,6 @@ def initialize(
5857
credentials:,
5958
ignored_versions:,
6059
security_advisories:,
61-
goprivate:,
6260
raise_on_ignored: false,
6361
cooldown_options: nil
6462
)
@@ -68,7 +66,6 @@ def initialize(
6866
@ignored_versions = ignored_versions
6967
@security_advisories = security_advisories
7068
@raise_on_ignored = raise_on_ignored
71-
@goprivate = goprivate
7269
@cooldown_options = cooldown_options
7370
super(
7471
dependency: dependency,
@@ -122,9 +119,6 @@ def cooldown_enabled?
122119
sig { returns(T::Array[Dependabot::SecurityAdvisory]) }
123120
attr_reader :security_advisories
124121

125-
sig { returns(String) }
126-
attr_reader :goprivate
127-
128122
sig { returns(T.nilable(Dependabot::Package::ReleaseCooldownOptions)) }
129123
attr_reader :cooldown_options
130124

@@ -133,8 +127,7 @@ def available_versions_details
133127
@available_versions_details ||= T.let(Package::PackageDetailsFetcher.new(
134128
dependency: dependency,
135129
dependency_files: dependency_files,
136-
credentials: credentials,
137-
goprivate: goprivate
130+
credentials: credentials
138131
).fetch_available_versions, T.nilable(T::Array[Dependabot::Package::PackageRelease]))
139132
end
140133

@@ -197,13 +190,10 @@ def lazy_filter_cooldown_versions(releases, check_max: true)
197190
# rubocop:disable Metrics/AbcSize
198191
sig { params(release: Dependabot::Package::PackageRelease).returns(T::Boolean) }
199192
def in_cooldown_period?(release)
200-
env = { "GOPRIVATE" => @goprivate }
201-
202193
begin
203194
release_info = SharedHelpers.run_shell_command(
204195
"go list -m -json #{dependency.name}@#{release.details.[]('version_string')}",
205-
fingerprint: "go list -m -json <dependency_name>",
206-
env: env
196+
fingerprint: "go list -m -json <dependency_name>"
207197
)
208198
rescue Dependabot::SharedHelpers::HelperSubprocessFailed => e
209199
Dependabot.logger.info("Error while fetching release date info: #{e.message}")

go_modules/spec/dependabot/go_modules/file_updater/go_mod_updater_spec.rb

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,22 @@
55
require "dependabot/dependency"
66
require "dependabot/dependency_file"
77
require "dependabot/go_modules/file_updater/go_mod_updater"
8+
require "dependabot/go_modules/file_parser"
89

910
RSpec.describe Dependabot::GoModules::FileUpdater::GoModUpdater do
11+
# Ensure GOPRIVATE is cleaned up after every test
12+
after do
13+
ENV.delete("GOPRIVATE")
14+
end
15+
1016
let(:updater) do
1117
described_class.new(
1218
dependencies: [dependency],
1319
dependency_files: dependency_files,
1420
credentials: credentials,
1521
repo_contents_path: repo_contents_path,
1622
directory: directory,
17-
options: { tidy: tidy, vendor: false, goprivate: goprivate }
23+
options: { tidy: tidy, vendor: false }
1824
)
1925
end
2026

@@ -23,7 +29,6 @@
2329
let(:go_mod_content) { fixture("projects", project_name, "go.mod") }
2430
let(:tidy) { true }
2531
let(:directory) { "/" }
26-
let(:goprivate) { "*" }
2732
let(:dependency_files) { [] }
2833

2934
let(:credentials) { [] }
@@ -121,13 +126,13 @@
121126
end
122127

123128
context "with an unrestricted goprivate" do
124-
let(:goprivate) { "" }
129+
before { ENV["GOPRIVATE"] = "" }
125130

126131
it { is_expected.to include(%(rsc.io/quote v1.5.2\n)) }
127132
end
128133

129134
context "with an org specific goprivate" do
130-
let(:goprivate) { "rsc.io/*" }
135+
before { ENV["GOPRIVATE"] = "rsc.io/*" }
131136

132137
it { is_expected.to include(%(rsc.io/quote v1.5.2\n)) }
133138
end
@@ -409,8 +414,7 @@ module github.com/dependabot/vgotest
409414

410415
before do
411416
allow(Open3).to receive(:capture3).and_call_original
412-
allow(Open3).to receive(:capture3).with(anything,
413-
"go get github.com/spf13/[email protected]").and_return(["", stderr,
417+
allow(Open3).to receive(:capture3).with("go get github.com/spf13/[email protected]").and_return(["", stderr,
414418
exit_status])
415419
end
416420

@@ -571,6 +575,8 @@ module github.com/dependabot/vgotest
571575
end
572576

573577
context "when dealing with a invalid pseudo version" do
578+
before { ENV["GOPRIVATE"] = "github.com/openshift/api" }
579+
574580
let(:project_name) { "invalid_pseudo_version" }
575581
let(:dependency_name) do
576582
"rsc.io/quote"
@@ -664,7 +670,9 @@ module github.com/dependabot/vgotest
664670
end
665671

666672
context "with an unrestricted goprivate" do
667-
let(:goprivate) { "" }
673+
before do
674+
ENV["GOPRIVATE"] = ""
675+
end
668676

669677
it "raises the correct error" do
670678
expect { updater.updated_go_sum_content }
@@ -673,7 +681,9 @@ module github.com/dependabot/vgotest
673681
end
674682

675683
context "with an org specific goprivate" do
676-
let(:goprivate) { "github.com/dependabot-fixtures/*" }
684+
before do
685+
ENV["GOPRIVATE"] = "github.com/dependabot-fixtures/*"
686+
end
677687

678688
it "raises the correct error" do
679689
expect { updater.updated_go_sum_content }

go_modules/spec/dependabot/go_modules/file_updater_spec.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ module declares its path as: go.etcd.io/bbolt
145145
before do
146146
exit_status = double(success?: false)
147147
allow(Open3).to receive(:capture3).and_call_original
148-
allow(Open3).to receive(:capture3).with(anything, "go get").and_return(["", stderr, exit_status])
148+
allow(Open3).to receive(:capture3).with("go get").and_return(["", stderr, exit_status])
149149
end
150150

151151
it "raises a helpful error" do
@@ -229,7 +229,7 @@ module declares its path as: go.etcd.io/bbolt
229229
credentials: anything,
230230
repo_contents_path: anything,
231231
directory: anything,
232-
options: { tidy: false, vendor: false, goprivate: "*" }
232+
options: { tidy: false, vendor: false }
233233
).and_return(double)
234234

235235
updater.updated_dependency_files

0 commit comments

Comments
 (0)