From 7d455866853e915a1652513f2f14e2fcc67eafd6 Mon Sep 17 00:00:00 2001 From: Philip Harrison Date: Mon, 29 Mar 2021 12:30:06 +0100 Subject: [PATCH] Go mod: Handle multi-line error messages Changes the go mod updater error handling to fall back to matching the whole string if no lines where matched against the regex. Some errors where surfacing with an empty error message as we initially match on the whole string but filter per line. --- .../go_modules/file_updater/go_mod_updater.rb | 24 ++++++++------ .../file_updater/go_mod_updater_spec.rb | 33 +++++++++++++++++++ .../projects/unknown_revision_version/go.mod | 7 ++++ .../projects/unknown_revision_version/main.go | 8 +++++ 4 files changed, 62 insertions(+), 10 deletions(-) create mode 100644 go_modules/spec/fixtures/projects/unknown_revision_version/go.mod create mode 100644 go_modules/spec/fixtures/projects/unknown_revision_version/main.go diff --git a/go_modules/lib/dependabot/go_modules/file_updater/go_mod_updater.rb b/go_modules/lib/dependabot/go_modules/file_updater/go_mod_updater.rb index 5132c4735c5..cef9e481dce 100644 --- a/go_modules/lib/dependabot/go_modules/file_updater/go_mod_updater.rb +++ b/go_modules/lib/dependabot/go_modules/file_updater/go_mod_updater.rb @@ -269,22 +269,20 @@ def substitute_all(substitutions) write_go_mod(body) end - # rubocop:disable Metrics/AbcSize - # rubocop:disable Metrics/PerceivedComplexity def handle_subprocess_error(stderr) stderr = stderr.gsub(Dir.getwd, "") # Package version doesn't match the module major version error_regex = RESOLVABILITY_ERROR_REGEXES.find { |r| stderr =~ r } if error_regex - lines = stderr.lines.drop_while { |l| error_regex !~ l } - raise Dependabot::DependencyFileNotResolvable, lines.join + error_message = filter_error_message(message: stderr, regex: error_regex) + raise Dependabot::DependencyFileNotResolvable, error_message end repo_error_regex = REPO_RESOLVABILITY_ERROR_REGEXES.find { |r| stderr =~ r } if repo_error_regex - lines = stderr.lines.drop_while { |l| repo_error_regex !~ l } - ResolvabilityErrors.handle(lines.join, credentials: credentials) + error_message = filter_error_message(message: stderr, regex: repo_error_regex) + ResolvabilityErrors.handle(error_message, credentials: credentials) end path_regex = MODULE_PATH_MISMATCH_REGEXES.find { |r| stderr =~ r } @@ -296,16 +294,22 @@ def handle_subprocess_error(stderr) out_of_disk_regex = OUT_OF_DISK_REGEXES.find { |r| stderr =~ r } if out_of_disk_regex - lines = stderr.lines.select { |l| out_of_disk_regex =~ l } - raise Dependabot::OutOfDisk.new, lines.join + error_message = filter_error_message(message: stderr, regex: out_of_disk_regex) + raise Dependabot::OutOfDisk.new, error_message end # We don't know what happened so we raise a generic error msg = stderr.lines.last(10).join.strip raise Dependabot::DependabotError, msg end - # rubocop:enable Metrics/PerceivedComplexity - # rubocop:enable Metrics/AbcSize + + def filter_error_message(message:, regex:) + lines = message.lines.select { |l| regex =~ l } + return lines.join if lines.any? + + # In case the regex is multi-line, match the whole string + message.match(regex).to_s + end def go_mod_path return "go.mod" if directory == "/" diff --git a/go_modules/spec/dependabot/go_modules/file_updater/go_mod_updater_spec.rb b/go_modules/spec/dependabot/go_modules/file_updater/go_mod_updater_spec.rb index 306f08c1f75..1491aeb396c 100644 --- a/go_modules/spec/dependabot/go_modules/file_updater/go_mod_updater_spec.rb +++ b/go_modules/spec/dependabot/go_modules/file_updater/go_mod_updater_spec.rb @@ -465,6 +465,39 @@ end end end + + context "for an unknown revision version" do + let(:project_name) { "unknown_revision_version" } + let(:dependency_name) do + "github.com/deislabs/oras" + end + let(:dependency_version) { "v0.10.0" } + let(:dependency_previous_version) { "v0.9.0" } + let(:requirements) do + [{ + file: "go.mod", + requirement: dependency_version, + groups: [], + source: { + type: "default", + source: "github.com/deislabs/oras" + } + }] + end + let(:previous_requirements) { [] } + + it "raises the correct error" do + error_class = Dependabot::DependencyFileNotResolvable + expect { updater.updated_go_sum_content }. + to raise_error(error_class) do |error| + expect(error.message).to include( + "go: github.com/deislabs/oras@v0.10.0 requires\n"\ + " github.com/docker/distribution@v0.0.0-00010101000000-000000000000: "\ + "invalid version: unknown revision" + ) + end + end + end end describe "#updated_go_sum_content" do diff --git a/go_modules/spec/fixtures/projects/unknown_revision_version/go.mod b/go_modules/spec/fixtures/projects/unknown_revision_version/go.mod new file mode 100644 index 00000000000..debfc31f10e --- /dev/null +++ b/go_modules/spec/fixtures/projects/unknown_revision_version/go.mod @@ -0,0 +1,7 @@ +module github.com/dependabot/vgotest + +go 1.16 + +require ( + github.com/deislabs/oras v0.9.0 +) diff --git a/go_modules/spec/fixtures/projects/unknown_revision_version/main.go b/go_modules/spec/fixtures/projects/unknown_revision_version/main.go new file mode 100644 index 00000000000..e6ed617b7cf --- /dev/null +++ b/go_modules/spec/fixtures/projects/unknown_revision_version/main.go @@ -0,0 +1,8 @@ +package main + +import ( + _ "github.com/deislabs/oras" +) + +func main() { +}