gergich 1.1.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +5 -5
  2. data/{bin → exe}/gergich +0 -0
  3. data/{bin → exe}/master_bouncer +0 -0
  4. data/lib/gergich/capture/androidlint_capture.rb +10 -5
  5. data/lib/gergich/capture/brakeman_capture.rb +3 -2
  6. data/lib/gergich/capture/eslint_capture.rb +2 -1
  7. data/lib/gergich/capture/flake8_capture.rb +1 -1
  8. data/lib/gergich/capture/i18nliner_capture.rb +1 -1
  9. data/lib/gergich/capture/rubocop_capture.rb +38 -3
  10. data/lib/gergich/capture/shellcheck_capture.rb +2 -1
  11. data/lib/gergich/capture/stylelint_capture.rb +2 -5
  12. data/lib/gergich/capture/swiftlint_capture.rb +3 -3
  13. data/lib/gergich/capture/yamllint_capture.rb +31 -0
  14. data/lib/gergich/capture.rb +12 -5
  15. data/lib/gergich/cli/gergich.rb +6 -4
  16. data/lib/gergich/cli/master_bouncer.rb +6 -6
  17. data/lib/gergich/cli.rb +1 -1
  18. data/lib/gergich.rb +27 -28
  19. metadata +65 -41
  20. data/LICENSE +0 -20
  21. data/README.md +0 -178
  22. data/bin/check_coverage +0 -8
  23. data/bin/run_tests.sh +0 -52
  24. data/spec/gergich/capture/androidlint_capture_spec.rb +0 -61
  25. data/spec/gergich/capture/brakeman_capture_spec.rb +0 -91
  26. data/spec/gergich/capture/custom_capture_spec.rb +0 -41
  27. data/spec/gergich/capture/eslint_capture_spec.rb +0 -31
  28. data/spec/gergich/capture/flake8_capture_spec.rb +0 -23
  29. data/spec/gergich/capture/i18nliner_capture_spec.rb +0 -25
  30. data/spec/gergich/capture/rubocop_capture_spec.rb +0 -66
  31. data/spec/gergich/capture/shellcheck_capture_spec.rb +0 -83
  32. data/spec/gergich/capture/stylelint_capture_spec.rb +0 -54
  33. data/spec/gergich/capture/swiftlint_capture_spec.rb +0 -42
  34. data/spec/gergich/capture_spec.rb +0 -75
  35. data/spec/gergich_spec.rb +0 -379
  36. data/spec/spec_helper.rb +0 -92
  37. data/spec/support/capture_shared_examples.rb +0 -19
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: d2ed144a6c64e2faa3cdad9dfdcb75fe535203b5
4
- data.tar.gz: e52ae51766e213f18050a7885b724cd106ae953e
2
+ SHA256:
3
+ metadata.gz: 49e238094aaf4cc412c50cff9e0704824f0460d28a38301a99ece910a9e4e3ca
4
+ data.tar.gz: 8a9d5bdf120832ef21c3a65bfc3e89e70ad0800eb6c76ec61ff32b866ae0a33c
5
5
  SHA512:
6
- metadata.gz: bb201b5e1f6b385bbbdbbda08c9ca4b3c8046e67a1a6bf0aa9d560be6106535a591c4e0ba773858de4f49c928538c646fcb02f69a1923690e7048aabc13749c1
7
- data.tar.gz: 239fa8d431558eb4bc9fa16373ad9aca7235c75c30e7d113f9fd9b8a4a3cf3844525a664006262723fa5af5d01c78941f89fedc9b2a8344ba7d0e29598a0a613
6
+ metadata.gz: 309de3347fb62da85de07807aa6b0f69913f756a69be2b515c928076077053378f5342961311adb17f07c7168413511ee42c95551f7029dfef36a00816fd6576
7
+ data.tar.gz: caae7f11e0f027d6bee1154b355dd04da9b3e149c3328bcf73016343724442e8b22454eaf47c869c392e983e941319bdf4a21e98fbf720a6d540fb9e688fc58b
File without changes
File without changes
@@ -11,7 +11,7 @@ module Gergich
11
11
  }.freeze
