renegade 0.0.1 → 0.1.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/renegade.rb +6 -5
- data/lib/renegade/branch_name.rb +40 -0
- data/lib/renegade/commit_message.rb +74 -22
- data/lib/renegade/conflict_markers.rb +33 -0
- data/lib/renegade/handle_errors.rb +39 -0
- data/lib/renegade/linters.rb +69 -0
- data/lib/renegade/pre_commit.rb +36 -0
- data/lib/renegade/prepare_commit_message.rb +28 -0
- data/lib/renegade/status.rb +30 -19
- data/lib/renegade/version.rb +4 -0
- metadata +46 -12
- data/lib/renegade/checks/branch_names.rb +0 -20
- data/lib/renegade/checks/lint.rb +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ade5a344f1baff35eaaaadd7d0c7145d69eae41a
|
4
|
+
data.tar.gz: a9a9d80519950b55b9ba777ea6ca8cdf50e40bee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5ecd738fff4c3c4641e8b7247ab94abf4b03381c7a044a8b31eb362a10b34134b147f74fd766f30fc01ad8dded1e6432dfa9724536a949267e5e78f4af97be86
|
7
|
+
data.tar.gz: b85a93764724822c908c8eda2842f7840b725536541a7e9decc26b90887a8a272dc169cb366a9e1b4e8bba73ffaf9a3c026b47f0dae360f8481519d621dc0395
|
data/lib/renegade.rb
CHANGED
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'renegade/status'
|
2
|
+
|
3
|
+
module Renegade
|
4
|
+
##
|
5
|
+
# Verify branch name
|
6
|
+
class BranchName
|
7
|
+
attr_reader :errors, :warnings
|
8
|
+
|
9
|
+
REGEX_STORY_BRANCH = /^(?:story)-(\d{4,6})-?(.*)?$/
|
10
|
+
REGEX_BUG_BRANCH = /^(?:bug)-(\d{4,6})-?(.*)?$/
|
11
|
+
|
12
|
+
def initialize(label)
|
13
|
+
# Instance variables
|
14
|
+
@label = label
|
15
|
+
@warnings = []
|
16
|
+
@errors = []
|
17
|
+
end
|
18
|
+
|
19
|
+
def run
|
20
|
+
branch_name = `git name-rev --name-only HEAD`
|
21
|
+
|
22
|
+
Status.report(@label, check_branch_name(branch_name))
|
23
|
+
end
|
24
|
+
|
25
|
+
def check_branch_name(branch_name)
|
26
|
+
if REGEX_STORY_BRANCH.match(branch_name)
|
27
|
+
# placeholder
|
28
|
+
return true
|
29
|
+
elsif REGEX_BUG_BRANCH.match(branch_name)
|
30
|
+
# placeholder
|
31
|
+
return true
|
32
|
+
else
|
33
|
+
@warnings.push('Branches must start with bug-##### or story-#####.')
|
34
|
+
@warnings.push('You may continue to develop in this branch, but you'\
|
35
|
+
' will not be allowed to merge unless you rename it.')
|
36
|
+
return false
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -1,22 +1,74 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
#
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
#
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
1
|
+
require 'renegade/status'
|
2
|
+
|
3
|
+
module Renegade
|
4
|
+
# Check commit messages meet certain criteria
|
5
|
+
class CommitMessage
|
6
|
+
attr_reader :errors, :warnings
|
7
|
+
|
8
|
+
COMMIT_FORMAT = /^(?:(?:BugId: |Story: B+-|Epic: E-0)[1-9]\d* \| )(.*)/
|
9
|
+
|
10
|
+
def initialize(label)
|
11
|
+
# Instance variables
|
12
|
+
@label = label
|
13
|
+
@warnings = []
|
14
|
+
@errors = []
|
15
|
+
|
16
|
+
@min_length = 7
|
17
|
+
@max_length = 50
|
18
|
+
end
|
19
|
+
|
20
|
+
def run(message)
|
21
|
+
check_commit_message_format(message)
|
22
|
+
check_commit_message_non_ascii(message)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Check message length
|
26
|
+
def check_commit_message_length(message)
|
27
|
+
check_label = 'Commit message length'
|
28
|
+
|
29
|
+
if message.length >= @min_length && message.length <= @max_length
|
30
|
+
Status.report(check_label, true)
|
31
|
+
else
|
32
|
+
@errors.push "Commit messages should be between #{@min_length} "\
|
33
|
+
"and #{@max_length} characters."
|
34
|
+
Status.report(check_label, false)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Check commit message contains no non-ASCII characters
|
39
|
+
def check_commit_message_non_ascii(message)
|
40
|
+
check_label = 'Only ASCII characters'
|
41
|
+
|
42
|
+
if message.ascii_only?
|
43
|
+
Status.report(check_label, true)
|
44
|
+
else
|
45
|
+
Status.report(check_label, false)
|
46
|
+
@errors.push('Commit messages may not contain non-ASCII characters')
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def check_commit_message_format_error
|
51
|
+
'You must include a valid BugId, Story or Epic number.' + "\n"\
|
52
|
+
' Examples:' + "\n"\
|
53
|
+
' - BugId: 12345 | Helpful comment describing bug fix' + "\n"\
|
54
|
+
' - Story: B-12345 | Helpful comment describing story' + "\n"\
|
55
|
+
' - Epic: E-12345 | Epic comment'
|
56
|
+
end
|
57
|
+
|
58
|
+
# Check commit message contains no non-ASCII characters
|
59
|
+
def check_commit_message_format(message)
|
60
|
+
check_label = 'Includes a valid BugId, Story or Epic number'
|
61
|
+
|
62
|
+
matches = COMMIT_FORMAT.match(message)
|
63
|
+
|
64
|
+
if matches
|
65
|
+
Status.report(check_label, true)
|
66
|
+
check_commit_message_length(matches[1])
|
67
|
+
else
|
68
|
+
Status.report(check_label, false)
|
69
|
+
check_commit_message_length(message)
|
70
|
+
@errors.push(check_commit_message_format_error)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'open3'
|
2
|
+
require 'renegade/status'
|
3
|
+
|
4
|
+
module Renegade
|
5
|
+
##
|
6
|
+
# Prevent merge artifacts from getting committed
|
7
|
+
class ConflictMarkers
|
8
|
+
attr_reader :errors, :warnings
|
9
|
+
|
10
|
+
def initialize(label)
|
11
|
+
# Instance variables
|
12
|
+
@label = label
|
13
|
+
@errors = []
|
14
|
+
end
|
15
|
+
|
16
|
+
def run
|
17
|
+
markers = `git diff-index --check --cached HEAD --`
|
18
|
+
|
19
|
+
check_markers(markers.chomp.strip)
|
20
|
+
end
|
21
|
+
|
22
|
+
def check_markers(markers)
|
23
|
+
check_label = 'No merge artifacts'
|
24
|
+
|
25
|
+
if markers == ''
|
26
|
+
Status.report(check_label, true)
|
27
|
+
else
|
28
|
+
Status.report(check_label, false)
|
29
|
+
@errors.push('Merge artifacts were found!' + "\n" + markers)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Renegade
|
2
|
+
##
|
3
|
+
# Handle errors
|
4
|
+
class HandleErrors
|
5
|
+
# Handle errors if they exist
|
6
|
+
def self.handle_errors(errors)
|
7
|
+
if errors.size > 0
|
8
|
+
print_errors(errors)
|
9
|
+
exit 1
|
10
|
+
else
|
11
|
+
exit 0
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.handle_warnings(warnings)
|
16
|
+
print_warnings(warnings) if warnings.size > 0
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.print_errors(errors)
|
20
|
+
puts "\nErrors:"
|
21
|
+
|
22
|
+
errors.each do |error|
|
23
|
+
puts "- #{error}"
|
24
|
+
end
|
25
|
+
|
26
|
+
puts "\n"
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.print_warnings(warnings)
|
30
|
+
puts "\nWarnings:"
|
31
|
+
|
32
|
+
warnings.each do |warning|
|
33
|
+
puts "- #{warning}"
|
34
|
+
end
|
35
|
+
|
36
|
+
puts "\n"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'open3'
|
2
|
+
require 'renegade/status'
|
3
|
+
|
4
|
+
module Renegade
|
5
|
+
# Run linters
|
6
|
+
class Linters
|
7
|
+
attr_reader :errors
|
8
|
+
|
9
|
+
def initialize(label, extension, exec_command)
|
10
|
+
# Instance variables
|
11
|
+
@label = label
|
12
|
+
@extension = extension
|
13
|
+
@exec_command = exec_command
|
14
|
+
@errors = []
|
15
|
+
end
|
16
|
+
|
17
|
+
def run(files)
|
18
|
+
files = filter_files(files)
|
19
|
+
append_file_count(files)
|
20
|
+
|
21
|
+
# Only run check if there are relevant files being committed
|
22
|
+
if files.size == 0
|
23
|
+
Status.report(@label, true)
|
24
|
+
else
|
25
|
+
Status.report(@label, exec(files))
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Add the file count to the end of the label
|
30
|
+
def append_file_count(files)
|
31
|
+
file_size = files.size
|
32
|
+
|
33
|
+
if file_size == 0 || file_size > 1
|
34
|
+
@label = "#{@label} (#{file_size} files)"
|
35
|
+
else
|
36
|
+
@label = "#{@label} (1 file)"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def exec(files)
|
41
|
+
# http://stackoverflow.com/questions/690151/getting-output-of-system-calls-in-ruby
|
42
|
+
_stdin, stdout, stderr,
|
43
|
+
wait_thread = Open3.popen3(@exec_command, files.join(' '))
|
44
|
+
|
45
|
+
if wait_thread.value.exitstatus == 1
|
46
|
+
@errors.push(stdout.read)
|
47
|
+
end
|
48
|
+
|
49
|
+
stdout.gets(nil)
|
50
|
+
stdout.close
|
51
|
+
stderr.gets(nil)
|
52
|
+
stderr.close
|
53
|
+
|
54
|
+
wait_thread.value.exitstatus == 0
|
55
|
+
end
|
56
|
+
|
57
|
+
def filter_files(file_list)
|
58
|
+
filtered_files = []
|
59
|
+
|
60
|
+
file_list.each do |file|
|
61
|
+
if File.extname(file) == @extension
|
62
|
+
filtered_files.push(file)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
filtered_files
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'renegade/handle_errors'
|
2
|
+
require 'renegade/status'
|
3
|
+
require 'renegade/linters'
|
4
|
+
require 'renegade/branch_name'
|
5
|
+
require 'renegade/conflict_markers'
|
6
|
+
|
7
|
+
module Renegade
|
8
|
+
# Run linters
|
9
|
+
class PreCommit
|
10
|
+
def initialize
|
11
|
+
Renegade::Status.hook_start('pre-commit')
|
12
|
+
# @scss_lint = Renegade::Linters.new('SCSS Lint', '.scss', 'scss-lint')
|
13
|
+
# @eslint = Renegade::Linters.new('ESLint', '.js', 'eslint')
|
14
|
+
@branch_name = Renegade::BranchName.new('Branch Name')
|
15
|
+
@conflict_markers = Renegade::ConflictMarkers.new('Conflict Markers')
|
16
|
+
# @protected_files = Renegade::ProtectedFiles.new('Protected Files')
|
17
|
+
|
18
|
+
run
|
19
|
+
end
|
20
|
+
|
21
|
+
def run
|
22
|
+
# @scss_lint.run
|
23
|
+
# @eslint.run
|
24
|
+
@branch_name.run
|
25
|
+
@conflict_markers.run
|
26
|
+
# @protected_files.run
|
27
|
+
|
28
|
+
Renegade::HandleErrors.handle_warnings(@branch_name.warnings)
|
29
|
+
Renegade::HandleErrors.handle_errors(@conflict_markers.errors)
|
30
|
+
|
31
|
+
# Renegade::HandleErrors.handle_errors(
|
32
|
+
# @scss_lint.errors + @eslint.errors +
|
33
|
+
# @branch_name.errors + @protected_files.errors)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'renegade/handle_errors'
|
2
|
+
require 'renegade/status'
|
3
|
+
require 'renegade/commit_message'
|
4
|
+
|
5
|
+
module Renegade
|
6
|
+
# Run linters
|
7
|
+
class PrepareCommitMessage
|
8
|
+
def initialize
|
9
|
+
Renegade::Status.hook_start('prepare-commit-msg')
|
10
|
+
run
|
11
|
+
end
|
12
|
+
|
13
|
+
def run
|
14
|
+
message_type = ARGV[1]
|
15
|
+
|
16
|
+
commit_message = Renegade::CommitMessage.new('Commit Message')
|
17
|
+
|
18
|
+
# Avoid checking merges
|
19
|
+
if message_type == 'message'
|
20
|
+
message_file = ARGV[0]
|
21
|
+
message = File.read(message_file)
|
22
|
+
commit_message.run(message)
|
23
|
+
end
|
24
|
+
|
25
|
+
Renegade::HandleErrors.handle_errors(commit_message.errors)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/renegade/status.rb
CHANGED
@@ -1,19 +1,30 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
|
4
|
-
#
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
#
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
#
|
13
|
-
|
14
|
-
|
15
|
-
#
|
16
|
-
|
17
|
-
#
|
18
|
-
|
19
|
-
|
1
|
+
# Add color options
|
2
|
+
class String
|
3
|
+
def red
|
4
|
+
"\e[31m#{self}\e[0m"
|
5
|
+
end
|
6
|
+
|
7
|
+
def green
|
8
|
+
"\e[32m#{self}\e[0m"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
# Define string colors
|
13
|
+
module Renegade
|
14
|
+
##
|
15
|
+
# Report statuses
|
16
|
+
class Status
|
17
|
+
# Report labels
|
18
|
+
def self.report(label, passed)
|
19
|
+
if passed
|
20
|
+
puts " √ #{label}".green
|
21
|
+
else
|
22
|
+
puts " × #{label}".red
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.hook_start(hook)
|
27
|
+
puts "\nRunning #{hook} hooks…"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
metadata
CHANGED
@@ -1,41 +1,75 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: renegade
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.29
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- ratherblue
|
8
8
|
autorequire:
|
9
|
-
bindir:
|
9
|
+
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-02-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: rake
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
20
|
-
type: :
|
19
|
+
version: '10.0'
|
20
|
+
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '10.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: minitest
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rubocop
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.35.1
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.35.1
|
27
55
|
description: Gem description
|
28
|
-
email:
|
56
|
+
email:
|
57
|
+
- ratherblue@gmail.com
|
29
58
|
executables: []
|
30
59
|
extensions: []
|
31
60
|
extra_rdoc_files: []
|
32
61
|
files:
|
33
62
|
- lib/renegade.rb
|
34
|
-
- lib/renegade/
|
35
|
-
- lib/renegade/checks/lint.rb
|
63
|
+
- lib/renegade/branch_name.rb
|
36
64
|
- lib/renegade/commit_message.rb
|
65
|
+
- lib/renegade/conflict_markers.rb
|
66
|
+
- lib/renegade/handle_errors.rb
|
67
|
+
- lib/renegade/linters.rb
|
68
|
+
- lib/renegade/pre_commit.rb
|
69
|
+
- lib/renegade/prepare_commit_message.rb
|
37
70
|
- lib/renegade/status.rb
|
38
|
-
|
71
|
+
- lib/renegade/version.rb
|
72
|
+
homepage: https://github.com/ratherblue/renegade
|
39
73
|
licenses:
|
40
74
|
- Apache 2.0
|
41
75
|
metadata: {}
|
@@ -1,20 +0,0 @@
|
|
1
|
-
# module Renegade
|
2
|
-
# ##
|
3
|
-
# # Validate class names
|
4
|
-
# class BranchNames
|
5
|
-
# REGEX_STORY_BRANCH = /^(?:story)-(\d{4,6})?-?(.*)?$/
|
6
|
-
# REGEX_BUG_BRANCH = /^(?:bug)-(\d{4,6})?-?(.*)?$/
|
7
|
-
#
|
8
|
-
# def self.check_branch_name(branch_name)
|
9
|
-
# if REGEX_STORY_BRANCH.match(branch_name)
|
10
|
-
# # placeholder
|
11
|
-
# return true
|
12
|
-
# elsif REGEX_BUG_BRANCH.match(branch_name)
|
13
|
-
# # placeholder
|
14
|
-
# return true
|
15
|
-
# else
|
16
|
-
# return false
|
17
|
-
# end
|
18
|
-
# end
|
19
|
-
# end
|
20
|
-
# end
|
data/lib/renegade/checks/lint.rb
DELETED