aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorPaul Bonaud <paul.bonaud@fretlink.com>2019-04-13 16:38:04 +0200
committerPaul Bonaud <paul.bonaud@fretlink.com>2019-04-13 16:38:04 +0200
commit9c1df04756bd900c1ab61e98526ad6eaac8a7216 (patch)
treecf4048303525aa090d00d7a4a2977377cb6a99d1
parent83414e23d7f03a7a939655f51b81c0792fff616a (diff)
downloadpronto-hlint-9c1df04756bd900c1ab61e98526ad6eaac8a7216.tar.gz
pronto-hlint-9c1df04756bd900c1ab61e98526ad6eaac8a7216.tar.zst
pronto-hlint-9c1df04756bd900c1ab61e98526ad6eaac8a7216.zip
Welcom pronto-hlint! This is a whole rewrite of pronto-eslint_npm.
Forking the pronto-eslint_npm repository to build a runner for hlint haskell linter.
-rw-r--r--.gitignore4
-rw-r--r--.ruby-version2
-rw-r--r--.travis.yml17
-rw-r--r--LICENSE2
-rw-r--r--README.md43
-rw-r--r--gems.locked71
-rw-r--r--gems.rb (renamed from Gemfile)0
-rw-r--r--lib/pronto/eslint_npm.rb104
-rw-r--r--lib/pronto/eslint_npm/version.rb7
-rw-r--r--lib/pronto/hlint.rb8
-rw-r--r--lib/pronto/hlint/runner.rb120
-rw-r--r--lib/pronto/hlint/version.rb7
-rw-r--r--pronto-hlint.gemspec (renamed from pronto-eslint_npm.gemspec)16
-rw-r--r--spec/fixtures/eslintignore.git/.eslintignore2
-rw-r--r--spec/fixtures/eslintignore.git/.eslintrc7
-rw-r--r--spec/fixtures/eslintignore.git/git/HEAD1
-rw-r--r--spec/fixtures/eslintignore.git/git/config7
-rw-r--r--spec/fixtures/eslintignore.git/git/indexbin353 -> 0 bytes
-rw-r--r--spec/fixtures/eslintignore.git/git/logs/HEAD3
-rw-r--r--spec/fixtures/eslintignore.git/git/logs/refs/heads/eslintignore2
-rw-r--r--spec/fixtures/eslintignore.git/git/logs/refs/heads/master1
-rw-r--r--spec/fixtures/eslintignore.git/git/objects/2d/1b9966feb19d665a9e5bb6a5bde410203a68f7bin73 -> 0 bytes
-rw-r--r--spec/fixtures/eslintignore.git/git/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904bin15 -> 0 bytes
-rw-r--r--spec/fixtures/eslintignore.git/git/objects/5f/fc9b3c7f8e8d8f2e8c91cb69c9698405d1ca53bin185 -> 0 bytes
-rw-r--r--spec/fixtures/eslintignore.git/git/objects/69/7ffd3c693fce9abcb871b9b47e2d116e6241d3bin88 -> 0 bytes
-rw-r--r--spec/fixtures/eslintignore.git/git/objects/d4/3de0396c81608113f99f7afd00f7f363e1cae82
-rw-r--r--spec/fixtures/eslintignore.git/git/objects/d8/5195b5ff74cc05d121b758f00da43018f53b6fbin42 -> 0 bytes
-rw-r--r--spec/fixtures/eslintignore.git/git/objects/ec/7b4537cbd327a580ee44b74ff02fffc74feb46bin63 -> 0 bytes
-rw-r--r--spec/fixtures/eslintignore.git/git/refs/heads/eslintignore1
-rw-r--r--spec/fixtures/eslintignore.git/git/refs/heads/master1
-rw-r--r--spec/fixtures/eslintignore.git/ignored/ignored.js5
-rw-r--r--spec/fixtures/eslintignore.git/ignored/not_ignored.js5
-rw-r--r--spec/fixtures/test.git/.eslintrc7
-rwxr-xr-xspec/fixtures/test.git/custom_eslint.sh1
-rwxr-xr-xspec/fixtures/test.git/custom_hlint.sh3
-rw-r--r--spec/fixtures/test.git/git/COMMIT_EDITMSG1
-rw-r--r--spec/fixtures/test.git/git/HEAD2
-rw-r--r--spec/fixtures/test.git/git/config2
-rw-r--r--spec/fixtures/test.git/git/description1
-rwxr-xr-xspec/fixtures/test.git/git/hooks/applypatch-msg.sample15
-rwxr-xr-xspec/fixtures/test.git/git/hooks/commit-msg.sample24
-rwxr-xr-xspec/fixtures/test.git/git/hooks/fsmonitor-watchman.sample114
-rwxr-xr-xspec/fixtures/test.git/git/hooks/post-update.sample8
-rwxr-xr-xspec/fixtures/test.git/git/hooks/pre-applypatch.sample14
-rwxr-xr-xspec/fixtures/test.git/git/hooks/pre-commit.sample49
-rwxr-xr-xspec/fixtures/test.git/git/hooks/pre-push.sample53
-rwxr-xr-xspec/fixtures/test.git/git/hooks/pre-rebase.sample169
-rwxr-xr-xspec/fixtures/test.git/git/hooks/pre-receive.sample24
-rwxr-xr-xspec/fixtures/test.git/git/hooks/prepare-commit-msg.sample42
-rwxr-xr-xspec/fixtures/test.git/git/hooks/update.sample128
-rw-r--r--spec/fixtures/test.git/git/indexbin209 -> 217 bytes
-rw-r--r--spec/fixtures/test.git/git/info/exclude6
-rw-r--r--spec/fixtures/test.git/git/logs/HEAD17
-rw-r--r--spec/fixtures/test.git/git/logs/refs/heads/curly3
-rw-r--r--spec/fixtures/test.git/git/logs/refs/heads/hlint2
-rw-r--r--spec/fixtures/test.git/git/logs/refs/heads/master4
-rw-r--r--spec/fixtures/test.git/git/objects/01/d6dc2234bda69a289104ffdf9667363a2414bd2
-rw-r--r--spec/fixtures/test.git/git/objects/06/745b4cc11f505bdd1ecc84a744c3802729f92dbin53 -> 0 bytes
-rw-r--r--spec/fixtures/test.git/git/objects/08/cc1f13f1d655a7353040edb359c7f3ab7f8bd4bin0 -> 132 bytes
-rw-r--r--spec/fixtures/test.git/git/objects/22/2c064befc5a4f3192526863ce449c81bb74924bin86 -> 0 bytes
-rw-r--r--spec/fixtures/test.git/git/objects/2d/1b9966feb19d665a9e5bb6a5bde410203a68f7bin73 -> 0 bytes
-rw-r--r--spec/fixtures/test.git/git/objects/37/018e429ad00f0ec961bd218e3dfa6a6e8cc05b1
-rw-r--r--spec/fixtures/test.git/git/objects/3a/6237c5feacca9a37c36bec5110a1eeb9da703bbin212 -> 0 bytes
-rw-r--r--spec/fixtures/test.git/git/objects/3a/efa89bfb08a4697dc441eed97005eb304364d8bin57 -> 0 bytes
-rw-r--r--spec/fixtures/test.git/git/objects/45/2143142df8628483f4a2fd4a4bbff9e89ea7a6bin55 -> 0 bytes
-rw-r--r--spec/fixtures/test.git/git/objects/55/3b8ba14bc0100f71f0bbe45c7ad29a088f7c151
-rw-r--r--spec/fixtures/test.git/git/objects/76/0a0807c483b0f2b949acc9cc2ba8e37d4a7ff8bin53 -> 0 bytes
-rw-r--r--spec/fixtures/test.git/git/objects/77/b5c76d003b18b78c41b86e36884ce49f40c259bin66 -> 0 bytes
-rw-r--r--spec/fixtures/test.git/git/objects/85/e04b1eb1a721d42db51d49e49dfeb8255a5741bin154 -> 0 bytes
-rw-r--r--spec/fixtures/test.git/git/objects/92/35e9c88c2051d6949febe22fc942365a0b2546bin86 -> 0 bytes
-rw-r--r--spec/fixtures/test.git/git/objects/93/1004157205727e6a47586feaed0473c6ddbd66bin154 -> 0 bytes
-rw-r--r--spec/fixtures/test.git/git/objects/9f/c2abdd0895100b5876bc346dad6bbfb39e9324bin53 -> 0 bytes
-rw-r--r--spec/fixtures/test.git/git/objects/c8/0c26814ee76057a8493b791e6e1a623f693e97bin0 -> 58 bytes
-rw-r--r--spec/fixtures/test.git/git/objects/cf/e8bc15022f8b4d3cea89bc20abb13f985feeb0bin60 -> 0 bytes
-rw-r--r--spec/fixtures/test.git/git/objects/d0/80b4f440e8a87be90677df855a139a36bd2dc3bin46 -> 0 bytes
-rw-r--r--spec/fixtures/test.git/git/objects/dd/e5c6b931572a74d0824ad8268e826ba18647b4bin0 -> 146 bytes
-rw-r--r--spec/fixtures/test.git/git/objects/e4/38134aac40ce86789d552f1bdada6582a987f61
-rw-r--r--spec/fixtures/test.git/git/objects/f3/7efccc1cef20309de28bfbdd16d0c4afb9d5503
-rw-r--r--spec/fixtures/test.git/git/objects/f6/e267486c6b9d0f50a690c894df5e981e31c1b0bin0 -> 96 bytes
-rw-r--r--spec/fixtures/test.git/git/objects/f7/eb73cae47464f2d235a1d014c4617ad2aa0cb0bin179 -> 0 bytes
-rw-r--r--spec/fixtures/test.git/git/refs/heads/curly1
-rw-r--r--spec/fixtures/test.git/git/refs/heads/hlint1
-rw-r--r--spec/fixtures/test.git/git/refs/heads/master2
-rw-r--r--spec/fixtures/test.git/hello.js7
-rw-r--r--spec/fixtures/test.git/pronto.hs11
-rw-r--r--spec/fixtures/test.git/world.es65
-rw-r--r--spec/pronto/eslint_spec.rb163
-rw-r--r--spec/pronto/hlint_spec.rb138
-rw-r--r--spec/spec_helper.rb9
89 files changed, 1055 insertions, 417 deletions
diff --git a/.gitignore b/.gitignore
index f783885..743adc5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,4 @@
1pkg/* 1pkg/*
2*.gem 2*.gem
3.bundle 3.bundle
4.DS_Store 4gems.lock
5Gemfile.lock
6.byebug_history
diff --git a/.ruby-version b/.ruby-version
index 6a6a3d8..097a15a 100644
--- a/.ruby-version
+++ b/.ruby-version
@@ -1 +1 @@
2.6.1 2.6.2
diff --git a/.travis.yml b/.travis.yml
index dab13ac..74e9f59 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,13 +1,8 @@
1--- 1---
2sudo: required 2language: nix
3dist: xenial
4language: ruby
5before_install:
6 - gem update --system
7before_script: 3before_script:
8 - npm install -g eslint 4 - nix-env -iA nixpkgs.hlint nixpkgs.ruby_2_6
9rvm: 5 - gem install bundler
10 - 2.3.8 6script:
11 - 2.4.4 7 - bundle install
12 - 2.5.3 8 - bundle exec rake spec
13 - 2.6.1
diff --git a/LICENSE b/LICENSE
index baecb15..91bb5a8 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
1The MIT License 1The MIT License
2 2
3Copyright (c) 2016 Mindaugas MozĊĞras 3Copyright (c) 2019 Fretlink
4 4
5Permission is hereby granted, free of charge, to any person obtaining a copy 5Permission is hereby granted, free of charge, to any person obtaining a copy
6of this software and associated documentation files (the "Software"), to deal 6of this software and associated documentation files (the "Software"), to deal
diff --git a/README.md b/README.md
index 508080b..7cec7d6 100644
--- a/README.md
+++ b/README.md
@@ -1,46 +1,39 @@
1# Pronto runner for ESLint (using eslint from npm) 1# Pronto runner for Hlint
2 2
3[![Code Climate](https://codeclimate.com/github/doits/pronto-eslint_npm.svg)](https://codeclimate.com/github/doits/pronto-eslint_npm) 3[![Build Status](https://travis-ci.org/fretlink/pronto-hlint.svg?branch=master)](https://travis-ci.org/fretlink/pronto-hlint)
4[![Build Status](https://travis-ci.org/doits/pronto-eslint_npm.svg?branch=master)](https://travis-ci.org/doits/pronto-eslint_npm) 4[![Gem Version](https://badge.fury.io/rb/pronto-hlint.svg)](http://badge.fury.io/rb/pronto-hlint)
5[![Gem Version](https://badge.fury.io/rb/pronto-eslint_npm.svg)](http://badge.fury.io/rb/pronto-eslint_npm)
6 5
7Pronto runner for [ESlint](http://eslint.org), pluggable linting utility for JavaScript and JSX. [What is Pronto?](https://github.com/mmozuras/pronto) 6Pronto runner for [Hlint](https://hackage.haskell.org/package/hlint), pluggable linting utility for Haskell. [What is Pronto?](https://github.com/mmozuras/pronto)
8
9Uses official eslint executable installed by `npm` in contrast to [pronto-eslint][pronto-eslint].
10
11[pronto-eslint]: https://github.com/mmozuras/pronto-eslint
12 7
13## Prerequisites 8## Prerequisites
14 9
15You'll need to install [eslint by yourself with npm][eslint-install]. If `eslint` is in your `PATH`, everything will simply work, otherwise you have to provide pronto-eslint-npm your custom executable path (see [below](#configuration-of-eslintnpm)). 10You'll need to install [hlint by yourself with cabal or stack][hlint-install]. If `hlint` is in your `PATH`, everything will simply work, otherwise you have to provide pronto-hlint your custom executable path (see [below](#configuration-of-hlint)).
16
17[eslint-install]: http://eslint.org/docs/user-guide/getting-started
18 11
19## Configuration of ESLint 12[hlint-install]: https://github.com/ndmitchell/hlint#installing-and-running-hlint
20 13
21Configuring ESLint via [.eslintrc and consorts][eslintrc] and excludes via [.eslintignore][eslintignore] will work just fine with pronto-eslint-npm. 14## Configuration of Hlint
22 15
23[eslintrc]: http://eslint.org/docs/user-guide/configuring#configuration-file-formats 16Configuring Hlint via [.hlint.yaml][.hlint.yaml] will work just fine with pronto-hlint.
24 17
25[eslintignore]: http://eslint.org/docs/user-guide/configuring#ignoring-files-and-directories 18[.hlint.yaml]: https://github.com/ndmitchell/hlint#customizing-the-hints
26 19
27## Configuration of ESLintNPM 20## Configuration of Pronto-Hlint
28 21
29pronto-eslint-npm can be configured by placing a `.pronto_eslint_npm.yml` inside the directory where pronto is run. 22pronto-hlint can be configured by placing a `.pronto_hlint.yml` inside the directory where pronto will run.
30 23
31Following options are available: 24Following options are available:
32 25
33| Option | Meaning | Default | 26| Option | Meaning | Default |
34| ----------------- | ---------------------------------------------------------------------------------------- | ----------------------------------- | 27| ----------------- | ---------------------------------------------------------------------------------------- | ----------------------------------- |
35| eslint_executable | ESLint executable to call. | `eslint` (calls `eslint` in `PATH`) | 28| hlint_executable | Hlint executable to call. | `hlint` (calls `hlint` in `PATH`) |
36| files_to_lint | What files to lint. Absolute path of offending file will be matched against this Regexp. | `(\.js|\.es6)$` | 29| files_to_lint | What files to lint. Absolute path of offending file will be matched against this Regexp. | `(\.hs)$` |
37| cmd_line_opts | Command line options to pass to eslint when running | '' | 30| cmd_line_opts | Command line options to pass to hlint when running | `` |
38 31
39Example configuration to call custom eslint executable and only lint files ending with `.my_custom_extension`: 32Example configuration to call custom hlint executable and only lint files ending with `.my_custom_extension`:
40 33
41```yaml 34```yaml
42# .pronto_eslint_npm.yml 35# .pronto_hlint.yml
43eslint_executable: '/my/custom/node/path/.bin/eslint' 36hlint_executable: '/my/custom/path/.bin/hlint'
44files_to_lint: '\.my_custom_extension$' 37files_to_lint: '\.my_custom_extension$'
45cmd_line_opts: '--ext .html,.js,.es6' 38cmd_line_opts: '-j $(nproc) --typecheck'
46``` 39```
diff --git a/gems.locked b/gems.locked
new file mode 100644
index 0000000..9a5d599
--- /dev/null
+++ b/gems.locked
@@ -0,0 +1,71 @@
1PATH
2 remote: .
3 specs:
4 pronto-hlint (0.1.0)
5 pronto (~> 0.10.0)
6
7GEM
8 remote: https://rubygems.org/
9 specs:
10 addressable (2.5.2)
11 public_suffix (>= 2.0.2, < 4.0)
12 byebug (11.0.1)
13 diff-lcs (1.3)
14 faraday (0.15.4)
15 multipart-post (>= 1.2, < 3)
16 gitlab (4.10.0)
17 httparty (~> 0.14, >= 0.14.0)
18 terminal-table (~> 1.5, >= 1.5.1)
19 httparty (0.16.4)
20 mime-types (~> 3.0)
21 multi_xml (>= 0.5.2)
22 mime-types (3.2.2)
23 mime-types-data (~> 3.2015)
24 mime-types-data (3.2019.0331)
25 multi_xml (0.6.0)
26 multipart-post (2.0.0)
27 octokit (4.14.0)
28 sawyer (~> 0.8.0, >= 0.5.3)
29 pronto (0.10.0)
30 gitlab (~> 4.0, >= 4.0.0)
31 httparty (>= 0.13.7)
32 octokit (~> 4.7, >= 4.7.0)
33 rainbow (>= 2.2, < 4.0)
34 rugged (~> 0.24, >= 0.23.0)
35 thor (~> 0.20.0)
36 public_suffix (3.0.3)
37 rainbow (3.0.0)
38 rake (12.3.2)
39 rspec (3.8.0)
40 rspec-core (~> 3.8.0)
41 rspec-expectations (~> 3.8.0)
42 rspec-mocks (~> 3.8.0)
43 rspec-core (3.8.0)
44 rspec-support (~> 3.8.0)
45 rspec-expectations (3.8.2)
46 diff-lcs (>= 1.2.0, < 2.0)
47 rspec-support (~> 3.8.0)
48 rspec-mocks (3.8.0)
49 diff-lcs (>= 1.2.0, < 2.0)
50 rspec-support (~> 3.8.0)
51 rspec-support (3.8.0)
52 rugged (0.28.1)
53 sawyer (0.8.1)
54 addressable (>= 2.3.5, < 2.6)
55 faraday (~> 0.8, < 1.0)
56 terminal-table (1.8.0)
57 unicode-display_width (~> 1.1, >= 1.1.1)
58 thor (0.20.3)
59 unicode-display_width (1.5.0)
60
61PLATFORMS
62 ruby
63
64DEPENDENCIES
65 byebug (>= 9)
66 pronto-hlint!
67 rake (>= 11.0, < 13)
68 rspec (~> 3.4)
69
70BUNDLED WITH
71 2.0.1
diff --git a/Gemfile b/gems.rb
index 7f4f5e9..7f4f5e9 100644
--- a/Gemfile
+++ b/gems.rb
diff --git a/lib/pronto/eslint_npm.rb b/lib/pronto/eslint_npm.rb
deleted file mode 100644
index 6a9c00c..0000000
--- a/lib/pronto/eslint_npm.rb
+++ /dev/null
@@ -1,104 +0,0 @@
1# frozen_string_literal: true
2
3require 'pronto'
4require 'shellwords'
5
6module Pronto
7 class ESLintNpm < Runner
8 CONFIG_FILE = '.pronto_eslint_npm.yml'.freeze
9 CONFIG_KEYS = %w[eslint_executable files_to_lint cmd_line_opts].freeze
10
11 attr_writer :eslint_executable, :cmd_line_opts
12
13 def eslint_executable
14 @eslint_executable || 'eslint'
15 end
16
17 def files_to_lint
18 @files_to_lint || /(\.js|\.es6)$/
19 end
20
21 def cmd_line_opts
22 @cmd_line_opts || ''
23 end
24
25 def files_to_lint=(regexp)
26 @files_to_lint = regexp.is_a?(Regexp) && regexp || Regexp.new(regexp)
27 end
28
29 def config_options
30 @config_options ||=
31 begin
32 config_file = File.join(repo_path, CONFIG_FILE)
33 File.exist?(config_file) && YAML.load_file(config_file) || {}
34 end
35 end
36
37 def read_config
38 config_options.each do |key, val|
39 next unless CONFIG_KEYS.include?(key.to_s)
40 send("#{key}=", val)
41 end
42 end
43
44 def run
45 return [] if !@patches || @patches.count.zero?
46
47 read_config
48
49 @patches
50 .select { |patch| patch.additions > 0 }
51 .select { |patch| js_file?(patch.new_file_full_path) }
52 .map { |patch| inspect(patch) }
53 .flatten.compact
54 end
55
56 private
57
58 def repo_path
59 @repo_path ||= @patches.first.repo.path
60 end
61
62 def inspect(patch)
63 offences = run_eslint(patch)
64 clean_up_eslint_output(offences)
65 .map do |offence|
66 patch
67 .added_lines
68 .select { |line| line.new_lineno == offence['line'] }
69 .map { |line| new_message(offence, line) }
70 end
71 end
72
73 def new_message(offence, line)
74 path = line.patch.delta.new_file[:path]
75 level = :warning
76
77 Message.new(path, line, level, offence['message'], nil, self.class)
78 end
79
80 def js_file?(path)
81 files_to_lint =~ path.to_s
82 end
83
84 def run_eslint(patch)
85 Dir.chdir(repo_path) do
86 JSON.parse `#{eslint_command_line(patch.new_file_full_path.to_s)}`
87 end
88 end
89
90 def eslint_command_line(path)
91 "#{eslint_executable} #{cmd_line_opts} #{Shellwords.escape(path)} -f json"
92 end
93
94 def clean_up_eslint_output(output)
95 # 1. Filter out offences without a warning or error
96 # 2. Get the messages for that file
97 # 3. Ignore errors without a line number for now
98 output
99 .select { |offence| offence['errorCount'] + offence['warningCount'] > 0 }
100 .map { |offence| offence['messages'] }
101 .flatten.select { |offence| offence['line'] }
102 end
103 end
104end
diff --git a/lib/pronto/eslint_npm/version.rb b/lib/pronto/eslint_npm/version.rb
deleted file mode 100644
index e3683f4..0000000
--- a/lib/pronto/eslint_npm/version.rb
+++ /dev/null
@@ -1,7 +0,0 @@
1# frozen_string_literal: true
2
3module Pronto
4 module ESLintNpmVersion
5 VERSION = '0.10.0'.freeze
6 end
7end
diff --git a/lib/pronto/hlint.rb b/lib/pronto/hlint.rb
new file mode 100644
index 0000000..daf1029
--- /dev/null
+++ b/lib/pronto/hlint.rb
@@ -0,0 +1,8 @@
1# frozen_string_literal: true
2
3require 'pronto/hlint/runner'
4
5module Pronto
6 module Hlint
7 end
8end
diff --git a/lib/pronto/hlint/runner.rb b/lib/pronto/hlint/runner.rb
new file mode 100644
index 0000000..e334860
--- /dev/null
+++ b/lib/pronto/hlint/runner.rb
@@ -0,0 +1,120 @@
1# frozen_string_literal: true
2
3require 'pronto'
4require 'shellwords'
5
6module Pronto
7 module Hlint
8 class Runner < Pronto::Runner
9 CONFIG_FILE = '.pronto_hlint.yml'.freeze
10 CONFIG_KEYS = %w[hlint_executable files_to_lint cmd_line_opts].freeze
11
12 attr_writer :hlint_executable, :cmd_line_opts
13
14 def hlint_executable
15 @hlint_executable || 'hlint'
16 end
17
18 def files_to_lint
19 @files_to_lint || /(\.hs)$/
20 end
21
22 def cmd_line_opts
23 @cmd_line_opts || ''
24 end
25
26 def files_to_lint=(regexp)
27 @files_to_lint = regexp.is_a?(Regexp) && regexp || Regexp.new(regexp)
28 end
29
30 def config_options
31 @config_options ||=
32 begin
33 config_file = File.join(repo_path, CONFIG_FILE)
34 File.exist?(config_file) && YAML.load_file(config_file) || {}
35 end
36 end
37
38 def read_config
39 config_options.each do |key, val|
40 next unless CONFIG_KEYS.include?(key.to_s)
41 send("#{key}=", val)
42 end
43 end
44
45 def run
46 return [] if !@patches || @patches.count.zero?
47
48 read_config
49
50 @patches
51 .select { |patch| patch.additions > 0 }
52 .select { |patch| hs_file?(patch.new_file_full_path) }
53 .map { |patch| inspect(patch) }
54 .flatten.compact
55 end
56
57 private
58
59 def repo_path
60 @repo_path ||= @patches.first.repo.path
61 end
62
63 def inspect(patch)
64 offences = run_hlint(patch)
65 offences
66 .map do |offence|
67 patch
68 .added_lines
69 .select { |line| (offence['startLine']..offence['endLine']).include?(line.new_lineno) }
70 .map { |line| new_message(offence, line) }
71 end
72 end
73
74 def new_message(offence, line)
75 path = line.patch.delta.new_file[:path]
76 level = hlint_severity_to_pronto_level(offence['severity']) || :warning
77
78 text = <<~EOF
79 #{offence['severity']} offence detected by Hlint. Hint is: `#{offence['hint']}`.
80
81 Consider changing the code from
82 ```
83 #{offence['from']}
84 ```
85 to
86 ```
87 #{offence['to']}
88 ```
89 EOF
90
91 Message.new(path, line, level, text, nil, self.class)
92 end
93
94 def hlint_severity_to_pronto_level(severity)
95 case severity
96 when "Error"
97 :error
98 when "Warning"
99 :warning
100 when "Suggestion"
101 :info
102 end
103 end
104
105 def hs_file?(path)
106 files_to_lint =~ path.to_s
107 end
108
109 def run_hlint(patch)
110 Dir.chdir(repo_path) do
111 JSON.parse `#{hlint_command_line(patch.new_file_full_path.to_s)}`
112 end
113 end
114
115 def hlint_command_line(path)
116 "#{hlint_executable} #{cmd_line_opts} #{Shellwords.escape(path)} --json"
117 end
118 end
119 end
120end
diff --git a/lib/pronto/hlint/version.rb b/lib/pronto/hlint/version.rb
new file mode 100644
index 0000000..0b9bd5a
--- /dev/null
+++ b/lib/pronto/hlint/version.rb
@@ -0,0 +1,7 @@
1# frozen_string_literal: true
2
3module Pronto
4 module Hlint
5 VERSION = '0.1.0'.freeze
6 end
7end
diff --git a/pronto-eslint_npm.gemspec b/pronto-hlint.gemspec
index 2a70f2f..2d56792 100644
--- a/pronto-eslint_npm.gemspec
+++ b/pronto-hlint.gemspec
@@ -1,17 +1,17 @@
1# frozen_string_literal: true 1# frozen_string_literal: true
2 2
3$LOAD_PATH.push File.expand_path('lib', __dir__) 3$LOAD_PATH.push File.expand_path('lib', __dir__)
4require 'pronto/eslint_npm/version' 4require 'pronto/hlint/version'
5 5
6Gem::Specification.new do |s| 6Gem::Specification.new do |s|
7 s.name = 'pronto-eslint_npm' 7 s.name = 'pronto-hlint'
8 s.version = Pronto::ESLintNpmVersion::VERSION 8 s.version = Pronto::Hlint::VERSION
9 s.platform = Gem::Platform::RUBY 9 s.platform = Gem::Platform::RUBY
10 s.authors = ['Markus Doits', 'Mindaugas MozĊĞras'] 10 s.authors = ['Paul Bonaud']
11 s.email = 'markus.doits@gmail.com' 11 s.email = 'paul.bonaud@fretlink.com'
12 s.homepage = 'https://github.com/doits/pronto-eslint_npm' 12 s.homepage = 'https://github.com/fretlink/pronto-hlint'
13 s.summary = <<-EOF 13 s.summary = <<-EOF
14 Pronto runner for ESLint, pluggable linting utility for JavaScript and JSX 14 Pronto runner for Hlint, pluggable linting utility for Haskell
15 EOF 15 EOF
16 16
17 s.licenses = ['MIT'] 17 s.licenses = ['MIT']
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
20 s.files = `git ls-files -z`.split("\x0").select { |f| f.match(%r{^(lib/|(LICENSE|README.md)$)}) } 20 s.files = `git ls-files -z`.split("\x0").select { |f| f.match(%r{^(lib/|(LICENSE|README.md)$)}) }
21 s.extra_rdoc_files = ['LICENSE', 'README.md'] 21 s.extra_rdoc_files = ['LICENSE', 'README.md']
22 s.require_paths = ['lib'] 22 s.require_paths = ['lib']
23 s.requirements << 'eslint (in PATH)' 23 s.requirements << 'hlint (in PATH)'
24 24
25 s.add_dependency('pronto', '~> 0.10.0') 25 s.add_dependency('pronto', '~> 0.10.0')
26 s.add_development_dependency('byebug', '>= 9') 26 s.add_development_dependency('byebug', '>= 9')
diff --git a/spec/fixtures/eslintignore.git/.eslintignore b/spec/fixtures/eslintignore.git/.eslintignore
deleted file mode 100644
index d85195b..0000000
--- a/spec/fixtures/eslintignore.git/.eslintignore
+++ /dev/null
@@ -1,2 +0,0 @@
1ignored/**/*.js
2!ignored/not_ignored.js
diff --git a/spec/fixtures/eslintignore.git/.eslintrc b/spec/fixtures/eslintignore.git/.eslintrc
deleted file mode 100644
index f94ba96..0000000
--- a/spec/fixtures/eslintignore.git/.eslintrc
+++ /dev/null
@@ -1,7 +0,0 @@
1{
2 "env": {
3 "browser": true,
4 "es6": true
5 },
6 "extends": "eslint:recommended"
7}
diff --git a/spec/fixtures/eslintignore.git/git/HEAD b/spec/fixtures/eslintignore.git/git/HEAD
deleted file mode 100644
index fac958f..0000000
--- a/spec/fixtures/eslintignore.git/git/HEAD
+++ /dev/null
@@ -1 +0,0 @@
1ref: refs/heads/eslintignore
diff --git a/spec/fixtures/eslintignore.git/git/config b/spec/fixtures/eslintignore.git/git/config
deleted file mode 100644
index 6c9406b..0000000
--- a/spec/fixtures/eslintignore.git/git/config
+++ /dev/null
@@ -1,7 +0,0 @@
1[core]
2 repositoryformatversion = 0
3 filemode = true
4 bare = false
5 logallrefupdates = true
6 ignorecase = true
7 precomposeunicode = true
diff --git a/spec/fixtures/eslintignore.git/git/index b/spec/fixtures/eslintignore.git/git/index
deleted file mode 100644
index 8c5575c..0000000
--- a/spec/fixtures/eslintignore.git/git/index
+++ /dev/null
Binary files differ
diff --git a/spec/fixtures/eslintignore.git/git/logs/HEAD b/spec/fixtures/eslintignore.git/git/logs/HEAD
deleted file mode 100644
index 8750baa..0000000
--- a/spec/fixtures/eslintignore.git/git/logs/HEAD
+++ /dev/null
@@ -1,3 +0,0 @@
10000000000000000000000000000000000000000 d43de0396c81608113f99f7afd00f7f363e1cae8 Markus Doits <markus.doits@stellenticket.de> 1469450052 +0200 commit (initial): empty init commit
2d43de0396c81608113f99f7afd00f7f363e1cae8 d43de0396c81608113f99f7afd00f7f363e1cae8 Markus Doits <markus.doits@stellenticket.de> 1469450062 +0200 checkout: moving from master to eslintignore
3d43de0396c81608113f99f7afd00f7f363e1cae8 5ffc9b3c7f8e8d8f2e8c91cb69c9698405d1ca53 Markus Doits <markus.doits@stellenticket.de> 1469450067 +0200 commit: add .eslintignore and files with errors
diff --git a/spec/fixtures/eslintignore.git/git/logs/refs/heads/eslintignore b/spec/fixtures/eslintignore.git/git/logs/refs/heads/eslintignore
deleted file mode 100644
index 3467ecc..0000000
--- a/spec/fixtures/eslintignore.git/git/logs/refs/heads/eslintignore
+++ /dev/null
@@ -1,2 +0,0 @@
10000000000000000000000000000000000000000 d43de0396c81608113f99f7afd00f7f363e1cae8 Markus Doits <markus.doits@stellenticket.de> 1469450062 +0200 branch: Created from HEAD
2d43de0396c81608113f99f7afd00f7f363e1cae8 5ffc9b3c7f8e8d8f2e8c91cb69c9698405d1ca53 Markus Doits <markus.doits@stellenticket.de> 1469450067 +0200 commit: add .eslintignore and files with errors
diff --git a/spec/fixtures/eslintignore.git/git/logs/refs/heads/master b/spec/fixtures/eslintignore.git/git/logs/refs/heads/master
deleted file mode 100644
index 8105749..0000000
--- a/spec/fixtures/eslintignore.git/git/logs/refs/heads/master
+++ /dev/null
@@ -1 +0,0 @@
10000000000000000000000000000000000000000 d43de0396c81608113f99f7afd00f7f363e1cae8 Markus Doits <markus.doits@stellenticket.de> 1469450052 +0200 commit (initial): empty init commit
diff --git a/spec/fixtures/eslintignore.git/git/objects/2d/1b9966feb19d665a9e5bb6a5bde410203a68f7 b/spec/fixtures/eslintignore.git/git/objects/2d/1b9966feb19d665a9e5bb6a5bde410203a68f7
deleted file mode 100644
index f5fbdc5..0000000
--- a/spec/fixtures/eslintignore.git/git/objects/2d/1b9966feb19d665a9e5bb6a5bde410203a68f7
+++ /dev/null
Binary files differ
diff --git a/spec/fixtures/eslintignore.git/git/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 b/spec/fixtures/eslintignore.git/git/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904
deleted file mode 100644
index adf6411..0000000
--- a/spec/fixtures/eslintignore.git/git/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904
+++ /dev/null
Binary files differ
diff --git a/spec/fixtures/eslintignore.git/git/objects/5f/fc9b3c7f8e8d8f2e8c91cb69c9698405d1ca53 b/spec/fixtures/eslintignore.git/git/objects/5f/fc9b3c7f8e8d8f2e8c91cb69c9698405d1ca53
deleted file mode 100644
index 832698f..0000000
--- a/spec/fixtures/eslintignore.git/git/objects/5f/fc9b3c7f8e8d8f2e8c91cb69c9698405d1ca53
+++ /dev/null
Binary files differ
diff --git a/spec/fixtures/eslintignore.git/git/objects/69/7ffd3c693fce9abcb871b9b47e2d116e6241d3 b/spec/fixtures/eslintignore.git/git/objects/69/7ffd3c693fce9abcb871b9b47e2d116e6241d3
deleted file mode 100644
index c23a96f..0000000
--- a/spec/fixtures/eslintignore.git/git/objects/69/7ffd3c693fce9abcb871b9b47e2d116e6241d3
+++ /dev/null
Binary files differ
diff --git a/spec/fixtures/eslintignore.git/git/objects/d4/3de0396c81608113f99f7afd00f7f363e1cae8 b/spec/fixtures/eslintignore.git/git/objects/d4/3de0396c81608113f99f7afd00f7f363e1cae8
deleted file mode 100644
index e3c829c..0000000
--- a/spec/fixtures/eslintignore.git/git/objects/d4/3de0396c81608113f99f7afd00f7f363e1cae8
+++ /dev/null
@@ -1,2 +0,0 @@
1xK
2Â0@]ç³Ê&!n=D>S mZIĤ oŻÖ#¸|›÷xi­µh´iÌ@Ñi““%˘ċèZdCqtÙzíÜ™É#İ°ÉcmpmÚ:ÜÖ"Îu§!éڅç™)ib2_àD֓A4Ž¨UÚëÂ˙zקĵ ,Ÿ•ŸS½…ïEµ \ No newline at end of file
diff --git a/spec/fixtures/eslintignore.git/git/objects/d8/5195b5ff74cc05d121b758f00da43018f53b6f b/spec/fixtures/eslintignore.git/git/objects/d8/5195b5ff74cc05d121b758f00da43018f53b6f
deleted file mode 100644
index ee9657e..0000000
--- a/spec/fixtures/eslintignore.git/git/objects/d8/5195b5ff74cc05d121b758f00da43018f53b6f
+++ /dev/null
Binary files differ
diff --git a/spec/fixtures/eslintignore.git/git/objects/ec/7b4537cbd327a580ee44b74ff02fffc74feb46 b/spec/fixtures/eslintignore.git/git/objects/ec/7b4537cbd327a580ee44b74ff02fffc74feb46
deleted file mode 100644
index 9a642e0..0000000
--- a/spec/fixtures/eslintignore.git/git/objects/ec/7b4537cbd327a580ee44b74ff02fffc74feb46
+++ /dev/null
Binary files differ
diff --git a/spec/fixtures/eslintignore.git/git/refs/heads/eslintignore b/spec/fixtures/eslintignore.git/git/refs/heads/eslintignore
deleted file mode 100644
index d02562a..0000000
--- a/spec/fixtures/eslintignore.git/git/refs/heads/eslintignore
+++ /dev/null
@@ -1 +0,0 @@
15ffc9b3c7f8e8d8f2e8c91cb69c9698405d1ca53
diff --git a/spec/fixtures/eslintignore.git/git/refs/heads/master b/spec/fixtures/eslintignore.git/git/refs/heads/master
deleted file mode 100644
index 5dcf161..0000000
--- a/spec/fixtures/eslintignore.git/git/refs/heads/master
+++ /dev/null
@@ -1 +0,0 @@
1d43de0396c81608113f99f7afd00f7f363e1cae8
diff --git a/spec/fixtures/eslintignore.git/ignored/ignored.js b/spec/fixtures/eslintignore.git/ignored/ignored.js
deleted file mode 100644
index 2d1b996..0000000
--- a/spec/fixtures/eslintignore.git/ignored/ignored.js
+++ /dev/null
@@ -1,5 +0,0 @@
1function HelloWorld(name)
2{
3 if (foo) foo++;
4 alert(name);
5}
diff --git a/spec/fixtures/eslintignore.git/ignored/not_ignored.js b/spec/fixtures/eslintignore.git/ignored/not_ignored.js
deleted file mode 100644
index 2d1b996..0000000
--- a/spec/fixtures/eslintignore.git/ignored/not_ignored.js
+++ /dev/null
@@ -1,5 +0,0 @@
1function HelloWorld(name)
2{
3 if (foo) foo++;
4 alert(name);
5}
diff --git a/spec/fixtures/test.git/.eslintrc b/spec/fixtures/test.git/.eslintrc
deleted file mode 100644
index f94ba96..0000000
--- a/spec/fixtures/test.git/.eslintrc
+++ /dev/null
@@ -1,7 +0,0 @@
1{
2 "env": {
3 "browser": true,
4 "es6": true
5 },
6 "extends": "eslint:recommended"
7}
diff --git a/spec/fixtures/test.git/custom_eslint.sh b/spec/fixtures/test.git/custom_eslint.sh
deleted file mode 100755
index 54fafdc..0000000
--- a/spec/fixtures/test.git/custom_eslint.sh
+++ /dev/null
@@ -1 +0,0 @@
1printf 'custom eslint called'
diff --git a/spec/fixtures/test.git/custom_hlint.sh b/spec/fixtures/test.git/custom_hlint.sh
new file mode 100755
index 0000000..c80c268
--- /dev/null
+++ b/spec/fixtures/test.git/custom_hlint.sh
@@ -0,0 +1,3 @@
1#!/usr/bin/env bash
2
3echo "hlint called!"
diff --git a/spec/fixtures/test.git/git/COMMIT_EDITMSG b/spec/fixtures/test.git/git/COMMIT_EDITMSG
new file mode 100644
index 0000000..d788b46
--- /dev/null
+++ b/spec/fixtures/test.git/git/COMMIT_EDITMSG
@@ -0,0 +1 @@
Add hs files with hlint errors
diff --git a/spec/fixtures/test.git/git/HEAD b/spec/fixtures/test.git/git/HEAD
index c15524d..feb5fdb 100644
--- a/spec/fixtures/test.git/git/HEAD
+++ b/spec/fixtures/test.git/git/HEAD
@@ -1 +1 @@
ref: refs/heads/curly ref: refs/heads/hlint
diff --git a/spec/fixtures/test.git/git/config b/spec/fixtures/test.git/git/config
index 6c9406b..515f483 100644
--- a/spec/fixtures/test.git/git/config
+++ b/spec/fixtures/test.git/git/config
@@ -3,5 +3,3 @@
3 filemode = true 3 filemode = true
4 bare = false 4 bare = false
5 logallrefupdates = true 5 logallrefupdates = true
6 ignorecase = true
7 precomposeunicode = true
diff --git a/spec/fixtures/test.git/git/description b/spec/fixtures/test.git/git/description
new file mode 100644
index 0000000..498b267
--- /dev/null
+++ b/spec/fixtures/test.git/git/description
@@ -0,0 +1 @@
Unnamed repository; edit this file 'description' to name the repository.
diff --git a/spec/fixtures/test.git/git/hooks/applypatch-msg.sample b/spec/fixtures/test.git/git/hooks/applypatch-msg.sample
new file mode 100755
index 0000000..a5d7b84
--- /dev/null
+++ b/spec/fixtures/test.git/git/hooks/applypatch-msg.sample
@@ -0,0 +1,15 @@
1#!/bin/sh
2#
3# An example hook script to check the commit log message taken by
4# applypatch from an e-mail message.
5#
6# The hook should exit with non-zero status after issuing an
7# appropriate message if it wants to stop the commit. The hook is
8# allowed to edit the commit message file.
9#
10# To enable this hook, rename this file to "applypatch-msg".
11
12. git-sh-setup
13commitmsg="$(git rev-parse --git-path hooks/commit-msg)"
14test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"}
15:
diff --git a/spec/fixtures/test.git/git/hooks/commit-msg.sample b/spec/fixtures/test.git/git/hooks/commit-msg.sample
new file mode 100755
index 0000000..b58d118
--- /dev/null
+++ b/spec/fixtures/test.git/git/hooks/commit-msg.sample
@@ -0,0 +1,24 @@
1#!/bin/sh
2#
3# An example hook script to check the commit log message.
4# Called by "git commit" with one argument, the name of the file
5# that has the commit message. The hook should exit with non-zero
6# status after issuing an appropriate message if it wants to stop the
7# commit. The hook is allowed to edit the commit message file.
8#
9# To enable this hook, rename this file to "commit-msg".
10
11# Uncomment the below to add a Signed-off-by line to the message.
12# Doing this in a hook is a bad idea in general, but the prepare-commit-msg
13# hook is more suited to it.
14#
15# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
16# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
17
18# This example catches duplicate Signed-off-by lines.
19
20test "" = "$(grep '^Signed-off-by: ' "$1" |
21 sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || {
22 echo >&2 Duplicate Signed-off-by lines.
23 exit 1
24}
diff --git a/spec/fixtures/test.git/git/hooks/fsmonitor-watchman.sample b/spec/fixtures/test.git/git/hooks/fsmonitor-watchman.sample
new file mode 100755
index 0000000..e673bb3
--- /dev/null
+++ b/spec/fixtures/test.git/git/hooks/fsmonitor-watchman.sample
@@ -0,0 +1,114 @@
1#!/usr/bin/perl
2
3use strict;
4use warnings;
5use IPC::Open2;
6
7# An example hook script to integrate Watchman
8# (https://facebook.github.io/watchman/) with git to speed up detecting
9# new and modified files.
10#
11# The hook is passed a version (currently 1) and a time in nanoseconds
12# formatted as a string and outputs to stdout all files that have been
13# modified since the given time. Paths must be relative to the root of
14# the working tree and separated by a single NUL.
15#
16# To enable this hook, rename this file to "query-watchman" and set
17# 'git config core.fsmonitor .git/hooks/query-watchman'
18#
19my ($version, $time) = @ARGV;
20
21# Check the hook interface version
22
23if ($version == 1) {
24 # convert nanoseconds to seconds
25 $time = int $time / 1000000000;
26} else {
27 die "Unsupported query-fsmonitor hook version '$version'.\n" .
28 "Falling back to scanning...\n";
29}
30
31my $git_work_tree;
32if ($^O =~ 'msys' || $^O =~ 'cygwin') {
33 $git_work_tree = Win32::GetCwd();
34 $git_work_tree =~ tr/\\/\//;
35} else {
36 require Cwd;
37 $git_work_tree = Cwd::cwd();
38}
39
40my $retry = 1;
41
42launch_watchman();
43
44sub launch_watchman {
45
46 my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty')
47 or die "open2() failed: $!\n" .
48 "Falling back to scanning...\n";
49
50 # In the query expression below we're asking for names of files that
51 # changed since $time but were not transient (ie created after
52 # $time but no longer exist).
53 #
54 # To accomplish this, we're using the "since" generator to use the
55 # recency index to select candidate nodes and "fields" to limit the
56 # output to file names only. Then we're using the "expression" term to
57 # further constrain the results.
58 #
59 # The category of transient files that we want to ignore will have a
60 # creation clock (cclock) newer than $time_t value and will also not
61 # currently exist.
62
63 my $query = <<" END";
64 ["query", "$git_work_tree", {
65 "since": $time,
66 "fields": ["name"],
67 "expression": ["not", ["allof", ["since", $time, "cclock"], ["not", "exists"]]]
68 }]
69 END
70
71 print CHLD_IN $query;
72 close CHLD_IN;
73 my $response = do {local $/; <CHLD_OUT>};
74
75 die "Watchman: command returned no output.\n" .
76 "Falling back to scanning...\n" if $response eq "";
77 die "Watchman: command returned invalid output: $response\n" .
78 "Falling back to scanning...\n" unless $response =~ /^\{/;
79
80 my $json_pkg;
81 eval {
82 require JSON::XS;
83 $json_pkg = "JSON::XS";
84 1;
85 } or do {
86 require JSON::PP;
87 $json_pkg = "JSON::PP";
88 };
89
90 my $o = $json_pkg->new->utf8->decode($response);
91
92 if ($retry > 0 and $o->{error} and $o->{error} =~ m/unable to resolve root .* directory (.*) is not watched/) {
93 print STDERR "Adding '$git_work_tree' to watchman's watch list.\n";
94 $retry--;
95 qx/watchman watch "$git_work_tree"/;
96 die "Failed to make watchman watch '$git_work_tree'.\n" .
97 "Falling back to scanning...\n" if $? != 0;
98
99 # Watchman will always return all files on the first query so
100 # return the fast "everything is dirty" flag to git and do the
101 # Watchman query just to get it over with now so we won't pay
102 # the cost in git to look up each individual file.
103 print "/\0";
104 eval { launch_watchman() };
105 exit 0;
106 }
107
108 die "Watchman: $o->{error}.\n" .
109 "Falling back to scanning...\n" if $o->{error};
110
111 binmode STDOUT, ":utf8";
112 local $, = "\0";
113 print @{$o->{files}};
114}
diff --git a/spec/fixtures/test.git/git/hooks/post-update.sample b/spec/fixtures/test.git/git/hooks/post-update.sample
new file mode 100755
index 0000000..ec17ec1
--- /dev/null
+++ b/spec/fixtures/test.git/git/hooks/post-update.sample
@@ -0,0 +1,8 @@
1#!/bin/sh
2#
3# An example hook script to prepare a packed repository for use over
4# dumb transports.
5#
6# To enable this hook, rename this file to "post-update".
7
8exec git update-server-info
diff --git a/spec/fixtures/test.git/git/hooks/pre-applypatch.sample b/spec/fixtures/test.git/git/hooks/pre-applypatch.sample
new file mode 100755
index 0000000..4142082
--- /dev/null
+++ b/spec/fixtures/test.git/git/hooks/pre-applypatch.sample
@@ -0,0 +1,14 @@
1#!/bin/sh
2#
3# An example hook script to verify what is about to be committed
4# by applypatch from an e-mail message.
5#
6# The hook should exit with non-zero status after issuing an
7# appropriate message if it wants to stop the commit.
8#
9# To enable this hook, rename this file to "pre-applypatch".
10
11. git-sh-setup
12precommit="$(git rev-parse --git-path hooks/pre-commit)"
13test -x "$precommit" && exec "$precommit" ${1+"$@"}
14:
diff --git a/spec/fixtures/test.git/git/hooks/pre-commit.sample b/spec/fixtures/test.git/git/hooks/pre-commit.sample
new file mode 100755
index 0000000..6a75641
--- /dev/null
+++ b/spec/fixtures/test.git/git/hooks/pre-commit.sample
@@ -0,0 +1,49 @@
1#!/bin/sh
2#
3# An example hook script to verify what is about to be committed.
4# Called by "git commit" with no arguments. The hook should
5# exit with non-zero status after issuing an appropriate message if
6# it wants to stop the commit.
7#
8# To enable this hook, rename this file to "pre-commit".
9
10if git rev-parse --verify HEAD >/dev/null 2>&1
11then
12 against=HEAD
13else
14 # Initial commit: diff against an empty tree object
15 against=$(git hash-object -t tree /dev/null)
16fi
17
18# If you want to allow non-ASCII filenames set this variable to true.
19allownonascii=$(git config --bool hooks.allownonascii)
20
21# Redirect output to stderr.
22exec 1>&2
23
24# Cross platform projects tend to avoid non-ASCII filenames; prevent
25# them from being added to the repository. We exploit the fact that the
26# printable range starts at the space character and ends with tilde.
27if [ "$allownonascii" != "true" ] &&
28 # Note that the use of brackets around a tr range is ok here, (it's
29 # even required, for portability to Solaris 10's /usr/bin/tr), since
30 # the square bracket bytes happen to fall in the designated range.
31 test $(git diff --cached --name-only --diff-filter=A -z $against |
32 LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
33then
34 cat <<\EOF
35Error: Attempt to add a non-ASCII file name.
36
37This can cause problems if you want to work with people on other platforms.
38
39To be portable it is advisable to rename the file.
40
41If you know what you are doing you can disable this check using:
42
43 git config hooks.allownonascii true
44EOF
45 exit 1
46fi
47
48# If there are whitespace errors, print the offending file names and fail.
49exec git diff-index --check --cached $against --
diff --git a/spec/fixtures/test.git/git/hooks/pre-push.sample b/spec/fixtures/test.git/git/hooks/pre-push.sample
new file mode 100755
index 0000000..6187dbf
--- /dev/null
+++ b/spec/fixtures/test.git/git/hooks/pre-push.sample
@@ -0,0 +1,53 @@
1#!/bin/sh
2
3# An example hook script to verify what is about to be pushed. Called by "git
4# push" after it has checked the remote status, but before anything has been
5# pushed. If this script exits with a non-zero status nothing will be pushed.
6#
7# This hook is called with the following parameters:
8#
9# $1 -- Name of the remote to which the push is being done
10# $2 -- URL to which the push is being done
11#
12# If pushing without using a named remote those arguments will be equal.
13#
14# Information about the commits which are being pushed is supplied as lines to
15# the standard input in the form:
16#
17# <local ref> <local sha1> <remote ref> <remote sha1>
18#
19# This sample shows how to prevent push of commits where the log message starts
20# with "WIP" (work in progress).
21
22remote="$1"
23url="$2"
24
25z40=0000000000000000000000000000000000000000
26
27while read local_ref local_sha remote_ref remote_sha
28do
29 if [ "$local_sha" = $z40 ]
30 then
31 # Handle delete
32 :
33 else
34 if [ "$remote_sha" = $z40 ]
35 then
36 # New branch, examine all commits
37 range="$local_sha"
38 else
39 # Update to existing branch, examine new commits
40 range="$remote_sha..$local_sha"
41 fi
42
43 # Check for WIP commit
44 commit=`git rev-list -n 1 --grep '^WIP' "$range"`
45 if [ -n "$commit" ]
46 then
47 echo >&2 "Found WIP commit in $local_ref, not pushing"
48 exit 1
49 fi
50 fi
51done
52
53exit 0
diff --git a/spec/fixtures/test.git/git/hooks/pre-rebase.sample b/spec/fixtures/test.git/git/hooks/pre-rebase.sample
new file mode 100755
index 0000000..6cbef5c
--- /dev/null
+++ b/spec/fixtures/test.git/git/hooks/pre-rebase.sample
@@ -0,0 +1,169 @@
1#!/bin/sh
2#
3# Copyright (c) 2006, 2008 Junio C Hamano
4#
5# The "pre-rebase" hook is run just before "git rebase" starts doing
6# its job, and can prevent the command from running by exiting with
7# non-zero status.
8#
9# The hook is called with the following parameters:
10#
11# $1 -- the upstream the series was forked from.
12# $2 -- the branch being rebased (or empty when rebasing the current branch).
13#
14# This sample shows how to prevent topic branches that are already
15# merged to 'next' branch from getting rebased, because allowing it
16# would result in rebasing already published history.
17
18publish=next
19basebranch="$1"
20if test "$#" = 2
21then
22 topic="refs/heads/$2"
23else
24 topic=`git symbolic-ref HEAD` ||
25 exit 0 ;# we do not interrupt rebasing detached HEAD
26fi
27
28case "$topic" in
29refs/heads/??/*)
30 ;;
31*)
32 exit 0 ;# we do not interrupt others.
33 ;;
34esac
35
36# Now we are dealing with a topic branch being rebased
37# on top of master. Is it OK to rebase it?
38
39# Does the topic really exist?
40git show-ref -q "$topic" || {
41 echo >&2 "No such branch $topic"
42 exit 1
43}
44
45# Is topic fully merged to master?
46not_in_master=`git rev-list --pretty=oneline ^master "$topic"`
47if test -z "$not_in_master"
48then
49 echo >&2 "$topic is fully merged to master; better remove it."
50 exit 1 ;# we could allow it, but there is no point.
51fi
52
53# Is topic ever merged to next? If so you should not be rebasing it.
54only_next_1=`git rev-list ^master "^$topic" ${publish} | sort`
55only_next_2=`git rev-list ^master ${publish} | sort`
56if test "$only_next_1" = "$only_next_2"
57then
58 not_in_topic=`git rev-list "^$topic" master`
59 if test -z "$not_in_topic"
60 then
61 echo >&2 "$topic is already up to date with master"
62 exit 1 ;# we could allow it, but there is no point.
63 else
64 exit 0
65 fi
66else
67 not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"`
68 /usr/bin/perl -e '
69 my $topic = $ARGV[0];
70 my $msg = "* $topic has commits already merged to public branch:\n";
71 my (%not_in_next) = map {
72 /^([0-9a-f]+) /;
73 ($1 => 1);
74 } split(/\n/, $ARGV[1]);
75 for my $elem (map {
76 /^([0-9a-f]+) (.*)$/;
77 [$1 => $2];
78 } split(/\n/, $ARGV[2])) {
79 if (!exists $not_in_next{$elem->[0]}) {
80 if ($msg) {
81 print STDERR $msg;
82 undef $msg;
83 }
84 print STDERR " $elem->[1]\n";
85 }
86 }
87 ' "$topic" "$not_in_next" "$not_in_master"
88 exit 1
89fi
90
91<<\DOC_END
92
93This sample hook safeguards topic branches that have been
94published from being rewound.
95
96The workflow assumed here is:
97
98 * Once a topic branch forks from "master", "master" is never
99 merged into it again (either directly or indirectly).
100
101 * Once a topic branch is fully cooked and merged into "master",
102 it is deleted. If you need to build on top of it to correct
103 earlier mistakes, a new topic branch is created by forking at
104 the tip of the "master". This is not strictly necessary, but
105 it makes it easier to keep your history simple.
106
107 * Whenever you need to test or publish your changes to topic
108 branches, merge them into "next" branch.
109
110The script, being an example, hardcodes the publish branch name
111to be "next", but it is trivial to make it configurable via
112$GIT_DIR/config mechanism.
113
114With this workflow, you would want to know:
115
116(1) ... if a topic branch has ever been merged to "next". Young
117 topic branches can have stupid mistakes you would rather
118 clean up before publishing, and things that have not been
119 merged into other branches can be easily rebased without
120 affecting other people. But once it is published, you would
121 not want to rewind it.
122
123(2) ... if a topic branch has been fully merged to "master".
124 Then you can delete it. More importantly, you should not
125 build on top of it -- other people may already want to
126 change things related to the topic as patches against your
127 "master", so if you need further changes, it is better to
128 fork the topic (perhaps with the same name) afresh from the
129 tip of "master".
130
131Let's look at this example:
132
133 o---o---o---o---o---o---o---o---o---o "next"
134 / / / /
135 / a---a---b A / /
136 / / / /
137 / / c---c---c---c B /
138 / / / \ /
139 / / / b---b C \ /
140 / / / / \ /
141 ---o---o---o---o---o---o---o---o---o---o---o "master"
142
143
144A, B and C are topic branches.
145
146 * A has one fix since it was merged up to "next".
147
148 * B has finished. It has been fully merged up to "master" and "next",
149 and is ready to be deleted.
150
151 * C has not merged to "next" at all.
152
153We would want to allow C to be rebased, refuse A, and encourage
154B to be deleted.
155
156To compute (1):
157
158 git rev-list ^master ^topic next
159 git rev-list ^master next
160
161 if these match, topic has not merged in next at all.
162
163To compute (2):
164
165 git rev-list master..topic
166
167 if this is empty, it is fully merged to "master".
168
169DOC_END
diff --git a/spec/fixtures/test.git/git/hooks/pre-receive.sample b/spec/fixtures/test.git/git/hooks/pre-receive.sample
new file mode 100755
index 0000000..a1fd29e
--- /dev/null
+++ b/spec/fixtures/test.git/git/hooks/pre-receive.sample
@@ -0,0 +1,24 @@
1#!/bin/sh
2#
3# An example hook script to make use of push options.
4# The example simply echoes all push options that start with 'echoback='
5# and rejects all pushes when the "reject" push option is used.
6#
7# To enable this hook, rename this file to "pre-receive".
8
9if test -n "$GIT_PUSH_OPTION_COUNT"
10then
11 i=0
12 while test "$i" -lt "$GIT_PUSH_OPTION_COUNT"
13 do
14 eval "value=\$GIT_PUSH_OPTION_$i"
15 case "$value" in
16 echoback=*)
17 echo "echo from the pre-receive-hook: ${value#*=}" >&2
18 ;;
19 reject)
20 exit 1
21 esac
22 i=$((i + 1))
23 done
24fi
diff --git a/spec/fixtures/test.git/git/hooks/prepare-commit-msg.sample b/spec/fixtures/test.git/git/hooks/prepare-commit-msg.sample
new file mode 100755
index 0000000..10fa14c
--- /dev/null
+++ b/spec/fixtures/test.git/git/hooks/prepare-commit-msg.sample
@@ -0,0 +1,42 @@
1#!/bin/sh
2#
3# An example hook script to prepare the commit log message.
4# Called by "git commit" with the name of the file that has the
5# commit message, followed by the description of the commit
6# message's source. The hook's purpose is to edit the commit
7# message file. If the hook fails with a non-zero status,
8# the commit is aborted.
9#
10# To enable this hook, rename this file to "prepare-commit-msg".
11
12# This hook includes three examples. The first one removes the
13# "# Please enter the commit message..." help message.
14#
15# The second includes the output of "git diff --name-status -r"
16# into the message, just before the "git status" output. It is
17# commented because it doesn't cope with --amend or with squashed
18# commits.
19#
20# The third example adds a Signed-off-by line to the message, that can
21# still be edited. This is rarely a good idea.
22
23COMMIT_MSG_FILE=$1
24COMMIT_SOURCE=$2
25SHA1=$3
26
27/usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE"
28
29# case "$COMMIT_SOURCE,$SHA1" in
30# ,|template,)
31# /usr/bin/perl -i.bak -pe '
32# print "\n" . `git diff --cached --name-status -r`
33# if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;;
34# *) ;;
35# esac
36
37# SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
38# git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE"
39# if test -z "$COMMIT_SOURCE"
40# then
41# /usr/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE"
42# fi
diff --git a/spec/fixtures/test.git/git/hooks/update.sample b/spec/fixtures/test.git/git/hooks/update.sample
new file mode 100755
index 0000000..80ba941
--- /dev/null
+++ b/spec/fixtures/test.git/git/hooks/update.sample
@@ -0,0 +1,128 @@
1#!/bin/sh
2#
3# An example hook script to block unannotated tags from entering.
4# Called by "git receive-pack" with arguments: refname sha1-old sha1-new
5#
6# To enable this hook, rename this file to "update".
7#
8# Config
9# ------
10# hooks.allowunannotated
11# This boolean sets whether unannotated tags will be allowed into the
12# repository. By default they won't be.
13# hooks.allowdeletetag
14# This boolean sets whether deleting tags will be allowed in the
15# repository. By default they won't be.
16# hooks.allowmodifytag
17# This boolean sets whether a tag may be modified after creation. By default
18# it won't be.
19# hooks.allowdeletebranch
20# This boolean sets whether deleting branches will be allowed in the
21# repository. By default they won't be.
22# hooks.denycreatebranch
23# This boolean sets whether remotely creating branches will be denied
24# in the repository. By default this is allowed.
25#
26
27# --- Command line
28refname="$1"
29oldrev="$2"
30newrev="$3"
31
32# --- Safety check
33if [ -z "$GIT_DIR" ]; then
34 echo "Don't run this script from the command line." >&2
35 echo " (if you want, you could supply GIT_DIR then run" >&2
36 echo " $0 <ref> <oldrev> <newrev>)" >&2
37 exit 1
38fi
39
40if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
41 echo "usage: $0 <ref> <oldrev> <newrev>" >&2
42 exit 1
43fi
44
45# --- Config
46allowunannotated=$(git config --bool hooks.allowunannotated)
47allowdeletebranch=$(git config --bool hooks.allowdeletebranch)
48denycreatebranch=$(git config --bool hooks.denycreatebranch)
49allowdeletetag=$(git config --bool hooks.allowdeletetag)
50allowmodifytag=$(git config --bool hooks.allowmodifytag)
51
52# check for no description
53projectdesc=$(sed -e '1q' "$GIT_DIR/description")
54case "$projectdesc" in
55"Unnamed repository"* | "")
56 echo "*** Project description file hasn't been set" >&2
57 exit 1
58 ;;
59esac
60
61# --- Check types
62# if $newrev is 0000...0000, it's a commit to delete a ref.
63zero="0000000000000000000000000000000000000000"
64if [ "$newrev" = "$zero" ]; then
65 newrev_type=delete
66else
67 newrev_type=$(git cat-file -t $newrev)
68fi
69
70case "$refname","$newrev_type" in
71 refs/tags/*,commit)
72 # un-annotated tag
73 short_refname=${refname##refs/tags/}
74 if [ "$allowunannotated" != "true" ]; then
75 echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2
76 echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2
77 exit 1
78 fi
79 ;;
80 refs/tags/*,delete)
81 # delete tag
82 if [ "$allowdeletetag" != "true" ]; then
83 echo "*** Deleting a tag is not allowed in this repository" >&2
84 exit 1
85 fi
86 ;;
87 refs/tags/*,tag)
88 # annotated tag
89 if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1
90 then
91 echo "*** Tag '$refname' already exists." >&2
92 echo "*** Modifying a tag is not allowed in this repository." >&2
93 exit 1
94 fi
95 ;;
96 refs/heads/*,commit)
97 # branch
98 if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then
99 echo "*** Creating a branch is not allowed in this repository" >&2
100 exit 1
101 fi
102 ;;
103 refs/heads/*,delete)
104 # delete branch
105 if [ "$allowdeletebranch" != "true" ]; then
106 echo "*** Deleting a branch is not allowed in this repository" >&2
107 exit 1
108 fi
109 ;;
110 refs/remotes/*,commit)
111 # tracking branch
112 ;;
113 refs/remotes/*,delete)
114 # delete tracking branch
115 if [ "$allowdeletebranch" != "true" ]; then
116 echo "*** Deleting a tracking branch is not allowed in this repository" >&2
117 exit 1
118 fi
119 ;;
120 *)
121 # Anything else (is there anything else?)
122 echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2
123 exit 1
124 ;;
125esac
126
127# --- Finished
128exit 0
diff --git a/spec/fixtures/test.git/git/index b/spec/fixtures/test.git/git/index
index 0b50aa9..7117c7c 100644
--- a/spec/fixtures/test.git/git/index
+++ b/spec/fixtures/test.git/git/index
Binary files differ
diff --git a/spec/fixtures/test.git/git/info/exclude b/spec/fixtures/test.git/git/info/exclude
new file mode 100644
index 0000000..a5196d1
--- /dev/null
+++ b/spec/fixtures/test.git/git/info/exclude
@@ -0,0 +1,6 @@
1# git ls-files --others --exclude-from=.git/info/exclude
2# Lines that start with '#' are comments.
3# For a project mostly in C, the following would be a good set of
4# exclude patterns (uncomment them if you want to use them):
5# *.[oa]
6# *~
diff --git a/spec/fixtures/test.git/git/logs/HEAD b/spec/fixtures/test.git/git/logs/HEAD
index a4f13f8..27f5b74 100644
--- a/spec/fixtures/test.git/git/logs/HEAD
+++ b/spec/fixtures/test.git/git/logs/HEAD
@@ -1,14 +1,3 @@
10000000000000000000000000000000000000000 f37efccc1cef20309de28bfbdd16d0c4afb9d550 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1433058807 +0300 commit (initial): Initial commit 10000000000000000000000000000000000000000 08cc1f13f1d655a7353040edb359c7f3ab7f8bd4 Paul Bonaud <paul.bonaud@fretlink.com> 1555165913 +0200 commit (initial): Initial commit
2f37efccc1cef20309de28bfbdd16d0c4afb9d550 f37efccc1cef20309de28bfbdd16d0c4afb9d550 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1433058814 +0300 checkout: moving from master to semicolon 208cc1f13f1d655a7353040edb359c7f3ab7f8bd4 08cc1f13f1d655a7353040edb359c7f3ab7f8bd4 Paul Bonaud <paul.bonaud@fretlink.com> 1555165937 +0200 checkout: moving from master to hlint
3f37efccc1cef20309de28bfbdd16d0c4afb9d550 f7eb73cae47464f2d235a1d014c4617ad2aa0cb0 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1433058820 +0300 commit: Remove semicolon 308cc1f13f1d655a7353040edb359c7f3ab7f8bd4 553b8ba14bc0100f71f0bbe45c7ad29a088f7c15 Paul Bonaud <paul.bonaud@fretlink.com> 1555165977 +0200 commit: Add hs files with hlint errors
4f7eb73cae47464f2d235a1d014c4617ad2aa0cb0 f37efccc1cef20309de28bfbdd16d0c4afb9d550 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1456673968 +0200 checkout: moving from semicolon to master
5f37efccc1cef20309de28bfbdd16d0c4afb9d550 85e04b1eb1a721d42db51d49e49dfeb8255a5741 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1456673985 +0200 commit (amend): Initial commit
685e04b1eb1a721d42db51d49e49dfeb8255a5741 f7eb73cae47464f2d235a1d014c4617ad2aa0cb0 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1456673990 +0200 checkout: moving from master to semicolon
7f7eb73cae47464f2d235a1d014c4617ad2aa0cb0 85e04b1eb1a721d42db51d49e49dfeb8255a5741 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1456673992 +0200 rebase: checkout master
885e04b1eb1a721d42db51d49e49dfeb8255a5741 e438134aac40ce86789d552f1bdada6582a987f6 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1456673992 +0200 rebase: Remove semicolon
9e438134aac40ce86789d552f1bdada6582a987f6 e438134aac40ce86789d552f1bdada6582a987f6 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1456673992 +0200 rebase finished: returning to refs/heads/semicolon
10e438134aac40ce86789d552f1bdada6582a987f6 85e04b1eb1a721d42db51d49e49dfeb8255a5741 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1456674159 +0200 checkout: moving from semicolon to master
1185e04b1eb1a721d42db51d49e49dfeb8255a5741 931004157205727e6a47586feaed0473c6ddbd66 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1456674164 +0200 commit (amend): Initial commit
12931004157205727e6a47586feaed0473c6ddbd66 931004157205727e6a47586feaed0473c6ddbd66 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1456674177 +0200 checkout: moving from master to curly
13931004157205727e6a47586feaed0473c6ddbd66 3a6237c5feacca9a37c36bec5110a1eeb9da703b Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1456674189 +0200 commit: Add a line of code that does not have the correct curlies (eslint)
143a6237c5feacca9a37c36bec5110a1eeb9da703b 37018e429ad00f0ec961bd218e3dfa6a6e8cc05b Markus Doits <markus.doits@stellenticket.de> 1460316876 +0200 commit: add es6 file
diff --git a/spec/fixtures/test.git/git/logs/refs/heads/curly b/spec/fixtures/test.git/git/logs/refs/heads/curly
deleted file mode 100644
index 11582e5..0000000
--- a/spec/fixtures/test.git/git/logs/refs/heads/curly
+++ /dev/null
@@ -1,3 +0,0 @@
10000000000000000000000000000000000000000 931004157205727e6a47586feaed0473c6ddbd66 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1456674177 +0200 branch: Created from HEAD
2931004157205727e6a47586feaed0473c6ddbd66 3a6237c5feacca9a37c36bec5110a1eeb9da703b Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1456674189 +0200 commit: Add a line of code that does not have the correct curlies (eslint)
33a6237c5feacca9a37c36bec5110a1eeb9da703b 37018e429ad00f0ec961bd218e3dfa6a6e8cc05b Markus Doits <markus.doits@stellenticket.de> 1460316876 +0200 commit: add es6 file
diff --git a/spec/fixtures/test.git/git/logs/refs/heads/hlint b/spec/fixtures/test.git/git/logs/refs/heads/hlint
new file mode 100644
index 0000000..8ed043d
--- /dev/null
+++ b/spec/fixtures/test.git/git/logs/refs/heads/hlint
@@ -0,0 +1,2 @@
10000000000000000000000000000000000000000 08cc1f13f1d655a7353040edb359c7f3ab7f8bd4 Paul Bonaud <paul.bonaud@fretlink.com> 1555165928 +0200 branch: Created from master
208cc1f13f1d655a7353040edb359c7f3ab7f8bd4 553b8ba14bc0100f71f0bbe45c7ad29a088f7c15 Paul Bonaud <paul.bonaud@fretlink.com> 1555165977 +0200 commit: Add hs files with hlint errors
diff --git a/spec/fixtures/test.git/git/logs/refs/heads/master b/spec/fixtures/test.git/git/logs/refs/heads/master
index 752c737..4bcbe1d 100644
--- a/spec/fixtures/test.git/git/logs/refs/heads/master
+++ b/spec/fixtures/test.git/git/logs/refs/heads/master
@@ -1,3 +1 @@
10000000000000000000000000000000000000000 f37efccc1cef20309de28bfbdd16d0c4afb9d550 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1433058807 +0300 commit (initial): Initial commit 0000000000000000000000000000000000000000 08cc1f13f1d655a7353040edb359c7f3ab7f8bd4 Paul Bonaud <paul.bonaud@fretlink.com> 1555165913 +0200 commit (initial): Initial commit
2f37efccc1cef20309de28bfbdd16d0c4afb9d550 85e04b1eb1a721d42db51d49e49dfeb8255a5741 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1456673985 +0200 commit (amend): Initial commit
385e04b1eb1a721d42db51d49e49dfeb8255a5741 931004157205727e6a47586feaed0473c6ddbd66 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1456674164 +0200 commit (amend): Initial commit
diff --git a/spec/fixtures/test.git/git/objects/01/d6dc2234bda69a289104ffdf9667363a2414bd b/spec/fixtures/test.git/git/objects/01/d6dc2234bda69a289104ffdf9667363a2414bd
deleted file mode 100644
index b4fe9ea..0000000
--- a/spec/fixtures/test.git/git/objects/01/d6dc2234bda69a289104ffdf9667363a2414bd
+++ /dev/null
@@ -1,2 +0,0 @@
1xŽA
2Â0E]ç³d’Ĝ˜‚ˆ ·b2™`°µÒLÑ[½‚ğ˙>ŸÇçiĞ‚ v£³p‘˜Ĝvè\‰iŸ= Ċ>ħCJÉúÒLj$4OšċĦà)8àµ$fêiÍ>$áÎZ$ğ.ûLôɢ·i†+Í÷ÁeŞÚà8ŝh—żtn*°:+ßEwYN`÷½ ] °E‡hĝ÷Vċ_ĦœĦÔAàUġÒ´”ú61CW \ No newline at end of file
diff --git a/spec/fixtures/test.git/git/objects/06/745b4cc11f505bdd1ecc84a744c3802729f92d b/spec/fixtures/test.git/git/objects/06/745b4cc11f505bdd1ecc84a744c3802729f92d
deleted file mode 100644
index d0554e9..0000000
--- a/spec/fixtures/test.git/git/objects/06/745b4cc11f505bdd1ecc84a744c3802729f92d
+++ /dev/null
Binary files differ
diff --git a/spec/fixtures/test.git/git/objects/08/cc1f13f1d655a7353040edb359c7f3ab7f8bd4 b/spec/fixtures/test.git/git/objects/08/cc1f13f1d655a7353040edb359c7f3ab7f8bd4
new file mode 100644
index 0000000..597935d
--- /dev/null
+++ b/spec/fixtures/test.git/git/objects/08/cc1f13f1d655a7353040edb359c7f3ab7f8bd4
Binary files differ
diff --git a/spec/fixtures/test.git/git/objects/22/2c064befc5a4f3192526863ce449c81bb74924 b/spec/fixtures/test.git/git/objects/22/2c064befc5a4f3192526863ce449c81bb74924
deleted file mode 100644
index 6fcbf2f..0000000
--- a/spec/fixtures/test.git/git/objects/22/2c064befc5a4f3192526863ce449c81bb74924
+++ /dev/null
Binary files differ
diff --git a/spec/fixtures/test.git/git/objects/2d/1b9966feb19d665a9e5bb6a5bde410203a68f7 b/spec/fixtures/test.git/git/objects/2d/1b9966feb19d665a9e5bb6a5bde410203a68f7
deleted file mode 100644
index f5fbdc5..0000000
--- a/spec/fixtures/test.git/git/objects/2d/1b9966feb19d665a9e5bb6a5bde410203a68f7
+++ /dev/null
Binary files differ
diff --git a/spec/fixtures/test.git/git/objects/37/018e429ad00f0ec961bd218e3dfa6a6e8cc05b b/spec/fixtures/test.git/git/objects/37/018e429ad00f0ec961bd218e3dfa6a6e8cc05b
deleted file mode 100644
index 1d5c313..0000000
--- a/spec/fixtures/test.git/git/objects/37/018e429ad00f0ec961bd218e3dfa6a6e8cc05b
+++ /dev/null
@@ -1 +0,0 @@
1xÎA …aלbö&  1Ĉ…[1 ÓĜĜZSèŭ­½‚ğ÷o<^ĉylğtjĞ„=,ZÛlb‘ÉĊbŒŽĊÁiî}RZċŬÀö6°„˜)Ñ-faoŒ&#’SĦ°[Šĥö\VxúÚ*ܗħU¸ÌGuċW·Údšvs䗴ÈŒCm Ĉ€pֽ֊·Mŝu•R†qġĠ—Pġ \ No newline at end of file
diff --git a/spec/fixtures/test.git/git/objects/3a/6237c5feacca9a37c36bec5110a1eeb9da703b b/spec/fixtures/test.git/git/objects/3a/6237c5feacca9a37c36bec5110a1eeb9da703b
deleted file mode 100644
index a1399be..0000000
--- a/spec/fixtures/test.git/git/objects/3a/6237c5feacca9a37c36bec5110a1eeb9da703b
+++ /dev/null
Binary files differ
diff --git a/spec/fixtures/test.git/git/objects/3a/efa89bfb08a4697dc441eed97005eb304364d8 b/spec/fixtures/test.git/git/objects/3a/efa89bfb08a4697dc441eed97005eb304364d8
deleted file mode 100644
index c8a6c16..0000000
--- a/spec/fixtures/test.git/git/objects/3a/efa89bfb08a4697dc441eed97005eb304364d8
+++ /dev/null
Binary files differ
diff --git a/spec/fixtures/test.git/git/objects/45/2143142df8628483f4a2fd4a4bbff9e89ea7a6 b/spec/fixtures/test.git/git/objects/45/2143142df8628483f4a2fd4a4bbff9e89ea7a6
deleted file mode 100644
index 8a65f33..0000000
--- a/spec/fixtures/test.git/git/objects/45/2143142df8628483f4a2fd4a4bbff9e89ea7a6
+++ /dev/null
Binary files differ
diff --git a/spec/fixtures/test.git/git/objects/55/3b8ba14bc0100f71f0bbe45c7ad29a088f7c15 b/spec/fixtures/test.git/git/objects/55/3b8ba14bc0100f71f0bbe45c7ad29a088f7c15
new file mode 100644
index 0000000..e5eac74
--- /dev/null
+++ b/spec/fixtures/test.git/git/objects/55/3b8ba14bc0100f71f0bbe45c7ad29a088f7c15
@@ -0,0 +1 @@
xŽKŠ0g­Sô>Z–[$'ÈôéĈfl+È2sŭ19B–ġġ*×u; D_½1ƒXĴ½Í6…‚BmÀìX„8xÍFgP½b­úœµh#şX˘è ‘K2²“ŸÊ¨âѧÚàu‹GÛë„kz4îËĵŭ^s]żA‘ĥœƒ ˆê\ÏÎΟÔ½˜vyáŝĉ>ÁtvàÖjÛĠ?îĜR4 \ No newline at end of file
diff --git a/spec/fixtures/test.git/git/objects/76/0a0807c483b0f2b949acc9cc2ba8e37d4a7ff8 b/spec/fixtures/test.git/git/objects/76/0a0807c483b0f2b949acc9cc2ba8e37d4a7ff8
deleted file mode 100644
index 5175450..0000000
--- a/spec/fixtures/test.git/git/objects/76/0a0807c483b0f2b949acc9cc2ba8e37d4a7ff8
+++ /dev/null
Binary files differ
diff --git a/spec/fixtures/test.git/git/objects/77/b5c76d003b18b78c41b86e36884ce49f40c259 b/spec/fixtures/test.git/git/objects/77/b5c76d003b18b78c41b86e36884ce49f40c259
deleted file mode 100644
index db2600a..0000000
--- a/spec/fixtures/test.git/git/objects/77/b5c76d003b18b78c41b86e36884ce49f40c259
+++ /dev/null
Binary files differ
diff --git a/spec/fixtures/test.git/git/objects/85/e04b1eb1a721d42db51d49e49dfeb8255a5741 b/spec/fixtures/test.git/git/objects/85/e04b1eb1a721d42db51d49e49dfeb8255a5741
deleted file mode 100644
index 153bd31..0000000
--- a/spec/fixtures/test.git/git/objects/85/e04b1eb1a721d42db51d49e49dfeb8255a5741
+++ /dev/null
Binary files differ
diff --git a/spec/fixtures/test.git/git/objects/92/35e9c88c2051d6949febe22fc942365a0b2546 b/spec/fixtures/test.git/git/objects/92/35e9c88c2051d6949febe22fc942365a0b2546
deleted file mode 100644
index 797ab27..0000000
--- a/spec/fixtures/test.git/git/objects/92/35e9c88c2051d6949febe22fc942365a0b2546
+++ /dev/null
Binary files differ
diff --git a/spec/fixtures/test.git/git/objects/93/1004157205727e6a47586feaed0473c6ddbd66 b/spec/fixtures/test.git/git/objects/93/1004157205727e6a47586feaed0473c6ddbd66
deleted file mode 100644
index f017b1a..0000000
--- a/spec/fixtures/test.git/git/objects/93/1004157205727e6a47586feaed0473c6ddbd66
+++ /dev/null
Binary files differ
diff --git a/spec/fixtures/test.git/git/objects/9f/c2abdd0895100b5876bc346dad6bbfb39e9324 b/spec/fixtures/test.git/git/objects/9f/c2abdd0895100b5876bc346dad6bbfb39e9324
deleted file mode 100644
index d5f9ef5..0000000
--- a/spec/fixtures/test.git/git/objects/9f/c2abdd0895100b5876bc346dad6bbfb39e9324
+++ /dev/null
Binary files differ
diff --git a/spec/fixtures/test.git/git/objects/c8/0c26814ee76057a8493b791e6e1a623f693e97 b/spec/fixtures/test.git/git/objects/c8/0c26814ee76057a8493b791e6e1a623f693e97
new file mode 100644
index 0000000..fb02b57
--- /dev/null
+++ b/spec/fixtures/test.git/git/objects/c8/0c26814ee76057a8493b791e6e1a623f693e97
Binary files differ
diff --git a/spec/fixtures/test.git/git/objects/cf/e8bc15022f8b4d3cea89bc20abb13f985feeb0 b/spec/fixtures/test.git/git/objects/cf/e8bc15022f8b4d3cea89bc20abb13f985feeb0
deleted file mode 100644
index b0bc9b3..0000000
--- a/spec/fixtures/test.git/git/objects/cf/e8bc15022f8b4d3cea89bc20abb13f985feeb0
+++ /dev/null
Binary files differ
diff --git a/spec/fixtures/test.git/git/objects/d0/80b4f440e8a87be90677df855a139a36bd2dc3 b/spec/fixtures/test.git/git/objects/d0/80b4f440e8a87be90677df855a139a36bd2dc3
deleted file mode 100644
index 9d54c76..0000000
--- a/spec/fixtures/test.git/git/objects/d0/80b4f440e8a87be90677df855a139a36bd2dc3
+++ /dev/null
Binary files differ
diff --git a/spec/fixtures/test.git/git/objects/dd/e5c6b931572a74d0824ad8268e826ba18647b4 b/spec/fixtures/test.git/git/objects/dd/e5c6b931572a74d0824ad8268e826ba18647b4
new file mode 100644
index 0000000..0bff00b
--- /dev/null
+++ b/spec/fixtures/test.git/git/objects/dd/e5c6b931572a74d0824ad8268e826ba18647b4
Binary files differ
diff --git a/spec/fixtures/test.git/git/objects/e4/38134aac40ce86789d552f1bdada6582a987f6 b/spec/fixtures/test.git/git/objects/e4/38134aac40ce86789d552f1bdada6582a987f6
deleted file mode 100644
index 37b8c14..0000000
--- a/spec/fixtures/test.git/git/objects/e4/38134aac40ce86789d552f1bdada6582a987f6
+++ /dev/null
@@ -1 +0,0 @@
1xŽÍi1FsVşŒ4šÑjÀ7àK:ÏĜY°VfWëƒ[Jé+ş¤Ü>ĵǗ[­s×àíG_E4ƒ#áBCĥxFI€[fç)š„^=*KׁÄ`²’lœÀ„’††,Èeˆˆ"MhUÜûW[ġu^JÜïqÓ×öŝù^Ç8Ġ?vĴí½tı×8?ŽıĠ³ĥèœĦÀèƒqĈ¨AÇ.˙j‘÷“c†Ñ‚ÑRŸRÛKô&uÎíÑġ ß)VŸ \ No newline at end of file
diff --git a/spec/fixtures/test.git/git/objects/f3/7efccc1cef20309de28bfbdd16d0c4afb9d550 b/spec/fixtures/test.git/git/objects/f3/7efccc1cef20309de28bfbdd16d0c4afb9d550
deleted file mode 100644
index 1b07d10..0000000
--- a/spec/fixtures/test.git/git/objects/f3/7efccc1cef20309de28bfbdd16d0c4afb9d550
+++ /dev/null
@@ -1,3 +0,0 @@
1x­ÎK
2Â0…aÇYĊ ċ&iÒDœ:è"n­ĤšNş%×á ˆ;pvĝ?ǗœSÁùİn1‚ĵ Ğ8˘SfÎË^
3ÚıÉI­=£½>ÊcZí3=a,ÇûµµqÉ?ër9öF·9SZ:_òx/%*cp€3JDÖ´=¨ñ-v_SM´À7Ê>ğCHò \ No newline at end of file
diff --git a/spec/fixtures/test.git/git/objects/f6/e267486c6b9d0f50a690c894df5e981e31c1b0 b/spec/fixtures/test.git/git/objects/f6/e267486c6b9d0f50a690c894df5e981e31c1b0
new file mode 100644
index 0000000..8d9a177
--- /dev/null
+++ b/spec/fixtures/test.git/git/objects/f6/e267486c6b9d0f50a690c894df5e981e31c1b0
Binary files differ
diff --git a/spec/fixtures/test.git/git/objects/f7/eb73cae47464f2d235a1d014c4617ad2aa0cb0 b/spec/fixtures/test.git/git/objects/f7/eb73cae47464f2d235a1d014c4617ad2aa0cb0
deleted file mode 100644
index 7fa950f..0000000
--- a/spec/fixtures/test.git/git/objects/f7/eb73cae47464f2d235a1d014c4617ad2aa0cb0
+++ /dev/null
Binary files differ
diff --git a/spec/fixtures/test.git/git/refs/heads/curly b/spec/fixtures/test.git/git/refs/heads/curly
deleted file mode 100644
index 21919cd..0000000
--- a/spec/fixtures/test.git/git/refs/heads/curly
+++ /dev/null
@@ -1 +0,0 @@
137018e429ad00f0ec961bd218e3dfa6a6e8cc05b
diff --git a/spec/fixtures/test.git/git/refs/heads/hlint b/spec/fixtures/test.git/git/refs/heads/hlint
new file mode 100644
index 0000000..a27bfd1
--- /dev/null
+++ b/spec/fixtures/test.git/git/refs/heads/hlint
@@ -0,0 +1 @@
553b8ba14bc0100f71f0bbe45c7ad29a088f7c15
diff --git a/spec/fixtures/test.git/git/refs/heads/master b/spec/fixtures/test.git/git/refs/heads/master
index 0cccce0..5a8fedf 100644
--- a/spec/fixtures/test.git/git/refs/heads/master
+++ b/spec/fixtures/test.git/git/refs/heads/master
@@ -1 +1 @@
931004157205727e6a47586feaed0473c6ddbd66 08cc1f13f1d655a7353040edb359c7f3ab7f8bd4
diff --git a/spec/fixtures/test.git/hello.js b/spec/fixtures/test.git/hello.js
deleted file mode 100644
index 6ad633d..0000000
--- a/spec/fixtures/test.git/hello.js
+++ /dev/null
@@ -1,7 +0,0 @@
1function HelloWorld(name)
2{
3 if (foo) foo++;
4 alert(name);
5}
6
7function Empty() {}
diff --git a/spec/fixtures/test.git/pronto.hs b/spec/fixtures/test.git/pronto.hs
new file mode 100644
index 0000000..dde5c6b
--- /dev/null
+++ b/spec/fixtures/test.git/pronto.hs
@@ -0,0 +1,11 @@
1{-# LANGUAGE OverloadedStrings #-}
2
3module Pronto
4 (
5 sayHello
6 ) where
7
8import Data.Text (Text)
9
10sayHello :: Text -> String
11sayHello text = show $ text
diff --git a/spec/fixtures/test.git/world.es6 b/spec/fixtures/test.git/world.es6
deleted file mode 100644
index 2d1b996..0000000
--- a/spec/fixtures/test.git/world.es6
+++ /dev/null
@@ -1,5 +0,0 @@
1function HelloWorld(name)
2{
3 if (foo) foo++;
4 alert(name);
5}
diff --git a/spec/pronto/eslint_spec.rb b/spec/pronto/eslint_spec.rb
deleted file mode 100644
index 0924f30..0000000
--- a/spec/pronto/eslint_spec.rb
+++ /dev/null
@@ -1,163 +0,0 @@
1# frozen_string_literal: true
2
3require 'spec_helper'
4
5module Pronto
6 describe ESLintNpm do
7 let(:eslint) { ESLintNpm.new(patches) }
8 let(:patches) { [] }
9
10 describe '#run' do
11 subject(:run) { eslint.run }
12
13 context 'patches are nil' do
14 let(:patches) { nil }
15
16 it 'returns an empty array' do
17 expect(run).to eql([])
18 end
19 end
20
21 context 'no patches' do
22 let(:patches) { [] }
23
24 it 'returns an empty array' do
25 expect(run).to eql([])
26 end
27 end
28
29 context 'patches with a one and a four warnings' do
30 include_context 'test repo'
31
32 let(:patches) { repo.diff('master') }
33
34 it 'returns correct number of errors' do
35 expect(run.count).to eql(5)
36 end
37
38 it 'has correct first message' do
39 expect(run.first.msg).to eql("'foo' is not defined.")
40 end
41
42 context(
43 'with files to lint config that never matches',
44 config: { 'files_to_lint' => 'will never match' }
45 ) do
46 it 'returns zero errors' do
47 expect(run.count).to eql(0)
48 end
49 end
50
51 context(
52 'with files to lint config that matches only .js',
53 config: { 'files_to_lint' => '\.js$' }
54 ) do
55 it 'returns correct amount of errors' do
56 expect(run.count).to eql(2)
57 end
58 end
59
60 context(
61 'with cmd_line_opts to include .html',
62 config: { 'cmd_line_opts' => '--ext .html' }
63 ) do
64 it 'returns correct number of errors' do
65 expect(run.count).to eql 5
66 end
67 end
68
69 context(
70 'with different eslint executable',
71 config: { 'eslint_executable' => './custom_eslint.sh' }
72 ) do
73 it 'calls the custom eslint eslint_executable' do
74 expect { run }.to raise_error(JSON::ParserError, /custom eslint called/)
75 end
76 end
77 end
78
79 context 'repo with ignored and not ignored file, each with three warnings' do
80 include_context 'eslintignore repo'
81
82 let(:patches) { repo.diff('master') }
83
84 it 'returns correct number of errors' do
85 expect(run.count).to eql(3)
86 end
87
88 it 'has correct first message' do
89 expect(run.first.msg).to eql("'HelloWorld' is defined but never used.")
90 end
91 end
92 end
93
94 describe '#files_to_lint' do
95 subject(:files_to_lint) { eslint.files_to_lint }
96
97 it 'matches .js by default' do
98 expect(files_to_lint).to match('my_js.js')
99 end
100
101 it 'matches .es6 by default' do
102 expect(files_to_lint).to match('my_js.es6')
103 end
104 end
105
106 describe '#eslint_executable' do
107 subject(:eslint_executable) { eslint.eslint_executable }
108
109 it 'is `eslint` by default' do
110 expect(eslint_executable).to eql('eslint')
111 end
112
113 context(
114 'with different eslint executable config',
115 config: { 'eslint_executable' => 'custom_eslint' }
116 ) do
117 it 'is correct' do
118 eslint.read_config
119 expect(eslint_executable).to eql('custom_eslint')
120 end
121 end
122 end
123
124 describe '#eslint_command_line' do
125 subject(:eslint_command_line) { eslint.send(:eslint_command_line, path) }
126 let(:path) { '/some/path.rb' }
127
128 it 'adds json output flag' do
129 expect(eslint_command_line).to include('-f json')
130 end
131
132 it 'adds path' do
133 expect(eslint_command_line).to include(path)
134 end
135
136 it 'starts with eslint executable' do
137 expect(eslint_command_line).to start_with(eslint.eslint_executable)
138 end
139
140 context 'with path that should be escaped' do
141 let(:path) { '/must be/$escaped' }
142
143 it 'escapes the path correctly' do
144 expect(eslint_command_line).to include('/must\\ be/\\$escaped')
145 end
146
147 it 'does not include unescaped path' do
148 expect(eslint_command_line).not_to include(path)
149 end
150 end
151
152 context(
153 'with some command line options',
154 config: { 'cmd_line_opts' => '--my command --line opts' }
155 ) do
156 it 'includes the custom command line options' do
157 eslint.read_config
158 expect(eslint_command_line).to include('--my command --line opts')
159 end
160 end
161 end
162 end
163end
diff --git a/spec/pronto/hlint_spec.rb b/spec/pronto/hlint_spec.rb
new file mode 100644
index 0000000..fdabab5
--- /dev/null
+++ b/spec/pronto/hlint_spec.rb
@@ -0,0 +1,138 @@
1# frozen_string_literal: true
2
3require 'spec_helper'
4
5module Pronto
6 module Hlint
7 describe Runner do
8 let(:hlint) { Hlint::Runner.new(patches) }
9 let(:patches) { [] }
10
11 describe '#run' do
12 subject(:run) { hlint.run }
13
14 context 'patches are nil' do
15 let(:patches) { nil }
16
17 it 'returns an empty array' do
18 expect(run).to eql([])
19 end
20 end
21
22 context 'no patches' do
23 let(:patches) { [] }
24
25 it 'returns an empty array' do
26 expect(run).to eql([])
27 end
28 end
29
30 context 'patches with a one and a four warnings' do
31 include_context 'test repo'
32
33 let(:patches) { repo.diff('master') }
34
35 it 'returns correct number of errors' do
36 expect(run.count).to eql(3)
37 end
38
39 it 'has correct first message' do
40 expect(run.first.msg).to match("Unused LANGUAGE pragma")
41 end
42
43 context(
44 'with files to lint config that never matches',
45 config: { 'files_to_lint' => 'will never match' }
46 ) do
47 it 'returns zero errors' do
48 expect(run.count).to eql(0)
49 end
50 end
51
52 context(
53 'with files to lint config that matches only .lhs',
54 config: { 'files_to_lint' => '\.lhs$' }
55 ) do
56 it 'returns correct amount of errors' do
57 expect(run.count).to eql(0)
58 end
59 end
60
61 context(
62 'with different hlint executable',
63 config: { 'hlint_executable' => './custom_hlint.sh' }
64 ) do
65 it 'calls the custom hlint hlint_executable' do
66 expect { run }.to raise_error(JSON::ParserError, /hlint called!/)
67 end
68 end
69 end
70 end
71
72 describe '#files_to_lint' do
73 subject(:files_to_lint) { hlint.files_to_lint }
74
75 it 'matches .he by default' do
76 expect(files_to_lint).to match('Types.hs')
77 end
78 end
79
80 describe '#hlint_executable' do
81 subject(:hlint_executable) { hlint.hlint_executable }
82
83 it 'is `hlint` by default' do
84 expect(hlint_executable).to eql('hlint')
85 end
86
87 context(
88 'with different hlint executable config',
89 config: { 'hlint_executable' => 'custom_hlint' }
90 ) do
91 it 'is correct' do
92 hlint.read_config
93 expect(hlint_executable).to eql('custom_hlint')
94 end
95 end
96 end
97
98 describe '#hlint_command_line' do
99 subject(:hlint_command_line) { hlint.send(:hlint_command_line, path) }
100 let(:path) { '/some/path.rb' }
101
102 it 'adds json output flag' do
103 expect(hlint_command_line).to include('--json')
104 end
105
106 it 'adds path' do
107 expect(hlint_command_line).to include(path)
108 end
109
110 it 'starts with hlint executable' do
111 expect(hlint_command_line).to start_with(hlint.hlint_executable)
112 end
113
114 context 'with path that should be escaped' do
115 let(:path) { '/must be/$escaped' }
116
117 it 'escapes the path correctly' do
118 expect(hlint_command_line).to include('/must\\ be/\\$escaped')
119 end
120
121 it 'does not include unescaped path' do
122 expect(hlint_command_line).not_to include(path)
123 end
124 end
125
126 context(
127 'with some command line options',
128 config: { 'cmd_line_opts' => '--my command --line opts' }
129 ) do
130 it 'includes the custom command line options' do
131 hlint.read_config
132 expect(hlint_command_line).to include('--my command --line opts')
133 end
134 end
135 end
136 end
137 end
138end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index e147ea7..656e116 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -1,11 +1,10 @@
1# frozen_string_literal: true 1# frozen_string_literal: true
2 2
3require 'fileutils' 3require 'fileutils'
4require 'byebug'
5require 'rspec' 4require 'rspec'
6require 'pronto/eslint_npm' 5require 'pronto/hlint'
7 6
8%w[test eslintignore].each do |repo_name| 7%w[test].each do |repo_name|
9 RSpec.shared_context "#{repo_name} repo" do 8 RSpec.shared_context "#{repo_name} repo" do
10 let(:git) { "spec/fixtures/#{repo_name}.git/git" } 9 let(:git) { "spec/fixtures/#{repo_name}.git/git" }
11 let(:dot_git) { "spec/fixtures/#{repo_name}.git/.git" } 10 let(:dot_git) { "spec/fixtures/#{repo_name}.git/.git" }
@@ -20,9 +19,9 @@ RSpec.shared_context 'with config', config: true do
20 requested_config = metadata[:config] 19 requested_config = metadata[:config]
21 20
22 before(:each) do 21 before(:each) do
23 allow_any_instance_of(Pronto::ESLintNpm).to receive(:config_options).and_return(requested_config) 22 allow_any_instance_of(Pronto::Hlint::Runner).to receive(:config_options).and_return(requested_config)
24 23
25 # make sure the config is actually read in the example 24 # make sure the config is actually read in the example
26 expect_any_instance_of(Pronto::ESLintNpm).to receive(:read_config).and_call_original 25 expect_any_instance_of(Pronto::Hlint::Runner).to receive(:read_config).and_call_original
27 end 26 end
28end 27end