12
12
 
13
13
  def run(output)
14
- # rubocop:disable Metrics/LineLength
14
+ # rubocop:disable Layout/LineLength
15
15
  #
16
16
  # Example:
17
17
  # /path/to/some.xml:27: Warning: Consider adding android:drawableStart="@drawable/a_media" to better support right-to-left layouts [RtlHardcoded]
@@ -26,7 +26,7 @@ module Gergich
26
26
  # <plurals name="number">
27
27
  # ^
28
28
  #
29
- # rubocop:enable Metrics/LineLength
29
+ # rubocop:enable Layout/LineLength
30
30
  pattern = /
31
31
  ^([^:\n]+):(\d+)?:?\s(\w+):\s(.*?)\n
32
32
  ([^\n]+\n
@@ -34,9 +34,14 @@ module Gergich
34
34
  /mx
35
35
 
36
36
  output.scan(pattern).map { |file, line, severity, error, context|
37
- context = "\n\n" + context if context
38
- { path: file, message: "[androidlint] #{error}#{context}".strip,
39
- position: (line || 0).to_i, severity: SEVERITY_MAP[severity] }
37
+ context = "\n\n#{context}" if context
38
+ {
39
+ path: file,
40
+ message: "#{error}#{context}".strip,
41
+ position: (line || 0).to_i,
42
+ severity: SEVERITY_MAP[severity],
43
+ source: "androidlint"
44
+ }
40
45
  }.compact
41
46
  end
42
47
  end
@@ -14,7 +14,7 @@ module Gergich
14
14
  def run(output)
15
15
  # See brakeman_example.json for sample output.
16
16
  JSON.parse(output)["warnings"].map { |warning|
17
- message = "[brakeman] #{warning['warning_type']}: #{warning['message']}"
17
+ message = "#{warning['warning_type']}: #{warning['message']}"
18
18
  message += "\n Code: #{warning['code']}" if warning["code"]
19
19
  message += "\n User Input: #{warning['user_input']}" if warning["user_input"]
20
20
  message += "\n See: #{warning['link']}" if warning["link"]
@@ -22,7 +22,8 @@ module Gergich
22
22
  path: warning["file"],
23
23
  position: warning["line"] || 0,
24
24
  message: message,
25
- severity: SEVERITY_MAP[warning["confidence"]]
25
+ severity: SEVERITY_MAP[warning["confidence"]],
26
+ source: "brakeman"
26
27
  }
27
28
  }.compact
28
29
  end
@@ -16,7 +16,8 @@ module Gergich
16
16
  output.scan(pattern).map { |file, errors|
17
17
  errors.scan(error_pattern).map { |line, severity, error|
18
18
  severity = SEVERITY_MAP[severity]
19
- { path: file, message: "[eslint] #{error}", position: line.to_i, severity: severity }
19
+ { path: file, message: error, source: "eslint", position: line.to_i,
20
+ severity: severity }
20
21
  }
21
22
  }.compact.flatten
22
23
  end
@@ -11,7 +11,7 @@ module Gergich
11
11
  /mx
12
12
 
13
13
  output.scan(pattern).map { |file, line, error|
14
- { path: file, message: "[flake8] #{error}",
14
+ { path: file, message: error, source: "flake8",
15
15
  position: line.to_i, severity: "error" }
16
16
  }.compact
17
17
  end
@@ -16,7 +16,7 @@ module Gergich
16
16
  line = Regexp.last_match[1]
17
17
  ""
18
18
  end
19
- { path: file, message: "[i18n] #{error}", position: line.to_i, severity: "error" }
19
+ { path: file, message: error, source: "i18n", position: line.to_i, severity: "error" }
20
20
  }.compact
