sfb_scripts 1.9.0 → 2.0.0
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
- metadata +6 -31
- data/lib/sfb_scripts/bundler/bundle_manager.rb +0 -59
- data/lib/sfb_scripts/dependency_loader.rb +0 -22
- data/lib/sfb_scripts/folder_guard.rb +0 -11
- data/lib/sfb_scripts/hook_manager.rb +0 -36
- data/lib/sfb_scripts/hooks/pre_push_hook.rb +0 -31
- data/lib/sfb_scripts/migrations/migrator.rb +0 -42
- data/lib/sfb_scripts/monkey_patches/string_extension.rb +0 -22
- data/lib/sfb_scripts/needs_manager.rb +0 -94
- data/lib/sfb_scripts/repositories/active_repo.rb +0 -60
- data/lib/sfb_scripts/repositories/lazy_repo.rb +0 -16
- data/lib/sfb_scripts/repositories/repo.rb +0 -70
- data/lib/sfb_scripts/shells/loud_shell_runner.rb +0 -7
- data/lib/sfb_scripts/shells/shell_runner.rb +0 -88
- data/lib/sfb_scripts/shells/verbose_shell_runner.rb +0 -8
- data/lib/sfb_scripts/test_running/status_checker.rb +0 -62
- data/lib/sfb_scripts/test_running/status_test_runner.rb +0 -41
- data/lib/sfb_scripts/test_running/test_case.rb +0 -38
- data/lib/sfb_scripts/test_running/test_collection.rb +0 -97
- data/lib/sfb_scripts/test_running/test_filter.rb +0 -15
- data/lib/sfb_scripts/test_running/test_finder.rb +0 -70
- data/lib/sfb_scripts/test_running/test_runner.rb +0 -121
- data/lib/sfb_scripts/tester.rb +0 -44
- data/lib/sfb_scripts/upper.rb +0 -93
- data/lib/sfb_scripts/version.rb +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a4146f286959b332098dde53e71bb82ec044b97e
|
4
|
+
data.tar.gz: 2d5a529036e5af8cc65dbd45a2a96c68cea21b4e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 458eb666e7f48ed93e9b9db28e1506a1b8a793ae9f983e402866766aca856c0309ea61dba8da1f6f0dec25fb0b8db7cb714e4ec7e6aa320fa20830664637df83
|
7
|
+
data.tar.gz: d23e50573381d2a6526931af2293e27e43e95f98ab8dafdd2888ec8f64cc312510c1b959ceadbf6e369d7dc7ac167715249bd6c91eabc1e4bece917f1b928f7e
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sfb_scripts
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pete Kinnecom
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-09-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: app_up
|
@@ -30,45 +30,21 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - '='
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 1.0.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - '='
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 1.0.0
|
41
41
|
description: Easily update your rails app and run tests from command line
|
42
42
|
email:
|
43
43
|
- pete.kinnecom@gmail.com
|
44
44
|
executables: []
|
45
45
|
extensions: []
|
46
46
|
extra_rdoc_files: []
|
47
|
-
files:
|
48
|
-
- lib/sfb_scripts/bundler/bundle_manager.rb
|
49
|
-
- lib/sfb_scripts/dependency_loader.rb
|
50
|
-
- lib/sfb_scripts/folder_guard.rb
|
51
|
-
- lib/sfb_scripts/hook_manager.rb
|
52
|
-
- lib/sfb_scripts/hooks/pre_push_hook.rb
|
53
|
-
- lib/sfb_scripts/migrations/migrator.rb
|
54
|
-
- lib/sfb_scripts/monkey_patches/string_extension.rb
|
55
|
-
- lib/sfb_scripts/needs_manager.rb
|
56
|
-
- lib/sfb_scripts/repositories/active_repo.rb
|
57
|
-
- lib/sfb_scripts/repositories/lazy_repo.rb
|
58
|
-
- lib/sfb_scripts/repositories/repo.rb
|
59
|
-
- lib/sfb_scripts/shells/loud_shell_runner.rb
|
60
|
-
- lib/sfb_scripts/shells/shell_runner.rb
|
61
|
-
- lib/sfb_scripts/shells/verbose_shell_runner.rb
|
62
|
-
- lib/sfb_scripts/test_running/status_checker.rb
|
63
|
-
- lib/sfb_scripts/test_running/status_test_runner.rb
|
64
|
-
- lib/sfb_scripts/test_running/test_case.rb
|
65
|
-
- lib/sfb_scripts/test_running/test_collection.rb
|
66
|
-
- lib/sfb_scripts/test_running/test_filter.rb
|
67
|
-
- lib/sfb_scripts/test_running/test_finder.rb
|
68
|
-
- lib/sfb_scripts/test_running/test_runner.rb
|
69
|
-
- lib/sfb_scripts/tester.rb
|
70
|
-
- lib/sfb_scripts/upper.rb
|
71
|
-
- lib/sfb_scripts/version.rb
|
47
|
+
files: []
|
72
48
|
homepage: http://github.com/petekinnecom/sfb_scripts/
|
73
49
|
licenses:
|
74
50
|
- MIT
|
@@ -89,9 +65,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
89
65
|
version: '0'
|
90
66
|
requirements: []
|
91
67
|
rubyforge_project:
|
92
|
-
rubygems_version: 2.4.
|
68
|
+
rubygems_version: 2.4.5.1
|
93
69
|
signing_key:
|
94
70
|
specification_version: 4
|
95
71
|
summary: Easily update your rails app and run tests from command line
|
96
72
|
test_files: []
|
97
|
-
has_rdoc:
|
@@ -1,59 +0,0 @@
|
|
1
|
-
class BundleManager
|
2
|
-
attr_accessor :shell, :repo, :queue, :folder_guard
|
3
|
-
|
4
|
-
def initialize(repo: raise, shell: raise, queue: raise, folder_guard: folder_guard)
|
5
|
-
@shell = shell
|
6
|
-
@repo = repo
|
7
|
-
@queue = queue
|
8
|
-
@folder_guard = folder_guard
|
9
|
-
end
|
10
|
-
|
11
|
-
def bundle_where_necessary
|
12
|
-
shell.notify "\nBundling:"
|
13
|
-
directories_to_bundle.each do |dir|
|
14
|
-
queue.enqueue_b do
|
15
|
-
bundle(dir)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
queue.join
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
def bundle(gemfile_directory)
|
24
|
-
begin
|
25
|
-
shell.run "bundle install --local", dir: gemfile_directory
|
26
|
-
rescue ShellRunner::CommandFailureError
|
27
|
-
puts 'trying without --local'
|
28
|
-
shell.run "bundle install", dir: gemfile_directory
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def directories_to_bundle
|
33
|
-
changed_gemfile_locks.map do |gemfile_lock|
|
34
|
-
directory_of(gemfile_lock)
|
35
|
-
end
|
36
|
-
.select do |dir|
|
37
|
-
folder_guard.allowed?(dir)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def changed_gemfile_locks
|
42
|
-
all_gemfile_locks.select do |gemfile_lock|
|
43
|
-
repo.changed?(gemfile_lock)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def all_gemfile_locks
|
48
|
-
find("Gemfile.lock")
|
49
|
-
end
|
50
|
-
|
51
|
-
def find(file_name)
|
52
|
-
Dir.glob("**/#{file_name}")
|
53
|
-
end
|
54
|
-
|
55
|
-
def directory_of(file_path)
|
56
|
-
File.dirname(file_path)
|
57
|
-
end
|
58
|
-
|
59
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
require 'work_queue'
|
2
|
-
|
3
|
-
# this is a bummer...
|
4
|
-
require_relative 'monkey_patches/string_extension'
|
5
|
-
require_relative 'bundler/bundle_manager'
|
6
|
-
require_relative 'hooks/pre_push_hook'
|
7
|
-
require_relative 'hook_manager'
|
8
|
-
require_relative 'migrations/migrator'
|
9
|
-
require_relative 'repositories/repo'
|
10
|
-
require_relative 'repositories/active_repo'
|
11
|
-
require_relative 'repositories/lazy_repo'
|
12
|
-
require_relative 'shells/shell_runner'
|
13
|
-
require_relative 'shells/loud_shell_runner'
|
14
|
-
require_relative 'shells/verbose_shell_runner'
|
15
|
-
require_relative 'test_running/status_checker'
|
16
|
-
require_relative 'test_running/test_case'
|
17
|
-
require_relative 'test_running/test_collection'
|
18
|
-
require_relative 'test_running/status_test_runner'
|
19
|
-
require_relative 'test_running/test_runner'
|
20
|
-
require_relative 'test_running/test_finder'
|
21
|
-
require_relative 'test_running/test_filter'
|
22
|
-
require_relative 'folder_guard'
|
@@ -1,36 +0,0 @@
|
|
1
|
-
class HookManager
|
2
|
-
|
3
|
-
def self.install!(env)
|
4
|
-
new(env).install!
|
5
|
-
end
|
6
|
-
|
7
|
-
attr_reader :shell, :repo
|
8
|
-
|
9
|
-
def initialize(env)
|
10
|
-
@shell = env[:shell]
|
11
|
-
@repo = env[:repo]
|
12
|
-
end
|
13
|
-
|
14
|
-
def is_installed?
|
15
|
-
File.file?('.git/hooks/pre-push')
|
16
|
-
end
|
17
|
-
|
18
|
-
def install!
|
19
|
-
return if is_installed?
|
20
|
-
|
21
|
-
create_file
|
22
|
-
make_executable
|
23
|
-
end
|
24
|
-
|
25
|
-
private
|
26
|
-
|
27
|
-
def create_file
|
28
|
-
shell.run %{echo 'app_up pre_push_hook "$(ps -ocommand= -p $PPID)"' > .git/hooks/pre-push}
|
29
|
-
shell.run %{echo 'test_runner status_check --confirm_exit_status' > .git/hooks/pre-commit}
|
30
|
-
end
|
31
|
-
|
32
|
-
def make_executable
|
33
|
-
shell.run "chmod +x .git/hooks/pre-push"
|
34
|
-
shell.run "chmod +x .git/hooks/pre-commit"
|
35
|
-
end
|
36
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
class PrePushHook
|
2
|
-
|
3
|
-
def self.check(command, env)
|
4
|
-
new(command, env).check
|
5
|
-
end
|
6
|
-
|
7
|
-
attr_reader :shell, :repo, :push_command
|
8
|
-
def initialize(command, env)
|
9
|
-
@shell = env[:shell]
|
10
|
-
@repo = env[:repo]
|
11
|
-
@push_command = command
|
12
|
-
end
|
13
|
-
|
14
|
-
def check
|
15
|
-
if affects_master? && is_destructive?
|
16
|
-
shell.warn "[Policy] Don't force push or delete master. (Denied by pre-push hook)"
|
17
|
-
exit 1
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
def affects_master?
|
24
|
-
push_command.match(/master/) || (repo.current_branch == 'master')
|
25
|
-
end
|
26
|
-
|
27
|
-
def is_destructive?
|
28
|
-
push_command.match(/-f|delete|force| :master/)
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
class Migrator
|
2
|
-
attr_accessor :shell, :repo, :queue, :folder_guard, :drop_dbs
|
3
|
-
|
4
|
-
def initialize(repo:, shell:, queue:, folder_guard:, drop_dbs: false)
|
5
|
-
@shell = shell
|
6
|
-
@repo = repo
|
7
|
-
@queue = queue
|
8
|
-
@drop_dbs = drop_dbs
|
9
|
-
@folder_guard = folder_guard
|
10
|
-
end
|
11
|
-
|
12
|
-
def migrate_where_necessary
|
13
|
-
shell.notify "\nMigrating:"
|
14
|
-
migrations.each do |migration|
|
15
|
-
queue.enqueue_b do
|
16
|
-
shell.run "RAILS_ENV=#{migration[:env]} bundle exec rake #{drop_dbs ? 'db:drop' : ''} db:create 2> /dev/null;\n RAILS_ENV=#{migration[:env]} bundle exec rake db:migrate", dir: migration[:dir]
|
17
|
-
end
|
18
|
-
end
|
19
|
-
queue.join
|
20
|
-
end
|
21
|
-
|
22
|
-
def directories_to_migrate
|
23
|
-
migrate_dirs = repo.files_changed.select {|f| f.match("/migrate/") }.map {|f| File.dirname(f) }.map {|dir| dir.gsub(/\/db\/migrate$/, '')}.uniq
|
24
|
-
migrate_dirs.select {|d| folder_guard.allowed?(d) };
|
25
|
-
end
|
26
|
-
|
27
|
-
private
|
28
|
-
|
29
|
-
def migrations
|
30
|
-
directories_to_migrate.map do |dir|
|
31
|
-
[
|
32
|
-
{env: "development",dir: dir},
|
33
|
-
{env: "test", dir: dir}
|
34
|
-
]
|
35
|
-
end.flatten
|
36
|
-
end
|
37
|
-
|
38
|
-
def in_rack_application?(migrate_dir)
|
39
|
-
folder_guard.allowed?(migrate_dir)
|
40
|
-
end
|
41
|
-
|
42
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
class String
|
2
|
-
# colorization
|
3
|
-
def colorize(color_code)
|
4
|
-
"\e[#{color_code}m#{self}\e[0m"
|
5
|
-
end
|
6
|
-
|
7
|
-
def red
|
8
|
-
colorize(31)
|
9
|
-
end
|
10
|
-
|
11
|
-
def green
|
12
|
-
colorize(32)
|
13
|
-
end
|
14
|
-
|
15
|
-
def yellow
|
16
|
-
colorize(33)
|
17
|
-
end
|
18
|
-
|
19
|
-
def pink
|
20
|
-
colorize(35)
|
21
|
-
end
|
22
|
-
end
|
@@ -1,94 +0,0 @@
|
|
1
|
-
require_relative 'dependency_loader'
|
2
|
-
|
3
|
-
class NeedsManager
|
4
|
-
|
5
|
-
BUNDLER_MAX_THREAD_COUNT = 4
|
6
|
-
MIGRATOR_MAX_THREAD_COUNT = 8
|
7
|
-
|
8
|
-
def self.configure(task, needs, options)
|
9
|
-
new(task, needs, options).configure
|
10
|
-
end
|
11
|
-
|
12
|
-
attr_reader :needs, :options, :env, :log_file
|
13
|
-
def initialize(task, needs, options)
|
14
|
-
@log_file = log_file_for(task)
|
15
|
-
@needs = needs
|
16
|
-
# symbolize_keys
|
17
|
-
@options = options.inject({}){|results,(k,v)| results[k.to_sym] = v; results}
|
18
|
-
@env = {}
|
19
|
-
end
|
20
|
-
|
21
|
-
def configure
|
22
|
-
set_working_directory
|
23
|
-
|
24
|
-
create_shell
|
25
|
-
create_folder_guard
|
26
|
-
|
27
|
-
create_repo if needs.include? :repo
|
28
|
-
create_bundler if needs.include? :bundler
|
29
|
-
create_migrator if needs.include? :migrator
|
30
|
-
create_test_runner if needs.include? :test_runner
|
31
|
-
|
32
|
-
return env
|
33
|
-
end
|
34
|
-
|
35
|
-
def set_working_directory
|
36
|
-
@working_directory = Repo.root_dir
|
37
|
-
Dir.chdir(@working_directory)
|
38
|
-
end
|
39
|
-
|
40
|
-
def create_shell
|
41
|
-
env[:shell] = shell_class.new(log_file, @working_directory)
|
42
|
-
end
|
43
|
-
|
44
|
-
def shell_class
|
45
|
-
if options[:verbose]
|
46
|
-
VerboseShellRunner
|
47
|
-
elsif options[:loud]
|
48
|
-
LoudShellRunner
|
49
|
-
else
|
50
|
-
ShellRunner
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def create_folder_guard
|
55
|
-
denied_folders = options[:ignore] || []
|
56
|
-
env[:folder_guard] = FolderGuard.new(denied_folders)
|
57
|
-
end
|
58
|
-
|
59
|
-
def create_repo
|
60
|
-
env[:repo] = repo_class.new(shell: env[:shell])
|
61
|
-
end
|
62
|
-
|
63
|
-
def repo_class
|
64
|
-
if options[:repo_type] == :active
|
65
|
-
ActiveRepo
|
66
|
-
elsif options[:repo_type] == :lazy
|
67
|
-
LazyRepo
|
68
|
-
else
|
69
|
-
Repo
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
def create_bundler
|
74
|
-
queue = WorkQueue.new(BUNDLER_MAX_THREAD_COUNT, nil)
|
75
|
-
env[:bundler] = BundleManager.new(shell: env[:shell], repo: env[:repo], queue: queue, folder_guard: env[:folder_guard])
|
76
|
-
end
|
77
|
-
|
78
|
-
def create_migrator
|
79
|
-
queue = WorkQueue.new(MIGRATOR_MAX_THREAD_COUNT, nil)
|
80
|
-
env[:migrator] = Migrator.new(shell: env[:shell], repo: env[:repo], queue: queue, folder_guard: env[:folder_guard], drop_dbs: options[:reset])
|
81
|
-
end
|
82
|
-
|
83
|
-
def create_test_runner
|
84
|
-
env[:test_runner] = TestRunner.new(
|
85
|
-
shell: env[:shell],
|
86
|
-
all_engines: options[:all_engines],
|
87
|
-
always_ask_before_grouping_tests: options[:timid]
|
88
|
-
)
|
89
|
-
end
|
90
|
-
|
91
|
-
def log_file_for(task)
|
92
|
-
"/tmp/#{task}.log"
|
93
|
-
end
|
94
|
-
end
|
@@ -1,60 +0,0 @@
|
|
1
|
-
class ActiveRepo < Repo
|
2
|
-
|
3
|
-
def alter!(git_command)
|
4
|
-
shell.notify "\nUpdating repo state:"
|
5
|
-
up do
|
6
|
-
# will raise an error with merge conflicts
|
7
|
-
begin
|
8
|
-
shell.run "git #{git_command}"
|
9
|
-
rescue ShellRunner::CommandFailureError
|
10
|
-
puts "Unable to rebase. Maybe you need to stash local changes, or there are rebase conflicts"
|
11
|
-
exit
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def up_master!
|
17
|
-
move_to_master!
|
18
|
-
rebase_on_master!
|
19
|
-
end
|
20
|
-
|
21
|
-
def up
|
22
|
-
old_sha = current_sha
|
23
|
-
yield
|
24
|
-
|
25
|
-
set_files_changed(old_sha)
|
26
|
-
end
|
27
|
-
|
28
|
-
def set_files_changed(old_sha)
|
29
|
-
shell.notify "\nIdentifying changed files:"
|
30
|
-
@files_changed = (shell.run "git diff --name-only #{old_sha}").split("\n")
|
31
|
-
end
|
32
|
-
|
33
|
-
def files_changed
|
34
|
-
@files_changed
|
35
|
-
end
|
36
|
-
|
37
|
-
def pull_origin_master!
|
38
|
-
up do
|
39
|
-
fetch_origin
|
40
|
-
reset_hard_origin_master!
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def compare_with_reflog
|
45
|
-
old_sha = shell.run "git rev-parse HEAD@{2}"
|
46
|
-
set_files_changed(old_sha)
|
47
|
-
end
|
48
|
-
|
49
|
-
def fetch_origin
|
50
|
-
shell.run 'git fetch origin'
|
51
|
-
end
|
52
|
-
|
53
|
-
def reset_hard_origin_master!
|
54
|
-
shell.run "git reset --hard origin/master"
|
55
|
-
end
|
56
|
-
|
57
|
-
def move_to_master!
|
58
|
-
shell.run "git checkout master"
|
59
|
-
end
|
60
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
class LazyRepo < Repo
|
2
|
-
|
3
|
-
def initialize(*args)
|
4
|
-
super
|
5
|
-
set_all_files
|
6
|
-
end
|
7
|
-
|
8
|
-
def files_changed
|
9
|
-
@all_files
|
10
|
-
end
|
11
|
-
|
12
|
-
def set_all_files
|
13
|
-
shell.notify "\nIdentifying all files:"
|
14
|
-
@all_files = shell.run("git ls-tree --full-tree -r HEAD --name-only").split("\n")
|
15
|
-
end
|
16
|
-
end
|
@@ -1,70 +0,0 @@
|
|
1
|
-
class Repo
|
2
|
-
|
3
|
-
def self.root_dir
|
4
|
-
@root_dir ||= %x[ git rev-parse --show-toplevel ].chomp
|
5
|
-
end
|
6
|
-
|
7
|
-
attr_reader :shell
|
8
|
-
|
9
|
-
def initialize(shell: shell)
|
10
|
-
@shell = shell
|
11
|
-
end
|
12
|
-
|
13
|
-
def changed?(file_path)
|
14
|
-
files_changed.include? file_path
|
15
|
-
end
|
16
|
-
|
17
|
-
def find_files(pattern)
|
18
|
-
shell.run("git ls-files '*#{pattern}*'").split("\n")
|
19
|
-
end
|
20
|
-
|
21
|
-
def status_files
|
22
|
-
statii = shell.run("git status -s").split("\n")
|
23
|
-
r = statii.map do |status|
|
24
|
-
status.strip!
|
25
|
-
if status[0] == 'D'
|
26
|
-
nil
|
27
|
-
else
|
28
|
-
status.split(' ').last
|
29
|
-
end
|
30
|
-
end.compact
|
31
|
-
end
|
32
|
-
|
33
|
-
def grep(regex, file_pattern: '*')
|
34
|
-
results = shell.run("git grep --untracked '#{regex}' -- '#{file_pattern}'").split("\n")
|
35
|
-
results.map do |result|
|
36
|
-
interpret_grep_result(result)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def current_branch
|
41
|
-
shell.run 'git rev-parse --abbrev-ref HEAD'
|
42
|
-
end
|
43
|
-
|
44
|
-
private
|
45
|
-
|
46
|
-
def interpret_grep_result(grep_result)
|
47
|
-
splits = grep_result.split(/:/)
|
48
|
-
file = splits.shift.strip
|
49
|
-
# we rejoin on ':' because our
|
50
|
-
# code may have colons inside of it.
|
51
|
-
#
|
52
|
-
# example:
|
53
|
-
# path/to/file: run_method(a: A, b: B)
|
54
|
-
#
|
55
|
-
# so shift the first one out, then
|
56
|
-
# rejoin the rest
|
57
|
-
line = splits.join(':').strip
|
58
|
-
|
59
|
-
{
|
60
|
-
:file => file,
|
61
|
-
:line => line,
|
62
|
-
}
|
63
|
-
end
|
64
|
-
|
65
|
-
def current_sha
|
66
|
-
shell.run "git rev-parse HEAD"
|
67
|
-
end
|
68
|
-
|
69
|
-
|
70
|
-
end
|
@@ -1,88 +0,0 @@
|
|
1
|
-
class ShellRunner
|
2
|
-
CommandFailureError = Class.new(StandardError)
|
3
|
-
|
4
|
-
attr_accessor :working_directory, :log_path
|
5
|
-
|
6
|
-
def initialize(log_path, working_directory)
|
7
|
-
@working_directory = working_directory
|
8
|
-
@queue = ''
|
9
|
-
@log_path = log_path
|
10
|
-
reset_log
|
11
|
-
end
|
12
|
-
|
13
|
-
def run(cmd, dir: working_directory)
|
14
|
-
command = "cd #{dir} && #{cmd}"
|
15
|
-
handle_output_for(command)
|
16
|
-
shell_out(command)
|
17
|
-
end
|
18
|
-
|
19
|
-
def shell_out(command)
|
20
|
-
%x{ set -o pipefail && #{command} 2>> #{log_path} | tee -a #{log_path} }.chomp.tap do
|
21
|
-
raise CommandFailureError, "The following command has failed: #{command}. See #{log_path} for a full log." if ($?.exitstatus != 0)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def exec(cmd, dir: working_directory)
|
26
|
-
command = "cd #{dir} && #{cmd}"
|
27
|
-
notify "\n#{command}"
|
28
|
-
Kernel.exec command
|
29
|
-
end
|
30
|
-
|
31
|
-
def enqueue(cmd, dir: working_directory)
|
32
|
-
command = "cd #{dir} && #{cmd} && cd -"
|
33
|
-
@queue += "#{command};\n"
|
34
|
-
end
|
35
|
-
|
36
|
-
def confirm?(question)
|
37
|
-
warn "#{question} [Yn]"
|
38
|
-
answer = STDIN.gets.strip.downcase
|
39
|
-
return answer != 'n'
|
40
|
-
end
|
41
|
-
|
42
|
-
def get_number_list_for_question(question)
|
43
|
-
warn question
|
44
|
-
answer = STDIN.gets.strip
|
45
|
-
|
46
|
-
answer.split(',').map do |term|
|
47
|
-
if term.include?('-')
|
48
|
-
(term.split('-')[0].to_i..term.split('-')[1].to_i).to_a
|
49
|
-
else
|
50
|
-
term.to_i
|
51
|
-
end
|
52
|
-
end.flatten
|
53
|
-
end
|
54
|
-
|
55
|
-
def deny?(question)
|
56
|
-
! confirm?(question)
|
57
|
-
end
|
58
|
-
|
59
|
-
def exec_queue
|
60
|
-
notify 'running: '
|
61
|
-
notify ''
|
62
|
-
notify @queue
|
63
|
-
Kernel.exec @queue
|
64
|
-
end
|
65
|
-
|
66
|
-
def warn(msg)
|
67
|
-
log msg
|
68
|
-
puts msg.red
|
69
|
-
end
|
70
|
-
|
71
|
-
def notify(msg)
|
72
|
-
log msg
|
73
|
-
puts msg.yellow
|
74
|
-
end
|
75
|
-
|
76
|
-
def log(msg)
|
77
|
-
%x{echo "#{msg}" >> #{log_path}}
|
78
|
-
end
|
79
|
-
|
80
|
-
def reset_log
|
81
|
-
%x{echo "" > #{log_path}}
|
82
|
-
end
|
83
|
-
|
84
|
-
def handle_output_for(cmd)
|
85
|
-
log(cmd)
|
86
|
-
end
|
87
|
-
|
88
|
-
end
|
@@ -1,62 +0,0 @@
|
|
1
|
-
class StatusChecker
|
2
|
-
def self.report(env, confirm_exit_status)
|
3
|
-
new(env, confirm_exit_status).report
|
4
|
-
end
|
5
|
-
|
6
|
-
attr_reader :repo, :shell, :untested_files
|
7
|
-
def initialize(env, confirm_exit_status)
|
8
|
-
@repo = env[:repo]
|
9
|
-
@shell = env[:shell]
|
10
|
-
@untested_files = []
|
11
|
-
@confirm_exit_status = confirm_exit_status
|
12
|
-
end
|
13
|
-
|
14
|
-
def report
|
15
|
-
non_test_files.each do |file|
|
16
|
-
if ! test_files.include? "#{file}_test"
|
17
|
-
untested_files << full_path_by_basename(file)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
if untested_files.empty?
|
22
|
-
shell.notify "All ruby files are tested!"
|
23
|
-
exit 0
|
24
|
-
else
|
25
|
-
shell.warn "The following files have changed without being tested:\n\n#{untested_files.join("\n")}"
|
26
|
-
|
27
|
-
STDIN.reopen('/dev/tty')
|
28
|
-
if confirm_exit_status? && shell.confirm?("\nDo you still wish to commit?")
|
29
|
-
exit 0
|
30
|
-
else
|
31
|
-
exit 1
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
36
|
-
|
37
|
-
private
|
38
|
-
|
39
|
-
def test_files
|
40
|
-
TestFilter.select_tests(file_names)
|
41
|
-
end
|
42
|
-
|
43
|
-
def non_test_files
|
44
|
-
TestFilter.reject_tests(file_names)
|
45
|
-
end
|
46
|
-
|
47
|
-
def file_names
|
48
|
-
@file_names ||= files.select {|f| f.match(/\.rb$/)}.map {|f| File.basename(f, '.rb') }
|
49
|
-
end
|
50
|
-
|
51
|
-
def files
|
52
|
-
@files ||= repo.status_files
|
53
|
-
end
|
54
|
-
|
55
|
-
def full_path_by_basename(file)
|
56
|
-
files.select {|f| File.basename(f, '.rb') == file }.first
|
57
|
-
end
|
58
|
-
|
59
|
-
def confirm_exit_status?
|
60
|
-
@confirm_exit_status
|
61
|
-
end
|
62
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
class StatusTestRunner
|
2
|
-
|
3
|
-
def self.status(env, ignore_selenium=false)
|
4
|
-
new(env, ignore_selenium).status
|
5
|
-
end
|
6
|
-
|
7
|
-
attr_reader :repo, :shell, :test_runner, :status_tests, :ignore_selenium
|
8
|
-
def initialize(env, ignore_selenium)
|
9
|
-
@repo = env[:repo]
|
10
|
-
@shell = env[:shell]
|
11
|
-
@test_runner = env[:test_runner]
|
12
|
-
@ignore_selenium = ignore_selenium
|
13
|
-
@status_tests = get_status_tests
|
14
|
-
end
|
15
|
-
|
16
|
-
def status
|
17
|
-
if status_tests.include_selenium?
|
18
|
-
handle_selenium
|
19
|
-
end
|
20
|
-
|
21
|
-
if status_tests.empty?
|
22
|
-
shell.notify 'No tests to run'
|
23
|
-
exit
|
24
|
-
end
|
25
|
-
|
26
|
-
test_runner.run_files(status_tests)
|
27
|
-
end
|
28
|
-
|
29
|
-
private
|
30
|
-
|
31
|
-
def handle_selenium
|
32
|
-
if ignore_selenium || shell.deny?("The status includes some selenium files. Do you wish to run those?")
|
33
|
-
status_tests.remove_selenium!
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def get_status_tests
|
38
|
-
files = TestFilter.select_tests(repo.status_files)
|
39
|
-
TestCollection.new(files)
|
40
|
-
end
|
41
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
class TestCase
|
2
|
-
TestDirectoryError = Class.new(StandardError)
|
3
|
-
|
4
|
-
attr_reader :working_dir, :relative_path, :test_name, :full_path
|
5
|
-
|
6
|
-
def initialize(full_path: raise, line: '')
|
7
|
-
raise 'Bad Test File' unless full_path.match(/_test\.rb/)
|
8
|
-
|
9
|
-
@test_name = test_name_from_grepped_line(line)
|
10
|
-
@full_path = full_path
|
11
|
-
end
|
12
|
-
|
13
|
-
def working_dir
|
14
|
-
@working_dir ||=
|
15
|
-
if full_path.match(/^(.*)test\//)
|
16
|
-
File.join(".", full_path.match(/^(.*)test\//)[1])
|
17
|
-
else
|
18
|
-
raise TestDirectoryError.new("Can't find test's working directory")
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def is_method?
|
23
|
-
! @test_name.nil?
|
24
|
-
end
|
25
|
-
|
26
|
-
def relative_path
|
27
|
-
@relative_path ||= full_path.gsub(/^#{working_dir.gsub(/^\.\//, '')}/, '') || raise_file_path_error
|
28
|
-
end
|
29
|
-
|
30
|
-
def raise_file_path_error
|
31
|
-
raise TestDirectoryError.new("Can't find test's relative path")
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_name_from_grepped_line(line)
|
35
|
-
return unless line && line.match(/^\s*def\s+test_/)
|
36
|
-
@test_name = line.strip.gsub(/^\s*def\s+/, '').strip
|
37
|
-
end
|
38
|
-
end
|
@@ -1,97 +0,0 @@
|
|
1
|
-
class TestCollection
|
2
|
-
|
3
|
-
MultipleWorkingDirectoriesError = Class.new(StandardError)
|
4
|
-
|
5
|
-
attr_reader :tests, :query
|
6
|
-
|
7
|
-
def initialize(tests_data=[], query: '')
|
8
|
-
@query = query
|
9
|
-
@tests = tests_data.map do |test_data|
|
10
|
-
if test_data.is_a? TestCase
|
11
|
-
test_data
|
12
|
-
else
|
13
|
-
test_data = {file: test_data} if test_data.is_a?(String)
|
14
|
-
|
15
|
-
TestCase.new(
|
16
|
-
full_path: test_data[:file],
|
17
|
-
line: test_data[:line]
|
18
|
-
)
|
19
|
-
end
|
20
|
-
end.compact
|
21
|
-
end
|
22
|
-
|
23
|
-
def empty?
|
24
|
-
tests.empty?
|
25
|
-
end
|
26
|
-
|
27
|
-
def uniq!
|
28
|
-
@tests = @tests.uniq {|e| "#{e.full_path} #{e.test_name} #{e.working_dir}" }
|
29
|
-
end
|
30
|
-
|
31
|
-
def present?
|
32
|
-
! empty?
|
33
|
-
end
|
34
|
-
|
35
|
-
def size
|
36
|
-
tests.size
|
37
|
-
end
|
38
|
-
|
39
|
-
def first
|
40
|
-
tests.first
|
41
|
-
end
|
42
|
-
|
43
|
-
def [](*args)
|
44
|
-
tests[*args]
|
45
|
-
end
|
46
|
-
|
47
|
-
def all?(&block)
|
48
|
-
tests.all?(&block)
|
49
|
-
end
|
50
|
-
|
51
|
-
def in_one_file?
|
52
|
-
full_paths.size == 1
|
53
|
-
end
|
54
|
-
|
55
|
-
def in_one_engine?
|
56
|
-
working_dirs.size == 1
|
57
|
-
end
|
58
|
-
|
59
|
-
def full_paths
|
60
|
-
@full_paths ||= tests.map {|t| t.full_path }.uniq
|
61
|
-
end
|
62
|
-
|
63
|
-
def relative_paths
|
64
|
-
@relative_paths ||= tests.map {|t| t.relative_path }.uniq
|
65
|
-
end
|
66
|
-
|
67
|
-
def working_dirs
|
68
|
-
@working_dirs ||= tests.map {|t| t.working_dir }.uniq
|
69
|
-
end
|
70
|
-
|
71
|
-
def relative_paths_in(working_directory)
|
72
|
-
tests.select {|t| t.working_dir == working_directory}.map {|t| t.relative_path }.uniq
|
73
|
-
end
|
74
|
-
|
75
|
-
def include_selenium?
|
76
|
-
! selenium_tests.empty?
|
77
|
-
end
|
78
|
-
|
79
|
-
def remove_selenium!
|
80
|
-
@tests = tests - selenium_tests
|
81
|
-
end
|
82
|
-
|
83
|
-
def selenium_tests
|
84
|
-
tests.select {|t| t.full_path.match(/selenium/)}
|
85
|
-
end
|
86
|
-
|
87
|
-
def working_dir
|
88
|
-
raise MultipleWorkingDirectoriesError.new("Can't run tests for more than one engine") unless working_dirs.size == 1
|
89
|
-
|
90
|
-
return working_dirs.first
|
91
|
-
end
|
92
|
-
|
93
|
-
def is_one_test_method?
|
94
|
-
(size == 1) && tests.first.is_method?
|
95
|
-
end
|
96
|
-
|
97
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
class TestFilter
|
2
|
-
def self.select_tests(files)
|
3
|
-
filter(action: :select, files: files)
|
4
|
-
end
|
5
|
-
|
6
|
-
def self.reject_tests(files)
|
7
|
-
filter(action: :reject, files: files)
|
8
|
-
end
|
9
|
-
|
10
|
-
private
|
11
|
-
|
12
|
-
def self.filter(action:, files:)
|
13
|
-
files.send(action) {|f| f.match(/_test(\.rb)?$/) }
|
14
|
-
end
|
15
|
-
end
|
@@ -1,70 +0,0 @@
|
|
1
|
-
class TestFinder
|
2
|
-
|
3
|
-
def self.find(query, env)
|
4
|
-
new(env, query).find
|
5
|
-
end
|
6
|
-
|
7
|
-
attr_accessor :shell, :repo, :query
|
8
|
-
def initialize(env, query)
|
9
|
-
@shell = env[:shell]
|
10
|
-
@repo = env[:repo]
|
11
|
-
@query = query
|
12
|
-
@regex_searches = {}
|
13
|
-
end
|
14
|
-
|
15
|
-
def find
|
16
|
-
return tests_found_by_absolute_path if query.match(Repo.root_dir)
|
17
|
-
|
18
|
-
return tests_found_by_name if tests_found_by_name.present?
|
19
|
-
|
20
|
-
return tests_found_by_file_name if tests_found_by_file_name.present?
|
21
|
-
|
22
|
-
return tests_found_by_full_regex if tests_found_by_full_regex.present?
|
23
|
-
|
24
|
-
return TestCollection.new
|
25
|
-
end
|
26
|
-
|
27
|
-
private
|
28
|
-
|
29
|
-
def tests_found_by_absolute_path
|
30
|
-
TestCollection.new([file: query.gsub(Repo.root_dir, '')])
|
31
|
-
end
|
32
|
-
|
33
|
-
def tests_found_by_name
|
34
|
-
@tests_found_by_name ||=
|
35
|
-
begin
|
36
|
-
tests_found_by_full_regex("^\s*def .*#{query}.*")
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def tests_found_by_full_regex(regex = query)
|
41
|
-
@regex_searches[regex] ||=
|
42
|
-
begin
|
43
|
-
test_matches = []
|
44
|
-
begin
|
45
|
-
test_matches = repo.grep(regex, file_pattern: '*_test.rb')
|
46
|
-
rescue ShellRunner::CommandFailureError
|
47
|
-
# git grep returns 1 if no results found
|
48
|
-
end
|
49
|
-
|
50
|
-
TestCollection.new(test_matches, query: query)
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def tests_found_by_file_name
|
55
|
-
@tests_found_by_file_name ||=
|
56
|
-
begin
|
57
|
-
files = TestFilter.select_tests(repo.find_files(query))
|
58
|
-
TestCollection.new(files)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
def might_be_method?(query)
|
63
|
-
! is_file_path?(query)
|
64
|
-
end
|
65
|
-
|
66
|
-
def is_file_path?(query)
|
67
|
-
!! query.match(/\.rb/)
|
68
|
-
end
|
69
|
-
|
70
|
-
end
|
@@ -1,121 +0,0 @@
|
|
1
|
-
class TestRunner
|
2
|
-
|
3
|
-
attr_reader :shell, :all_engines_param, :always_ask_before_grouping_tests
|
4
|
-
def initialize(env)
|
5
|
-
@shell = env[:shell]
|
6
|
-
@all_engines_param = env[:all_engines]
|
7
|
-
@always_ask_before_grouping_tests = env[:always_ask_before_grouping_tests]
|
8
|
-
end
|
9
|
-
|
10
|
-
# Hack: this could use *a lot* of love
|
11
|
-
# this could use some love
|
12
|
-
def run(tests)
|
13
|
-
|
14
|
-
if tests.empty?
|
15
|
-
shell.warn "Unable to identify any tests."
|
16
|
-
exit
|
17
|
-
|
18
|
-
elsif tests.is_one_test_method?
|
19
|
-
test = tests.first
|
20
|
-
run_method(path: test.relative_path, name: test.test_name, dir: test.working_dir)
|
21
|
-
elsif always_ask_before_grouping_tests
|
22
|
-
ask_user_which_tests_to_run(tests)
|
23
|
-
elsif tests.in_one_file? && tests.all? {|t| t.is_method? }
|
24
|
-
shell.notify "Multiple matches in same file. Running those tests"
|
25
|
-
test = tests.first
|
26
|
-
run_method(path: test.relative_path, name: tests.query, dir: test.working_dir)
|
27
|
-
|
28
|
-
elsif tests.in_one_file? #catches regex that matched a test file or other regex that matched in the body
|
29
|
-
shell.notify "Matched one file. Running that file."
|
30
|
-
run_files(tests)
|
31
|
-
|
32
|
-
elsif tests.in_one_engine? && tests.full_paths.size < 4 # hack: maybe should ask here?
|
33
|
-
shell.notify "Multiple matches across files in same engine. Running those files."
|
34
|
-
run_files(tests)
|
35
|
-
|
36
|
-
else
|
37
|
-
ask_user_which_tests_to_run(tests)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def run_method(path:, name:, dir:)
|
42
|
-
test_runner = named_test_runner(dir)
|
43
|
-
shell.exec("#{test_runner} #{path} --name=/#{name}/", dir: dir)
|
44
|
-
end
|
45
|
-
|
46
|
-
def ask_user_which_tests_to_run(tests)
|
47
|
-
shell.warn 'Found too many tests. Please choose which matches you would like to run:'
|
48
|
-
|
49
|
-
tests.uniq!.each_with_index do |t, index|
|
50
|
-
shell.notify "(#{index}) #{t.full_path}: #{t.test_name}"
|
51
|
-
end
|
52
|
-
|
53
|
-
tests_to_run = shell.get_number_list_for_question('Please enter the match numbers you would like to run(comma seperated)')
|
54
|
-
|
55
|
-
new_tests = tests_to_run.map do |index|
|
56
|
-
tests[index]
|
57
|
-
end
|
58
|
-
@always_ask_before_grouping_tests = false
|
59
|
-
run(TestCollection.new(new_tests))
|
60
|
-
end
|
61
|
-
|
62
|
-
def run_files(tests)
|
63
|
-
begin
|
64
|
-
test_runner = test_collection_runner(tests.working_dir)
|
65
|
-
test_files = tests.relative_paths.join(' ')
|
66
|
-
|
67
|
-
shell.exec("#{test_runner} #{test_files}", dir: tests.working_dir)
|
68
|
-
rescue TestCollection::MultipleWorkingDirectoriesError => e
|
69
|
-
if run_across_engines?
|
70
|
-
run_across_engines(tests)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
def run_across_engines(tests)
|
76
|
-
shell.notify "\nfinding test runners"
|
77
|
-
tests.working_dirs.each do |engine_dir|
|
78
|
-
test_files = tests.relative_paths_in(engine_dir).join(' ')
|
79
|
-
test_runner = test_collection_runner(engine_dir)
|
80
|
-
|
81
|
-
shell.enqueue("#{test_runner} #{test_files}", dir: engine_dir)
|
82
|
-
end
|
83
|
-
shell.exec_queue
|
84
|
-
end
|
85
|
-
|
86
|
-
def test_runner_type(working_dir)
|
87
|
-
if shell.run("ls bin", dir: working_dir).split("\n").include? 'testunit'
|
88
|
-
:spring
|
89
|
-
else
|
90
|
-
:ruby
|
91
|
-
end
|
92
|
-
rescue ShellRunner::CommandFailureError
|
93
|
-
:ruby
|
94
|
-
end
|
95
|
-
|
96
|
-
def named_test_runner(working_dir)
|
97
|
-
if test_runner_type(working_dir) == :spring
|
98
|
-
# hack:
|
99
|
-
# Add some options for using spring.
|
100
|
-
#
|
101
|
-
#"bin/testunit"
|
102
|
-
"ruby -I test"
|
103
|
-
else
|
104
|
-
"ruby -I test"
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
def test_collection_runner(working_dir)
|
109
|
-
if test_runner_type(working_dir) == :spring
|
110
|
-
#"bin/testunit"
|
111
|
-
%{ruby -I test -e 'ARGV.each { |file| require(Dir.pwd + "/" + file) }'}
|
112
|
-
else
|
113
|
-
%{ruby -I test -e 'ARGV.each { |file| require(Dir.pwd + "/" + file) }'}
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
def run_across_engines?
|
118
|
-
all_engines_param || shell.confirm?("Test files are in multiple engines. Run them all?")
|
119
|
-
end
|
120
|
-
|
121
|
-
end
|
data/lib/sfb_scripts/tester.rb
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
require_relative 'needs_manager'
|
2
|
-
|
3
|
-
class Tester
|
4
|
-
|
5
|
-
def self.needs
|
6
|
-
[:shell, :repo, :test_runner]
|
7
|
-
end
|
8
|
-
|
9
|
-
def self.find(inputs, options)
|
10
|
-
env = NeedsManager.configure(:test_runner, needs, options.merge(repo_type: :info))
|
11
|
-
new(env).find(inputs)
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.status(options)
|
15
|
-
env = NeedsManager.configure(:test_runner, needs, options.merge(repo_type: :info))
|
16
|
-
new(env).status(options)
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.status_check(options)
|
20
|
-
env = NeedsManager.configure(:test_runner, (needs - [:test_runner]), options.merge(repo_type: :info))
|
21
|
-
new(env).status_check(options)
|
22
|
-
end
|
23
|
-
|
24
|
-
attr_accessor :env
|
25
|
-
def initialize(env)
|
26
|
-
@env = env
|
27
|
-
end
|
28
|
-
|
29
|
-
def find(input)
|
30
|
-
tests = TestFinder.find(input, env)
|
31
|
-
|
32
|
-
env[:test_runner].run(tests)
|
33
|
-
env[:shell].warn "Giving up :("
|
34
|
-
end
|
35
|
-
|
36
|
-
def status(options)
|
37
|
-
StatusTestRunner.status(env, options[:no_selenium])
|
38
|
-
end
|
39
|
-
|
40
|
-
def status_check(options)
|
41
|
-
StatusChecker.report(env, options[:confirm_exit_status])
|
42
|
-
end
|
43
|
-
|
44
|
-
end
|
data/lib/sfb_scripts/upper.rb
DELETED
@@ -1,93 +0,0 @@
|
|
1
|
-
require_relative 'needs_manager'
|
2
|
-
|
3
|
-
class Upper
|
4
|
-
|
5
|
-
def self.needs
|
6
|
-
[:shell, :repo, :bundler, :migrator]
|
7
|
-
end
|
8
|
-
|
9
|
-
def self.with_defaults(options)
|
10
|
-
{loud: true}.merge(options)
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.arbitrary_action!(git_command, options)
|
14
|
-
env = NeedsManager.configure(:up, needs, with_defaults(options).merge(repo_type: :active))
|
15
|
-
new(env).arbitrary_action!(git_command)
|
16
|
-
end
|
17
|
-
|
18
|
-
def self.rebase_on_branch!(options)
|
19
|
-
env = NeedsManager.configure(:up, needs, with_defaults(options).merge(repo_type: :active))
|
20
|
-
new(env).arbitrary_action!("pull --rebase origin #{env[:repo].current_branch}")
|
21
|
-
end
|
22
|
-
|
23
|
-
def self.rebase_on_master!(options)
|
24
|
-
env = NeedsManager.configure(:up, needs, with_defaults(options).merge(repo_type: :active))
|
25
|
-
new(env).arbitrary_action!("pull --rebase origin master")
|
26
|
-
end
|
27
|
-
|
28
|
-
def self.up_master!(options)
|
29
|
-
env = NeedsManager.configure(:up, needs, with_defaults(options).merge(repo_type: :active))
|
30
|
-
new(env).up_master!
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.no_git(options)
|
34
|
-
env = NeedsManager.configure(:up, needs, with_defaults(options).merge(repo_type: :lazy))
|
35
|
-
new(env).no_git
|
36
|
-
end
|
37
|
-
|
38
|
-
def self.finish_rebase(options)
|
39
|
-
env = NeedsManager.configure(:up, needs, with_defaults(options).merge(repo_type: :active))
|
40
|
-
new(env).finish_rebase
|
41
|
-
end
|
42
|
-
|
43
|
-
def self.install_hooks(options)
|
44
|
-
env = NeedsManager.configure(:up, needs, with_defaults(options).merge(repo_type: :lazy))
|
45
|
-
new(env).install_hooks
|
46
|
-
end
|
47
|
-
|
48
|
-
def self.pre_push_hook(git_command, options)
|
49
|
-
env = NeedsManager.configure(:up, needs, with_defaults(options).merge(repo_type: :active))
|
50
|
-
new(env).pre_push_hook(git_command)
|
51
|
-
end
|
52
|
-
|
53
|
-
attr_reader :env, :repo, :bundler, :migrator
|
54
|
-
|
55
|
-
def initialize(env)
|
56
|
-
@env = env
|
57
|
-
@repo = env[:repo]
|
58
|
-
@bundler = env[:bundler]
|
59
|
-
@migrator = env[:migrator]
|
60
|
-
end
|
61
|
-
|
62
|
-
def up_master!
|
63
|
-
repo.up_master!
|
64
|
-
bundler.bundle_where_necessary
|
65
|
-
migrator.migrate_where_necessary
|
66
|
-
end
|
67
|
-
|
68
|
-
def arbitrary_action!(git_command)
|
69
|
-
repo.alter!(git_command)
|
70
|
-
bundler.bundle_where_necessary
|
71
|
-
migrator.migrate_where_necessary
|
72
|
-
end
|
73
|
-
|
74
|
-
def no_git
|
75
|
-
env[:shell].notify "\nBundling and migrating without checking diffs:"
|
76
|
-
bundler.bundle_where_necessary
|
77
|
-
migrator.migrate_where_necessary
|
78
|
-
end
|
79
|
-
|
80
|
-
def finish_rebase
|
81
|
-
repo.compare_with_reflog
|
82
|
-
bundler.bundle_where_necessary
|
83
|
-
migrator.migrate_where_necessary
|
84
|
-
end
|
85
|
-
|
86
|
-
def install_hooks
|
87
|
-
HookManager.install!(env)
|
88
|
-
end
|
89
|
-
|
90
|
-
def pre_push_hook(git_command)
|
91
|
-
PrePushHook.check(git_command, env)
|
92
|
-
end
|
93
|
-
end
|
data/lib/sfb_scripts/version.rb
DELETED