overcommit 0.18.0 → 0.19.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b609412f41e430a857ae1b1b9b5a3d31cf97eb9b
4
- data.tar.gz: 1f3ebdf4981de86e51503d69fdc7ed851cb91aca
3
+ metadata.gz: 996dd0cae1610ccd8862512890ce60c917eb9998
4
+ data.tar.gz: 8a7a2dc6f4f36ec0d650fea031bff26a963ef510
5
5
  SHA512:
6
- metadata.gz: 46b3a66583a3522bbec747ba4a0a579839b5fe09ea77ac62b57149b52e7413b05388fbd1db399d953d2503ff590331f6d8bf789191f45983027aea6dd11bcbb2
7
- data.tar.gz: 072a5ce0c265bc2da606332369a5e2ea53e77f4f4aec07b3f94f056fb2e8644358737192ff6c495a4e5fda27fd5fa9b3e5625ad58f916a562056195895e88d26
6
+ metadata.gz: 40272621da3bd248750062ae0cb16a7c8a5e08fd3cdef1d508579ac740a4ec80a69147e121f66316f3e14c3a68297b5e572b8805fac33294e1c568814aaec3c0
7
+ data.tar.gz: 2321fa13f258e8d24952655e06f9a3c450a03365759c94dc4e9b60e0a2c6b087e8b7298c168c81a38a4a6577a8f8a86cd80e2f090d8f16df5d87147d10e91fff
@@ -131,6 +131,12 @@ PreCommit:
131
131
  install_command: 'npm install -g jscs'
132
132
  include: '**/*.js'
133
133
 
134
+ Jsxcs:
135
+ description: 'Analyzing with JSXCS'
136
+ required_executable: 'jsxcs'
137
+ install_command: 'npm install -g jsxcs'
138
+ include: '**/*.jsx'
139
+
134
140
  JsHint:
135
141
  description: 'Analyzing with JSHint'
136
142
  required_executable: 'jshint'
@@ -173,6 +179,17 @@ PreCommit:
173
179
  - 'db/schema.rb'
174
180
  - 'db/structure.sql'
175
181
 
182
+ Reek:
183
+ description: 'Analyzing with Reek'
184
+ required_executable: 'reek'
185
+ install_command: 'gem install reek'
186
+ include:
187
+ - '**/*.gemspec'
188
+ - '**/*.rake'
189
+ - '**/*.rb'
190
+ - '**/Gemfile'
191
+ - '**/Rakefile'
192
+
176
193
  Rubocop:
177
194
  description: 'Analyzing with Rubocop'
178
195
  required_executable: 'rubocop'
@@ -68,7 +68,7 @@ module Overcommit
68
68
  @merge_head = merge_head
69
69
  end
70
70
 
71
- merge_msg_file = File.expand_path('.git/MERGE_MSG', Overcommit::Utils.repo_root)
71
+ merge_msg_file = File.expand_path('MERGE_MSG', Overcommit::Utils.git_dir)
72
72
  @merge_msg = File.open(merge_msg_file).read if File.exist?(merge_msg_file)
73
73
  end
74
74
 
@@ -90,16 +90,16 @@ module Overcommit
90
90
  # of a merge.
91
91
  def restore_merge_state
92
92
  if @merge_head
93
- FileUtils.touch(File.expand_path('.git/MERGE_MODE', Overcommit::Utils.repo_root))
93
+ FileUtils.touch(File.expand_path('MERGE_MODE', Overcommit::Utils.git_dir))
94
94
 
95
- File.open(File.expand_path('.git/MERGE_HEAD', Overcommit::Utils.repo_root), 'w') do |f|
95
+ File.open(File.expand_path('MERGE_HEAD', Overcommit::Utils.git_dir), 'w') do |f|
96
96
  f.write("#{@merge_head}\n")
97
97
  end
98
98
  @merge_head = nil
99
99
  end
100
100
 
101
101
  if @merge_msg
102
- File.open(File.expand_path('.git/MERGE_MSG', Overcommit::Utils.repo_root), 'w') do |f|
102
+ File.open(File.expand_path('MERGE_MSG', Overcommit::Utils.git_dir), 'w') do |f|
103
103
  f.write("#{@merge_msg}\n")
104
104
  end
105
105
  @merge_msg = nil
@@ -110,8 +110,8 @@ module Overcommit
110
110
  # of a cherry-pick.
111
111
  def restore_cherry_pick_state
112
112
  if @cherry_head
113
- File.open(File.expand_path('.git/CHERRY_PICK_HEAD',
114
- Overcommit::Utils.repo_root), 'w') do |f|
113
+ File.open(File.expand_path('CHERRY_PICK_HEAD',
114
+ Overcommit::Utils.git_dir), 'w') do |f|
115
115
  f.write("#{@cherry_head}\n")
116
116
  end
117
117
  @cherry_head = nil
@@ -2,8 +2,8 @@ module Overcommit::Hook::PreCommit
2
2
  # Runs `brakeman` against any modified Ruby/Rails files.
3
3
  class Brakeman < Base