21
21
  end
22
22
  end
@@ -16,10 +16,29 @@ module Gergich
16
16
  # bin/gergich:47:8: C: Prefer double-quoted strings
17
17
  # if ENV['DEBUG']
18
18
  # ^^^^^^^
19
+ #
20
+ # 1 file inspected, 35 offenses detected, 27 offenses auto-correctable
21
+ #
22
+ # Example:
23
+ # 2 files inspected, 40 offenses detected, 31 offenses auto-correctable
24
+ #
25
+ # Example:
26
+ # 1 file inspected, no offenses detected
27
+
19
28
  first_line_pattern = /^([^:\n]+):(\d+):\d+:\s(\w):\s/
20
29
 
21
30
  parts = output.split(first_line_pattern)
31
+
32
+ unless parts.last.match?(/^\d+ files? inspect/)
33
+ raise "RuboCop failed to run properly:\n\n#{output}"
34
+ end
35
+
36
+ # strip off the summary line from the last error
37
+ parts[-1] = parts[-1].split("\n")[0..-2].join("\n")
38
+
39
+ # strip off the header
22
40
  parts.shift
41
+
23
42
  messages = []
24
43
 
25
44
  until parts.empty?
@@ -30,15 +49,31 @@ module Gergich
30
49
  # if there is code context at the end, separate it and indent it
31
50
  # so that gerrit preserves formatting
32
51
  if /(?<context>[^\n]+\n *\^+\n)/m =~ message
33
- message.sub!(context, "\n" + context.gsub(/^/, " "))
52
+ message.sub!(context, "\n#{context.gsub(/^/, ' ')}")
34
53
  end
54
+ match = message.match(
55
+ %r{
56
+ \A
57
+ (?<corrected>\[Corrected\]\s)?
58
+ (?<correctable>\[Correctable\]\s)?
59
+ (?:(?<cop>[A-Za-z/]+):\s)?
60
+ (?<message>.*)
61
+ \z
62
+ }mx
63
+ )
35
64
 
65
+ # rubocop:disable Style/DoubleNegation
36
66
  messages << {
37
67
  path: file,
38
68
  position: line.to_i,
39
- message: "[rubocop] #{message}",
40
- severity: SEVERITY_MAP[severity]
69
+ message: match[:message],
70
+ rule: match[:cop],
71
+ corrected: !!match[:corrected],
72
+ correctable: !!match[:correctable],
73
+ severity: SEVERITY_MAP[severity],
74
+ source: "rubocop"
41
75
  }
76
+ # rubocop:enable Style/DoubleNegation
42
77
  end
43
78
 
44
79
  messages
@@ -20,7 +20,8 @@ module Gergich
20
20
  path: warning.fetch("file"),
21
21
  position: warning.fetch("line"),
22
22
  message: warning.fetch("message"),
23
- severity: SEVERITY_MAP.fetch(severity)
23
+ severity: SEVERITY_MAP.fetch(severity),
24
+ source: "shellcheck"
24
25
  }
25
26
  end
26
27
  end
@@ -6,7 +6,6 @@ module Gergich
6
6
  # stylelint is a css linter
7
7
  # https://github.com/stylelint/stylelint
8
8
  #
9
- # rubocop:disable Style/AsciiComments
10
9
  # example full output:
11
10
  # app/stylesheets/base/_print.scss
12
11
  # 3:17 ✖ Unexpected invalid hex color "#owiehfi" color-no-invalid-hex
@@ -16,8 +15,6 @@ module Gergich
16
15
  # 2:15 ✖ Unexpected invalid hex color "#2D3B4" color-no-invalid-hex
17
16
  # 30:15 ⚠ Expected "#2d3b4a" to be "#2D3B4A" color-hex-case
18
17
 
