diff options
89 files changed, 1055 insertions, 417 deletions
@@ -1,6 +1,4 @@ | |||
1 | pkg/* | 1 | pkg/* |
2 | *.gem | 2 | *.gem |
3 | .bundle | 3 | .bundle |
4 | .DS_Store | 4 | gems.lock |
5 | Gemfile.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 | --- |
2 | sudo: required | 2 | language: nix |
3 | dist: xenial | ||
4 | language: ruby | ||
5 | before_install: | ||
6 | - gem update --system | ||
7 | before_script: | 3 | before_script: |
8 | - npm install -g eslint | 4 | - nix-env -iA nixpkgs.hlint nixpkgs.ruby_2_6 |
9 | rvm: | 5 | - gem install bundler |
10 | - 2.3.8 | 6 | script: |
11 | - 2.4.4 | 7 | - bundle install |
12 | - 2.5.3 | 8 | - bundle exec rake spec |
13 | - 2.6.1 | ||
@@ -1,6 +1,6 @@ | |||
1 | The MIT License | 1 | The MIT License |
2 | 2 | ||
3 | Copyright (c) 2016 Mindaugas MozĊĞras | 3 | Copyright (c) 2019 Fretlink |
4 | 4 | ||
5 | Permission is hereby granted, free of charge, to any person obtaining a copy | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy |
6 | of this software and associated documentation files (the "Software"), to deal | 6 | of this software and associated documentation files (the "Software"), to deal |
@@ -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 | ||
7 | Pronto runner for [ESlint](http://eslint.org), pluggable linting utility for JavaScript and JSX. [What is Pronto?](https://github.com/mmozuras/pronto) | 6 | Pronto runner for [Hlint](https://hackage.haskell.org/package/hlint), pluggable linting utility for Haskell. [What is Pronto?](https://github.com/mmozuras/pronto) |
8 | |||
9 | Uses 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 | ||
15 | You'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)). | 10 | You'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 | ||
21 | Configuring 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 | 16 | Configuring 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 | ||
29 | pronto-eslint-npm can be configured by placing a `.pronto_eslint_npm.yml` inside the directory where pronto is run. | 22 | pronto-hlint can be configured by placing a `.pronto_hlint.yml` inside the directory where pronto will run. |
30 | 23 | ||
31 | Following options are available: | 24 | Following 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 | ||
39 | Example configuration to call custom eslint executable and only lint files ending with `.my_custom_extension`: | 32 | Example 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 |
43 | eslint_executable: '/my/custom/node/path/.bin/eslint' | 36 | hlint_executable: '/my/custom/path/.bin/hlint' |
44 | files_to_lint: '\.my_custom_extension$' | 37 | files_to_lint: '\.my_custom_extension$' |
45 | cmd_line_opts: '--ext .html,.js,.es6' | 38 | cmd_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 @@ | |||
1 | PATH | ||
2 | remote: . | ||
3 | specs: | ||
4 | pronto-hlint (0.1.0) | ||
5 | pronto (~> 0.10.0) | ||
6 | |||
7 | GEM | ||
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 | |||
61 | PLATFORMS | ||
62 | ruby | ||
63 | |||
64 | DEPENDENCIES | ||
65 | byebug (>= 9) | ||
66 | pronto-hlint! | ||
67 | rake (>= 11.0, < 13) | ||
68 | rspec (~> 3.4) | ||
69 | |||
70 | BUNDLED WITH | ||
71 | 2.0.1 | ||
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 | |||
3 | require 'pronto' | ||
4 | require 'shellwords' | ||
5 | |||
6 | module 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 | ||
104 | end | ||
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 | |||
3 | module Pronto | ||
4 | module ESLintNpmVersion | ||
5 | VERSION = '0.10.0'.freeze | ||
6 | end | ||
7 | end | ||
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 | |||
3 | require 'pronto/hlint/runner' | ||
4 | |||
5 | module Pronto | ||
6 | module Hlint | ||
7 | end | ||
8 | end | ||
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 | |||
3 | require 'pronto' | ||
4 | require 'shellwords' | ||
5 | |||
6 | module 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 | ||
120 | end | ||
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 | |||
3 | module Pronto | ||
4 | module Hlint | ||
5 | VERSION = '0.1.0'.freeze | ||
6 | end | ||
7 | end | ||
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__) |
4 | require 'pronto/eslint_npm/version' | 4 | require 'pronto/hlint/version' |
5 | 5 | ||
6 | Gem::Specification.new do |s| | 6 | Gem::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 @@ | |||
1 | ignored/**/*.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 @@ | |||
1 | ref: 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 @@ | |||
1 | 0000000000000000000000000000000000000000 d43de0396c81608113f99f7afd00f7f363e1cae8 Markus Doits <markus.doits@stellenticket.de> 1469450052 +0200 commit (initial): empty init commit | ||
2 | d43de0396c81608113f99f7afd00f7f363e1cae8 d43de0396c81608113f99f7afd00f7f363e1cae8 Markus Doits <markus.doits@stellenticket.de> 1469450062 +0200 checkout: moving from master to eslintignore | ||
3 | d43de0396c81608113f99f7afd00f7f363e1cae8 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 @@ | |||
1 | 0000000000000000000000000000000000000000 d43de0396c81608113f99f7afd00f7f363e1cae8 Markus Doits <markus.doits@stellenticket.de> 1469450062 +0200 branch: Created from HEAD | ||
2 | d43de0396c81608113f99f7afd00f7f363e1cae8 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 @@ | |||
1 | 0000000000000000000000000000000000000000 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 @@ | |||
1 | xK | ||
2 | Â0@]ç³Ê&!n=D>SmZIĤ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 @@ | |||
1 | 5ffc9b3c7f8e8d8f2e8c91cb69c9698405d1ca53 | ||
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 @@ | |||
1 | d43de0396c81608113f99f7afd00f7f363e1cae8 | ||
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 @@ | |||
1 | function 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 @@ | |||
1 | function 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 @@ | |||
1 | printf '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 | |||
3 | echo "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 | ||
13 | commitmsg="$(git rev-parse --git-path hooks/commit-msg)" | ||
14 | test -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 | |||
20 | test "" = "$(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 | |||
3 | use strict; | ||
4 | use warnings; | ||
5 | use 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 | # | ||
19 | my ($version, $time) = @ARGV; | ||
20 | |||
21 | # Check the hook interface version | ||
22 | |||
23 | if ($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 | |||
31 | my $git_work_tree; | ||
32 | if ($^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 | |||
40 | my $retry = 1; | ||
41 | |||
42 | launch_watchman(); | ||
43 | |||
44 | sub 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 | |||
8 | exec 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 | ||
12 | precommit="$(git rev-parse --git-path hooks/pre-commit)" | ||
13 | test -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 | |||
10 | if git rev-parse --verify HEAD >/dev/null 2>&1 | ||
11 | then | ||
12 | against=HEAD | ||
13 | else | ||
14 | # Initial commit: diff against an empty tree object | ||
15 | against=$(git hash-object -t tree /dev/null) | ||
16 | fi | ||
17 | |||
18 | # If you want to allow non-ASCII filenames set this variable to true. | ||
19 | allownonascii=$(git config --bool hooks.allownonascii) | ||
20 | |||
21 | # Redirect output to stderr. | ||
22 | exec 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. | ||
27 | if [ "$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 | ||
33 | then | ||
34 | cat <<\EOF | ||
35 | Error: Attempt to add a non-ASCII file name. | ||
36 | |||
37 | This can cause problems if you want to work with people on other platforms. | ||
38 | |||
39 | To be portable it is advisable to rename the file. | ||
40 | |||
41 | If you know what you are doing you can disable this check using: | ||
42 | |||
43 | git config hooks.allownonascii true | ||
44 | EOF | ||
45 | exit 1 | ||
46 | fi | ||
47 | |||
48 | # If there are whitespace errors, print the offending file names and fail. | ||
49 | exec 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 | |||
22 | remote="$1" | ||
23 | url="$2" | ||
24 | |||
25 | z40=0000000000000000000000000000000000000000 | ||
26 | |||
27 | while read local_ref local_sha remote_ref remote_sha | ||
28 | do | ||
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 | ||
51 | done | ||
52 | |||
53 | exit 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 | |||
18 | publish=next | ||
19 | basebranch="$1" | ||
20 | if test "$#" = 2 | ||
21 | then | ||
22 | topic="refs/heads/$2" | ||
23 | else | ||
24 | topic=`git symbolic-ref HEAD` || | ||
25 | exit 0 ;# we do not interrupt rebasing detached HEAD | ||
26 | fi | ||
27 | |||
28 | case "$topic" in | ||
29 | refs/heads/??/*) | ||
30 | ;; | ||
31 | *) | ||
32 | exit 0 ;# we do not interrupt others. | ||
33 | ;; | ||
34 | esac | ||
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? | ||
40 | git show-ref -q "$topic" || { | ||
41 | echo >&2 "No such branch $topic" | ||
42 | exit 1 | ||
43 | } | ||
44 | |||
45 | # Is topic fully merged to master? | ||
46 | not_in_master=`git rev-list --pretty=oneline ^master "$topic"` | ||
47 | if test -z "$not_in_master" | ||
48 | then | ||
49 | echo >&2 "$topic is fully merged to master; better remove it." | ||
50 | exit 1 ;# we could allow it, but there is no point. | ||
51 | fi | ||
52 | |||
53 | # Is topic ever merged to next? If so you should not be rebasing it. | ||
54 | only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` | ||
55 | only_next_2=`git rev-list ^master ${publish} | sort` | ||
56 | if test "$only_next_1" = "$only_next_2" | ||
57 | then | ||
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 | ||
66 | else | ||
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 | ||
89 | fi | ||
90 | |||
91 | <<\DOC_END | ||
92 | |||
93 | This sample hook safeguards topic branches that have been | ||
94 | published from being rewound. | ||
95 | |||
96 | The 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 | |||
110 | The script, being an example, hardcodes the publish branch name | ||
111 | to be "next", but it is trivial to make it configurable via | ||
112 | $GIT_DIR/config mechanism. | ||
113 | |||
114 | With 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 | |||
131 | Let'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 | |||
144 | A, 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 | |||
153 | We would want to allow C to be rebased, refuse A, and encourage | ||
154 | B to be deleted. | ||
155 | |||
156 | To 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 | |||
163 | To compute (2): | ||
164 | |||
165 | git rev-list master..topic | ||
166 | |||
167 | if this is empty, it is fully merged to "master". | ||
168 | |||
169 | DOC_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 | |||
9 | if test -n "$GIT_PUSH_OPTION_COUNT" | ||
10 | then | ||
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 | ||
24 | fi | ||
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 | |||
23 | COMMIT_MSG_FILE=$1 | ||
24 | COMMIT_SOURCE=$2 | ||
25 | SHA1=$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 | ||
28 | refname="$1" | ||
29 | oldrev="$2" | ||
30 | newrev="$3" | ||
31 | |||
32 | # --- Safety check | ||
33 | if [ -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 | ||
38 | fi | ||
39 | |||
40 | if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then | ||
41 | echo "usage: $0 <ref> <oldrev> <newrev>" >&2 | ||
42 | exit 1 | ||
43 | fi | ||
44 | |||
45 | # --- Config | ||
46 | allowunannotated=$(git config --bool hooks.allowunannotated) | ||
47 | allowdeletebranch=$(git config --bool hooks.allowdeletebranch) | ||
48 | denycreatebranch=$(git config --bool hooks.denycreatebranch) | ||
49 | allowdeletetag=$(git config --bool hooks.allowdeletetag) | ||
50 | allowmodifytag=$(git config --bool hooks.allowmodifytag) | ||
51 | |||
52 | # check for no description | ||
53 | projectdesc=$(sed -e '1q' "$GIT_DIR/description") | ||
54 | case "$projectdesc" in | ||
55 | "Unnamed repository"* | "") | ||
56 | echo "*** Project description file hasn't been set" >&2 | ||
57 | exit 1 | ||
58 | ;; | ||
59 | esac | ||
60 | |||
61 | # --- Check types | ||
62 | # if $newrev is 0000...0000, it's a commit to delete a ref. | ||
63 | zero="0000000000000000000000000000000000000000" | ||
64 | if [ "$newrev" = "$zero" ]; then | ||
65 | newrev_type=delete | ||
66 | else | ||
67 | newrev_type=$(git cat-file -t $newrev) | ||
68 | fi | ||
69 | |||
70 | case "$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 | ;; | ||
125 | esac | ||
126 | |||
127 | # --- Finished | ||
128 | exit 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 @@ | |||
1 | 0000000000000000000000000000000000000000 f37efccc1cef20309de28bfbdd16d0c4afb9d550 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1433058807 +0300 commit (initial): Initial commit | 1 | 0000000000000000000000000000000000000000 08cc1f13f1d655a7353040edb359c7f3ab7f8bd4 Paul Bonaud <paul.bonaud@fretlink.com> 1555165913 +0200 commit (initial): Initial commit |
2 | f37efccc1cef20309de28bfbdd16d0c4afb9d550 f37efccc1cef20309de28bfbdd16d0c4afb9d550 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1433058814 +0300 checkout: moving from master to semicolon | 2 | 08cc1f13f1d655a7353040edb359c7f3ab7f8bd4 08cc1f13f1d655a7353040edb359c7f3ab7f8bd4 Paul Bonaud <paul.bonaud@fretlink.com> 1555165937 +0200 checkout: moving from master to hlint |
3 | f37efccc1cef20309de28bfbdd16d0c4afb9d550 f7eb73cae47464f2d235a1d014c4617ad2aa0cb0 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1433058820 +0300 commit: Remove semicolon | 3 | 08cc1f13f1d655a7353040edb359c7f3ab7f8bd4 553b8ba14bc0100f71f0bbe45c7ad29a088f7c15 Paul Bonaud <paul.bonaud@fretlink.com> 1555165977 +0200 commit: Add hs files with hlint errors |
4 | f7eb73cae47464f2d235a1d014c4617ad2aa0cb0 f37efccc1cef20309de28bfbdd16d0c4afb9d550 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1456673968 +0200 checkout: moving from semicolon to master | ||
5 | f37efccc1cef20309de28bfbdd16d0c4afb9d550 85e04b1eb1a721d42db51d49e49dfeb8255a5741 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1456673985 +0200 commit (amend): Initial commit | ||
6 | 85e04b1eb1a721d42db51d49e49dfeb8255a5741 f7eb73cae47464f2d235a1d014c4617ad2aa0cb0 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1456673990 +0200 checkout: moving from master to semicolon | ||
7 | f7eb73cae47464f2d235a1d014c4617ad2aa0cb0 85e04b1eb1a721d42db51d49e49dfeb8255a5741 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1456673992 +0200 rebase: checkout master | ||
8 | 85e04b1eb1a721d42db51d49e49dfeb8255a5741 e438134aac40ce86789d552f1bdada6582a987f6 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1456673992 +0200 rebase: Remove semicolon | ||
9 | e438134aac40ce86789d552f1bdada6582a987f6 e438134aac40ce86789d552f1bdada6582a987f6 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1456673992 +0200 rebase finished: returning to refs/heads/semicolon | ||
10 | e438134aac40ce86789d552f1bdada6582a987f6 85e04b1eb1a721d42db51d49e49dfeb8255a5741 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1456674159 +0200 checkout: moving from semicolon to master | ||
11 | 85e04b1eb1a721d42db51d49e49dfeb8255a5741 931004157205727e6a47586feaed0473c6ddbd66 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1456674164 +0200 commit (amend): Initial commit | ||
12 | 931004157205727e6a47586feaed0473c6ddbd66 931004157205727e6a47586feaed0473c6ddbd66 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1456674177 +0200 checkout: moving from master to curly | ||
13 | 931004157205727e6a47586feaed0473c6ddbd66 3a6237c5feacca9a37c36bec5110a1eeb9da703b Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1456674189 +0200 commit: Add a line of code that does not have the correct curlies (eslint) | ||
14 | 3a6237c5feacca9a37c36bec5110a1eeb9da703b 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 @@ | |||
1 | 0000000000000000000000000000000000000000 931004157205727e6a47586feaed0473c6ddbd66 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1456674177 +0200 branch: Created from HEAD | ||
2 | 931004157205727e6a47586feaed0473c6ddbd66 3a6237c5feacca9a37c36bec5110a1eeb9da703b Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1456674189 +0200 commit: Add a line of code that does not have the correct curlies (eslint) | ||
3 | 3a6237c5feacca9a37c36bec5110a1eeb9da703b 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 @@ | |||
1 | 0000000000000000000000000000000000000000 08cc1f13f1d655a7353040edb359c7f3ab7f8bd4 Paul Bonaud <paul.bonaud@fretlink.com> 1555165928 +0200 branch: Created from master | ||
2 | 08cc1f13f1d655a7353040edb359c7f3ab7f8bd4 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 @@ | |||
1 | 0000000000000000000000000000000000000000 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 | |
2 | f37efccc1cef20309de28bfbdd16d0c4afb9d550 85e04b1eb1a721d42db51d49e49dfeb8255a5741 Mindaugas MozĊĞras <mindaugas.mozuras@gmail.com> 1456673985 +0200 commit (amend): Initial commit | ||
3 | 85e04b1eb1a721d42db51d49e49dfeb8255a5741 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 @@ | |||
1 | xA | ||
2 | Â0E]ç³dĜ·b2`°µÒLÑ[½ğ˙>ÇçiĞv£³pĜvè\i=Ċ>ħCJÉúÒÇ$4OċĦà)8àµ$fêiÍ>$áÎZ$ğ.ûLôɢ·i+Í÷ÁeŞÚà8ŝhżtn*°:+ßEwYN`÷½ ]°Ehĝ÷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 @@ | |||
1 | xÎA a×bö& 1Ĉ [1ÓĜĜZSèŭ½ğ÷o<^ĉylğtjĞ=,ZÛlbÉĊbĊÁiî}RZċŬÀö6°)Ñ-fao&#SĦ°[ĥö\VxúÚ*ÜħU¸ÌGuċW·Údvsä´ÈCm ĈpÖ½Ö·MŝuRqġĠ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 @@ | |||
xK0gSô>Z[$'ÈôéĈfl+È2sŭ19Bġġ*×u;D_½1XĴ½Í6 BmÀìX8xÍFgP½búµh#şX˘èK2²Ê¨âѧÚàuGÛëkz4îËĵŭ^s]żAĥê\ÏÎÎÔ½vyáŝĉ>Á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 @@ | |||
1 | xÍ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ÑÑRRÛ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 @@ | |||
1 | xÎK | ||
2 | Â0 aÇYĊċ&iÒD:è"nĤNş%×á;pvĝ?ÇSÁùİn1ĵ Ğ8˘SfÎË^ | ||
3 | ÚıÉI=£½>ÊcZí3=a,ÇûµµqÉ?ër9öF·9SZ:_òx/%*cp3JDÖ´=¨ñ-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 @@ | |||
1 | 37018e429ad00f0ec961bd218e3dfa6a6e8cc05b | ||
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 @@ | |||
1 | function HelloWorld(name) | ||
2 | { | ||
3 | if (foo) foo++; | ||
4 | alert(name); | ||
5 | } | ||
6 | |||
7 | function 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 | |||
3 | module Pronto | ||
4 | ( | ||
5 | sayHello | ||
6 | ) where | ||
7 | |||
8 | import Data.Text (Text) | ||
9 | |||
10 | sayHello :: Text -> String | ||
11 | sayHello 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 @@ | |||
1 | function 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 | |||
3 | require 'spec_helper' | ||
4 | |||
5 | module 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 | ||
163 | end | ||
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 | |||
3 | require 'spec_helper' | ||
4 | |||
5 | module 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 | ||
138 | end | ||
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 | ||
3 | require 'fileutils' | 3 | require 'fileutils' |
4 | require 'byebug' | ||
5 | require 'rspec' | 4 | require 'rspec' |
6 | require 'pronto/eslint_npm' | 5 | require '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 |
28 | end | 27 | end |