overcommit 0.6.3 → 0.7.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: 7d64fbba103905649d8924761929dd8de6ed8dda
4
- data.tar.gz: 7e60a0e86700b84e2c0e20f31d9725e3d20e17b5
3
+ metadata.gz: 92e61229cb593b12785dc6f250aaf20b59335277
4
+ data.tar.gz: 6109a2ebdd9e9ad8fb6612178dc38c919decc366
5
5
  SHA512:
6
- metadata.gz: 6287bda409ccdcb0b42760bae088929caec13d9a09ab9dd8355374e889cae1fb33ebc2450bc2a725ec8901f2d0df3185ec7f604694ca2631c43449f4ef371d82
7
- data.tar.gz: 4c8de904dcf1b65ef3854e43e8a313baacef309e999d38448f106941284a246fe3cdcc933c7e9e96efe749627771cf9b4b3207a221b413c3006ea78b2ebdef7e
6
+ metadata.gz: 9a30a6cef4ea66c146c536e3868e12e2ce8a80dbc4c10955e3e6f18990dc0f75a21e439032bdcd180086aa6fd47a4a327d9ca36441f654f4e1400777ce333d8c
7
+ data.tar.gz: 1d0a931ee95dac1fa0f7bf35f3e154033d831df840f1ba30772108612bc5aafd52315bded077ec359873cc2d3298f76aca2800fec55ae862b89f45867af15b11
@@ -45,6 +45,10 @@ module Overcommit
45
45
  @options[:action] = :install
46
46
  end
47
47
 
48
+ opts.on('-f', '--force', 'Overwrite any previously installed hooks') do
49
+ @options[:force] = true
50
+ end
51
+
48
52
  opts.on('-t', '--template-dir', 'Print location of template directory') do
49
53
  @options[:action] = :template_dir
50
54
  end
@@ -81,6 +85,9 @@ module Overcommit
81
85
  rescue Overcommit::Exceptions::InvalidGitRepo => error
82
86
  log.warning "Invalid repo #{target}: #{error}"
83
87
  halt 69 # EX_UNAVAILABLE
88
+ rescue Overcommit::Exceptions::PreExistingHooks => error
89
+ log.warning "Unable to install into #{target}: #{error}"
90
+ halt 73 # EX_CANTCREAT
84
91
  end
85
92
  end
86
93
  end
@@ -51,8 +51,8 @@ module Overcommit::Hook
51
51
  Overcommit::Utils.in_path?(cmd)
52
52
  end
53
53
 
54
- def command(cmd)
55
- Overcommit::Utils.command(cmd)
54
+ def execute(cmd)
55
+ Overcommit::Utils.execute(cmd)
56
56
  end
57
57
 
58
58
  # Gets a list of staged files that apply to this hook based on its
@@ -7,7 +7,7 @@ module Overcommit::Hook::CommitMsg
7
7
  # edit the message after a prepare-commit-msg hook was run.
8
8
  class GerritChangeId < Base
9
9
  def run
10
- result = command("#{SCRIPT_LOCATION} #{commit_message_file}")
10
+ result = execute([SCRIPT_LOCATION, commit_message_file])
11
11
  return (result.success? ? :good : :bad), result.stdout
12
12
  end
13
13
 
@@ -15,7 +15,7 @@ module Overcommit::Hook::PostCheckout
15
15
  private
16
16
 
17
17
  def dependencies_changed?
18
- result = command("git diff --exit-code #{new_head} #{previous_head} --name-only")
18
+ result = execute(%w[git diff --exit-code --name-only] + [new_head, previous_head])
19
19
 
20
20
  result.stdout.split("\n").any? do |file|
21
21
  Array(@config['include']).any? { |glob| File.fnmatch(glob, file) }
@@ -23,7 +23,7 @@ module Overcommit::Hook::PostCheckout
23
23
  end
24
24
 
25
25
  def dependencies_satisfied?
26
- command('bundle check').success?
26
+ execute(%w[bundle check]).success?
27
27
  end
28
28
  end
29
29
  end
@@ -2,7 +2,7 @@ module Overcommit::Hook::PreCommit
2
2
  # Checks the format of an author's email address.
3
3
  class AuthorEmail < Base
4
4
  def run
5
- result = command('git config --get user.email')
5
+ result = execute(%w[git config --get user.email])
6
6
  email = result.stdout.chomp
7
7
 
8
8
  unless email =~ /#{@config['pattern']}/
@@ -2,7 +2,7 @@ module Overcommit::Hook::PreCommit
2
2
  # Ensures that a commit author has a name with at least first and last names.
3
3
  class AuthorName < Base
4
4
  def run
5
- result = command('git config --get user.name')
5
+ result = execute(%w[git config --get user.name])
6
6
  name = result.stdout.chomp
7
7
 
8
8
  unless name.split(' ').count >= 2
@@ -8,14 +8,14 @@ module Overcommit::Hook::PreCommit
8
8
  end
9
9
 