19
- MESSAGE_PREFIX = "[stylelint]"
20
-
21
18
  SEVERITY_MAP = {
22
19
  "✖" => "error",
23
20
  "⚠" => "warn",
@@ -31,7 +28,6 @@ module Gergich
31
28
  # example error line:
32
29
  # 1:15 ✖ Unexpected invalid hex color "#2D3B4" color-no-invalid-hex
33
30
  ERROR_PATTERN = /^\s+(\d+):\d+\s+(✖|⚠|ℹ)\s+(.*?)\s\s+[^\n]+\n/.freeze
34
- # rubocop:enable Style/AsciiComments
35
31
 
36
32
  PATTERN = /#{FILE_PATH_PATTERN}((#{ERROR_PATTERN})+)/.freeze
37
33
 
@@ -41,7 +37,8 @@ module Gergich
41
37
  severity = SEVERITY_MAP[severity]
42
38
  {
43
39
  path: file,
44
- message: "#{MESSAGE_PREFIX} #{error}",
40
+ message: error,
41
+ source: "stylelint",
45
42
  position: line.to_i,
46
43
  severity: severity
47
44
  }
@@ -12,19 +12,19 @@ module Gergich
12
12
  }.freeze
13
13
 
14
14
  def run(output)
15
- # rubocop:disable Metrics/LineLength
15
+ # rubocop:disable Layout/LineLength
16
16
  #
17
17
  # Example:
18
18
  # /path/to/My.swift:13:22: warning: Colon Violation: Colons should be next to the identifier when specifying a type. (colon)
19
19
  # /path/to/Fail.swift:80: warning: Line Length Violation: Line should be 100 characters or less: currently 108 characters (line_length)
20
20
  #
21
- # rubocop:enable Metrics/LineLength
21
+ # rubocop:enable Layout/LineLength
22
22
  pattern = /
23
23
  ^([^:\n]+):(\d+)(?::\d+)?:\s(\w+):\s(.*?)\n
24
24
  /mx
25
25
 
