diffend-monitor 0.2.27

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'byebug' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("byebug", "byebug")
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'htmldiff' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("diff-lcs", "htmldiff")
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'ldiff' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("diff-lcs", "ldiff")
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'rake' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("rake", "rake")
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'rspec' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("rspec-core", "rspec")
@@ -0,0 +1,25 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEODCCAqCgAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMSEwHwYDVQQDDBhtYWNp
3
+ ZWovREM9bWVuc2ZlbGQvREM9cGwwHhcNMjAwODExMDkxNTM3WhcNMjEwODExMDkx
4
+ NTM3WjAjMSEwHwYDVQQDDBhtYWNpZWovREM9bWVuc2ZlbGQvREM9cGwwggGiMA0G
5
+ CSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDCpXsCgmINb6lHBXXBdyrgsBPSxC4/
6
+ 2H+weJ6L9CruTiv2+2/ZkQGtnLcDgrD14rdLIHK7t0o3EKYlDT5GhD/XUVhI15JE
7
+ N7IqnPUgexe1fbZArwQ51afxz2AmPQN2BkB2oeQHXxnSWUGMhvcEZpfbxCCJH26w
8
+ hS0Ccsma8yxA6hSlGVhFVDuCr7c2L1di6cK2CtIDpfDaWqnVNJEwBYHIxrCoWK5g
9
+ sIGekVt/admS9gRhIMaIBg+Mshth5/DEyWO2QjteTodItlxfTctrfmiAl8X8T5JP
10
+ VXeLp5SSOJ5JXE80nShMJp3RFnGw5fqjX/ffjtISYh78/By4xF3a25HdWH9+qO2Z
11
+ tx0wSGc9/4gqNM0APQnjN/4YXrGZ4IeSjtE+OrrX07l0TiyikzSLFOkZCAp8oBJi
12
+ Fhlosz8xQDJf7mhNxOaZziqASzp/hJTU/tuDKl5+ql2icnMv5iV/i6SlmvU29QNg
13
+ LCV71pUv0pWzN+OZbHZKWepGhEQ3cG9MwvkCAwEAAaN3MHUwCQYDVR0TBAIwADAL
14
+ BgNVHQ8EBAMCBLAwHQYDVR0OBBYEFImGed2AXS070ohfRidiCEhXEUN+MB0GA1Ud
15
+ EQQWMBSBEm1hY2llakBtZW5zZmVsZC5wbDAdBgNVHRIEFjAUgRJtYWNpZWpAbWVu
16
+ c2ZlbGQucGwwDQYJKoZIhvcNAQELBQADggGBAKiHpwoENVrMi94V1zD4o8/6G3AU
17
+ gWz4udkPYHTZLUy3dLznc/sNjdkJFWT3E6NKYq7c60EpJ0m0vAEg5+F5pmNOsvD3
18
+ 2pXLj9kisEeYhR516HwXAvtngboUcb75skqvBCU++4Pu7BRAPjO1/ihLSBexbwSS
19
+ fF+J5OWNuyHHCQp+kGPLtXJe2yUYyvSWDj3I2//Vk0VhNOIlaCS1+5/P3ZJThOtm
20
+ zJUBI7h3HgovwRpcnmk2mXTmU4Zx/bCzX8EA6VY0khEvnmiq7S6eBF0H9qH8KyQ6
21
+ EkVLpvmUDFcf/uNaBQdazEMB5jYtwoA8gQlANETNGPi51KlkukhKgaIEDMkBDJOx
22
+ 65N7DzmkcyY0/GwjIVIxmRhcrCt1YeCUElmfFx0iida1/YRm6sB2AXqScc1+ECRi
23
+ 2DND//YJUikn1zwbz1kT70XmHd97B4Eytpln7K+M1u2g1pHVEPW4owD/ammXNpUy
24
+ nt70FcDD4yxJQ+0YNiHd0N8IcVBM1TMIVctMNQ==
25
+ -----END CERTIFICATE-----
@@ -0,0 +1,25 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIERDCCAqygAwIBAgIBATANBgkqhkiG9w0BAQsFADAmMSQwIgYDVQQDDBt0b21l
3
+ ay9EQz1wb2xpc2hnZWVrcy9EQz1jb20wHhcNMjAwNzA3MTY0NjU0WhcNMjEwNzA3
4
+ MTY0NjU0WjAmMSQwIgYDVQQDDBt0b21lay9EQz1wb2xpc2hnZWVrcy9EQz1jb20w
5
+ ggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDPRTvPuofdtL/wFEPOwPUr
6
+ vR0XHzM/ADb2GBuzu6fzgmoxaYXBe8A++0BbgFvK47T04i8bsbXnfkxrkz/nupQ5
7
+ SK2DPgS4HWnADuyBuyBY7LT4O1wwlytdlHtJgQV6NIcbprcOs/ZQKnimZpW9uByu
8
+ FoN3i94pAEQhuzK0S+wWPvSm22+6XGtCuOzyFGdnCJjGUOkCRno5Nx34MWz0NpJ3
9
+ 9Ekkyy8g2cLvBcUdfeSrY7WsJ5cPCNrBs5cMuV426s1dDrhuvsW+sacwwY/4/LBw
10
+ JzEX4/zS+lsVIX+iOoIFGJdeGnpEWqKgWoaskxqseFi661td1n9UaMXxgoaYh/oX
11
+ 3fJOy2jsZFboZ/eJ5rfciXLiCqSERGkEA+QcA2/jC/d77YJ1FfJW9uwJs3kptf4D
12
+ p6h8wuA3T6rN4QrxkGBYzOfUJ2zSQy1cFu0rTZiYdKo9X6BunnxhmUExNng7advu
13
+ qo8IDinyRlqA5+sOLXd4W3AS/RfF2nrayZNa3khTmmUCAwEAAaN9MHswCQYDVR0T
14
+ BAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFHRFOZPwpgOd2m8FIOodOii+OiID
15
+ MCAGA1UdEQQZMBeBFXRvbWVrQHBvbGlzaGdlZWtzLmNvbTAgBgNVHRIEGTAXgRV0
16
+ b21la0Bwb2xpc2hnZWVrcy5jb20wDQYJKoZIhvcNAQELBQADggGBAKWFwYTGZVoy
17
+ Bj3L9lvGOXpz8VWNoptFNHdncpaw1MMhS8UHcPQOUEiExX5ZH7MARy1fBjMXzIh9
18
+ 41ZpCjR+S6uCEpzUcg5Z/kEWa/wOW6tqrX+zfyxFATDI20pYaQWOLepjbDxePFMZ
19
+ GAlIX5UNsze04A+wArXAttZB4oPt6loS1ao0GNdMb+syYMLzZUTW/sY2rm8zP4Mz
20
+ Kt+zjoqMxQ1Jf+EwH+0uq8Tj5BJcmG6mWYM+ljvRbxBwfimoUBUCQe6KIDouF0Og
21
+ uwLMY7X3jSERta4SxyY+iY7qNLsmG370GIGYbHuIiCwubFXt8jiPJZEdPE1xuzVF
22
+ CLsYItzC28UQEWrVe6sJ0Fuqv5VHM6t8jNClkXDwzf95efFlGSCFN4t+/dywVIK8
23
+ 9MmF6uCQa1EjK2p8tYT0MnbHrFkoehxdX4VO9y99GAkhZyJNKPYPtyAUFV27sT2V
24
+ LfCJRk4ifKIN/FUCwDSn8Cz0m6oH265q0p6wdzI6qrWOjP8tGOMBTA==
25
+ -----END CERTIFICATE-----
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'diffend'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'diffend'
9
+ spec.version = Diffend::VERSION
10
+ spec.authors = ['Tomasz Pajor']
11
+ spec.email = ['contact@diffend.io']
12
+
13
+ spec.summary = 'OSS supply chain security and management platform'
14
+ spec.summary = 'OSS supply chain security and management platform.'
15
+ spec.homepage = Diffend::HOMEPAGE
16
+ spec.license = 'Prosperity Public License'
17
+
18
+ if $PROGRAM_NAME.end_with?('gem')
19
+ spec.signing_key = File.expand_path('~/.ssh/gem-private_key.pem')
20
+ end
21
+
22
+ spec.cert_chain = %w[certs/tomaszpajor.pem]
23
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(spec)/}) }
24
+ spec.require_paths = %w[lib]
25
+
26
+ spec.add_development_dependency 'bundler'
27
+ spec.add_development_dependency 'rake'
28
+ end
@@ -0,0 +1,142 @@
1
+ # frozen_string_literal: true
2
+
3
+ %w[
4
+ bundler
5
+ ].each(&method(:require))
6
+
7
+ %w[
8
+ build_bundler_definition
9
+ errors
10
+ config/fetcher
11
+ config/file_finder
12
+ config/validator
13
+ commands
14
+ handle_errors/messages
15
+ handle_errors/build_exception_payload
16
+ handle_errors/display_to_stdout
17
+ handle_errors/report
18
+ request_object
19
+ request
20
+ voting
21
+ track
22
+ ].each { |file| require "diffend/#{file}" }
23
+
24
+ %w[
25
+ versions/local
26
+ versions/remote
27
+ ].each { |file| require "diffend/voting/#{file}" }
28
+
29
+ # Diffend main namespace
30
+ module Diffend
31
+ # Current plugin version
32
+ VERSION = '0.2.27'
33
+ # Diffend homepage
34
+ HOMEPAGE = 'https://diffend.io'
35
+
36
+ class << self
37
+ # Registers the plugin and add before install all hook
38
+ def register
39
+ Bundler::Plugin.add_hook('before-install-all') do |_|
40
+ execute
41
+ end
42
+ end
43
+
44
+ # Execute diffend plugin
45
+ def execute
46
+ return unless enabled?
47
+
48
+ verify_version
49
+
50
+ config = fetch_config
51
+
52
+ Diffend::Voting.call(
53
+ command,
54
+ config,
55
+ Diffend::BuildBundlerDefinition.call(
56
+ command,
57
+ Bundler.default_gemfile,
58
+ Bundler.default_lockfile
59
+ )
60
+ )
61
+ rescue Diffend::Errors::HandledException
62
+ return if ENV['DIFFEND_IGNORE_ERRORS'] == 'true'
63
+
64
+ exit 255
65
+ rescue StandardError => e
66
+ Diffend::HandleErrors::Report.call(
67
+ exception: e,
68
+ config: config,
69
+ message: :unhandled_exception,
70
+ report: true,
71
+ raise_exception: false
72
+ )
73
+
74
+ return if ENV['DIFFEND_IGNORE_ERRORS'] == 'true'
75
+
76
+ exit 255
77
+ end
78
+
79
+ def verify_version
80
+ return if ENV['DIFFEND_DEVELOPMENT'] == 'true'
81
+ return if installed_version == VERSION
82
+
83
+ build_outdated_version_message(installed_version)
84
+ .tap(&Bundler.ui.method(:error))
85
+
86
+ exit 2
87
+ end
88
+
89
+ # @return [String] installed plugin version
90
+ def installed_version
91
+ Bundler::Plugin
92
+ .index
93
+ .plugin_path('diffend')
94
+ .basename
95
+ .to_s
96
+ .split('-')
97
+ .last
98
+ end
99
+
100
+ # Checks if plugin is enabled
101
+ #
102
+ # @return [Boolean] true if enabled, false otherwise
103
+ def enabled?
104
+ Bundler
105
+ .default_gemfile
106
+ .read
107
+ .split("\n")
108
+ .reject(&:empty?)
109
+ .map(&:strip)
110
+ .select { |line| line.start_with?('plugin') }
111
+ .any? { |line| line.include?('diffend') }
112
+ end
113
+
114
+ # @param version [Hash] installed version
115
+ #
116
+ # @return [String]
117
+ def build_outdated_version_message(version)
118
+ <<~MSG
119
+ \nYou are running an outdated version (#{version}) of the plugin, which will lead to issues.
120
+ \nPlease upgrade to the latest one (#{VERSION}) by executing "rm -rf .bundle/plugin".\n
121
+ MSG
122
+ end
123
+
124
+ # Command that was run with bundle
125
+ #
126
+ # @return [String]
127
+ def command
128
+ ARGV.first || Bundler.feature_flag.default_cli_command.to_s
129
+ end
130
+
131
+ # Fetch diffend config file
132
+ #
133
+ # @return [OpenStruct, nil] configuration object
134
+ #
135
+ # @raise [Errors::MissingConfigurationFile] when no config file
136
+ def fetch_config
137
+ Config::Fetcher.call(
138
+ File.expand_path('..', Bundler.bin_path)
139
+ )
140
+ end
141
+ end
142
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Diffend
4
+ # Builds bundler definition used within the plugin
5
+ module BuildBundlerDefinition
6
+ class << self
7
+ # Build clean instance of bundler definition, as we don't want to pollute the main one
8
+ #
9
+ # @param command [String] bundler command that we are executing
10
+ # @param gemfile [String] path to Gemfile
11
+ # @param lockfile [String] path to Gemfile.lock
12
+ #
13
+ # @return [Bundler::Definition]
14
+ def call(command, gemfile, lockfile)
15
+ unlock = command == 'update' ? true : nil
16
+
17
+ Bundler.configure
18
+ Bundler::Fetcher.disable_endpoint = nil
19
+
20
+ Bundler::Definition
21
+ .build(gemfile, lockfile, unlock)
22
+ .tap(&:validate_runtime!)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Diffend
4
+ # Modules grouping supported bundler commands
5
+ module Commands
6
+ # Bundler install command
7
+ INSTALL = 'install'
8
+ # Bundler update command
9
+ UPDATE = 'update'
10
+ # Bundler exec command
11
+ EXEC = 'exec'
12
+ end
13
+ end
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'yaml'
4
+
5
+ module Diffend
6
+ # Module for all the components related to setting up the config
7
+ module Config
8
+ # Class responsible for fetching the config from .diffend.yml
9
+ module Fetcher
10
+ # All the errors for missing keys in the configuration file
11
+ MISSING_KEY_ERRORS = [
12
+ Errors::ProjectIdMissingInConfigurationFile,
13
+ Errors::ShareableIdMissingInConfigurationFile,
14
+ Errors::ShareableKeyMissingInConfigurationFile,
15
+ Errors::BuildPathMissingInConfigurationFile
16
+ ].freeze
17
+
18
+ class << self
19
+ # @param build_path [String] path of the current build
20
+ #
21
+ # @return [OpenStruct] open struct with config details
22
+ #
23
+ # @example
24
+ # details = Fetcher.new.call('./')
25
+ # details.build_path #=> './'
26
+ def call(build_path)
27
+ build(build_path)
28
+ rescue Errors::MissingConfigurationFile
29
+ Bundler.ui.error(build_missing_error_message(build_path))
30
+
31
+ raise Diffend::Errors::HandledException
32
+ rescue Errors::EmptyConfigurationFile
33
+ Bundler.ui.error(build_empty_error_message(build_path))
34
+
35
+ raise Diffend::Errors::HandledException
36
+ rescue Errors::MalformedConfigurationFile
37
+ Bundler.ui.error(build_malformed_error_message(build_path))
38
+
39
+ raise Diffend::Errors::HandledException
40
+ rescue *MISSING_KEY_ERRORS => e
41
+ Bundler.ui.error(build_missing_key_error_message(e))
42
+
43
+ raise Diffend::Errors::HandledException
44
+ end
45
+
46
+ private
47
+
48
+ # @param build_path [String] path of the current build
49
+ #
50
+ # @return [OpenStruct] open struct with config details
51
+ def build(build_path)
52
+ content = ERB.new(
53
+ File.read(
54
+ FileFinder.call(build_path)
55
+ )
56
+ ).result
57
+
58
+ raise Errors::EmptyConfigurationFile if content.empty?
59
+
60
+ OpenStruct.new(parse_file(content).merge(build_path: build_path))
61
+ .tap(&Validator.method(:call))
62
+ end
63
+
64
+ def parse_file(content)
65
+ YAML.safe_load(content)
66
+ rescue Psych::SyntaxError
67
+ raise Errors::MalformedConfigurationFile
68
+ end
69
+
70
+ # @param build_path [String] path of the current build
71
+ #
72
+ # @return [String] missing configuration file message
73
+ def build_missing_error_message(build_path)
74
+ <<~MSG
75
+ \nWe were unable to locate Diffend configuration file.\n
76
+ Please make sure that .diffend.yml is present in #{build_path} folder.\n
77
+ MSG
78
+ end
79
+
80
+ # @return [String] empty configuration file message
81
+ def build_empty_error_message
82
+ <<~MSG
83
+ \nYour Diffend configuration file is empty.\n
84
+ Please re-setup.\n
85
+ MSG
86
+ end
87
+
88
+ # @return [String] malformed configuration file message
89
+ def build_malformed_error_message
90
+ <<~MSG
91
+ \nYour Diffend configuration file is malformed.\n
92
+ Please re-setup.\n
93
+ MSG
94
+ end
95
+
96
+ # @return [String] malformed configuration file message
97
+ def build_missing_key_error_message(exception)
98
+ missing_key = missing_key_from_exception(exception)
99
+
100
+ <<~MSG
101
+ \nYour Diffend configuration file is missing #{missing_key} key.\n
102
+ Please re-setup.\n
103
+ MSG
104
+ end
105
+
106
+ def missing_key_from_exception(exception)
107
+ case exception
108
+ when Errors::ProjectIdMissingInConfigurationFile then 'project_id'
109
+ when Errors::ShareableIdMissingInConfigurationFile then 'shareable_id'
110
+ when Errors::ShareableKeyMissingInConfigurationFile then 'shareable_key'
111
+ when Errors::BuildPathMissingInConfigurationFile then 'build_path'
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end