10
10
  # Ignore if Gemfile.lock is not tracked by git
11
- return :good if command("git check-ignore #{LOCK_FILE}").success?
11
+ return :good if execute(%w[git check-ignore] + [LOCK_FILE]).success?
12
12
 
13
- result = command('bundle check')
13
+ result = execute(%w[bundle check])
14
14
  unless result.success?
15
15
  return :bad, result.stdout
16
16
  end
17
17
 
18
- result = command("git diff --quiet -- #{LOCK_FILE}")
18
+ result = execute(%w[git diff --quiet --] + [LOCK_FILE])
19
19
  unless result.success?
20
20
  return :bad, "#{LOCK_FILE} is not up-to-date -- run `bundle check`"
21
21
  end
@@ -6,7 +6,7 @@ module Overcommit::Hook::PreCommit
6
6
  return :warn, 'Run `npm install -g coffeelint`'
7
7
  end
8
8
 
9
- result = command("coffeelint --quiet #{applicable_files.join(' ')}")
9
+ result = execute(%w[coffeelint --quiet] + applicable_files)
10
10
  return :good if result.success?
11
11
  return :bad, result.stdout
12
12
  end
@@ -6,9 +6,7 @@ module Overcommit::Hook::PreCommit
6
6
  return :warn, 'csslint not installed -- run `npm install -g csslint`'
7
7
  end
8
8
 
9
- paths = applicable_files.join(' ')
10
-
11
- result = command("csslint --quiet --format=compact #{paths} | grep 'Error - '")
9
+ result = execute(%w[csslint --quiet --format=compact] + applicable_files)
12
10
  output = result.stdout
13
11
  return (output !~ /Error - (?!Unknown @ rule)/ ? :good : :bad), output
14
12
  end
@@ -6,7 +6,7 @@ module Overcommit::Hook::PreCommit
6
6
  return :warn, 'haml-lint not installed -- run `gem install haml-lint`'
7
7
  end
8
8
 
9
- result = command("haml-lint #{applicable_files.join(' ')}")
9
+ result = execute(%w[haml-lint] + applicable_files)
10
10
  return :good if result.success?
11
11
 
12
12
  # Keep lines from the output for files that we actually modified
@@ -2,10 +2,8 @@ module Overcommit::Hook::PreCommit
2
2
  # Checks for hard tabs in files.
3
3
  class HardTabs < Base
4
4
  def run
5
- paths = applicable_files.join(' ')
6
-
7
5
  # Catches hard tabs
8
- result = command("grep -IHn \"\t\" #{paths}")
6
+ result = execute(%w[grep -IHn] + ["\t"] + applicable_files)
9
7
  unless result.stdout.empty?
10
8
  return :bad, "Hard tabs detected:\n#{result.stdout}"
11
9
  end
@@ -6,7 +6,7 @@ module Overcommit::Hook::PreCommit
6
6
  return :warn, 'jshint not installed -- run `npm install -g jshint`'
7
7
  end
8
8
 
9
- result = command("jshint #{applicable_files.join(' ')}")
9
+ result = execute(%w[jshint] + applicable_files)
10
10
  output = result.stdout
11
11
 
12
12
  return (output.empty? ? :good : :bad), output
@@ -7,7 +7,7 @@ module Overcommit::Hook::PreCommit
7
7
  return :warn, 'jscs not installed -- run `npm install -g jscs`'
8
8
  end
9
9
 
10
- result = command("jscs --reporter=inline #{applicable_files.join(' ')}")
10
+ result = execute(%w[jscs --reporter=inline] + applicable_files)
11
11
  return :good if result.success?
12
12
 
13
13
  if /Config.*not found/i =~ result.stderr
@@ -6,7 +6,7 @@ module Overcommit::Hook::PreCommit
6
6
  return :warn, 'flake8 not installed -- run `pip install flake8`'
7
7
  end
8
8
 
9
- result = command("flake8 #{applicable_files.join(' ')}")
9
+ result = execute(%w[flake8] + applicable_files)
10
10
 
11
11
  return (result.success? ? :good : :bad), result.stdout
12
12
  end
@@ -6,11 +6,13 @@ module Overcommit::Hook::PreCommit
6
6
  return :warn, 'Rubocop not installed -- run `gem install rubocop`'
7
7
  end
8
8
 
9
- result = command("rubocop --format=emacs #{applicable_files.join(' ')} 2>&1")
9
+ result = execute(%w[rubocop --format=emacs] + applicable_files)
10
10
  return :good if result.success?
11
11
 
12
+ output = result.stdout + result.stderr
13
+
12
14
  # Keep lines from the output for files that we actually modified
13
- error_lines, warning_lines = result.stdout.split("\n").partition do |output_line|
15
+ error_lines, warning_lines = output.split("\n").partition do |output_line|
14
16
  if match = output_line.match(/^([^:]+):(\d+)/)
15
17
  file = match[1]
16
18
  line = match[2]