26
26
  output.scan(pattern).map { |file, line, severity, error, _context|
27
- { path: file, message: "[swiftlint] #{error}",
27
+ { path: file, message: error, source: "swiftlint",
28
28
  position: line.to_i, severity: SEVERITY_MAP[severity] }
29
29
  }.compact
30
30
  end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gergich
4
+ module Capture
5
+ class YamllintCapture < BaseCapture
6
+ SEVERITY_MAP = { "error" => "error", "warning" => "warn" }.freeze
7
+
8
+ def run(output)
9
+ # e.g. " 9:5 error string value redundantly (quoted-strings)"
10
+ error_pattern = %r{\s\s+(\d+):\d+\s+(\w+)\s+(.*?)\s+\([\w/-]+\)\n}
11
+ pattern = %r{ # Example:
12
+ ^./([^\n]+)\n # ./api/config/lti/development/config.yml
13
+ ((#{error_pattern})+) # 9:5 error string value redundantly (quoted-strings)
14
+ }mx
15
+
16
+ output.scan(pattern).map { |file, errors|
17
+ errors.scan(error_pattern).map { |line, severity, error|
18
+ severity = SEVERITY_MAP[severity]
19
+ {
20
+ path: file,
21
+ message: error,
22
+ source: "yamllint",
23
+ position: line.to_i,
24
+ severity: severity
25
+ }
26
+ }
27
+ }.compact.flatten
28
+ end
29
+ end
30
+ end
31
+ end
@@ -7,6 +7,7 @@ module Gergich
7
7
  module Capture
8
8
  class BaseCapture
9
9
  def self.inherited(subclass)
10
+ super
10
11
  name = normalize_captor_class_name(subclass)
11
12
  Capture.captors[name] = subclass
12
13
  end
@@ -38,8 +39,14 @@ module Gergich
38
39
  comments.each do |comment|
39
40
  next if skip_paths.any? { |path| comment[:path].start_with?(path) }
40
41
 
41
- draft.add_comment comment[:path], comment[:position],
42
- comment[:message], comment[:severity]
42
+ message = +"[#{comment[:source]}] "
43
+ message << "#{comment[:rule]}: " if comment[:rule]
44
+ message << comment[:message]
45
+
46
+ draft.add_comment comment[:path],
47
+ comment[:position],
48
+ message,
49
+ comment[:severity]
43
50
  end
44
51
  end
45
52
 
@@ -47,7 +54,7 @@ module Gergich
47
54
  end
48
55
 
49
56
  def base_path
50
- @base_path ||= File.expand_path(GERGICH_GIT_PATH) + "/"
57
+ @base_path ||= "#{File.expand_path(GERGICH_GIT_PATH)}/"
51
58
  end
52
59
 
53
60
  def relativize(path)
@@ -75,7 +82,7 @@ module Gergich
75
82
  $stdout.puts line unless suppress_output
76
83
  output << line
77
84
  end
78
- output.join("")
85
+ output.join
79
86
  end
80
87
 
81
88
  def load_captor(format)
@@ -109,4 +116,4 @@ module Gergich
109
116
  end
110
117
  end
111
118
 
112
- Dir[File.dirname(__FILE__) + "/capture/*.rb"].sort.each { |file| require file }
119
+ Dir["#{File.dirname(__FILE__)}/capture/*.rb"].sort.each { |file| require file }
@@ -14,10 +14,11 @@ CI_TEST_ARGS = {
14
14
  ],
15
15
  "label" => ["Code-Review", 1],
16
16
  "message" => ["this is a test"],
17
- "capture" => ["rubocop", "echo #{Shellwords.escape(<<~OUTPUT)}"]
17
+ "capture" => ["rubocop", format("echo %<output>s", output: Shellwords.escape(<<~OUTPUT))]
18
18
  bin/gergich:47:8: C: Prefer double-quoted strings
19
19
  if ENV['DEBUG']
20
20
  ^^^^^^^
21
+ 1 file inspected, 35 offenses detected, 27 offenses auto-correctable
21
22
  OUTPUT
22
23
  }.freeze
23
24
 
@@ -40,7 +41,7 @@ def run_ci_test!(all_commands)
40
41
 
41
42
  commands.each do |command, args = []|
42
43
  arglist = args.map { |arg| Shellwords.escape(arg.to_s) }
43
- output = `bin/gergich #{command} #{arglist.join(" ")} 2>&1`
44
+ output = `bundle exec gergich #{command} #{arglist.join(" ")} 2>&1`
44
45
  unless $CHILD_STATUS.success?
45
46
  error "`gergich citest` failed on step `#{command}`:\n\n#{output.gsub(/^/, ' ')}\n"
46
47
  end
@@ -108,8 +109,8 @@ commands["comment"] = {
108
109
  action: ->(comment_data) {
109
110
  comment_data = begin
110
111
  JSON.parse(comment_data)
111
- rescue JSON::ParserError
112
- error("Unable to parse <comment_data> json", "comment")
112
+ rescue JSON::ParserError
113
+ error("Unable to parse <comment_data> json", "comment")
113
114
  end
114
115
  comment_data = [comment_data] unless comment_data.is_a?(Array)
115
116
 
@@ -209,6 +210,7 @@ commands["capture"] = {
209
210
  * i18nliner
210
211
  * flake8
211
212
  * stylelint
213
+ * yamllint
212
214
  * custom:<path>:<class_name> - file path and ruby
213
215
  class_name of a custom formatter.
214
216
 
@@ -15,11 +15,11 @@ ERROR_DISTANCE = ENV.fetch("MASTER_BOUNCER_ERROR_DISTANCE", 100).to_i
15
15
 
16
16
  def potentially_mergeable_changes
17
17
  url = "/changes/?q=status:open+" \
18
- "p:#{PROJECT}+" \
19
- "label:Verified=1+" \
20
- "is:mergeable+" \
21
- "branch:master" \
22
- "&o=CURRENT_REVISION"
18
+ "p:#{PROJECT}+" \
19
+ "label:Verified=1+" \
20
+ "is:mergeable+" \
21
+ "branch:master" \
22
+ "&o=CURRENT_REVISION"
23
23
  changes = Gergich::API.get(url)
24
24
  changes.reject { |c| c["subject"] =~ /\Awip($|\W)/i }
25
25
  end
@@ -62,7 +62,7 @@ def maybe_bounce_commit!(commit)
62
62
  # similarly, over time the same patchset will become more out of date,
63
63
  # so we allow_repost (so to speak) so we can add increasingly negative
64
64
  # reviews
65
- review.publish!(:allow_repost)
65
+ review.publish!(allow_repost: true)
66
66
  end
67
67
 
68
68
  commands = {}
data/lib/gergich/cli.rb CHANGED
@@ -12,7 +12,7 @@ def info(text)
12
12
  end
13
13
 
14
14
  def script_name
15
- $PROGRAM_NAME.sub(%r{.*\/}, "")
15
+ $PROGRAM_NAME.sub(%r{.*/}, "")
16
16
  end
17
17
 
18
18
  def usage(content = nil)
data/lib/gergich.rb CHANGED
@@ -1,10 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "erb"
4
- require "sqlite3"
5
4
  require "json"
6
5
  require "fileutils"
7
- require "httparty"
8
6
  require "base64"
9
7
 
10
8
  GERGICH_REVIEW_LABEL = ENV.fetch("GERGICH_REVIEW_LABEL", "Code-Review")
@@ -53,15 +51,13 @@ module Gergich
53
51
  end
54
52
 
55
53
  def files
56
- @files ||= begin
57
- if Gergich.use_git?
58
- Gergich.git("diff-tree --no-commit-id --name-only -r #{ref}").split
59
- else
60
- raw = API.get("/changes/#{change_id}/revisions/#{revision_id}/patch", raw: true)
61
- Base64.decode64(raw)
62
- .scan(%r{^diff --git a/.*? b/(.*?)$})
63
- .flatten
64
- end
54
+ @files ||= if Gergich.use_git?
55
+ Gergich.git("diff-tree --no-commit-id --name-only -r #{ref}").split
56
+ else
57
+ raw = API.get("/changes/#{change_id}/revisions/#{revision_id}/patch", raw: true)
58
+ Base64.decode64(raw)
59
+ .scan(%r{^diff --git a/.*? b/(.*?)$})
60
+ .flatten
65
61
  end
66
62
  end
67
63
 
@@ -72,7 +68,7 @@ module Gergich
72
68
  def revision_number
73
69
  @revision_number ||= begin
74
70
  patchset_number = ENV["GERRIT_PATCHSET_NUMBER"]
75
- return patchset_number unless patchset_number.nil?
71
+ return patchset_number unless patchset_number.nil? # rubocop:disable Lint/NoReturnInBeginEndBlocks
76
72
 
77
73
  gerrit_info = API.get("/changes/?q=#{change_id}&o=ALL_REVISIONS")[0]
78
74
  raise GergichError, "Gerrit patchset not found" unless gerrit_info
@@ -99,7 +95,7 @@ module Gergich
99
95
  end
100
96
 
101
97
  # Public: publish all draft comments/labels/messages
102
- def publish!(allow_repost = false)
98
+ def publish!(allow_repost: false)
103
99
  # only publish if we have something to say or if our last score was negative
104
100
  return unless anything_to_publish?
105
101
 
@@ -202,13 +198,11 @@ module Gergich
202
198
  # currently, cover message only supports the GERGICH_REVIEW_LABEL.
203
199
  # i.e., even if gergich has "Code-Review: -2"
204
200
  def current_label
205
- @current_label ||= begin
206
- API.get("/changes/#{commit.change_id}/detail")["labels"]
207
- .fetch(GERGICH_REVIEW_LABEL, {})
208
- .fetch("all", [])
209
- .select { |label| label["username"] == GERGICH_USER }
210
- .first
211
- end
201
+ @current_label ||= API.get("/changes/#{commit.change_id}/detail")["labels"]
202
+ .fetch(GERGICH_REVIEW_LABEL, {})
203
+ .fetch("all", [])
204
+ .select { |label| label["username"] == GERGICH_USER }
205
+ .first
212
206
  end
213
207
 
214
208
  def current_label_date
@@ -234,7 +228,7 @@ module Gergich
234
228
  end
235
229
 
236
230
  def current_score
237
- current_label && current_label["value"] || 0
231
+ (current_label && current_label["value"]) || 0
238
232
  end
239
233
 
240
234
  def cover_message
@@ -292,6 +286,8 @@ module Gergich
292
286
  private
293
287
 
294
288
  def perform(method, url, options)
289
+ # delay requiring httparty until here, to make local command line runs as fast as possible
290
+ require "httparty"
295
291
  options = prepare_options(options)
296
292
  ret = HTTParty.send(method, url, options).body
297
293
  return ret if options[:raw]
@@ -314,7 +310,7 @@ module Gergich
314
310
  def base_uri
315
311
  @base_uri ||= \
316
312
  ENV["GERRIT_BASE_URL"] ||
317
- ENV.key?("GERRIT_HOST") && "https://#{ENV['GERRIT_HOST']}" ||
313
+ (ENV.key?("GERRIT_HOST") && "https://#{ENV['GERRIT_HOST']}") ||
318
314
  raise(GergichError, "need to set GERRIT_BASE_URL or GERRIT_HOST")
319
315
  end
320
316
 
@@ -338,7 +334,7 @@ module Gergich
338
334
 
339
335
  def prepare_options(options)
340
336
  options = {
341
- base_uri: base_uri + "/a"
337
+ base_uri: "#{base_uri}/a"
342
338
  }.merge(auth_config).merge(options)
343
339
  if options[:body]
344
340
  options[:headers] ||= {}
@@ -363,11 +359,14 @@ module Gergich
363
359
  end
364
360
 
365
361
  def db_file
366
- @db_file ||= File.expand_path("/tmp/#{GERGICH_USER}-#{commit.revision_id}.sqlite3")
362
+ @db_file ||= File.expand_path(
363
+ "#{ENV.fetch('GERGICH_DB_PATH', '/tmp')}/#{GERGICH_USER}-#{commit.revision_id}.sqlite3"
364
+ )
367
365
  end
368
366
 
369
367
  def db
370
368
  @db ||= begin
369
+ require "sqlite3"
371
370
  db_exists = File.exist?(db_file)
372
371
  db = SQLite3::Database.new(db_file)
373
372
  db.results_as_hash = true
@@ -512,7 +511,7 @@ module Gergich
512
511
 
513
512
  def info
514
513
  @info ||= begin
515
- comments = Hash[inline_comments.map { |file| [file.path, file.to_a] }]
514
+ comments = inline_comments.map { |file| [file.path, file.to_a] }.to_h
516
515
 
517
516
  {
518
517
  comments: comments,
@@ -530,9 +529,9 @@ module Gergich
530
529
 
531
530
  def orphaned_message
532
531
  messages = ["NOTE: I couldn't create inline comments for everything. " \
533
- "Although this isn't technically part of your commit, you " \
534
- "should still check it out (i.e. side effects or auto-" \
535
- "generated from stuff you *did* change):"]
532
+ "Although this isn't technically part of your commit, you " \
533
+ "should still check it out (i.e. side effects or auto-" \
534
+ "generated from stuff you *did* change):"]
536
535
 
537
536
  other_comments.each do |file|
538
537
  file.comments.each do |position, comments|