4
4
  def run
5
- result = execute(%W[#{executable} --exit-on-warn --quiet --summary --only-files] +
6
- applicable_files)
5
+ result = execute(%W[#{executable} --exit-on-warn --quiet --summary --only-files] <<
6
+ applicable_files.join(','))
7
7
  return :pass if result.success?
8
8
 
9
9
  [:fail, result.stdout]
@@ -19,7 +19,7 @@ module Overcommit::Hook::PreCommit
19
19
  return :fail,
20
20
  "The following images are optimizable:\n#{optimized_images.join("\n")}" \
21
21
  "\n\nOptimize them by running:\n" \
22
- " image_optim #{optimized_images.join(' ')}"
22
+ " image_optim --no-pngout #{optimized_images.join(' ')}"
23
23
  end
24
24
 
25
25
  :pass
@@ -0,0 +1,28 @@
1
+ module Overcommit::Hook::PreCommit
2
+ # Runs `jsxcs` (JSCS (JavaScript Code Style Checker) wrapper for JSX files)
3
+ # against any modified JavaScript files.
4
+ class Jsxcs < Base
5
+ def run
6
+ result = execute(%W[#{executable} --reporter=inline] + applicable_files)
7
+ return :pass if result.success?
8
+
9
+ if result.status == 1
10
+ return :warn, result.stderr.chomp
11
+ end
12
+
13
+ # Keep lines from the output for files that we actually modified
14
+ error_lines, warning_lines = result.stdout.split("\n").partition do |output_line|
15
+ if match = output_line.match(/^([^:]+):[^\d]+(\d+)/)
16
+ file = match[1]
17
+ line = match[2]
18
+ end
19
+ modified_lines(file).include?(line.to_i)
20
+ end
21
+
22
+ return :fail, error_lines.join("\n") unless error_lines.empty?
23
+
24
+ [:warn, "Modified files have lints (on lines you didn't modify)\n" <<
25
+ warning_lines.join("\n")]
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,29 @@
1
+ module Overcommit::Hook::PreCommit
2
+ # Runs `reek` against any modified Ruby files.
3
+ class Reek < Base
4
+ def run
5
+ result = execute(%W[#{executable} --single-line --no-color] + applicable_files)
6
+ return :pass if result.success?
7
+
8
+ output = cleanup_output(result.stdout + result.stderr)
9
+
10
+ # Keep lines from the output for files that we actually modified
11
+ error_lines, warning_lines = output.partition do |output_line|
12
+ if (match = output_line.match(/^([^:]+):(\d+)/))
13
+ file = match[1]
14
+ line = match[2]
15
+ end
16
+ modified_lines(file).include?(line.to_i)
17
+ end
18
+
19
+ return :fail, error_lines.join("\n") unless error_lines.empty?
20
+
21
+ [:warn, "Modified files have lints (on lines you didn't modify)\n" <<
22
+ warning_lines.join("\n")]
23
+ end
24
+
25
+ def cleanup_output(raw_output)
26
+ raw_output.split("\n").grep(/^(.(?!warning))*$/)
27
+ end
28
+ end
29
+ end
@@ -40,13 +40,20 @@ module Overcommit::HookContext
40
40
 
41
41
  # Restore unstaged changes and reset file modification times so it appears
42
42
  # as if nothing ever changed.
43
+ #
44
+ # We want to restore the modification times for each of the files after
45
+ # every step to ensure as little time as possible has passed while the
46
+ # modification time on the file was newer. This helps us play more nicely
47
+ # with file watchers.
43
48
  def cleanup_environment
44
49
  unless initial_commit? || (@stash_attempted && !@changes_stashed)
45
50
  clear_working_tree # Ensure working tree is clean before restoring it
51
+ restore_modified_times
46
52
  end
47
53
 
48
54
  if @changes_stashed
49
55
  restore_working_tree
56
+ restore_modified_times
50
57
  end
51
58
 
52
59
  Overcommit::GitRepo.restore_merge_state
@@ -124,6 +131,7 @@ module Overcommit::HookContext
124
131
  def restore_modified_times
125
132
  modified_files.each do |file|
126
133
  next if Overcommit::Utils.broken_symlink?(file)
134
+ next unless File.exist?(file)
127
135
  time = @modified_times[file]
128
136
  File.utime(time, time, file)
129
137
  end
@@ -2,7 +2,7 @@ require 'fileutils'
2
2
 
3
3
  module Overcommit
4
4
  # Manages the installation of Overcommit hooks in a git repository.
5
- class Installer
5
+ class Installer # rubocop:disable ClassLength
6
6
  MASTER_HOOK =
7
7
  File.join(OVERCOMMIT_HOME, 'template-dir', 'hooks', 'overcommit-hook')
8
8
 
@@ -60,7 +60,7 @@ module Overcommit
60
60
 
61
61
  def hooks_path
62
62
  absolute_target = File.expand_path(@target)
63
- File.join(absolute_target, '.git', 'hooks')
63
+ File.join(Overcommit::Utils.git_dir(absolute_target), 'hooks')
64
64
  end
65
65
 
66
66
  def master_hook_install_path
@@ -78,7 +78,11 @@ module Overcommit
78
78
  raise Overcommit::Exceptions::InvalidGitRepo, 'is not a directory'
79
79
  end
80
80
 
81
- unless File.directory?(File.join(absolute_target, '.git'))
81
+ git_dir_check = Dir.chdir(absolute_target) do
82
+ Overcommit::Utils.execute(%w[git rev-parse --git-dir])
83
+ end
84
+
85
+ unless git_dir_check.success?
82
86
  raise Overcommit::Exceptions::InvalidGitRepo, 'does not appear to be a git repository'
83
87
  end
84
88
  end
@@ -1,3 +1,4 @@
1
+ require 'pathname'
1
2
  require 'overcommit/subprocess'
2
3
 
3
4
  module Overcommit
@@ -9,11 +10,47 @@ module Overcommit
9
10
  end
10
11
 
11
12
  # Returns an absolute path to the root of the repository.
13
+ #
14
+ # We do this ourselves rather than call `git rev-parse --show-toplevel` to
15
+ # solve an issue where the .git directory might not actually be valid in
16
+ # tests.
17
+ #
18
+ # @return [String]
12
19
  def repo_root
13
20
  @repo_root ||=
14
21
  begin
15
- result = `git rev-parse --show-toplevel`.chomp
16
- result if $?.success?
22
+ git_dir = Pathname.new(File.expand_path('.')).enum_for(:ascend).find do |path|
23
+ File.exist?(File.join(path, '.git'))
24
+ end
25
+
26
+ unless git_dir
27
+ raise Overcommit::Exceptions::InvalidGitRepo, 'no .git directory found'
28
+ end
29
+
30
+ git_dir.to_s
31
+ end
32
+ end
33
+
34
+ # Returns an absolute path to the .git directory for a repo.
35
+ #
36
+ # @param repo_dir [String] root directory of git repo
37
+ # @return [String]
38
+ def git_dir(repo_dir = repo_root)
39
+ @git_dir ||=
40
+ begin
41
+ git_dir = File.expand_path('.git', repo_dir)
42
+
43
+ # .git could also be a file that contains the location of the git directory
44
+ unless File.directory?(git_dir)
45
+ git_dir = File.read(git_dir)[/^gitdir: (.*)$/, 1]
46
+
47
+ # Resolve relative paths
48
+ unless git_dir.start_with?('/')
49
+ git_dir = File.expand_path(git_dir, repo_dir)
50
+ end
51
+ end
52
+
53
+ git_dir
17
54
  end
18
55
  end
19
56
 
@@ -1,4 +1,4 @@
1
1
  # Defines the gem version.
2
2
  module Overcommit
3
- VERSION = '0.18.0'
3
+ VERSION = '0.19.0'
4
4
  end
@@ -6,10 +6,10 @@
6
6
 
7
7
  set -e
8
8
 
9
- trap "rm -f .git/tags.$$" EXIT
10
- err_file=.git/ctags.err
11
- if ctags --tag-relative -Rf.git/tags.$$ --exclude=.git "$@" 2>${err_file}; then
12
- mv .git/tags.$$ .git/tags
9
+ trap "rm -f $GIT_DIR/tags.$$" EXIT
10
+ err_file=$GIT_DIR/ctags.err
11
+ if ctags --tag-relative -Rf$GIT_DIR/tags.$$ --exclude=.git "$@" 2>${err_file}; then
12
+ mv $GIT_DIR/tags.$$ $GIT_DIR/tags
13
13
  [ -e ${err_file} ] && rm -f ${err_file}
14
14
  else
15
15
  # Ignore STDERR unless `ctags` returned a non-zero exit code
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: overcommit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.18.0
4
+ version: 0.19.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Causes Engineering
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-09-21 00:00:00.000000000 Z
12
+ date: 2014-11-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: childprocess
@@ -99,6 +99,7 @@ files:
99
99
  - lib/overcommit/hook/base.rb
100
100
  - lib/overcommit/hook/pre_commit/author_email.rb
101
101
  - lib/overcommit/hook/pre_commit/pry_binding.rb
102
+ - lib/overcommit/hook/pre_commit/jsxcs.rb
102
103
  - lib/overcommit/hook/pre_commit/image_optim.rb
103
104
  - lib/overcommit/hook/pre_commit/css_lint.rb
104
105
  - lib/overcommit/hook/pre_commit/jsx_hint.rb
@@ -120,6 +121,7 @@ files:
120
121
  - lib/overcommit/hook/pre_commit/haml_lint.rb
121
122
  - lib/overcommit/hook/pre_commit/coffee_lint.rb
122
123
  - lib/overcommit/hook/pre_commit/brakeman.rb
124
+ - lib/overcommit/hook/pre_commit/reek.rb
123
125
  - lib/overcommit/hook/pre_commit/jscs.rb
124
126
  - lib/overcommit/hook/pre_commit/scss_lint.rb
125
127
  - lib/overcommit/hook/pre_commit/base.rb