@@ -6,7 +6,7 @@ module Overcommit::Hook::PreCommit
6
6
  return :warn, 'scss-lint not installed -- run `gem install scss-lint`'
7
7
  end
8
8
 
9
- result = command("scss-lint #{applicable_files.join(' ')}")
9
+ result = execute(%w[scss-lint] + applicable_files)
10
10
  return :good if result.success?
11
11
 
12
12
  # Keep lines from the output for files that we actually modified
@@ -2,9 +2,7 @@ module Overcommit::Hook::PreCommit
2
2
  # Checks for trailing whitespace in files.
3
3
  class TrailingWhitespace < Base
4
4
  def run
5
- paths = applicable_files.join(' ')
6
-
7
- result = command("grep -IHn \"\\s$\" #{paths}")
5
+ result = execute(%w[grep -IHn \s$] + applicable_files)
8
6
  unless result.stdout.empty?
9
7
  return :bad, "Trailing whitespace detected:\n#{result.stdout}"
10
8
  end
@@ -101,6 +101,10 @@ module Overcommit
101
101
 
102
102
  def overcommit_symlink?(file)
103
103
  File.symlink?(file) && File.readlink(file) == 'overcommit-hook'
104
+ rescue Errno::ENOENT
105
+ # Some Ruby implementations (e.g. JRuby) raise an error when the file
106
+ # doesn't exist. Standardize the behavior to return false.
107
+ false
104
108
  end
105
109
  end
106
110
  end
@@ -0,0 +1,37 @@
1
+ require 'childprocess'
2
+ require 'tempfile'
3
+
4
+ module Overcommit
5
+ # Manages execution of a child process, collecting the exit status and
6
+ # standard out/error output.
7
+ class Subprocess
8
+ # Encapsulates the result of a process.
9
+ Result = Struct.new(:status, :stderr, :stdout) do
10
+ def success?
11
+ status == 0
12
+ end
13
+ end
14
+
15
+ # Spawns a new process using the given array of arguments (the first
16
+ # element is the command).
17
+ def self.spawn(args)
18
+ process = ChildProcess.build(*args)
19
+
20
+ err = ::Tempfile.new('err')
21
+ err.sync = true
22
+ out = ::Tempfile.new('out')
23
+ out.sync = true
24
+
25
+ process.io.stderr = err
26
+ process.io.stdout = out
27
+
28
+ process.start
29
+ process.wait
30
+
31
+ err.rewind
32
+ out.rewind
33
+
34
+ Result.new(process.exit_code, err.read, out.read)
35
+ end
36
+ end
37
+ end
@@ -1,4 +1,4 @@
1
- require 'wopen3'
1
+ require 'overcommit/subprocess'
2
2
 
3
3
  module Overcommit
4
4
  # Utility functions for general use.
@@ -62,9 +62,9 @@ module Overcommit
62
62
  # Overcommit to call other Ruby executables without requiring that they be
63
63
  # specified in Overcommit's Gemfile--a nasty consequence of using
64
64
  # `bundle exec overcommit` while developing locally.
65
- def command(command)
65
+ def execute(args)
66
66
  with_environment 'RUBYOPT' => nil do
67
- Wopen3.system(command)
67
+ Subprocess.spawn(args)
68
68
  end
69
69
  end
70
70
 
@@ -1,4 +1,4 @@
1
1
  # Defines the gem version.
2
2
  module Overcommit
3
- VERSION = '0.6.3'
3
+ VERSION = '0.7.0'
4
4
  end
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.6.3
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Causes Engineering
@@ -9,22 +9,22 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-03-05 00:00:00.000000000 Z
12
+ date: 2014-03-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: wopen3
15
+ name: childprocess
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
18
  - - '>='
19
19
  - !ruby/object:Gem::Version
20
- version: '0'
20
+ version: 0.5.1
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - '>='
26
26
  - !ruby/object:Gem::Version
27
- version: '0'
27
+ version: 0.5.1
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: rspec
30
30
  requirement: !ruby/object:Gem::Requirement
@@ -45,14 +45,14 @@ dependencies:
45
45
  requirements:
46
46
  - - '='
47
47
  - !ruby/object:Gem::Version
48
- version: 0.11.1
48
+ version: 0.12.0
49
49
  type: :development
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - '='
54
54
  - !ruby/object:Gem::Version
55
- version: 0.11.1
55
+ version: 0.12.0
56
56
  description: Utility to install, configure, and extend Git hooks
57
57
  email:
58
58
  - eng@causes.com
@@ -71,6 +71,7 @@ files:
71
71
  - lib/overcommit/constants.rb
72
72
  - lib/overcommit/utils.rb
73
73
  - lib/overcommit/hook_runner.rb
74
+ - lib/overcommit/subprocess.rb
74
75
  - lib/overcommit/hook/commit_msg/trailing_period.rb
75
76
  - lib/overcommit/hook/commit_msg/gerrit_change_id.rb
76
77
  - lib/overcommit/hook/commit_msg/single_line_subject.rb