rlt 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: 8da7586a22e7a30c47783bdd63909e61e16e45be6f995c0443ba85fac3a3a054
4
- data.tar.gz: 3af912d1b8183616a323220962098ed5ffb628f9f9d6ea096a3b3b60c6797058
2
+ SHA1:
3
+ metadata.gz: e8103d3ed650fed8f99f8e0c57f5515c66849626
4
+ data.tar.gz: 65012e4e9b016e389e82b9db9206cd4b952f0766
5
5
  SHA512:
6
- metadata.gz: 214bcde24666186a54441671bc0fedba0506d777a3bfd4aef18bff319368d50a36c10ff51b549e3acc4b3c63444409a5faa671bf44c1e990ae301ff5046bc66a
7
- data.tar.gz: 45d85c1a76f73a3f375ba69a9f0f8d8f619e6e26c9172e3f070eddb9eb504e4abfc2bc615a19e0bad4fa1224fdda14919ba3e64b13c2f0406848d0d656aebc4e
6
+ metadata.gz: 88122ab1296aba40b00b3469883d1dbe8025db9031fd44cd43934d924e3da7951de0486e9b7030192a2214d3b24c70ea9984627f264d214a9039d7a27417832f
7
+ data.tar.gz: 98adfc71e188bf936dc9887ea61bf951fb0b6047a5447f20aaa1d7486d71b5f046a0a427bc166853940441d63f6bca492da75f8708175bdab8912c44a0309c31
data/exe/rlt CHANGED
@@ -2,8 +2,18 @@
2
2
 
3
3
  # frozen_string_literal: true
4
4
 
5
- $LOAD_PATH.unshift File.expand_path('../lib', __dir__)
5
+ $LOAD_PATH << File.expand_path('lib', __dir__)
6
6
 
7
7
  require 'rlt'
8
8
 
9
- Rlt.run(ARGV)
9
+ begin
10
+ Rlt::CLI.start(ARGV)
11
+ rescue TTY::Reader::InputInterrupt
12
+ puts ''
13
+ # ignore
14
+ rescue TTY::Command::ExitError
15
+ puts ''
16
+ # ignore
17
+ rescue Rlt::GitNativeCommandError
18
+ Rlt::Utils::GitUtil.execute_native_command(ARGV)
19
+ end
data/lib/rlt/cli.rb ADDED
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'thor'
4
+ require 'rlt/commands/cmt'
5
+ require 'rlt/commands/switch'
6
+ require 'rlt/commands/close'
7
+
8
+ module Rlt
9
+ class CLI < Thor
10
+ def self.handle_no_command_error(command)
11
+ raise GitNativeCommandError if Utils::GitUtil::NATIVE_COMMANDS.include? command
12
+ super
13
+ end
14
+
15
+ def self.command_name(klass)
16
+ Utils::StringUtil.underscore(klass.name.split('::').last)
17
+ end
18
+
19
+ def self.run(klass, *arguments)
20
+ config = Rlt.config('command', command_name(klass))
21
+ klass.send(:run, config, *arguments)
22
+ end
23
+
24
+ desc 'cmt', 'Commit with structured commit message'
25
+ method_option :add_all,
26
+ aliases: '-a',
27
+ desc: 'Add all before commit',
28
+ type: :boolean, default: false
29
+ def cmt
30
+ CLI.run Rlt::Commands::Cmt, options.add_all?
31
+ end
32
+
33
+ desc 'switch <branch_name>', 'Switch branches with auto stash/unstash'
34
+ def switch(branch_name)
35
+ CLI.run Rlt::Commands::Switch, branch_name
36
+ end
37
+
38
+ desc 'close', 'Delete current branch and merge it to master'
39
+ def close
40
+ CLI.run Rlt::Commands::Close
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rlt
4
+ module Commands
5
+ class Close
6
+ def self.run(config)
7
+ master_branch = master_branch(config)
8
+ current_branch_name = Utils::GitUtil.current_branch_name
9
+ return if should_stop?(master_branch, config)
10
+ run_internal(current_branch_name, master_branch)
11
+ Utils::Logger.info "Done closing `#{current_branch_name}`."
12
+ end
13
+
14
+ def self.run_internal(current_branch_name, master_branch)
15
+ merge_back_and_forth(current_branch_name, master_branch)
16
+ delete_branch(current_branch_name)
17
+ end
18
+
19
+ def self.should_stop?(master_branch, config)
20
+ return true if uncommitted_changes?
21
+ return true if config_not_existing?(config)
22
+ return true if master_branch_now?(master_branch)
23
+ end
24
+
25
+ def self.uncommitted_changes?
26
+ result = Utils::GitUtil.uncommitted_change?
27
+ print_uncommitted_changes_error if result
28
+ result
29
+ end
30
+
31
+ def self.config_not_existing?(config)
32
+ result = config['master_branch'].nil?
33
+ print_explicit_config_error if result
34
+ result
35
+ end
36
+
37
+ def self.master_branch_now?(master_branch)
38
+ result = Utils::GitUtil.current_branch_name == master_branch
39
+ print_master_branch_now_error(master_branch) if result
40
+ result
41
+ end
42
+
43
+ def self.master_branch(config)
44
+ config['master_branch']
45
+ end
46
+
47
+ def self.merge_back_and_forth(current_branch_name, master_branch)
48
+ Utils::GitUtil.merge_from(master_branch, print_info: true)
49
+ return if any_conflict?
50
+ Utils::GitUtil.checkout(master_branch, print_info: true)
51
+ Utils::GitUtil.merge_from(current_branch_name, print_info: true)
52
+ end
53
+
54
+ def self.any_conflict?
55
+ result = Utils::GitUtil.any_conflict?
56
+ print_conflict_error if result
57
+ result
58
+ end
59
+
60
+ def self.print_uncommitted_changes_error
61
+ Utils::Logger.error 'There are uncommitted changes.'
62
+ Utils::Logger.error 'Commit them first!'
63
+ end
64
+
65
+ # rubocop:disable Metrics/MethodLength
66
+ def self.print_explicit_config_error
67
+ Utils::Logger.error 'You must explicitly configure name of master branch at `.rlt.yml`'
68
+ Utils::Logger.error 'For example,'
69
+ Utils::Logger.error ''
70
+ Utils::Logger.error '# .rlt.yml'
71
+ Utils::Logger.error 'command:'
72
+ Utils::Logger.error ' close:'
73
+ Utils::Logger.error ' master_branch: master'
74
+ end
75
+ # rubocop:enable Metrics/MethodLength
76
+
77
+ def self.print_master_branch_now_error(master_branch)
78
+ Utils::Logger.error "You cannot close `#{master_branch}`."
79
+ end
80
+
81
+ def self.print_conflict_error
82
+ Utils::Logger.error 'Aborting the process due to the conflict.'
83
+ Utils::Logger.error 'Resolve them first, and try it again.'
84
+ end
85
+
86
+ def self.delete_branch(current_branch_name)
87
+ Utils::GitUtil.delete_branch(current_branch_name, print_info: true)
88
+ Utils::GitUtil.remotes.each do |remote|
89
+ Utils::GitUtil.safely_delete_remote_branch(remote, current_branch_name, print_info: true)
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -6,22 +6,18 @@ require 'tmpdir'
6
6
 
7
7
  module Rlt
8
8
  module Commands
9
- class CmtCommand < BaseCommand
10
- CONF_SUBJECT_TEMPLATE = 'subject_template'.freeze
11
- CONF_BODY_TEMPLATE = 'body_template'.freeze
9
+ class Cmt
10
+ CONF_SUBJECT_TEMPLATE = 'subject_template'
11
+ CONF_BODY_TEMPLATE = 'body_template'
12
12
 
13
- def self.run(config, *arguments)
14
- branch_name = acquire_branch_name
15
- puts "Commiting to '#{ColoredText.info(branch_name)}'\n\n"
13
+ def self.run(config, add_all)
14
+ branch_name = Utils::GitUtil.current_branch_name
15
+ Utils::Logger.info "Committing to '#{branch_name}'"
16
16
  (subject, body) = subject_and_body(config, branch_name)
17
- add_all if arguments[0] == '-a'
17
+ Utils::GitUtil.add_all if add_all
18
18
  commit(subject, body)
19
19
  end
20
20
 
21
- def self.add_all
22
- Shell.new.run 'git', 'add', '.'
23
- end
24
-
25
21
  def self.subject_and_body(config, branch_name)
26
22
  subject = adjust_subject_template(ask_subject, config, branch_name)
27
23
  body = adjust_body_template(ask_body, config, branch_name)
@@ -29,27 +25,20 @@ module Rlt
29
25
  end
30
26
 
31
27
  def self.commit(subject, body)
32
- commit_msg_file_path = "#{Dir.tmpdir}/.rlt.commit.msg.#{short_random_string}"
33
- File.write(commit_msg_file_path, "#{subject}\n\n#{body}".strip)
34
- Shell.new.run 'git', 'commit', '-F', commit_msg_file_path
35
- File.delete(commit_msg_file_path)
36
- end
37
-
38
- def self.short_random_string
39
- (0...4).map { rand(65..90).chr }.join
28
+ Utils::GitUtil.commit_with_long_message("#{subject}\n\n#{body}".strip)
40
29
  end
41
30
 
42
31
  def self.ask_subject
43
32
  prompt = TTY::Prompt.new
44
- prompt.ask('Subject:', active_color: :cyan) do |q|
33
+ prompt.ask('Subject:', active_color: :magenta) do |q|
45
34
  q.required true
46
35
  q.modify :capitalize
47
- end
36
+ end.gsub(/\.$/, '')
48
37
  end
49
38
 
50
39
  def self.ask_body
51
- puts 'Body: ' + ColoredText.desc('(Insert empty line to finish)')
52
- lines = ask_multiline_until_done('>', :cyan)
40
+ puts 'Body: (Insert empty line to finish)'
41
+ lines = ask_multiline_until_done('>', :magenta)
53
42
  lines.join("\n")
54
43
  end
55
44
 
@@ -76,21 +65,6 @@ module Rlt
76
65
  return body if config.nil? || template.nil?
77
66
  ERB.new(template).result binding
78
67
  end
79
-
80
- def self.acquire_branch_name
81
- `git rev-parse --abbrev-ref HEAD`.strip
82
- end
83
-
84
- def self.print_help(*_arguments)
85
- puts 'USAGE:'
86
- puts ' 1. rlt commit # Almost same as `git commit`. You do not need `-m` parameter here.'
87
- puts ''
88
- puts ' 2. rlt commit -a # This performs `git add .` before committing.'
89
- end
90
-
91
- def self.valid_parameters?(*arguments)
92
- arguments.empty? || (arguments.size == 1 && arguments[0] == '-a')
93
- end
94
68
  end
95
69
  end
96
70
  end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'erb'
4
+
5
+ module Rlt
6
+ module Commands
7
+ class Switch
8
+ CONF_BRANCH_NAME_TEMPLATE = 'branch_name_template'
9
+
10
+ def self.run(config, branch_name)
11
+ modified_branch_name = change_branch_name(config, branch_name)
12
+ save_stash_if_any
13
+ switch(modified_branch_name)
14
+ apply_stash_if_any(modified_branch_name)
15
+ end
16
+
17
+ def self.change_branch_name(config, branch_name)
18
+ return branch_name if dont_change_branch_name?(config, branch_name)
19
+ branch_name_template = config[CONF_BRANCH_NAME_TEMPLATE]
20
+ return branch_name if branch_name_template.nil?
21
+ ERB.new(branch_name_template).result binding
22
+ end
23
+
24
+ def self.save_stash_if_any
25
+ return if Utils::GitUtil.uncommitted_change?
26
+ Utils::GitUtil.save_stash('Auto stash', print_info: true)
27
+ end
28
+
29
+ def self.apply_stash_if_any(branch_name)
30
+ stash_name = Utils::GitUtil.latest_stash_name(branch_name)
31
+ return if stash_name.nil?
32
+ Utils::GitUtil.apply_stash(stash_name, print_info: true)
33
+ Utils::GitUtil.drop_stash(stash_name, print_info: true)
34
+ end
35
+
36
+ def self.dont_change_branch_name?(config, branch_name)
37
+ list = %w[master develop] + (config['exclude'] || [])
38
+ list.include? branch_name
39
+ end
40
+
41
+ def self.switch(branch_name)
42
+ create_and_checkout(branch_name) unless checkout(branch_name)
43
+ end
44
+
45
+ def self.checkout(branch_name)
46
+ result = Utils::GitUtil.silently_try_checkout(branch_name)
47
+ Utils::Logger.info "Switched to '#{branch_name}'." if result
48
+ result
49
+ end
50
+
51
+ def self.create_and_checkout(branch_name)
52
+ Utils::GitUtil.silently_create_and_checkout(branch_name)
53
+ Utils::Logger.info "Created & Switched to '#{branch_name}'."
54
+ end
55
+ end
56
+ end
57
+ end
data/lib/rlt/config.rb CHANGED
@@ -7,11 +7,11 @@ module Rlt
7
7
  def config(category, command)
8
8
  c = config_map.dig category, command
9
9
  return c unless c.nil?
10
- return {} if command == original_name(command)
11
- config_map.dig(category, original_name(command)) || {}
10
+ return {} if command == original_name_of_alias(command)
11
+ config_map.dig(category, original_name_of_alias(command)) || {}
12
12
  end
13
13
 
14
- def original_name(command)
14
+ def original_name_of_alias(command)
15
15
  config_map.dig 'alias', command
16
16
  end
17
17
 
@@ -28,15 +28,15 @@ module Rlt
28
28
  end
29
29
 
30
30
  def file_path
31
- if Rlt.debug
32
- "#{Dir.pwd}/.rlt.sample.yml"
33
- else
34
- "#{Dir.pwd}/.rlt.yml"
35
- end
31
+ sample_config_path = "#{Dir.pwd}/.rlt.sample.yml"
32
+ return sample_config_path if Rlt.debug && File.exist?(sample_config_path)
33
+ "#{Dir.pwd}/.rlt.yml"
36
34
  end
37
35
 
38
36
  def config_map
39
37
  (@config_map ||= load_config)
40
38
  end
41
39
  end
40
+
41
+ extend Config
42
42
  end
data/lib/rlt/debug.rb ADDED
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rlt
4
+ def self.debug
5
+ ENV['RLT_DEBUG']
6
+ end
7
+ end
data/lib/rlt/error.rb ADDED
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rlt
4
+ class GitNativeCommandError < StandardError
5
+ end
6
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'pastel'
4
+
5
+ module Rlt
6
+ module Utils
7
+ class ColoredText
8
+ def self.verbose(msg)
9
+ Pastel.new.white(msg)
10
+ end
11
+
12
+ def self.info(msg)
13
+ Pastel.new.magenta.bold(msg)
14
+ end
15
+
16
+ def self.desc(msg)
17
+ Pastel.new.green(msg)
18
+ end
19
+
20
+ def self.warn(msg)
21
+ Pastel.new.yellow(msg)
22
+ end
23
+
24
+ def self.error(msg)
25
+ Pastel.new.red(msg)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,113 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rlt
4
+ module Utils
5
+ class GitUtil
6
+ # git help -a
7
+ NATIVE_COMMANDS =
8
+ %w[add add--interactive am annotate apply archimport archive bisectbisect--helper blame
9
+ branch bundle cat-file check-attr check-ignore check-mailmap check-ref-format checkout
10
+ checkout-index cherry cherry-pick citool clean clone column commit commit-tree config
11
+ count-objects credential credential-cache credential-cache--daemon credential-store
12
+ cvsexportcommit cvsimport cvsserver daemon describe diff diff-files diff-index diff-tree
13
+ difftool difftool--helper fast-export fast-import fetch fetch-pack filter-branch
14
+ fmt-merge-msg for-each-ref format-patch fsck fsck-objects gc get-tar-commit-id grep gui
15
+ gui--askpass hash-object help http-backend http-fetch http-push index-pack init init-db
16
+ instaweb interpret-trailers log ls-files ls-remote ls-tree mailinfo mailsplit merge
17
+ merge-base merge-file merge-index merge-octopus merge-one-file merge-ours merge-recursive
18
+ merge-resolve merge-subtree merge-tree mergetool mktag mktree mv name-rev notes p4
19
+ pack-objects pack-redundant pack-refs patch-id prune prune-packed pull push quiltimport
20
+ read-tree rebase receive-pack reflog relink remote remote-ext remote-fd remote-ftp
21
+ remote-ftps remote-http remote-https remote-testsvn repack replace request-pull rerere
22
+ reset rev-list rev-parse revert rm send-email send-pack sh-i18n--envsubst shell shortlog
23
+ show show-branch show-index show-ref stage stash status stripspace submodule
24
+ submodule--helper svn symbolic-ref tag unpack-file unpack-objects update-index update-ref
25
+ update-server-info upload-archive upload-pack var verify-commit verify-pack verify-tag
26
+ web--browse whatchanged worktree write-tree].freeze
27
+
28
+ def self.execute_native_command(args)
29
+ Shell.new.run 'git', *args
30
+ end
31
+
32
+ def self.current_branch_name
33
+ `git rev-parse --abbrev-ref HEAD`.strip
34
+ end
35
+
36
+ def self.add_all
37
+ Shell.new.run 'git', 'add', '-A'
38
+ end
39
+
40
+ def self.uncommitted_change?
41
+ !`git status -s`.strip.empty?
42
+ end
43
+
44
+ def self.latest_stash_name(branch_name)
45
+ line = `git stash list`.strip.split("\n").find do |l|
46
+ l.split(':')[1].strip == "On #{branch_name}"
47
+ end
48
+ return nil if line.nil?
49
+ line.split(':').first
50
+ end
51
+
52
+ def self.save_stash(message, opts = {})
53
+ Logger.info 'Saving stash' if opts[:print_info]
54
+ Shell.new.run 'git', 'stash', 'save', '--include-untracked', message
55
+ end
56
+
57
+ def self.apply_stash(name, opts = {})
58
+ Logger.info 'Applied stash' if opts[:print_info]
59
+ Shell.new.run 'git', 'stash', 'apply', name, '--index'
60
+ end
61
+
62
+ def self.drop_stash(name, opts = {})
63
+ Logger.info 'Dropped stash' if opts[:print_info]
64
+ Shell.new.run 'git', 'stash', 'drop', name
65
+ end
66
+
67
+ def self.checkout(branch_name, opts = {})
68
+ Logger.info "Switching to `#{branch_name}`" if opts[:print_info]
69
+ Shell.new.run 'git', 'checkout', branch_name
70
+ end
71
+
72
+ def self.silently_try_checkout(branch_name)
73
+ result = Shell.new(no_output: true).run_safely 'git', 'checkout', branch_name
74
+ result.success?
75
+ end
76
+
77
+ def self.silently_create_and_checkout(branch_name)
78
+ Shell.new(no_output: true).run 'git', 'checkout', '-b', branch_name
79
+ end
80
+
81
+ def self.commit_with_long_message(message)
82
+ Logger.verbose message if Rlt.debug
83
+ commit_msg_file_path = "#{Dir.tmpdir}/.rlt.commit.msg.#{StringUtil.short_random_string}"
84
+ File.write(commit_msg_file_path, message)
85
+ Shell.new.run 'git', 'commit', '-F', commit_msg_file_path
86
+ File.delete(commit_msg_file_path)
87
+ end
88
+
89
+ def self.merge_from(branch_name, opts = {})
90
+ Logger.info "Merging from `#{branch_name}`" if opts[:print_info]
91
+ Shell.new.run 'git', 'merge', branch_name
92
+ end
93
+
94
+ def self.any_conflict?
95
+ !`git diff --name-only --diff-filter=U`.strip.empty?
96
+ end
97
+
98
+ def self.delete_branch(branch_name, opts = {})
99
+ Logger.info "Deleting `#{branch_name}`" if opts[:print_info]
100
+ Shell.new.run 'git', 'branch', '-d', branch_name
101
+ end
102
+
103
+ def self.remotes
104
+ `git remote`.strip.split('\n')
105
+ end
106
+
107
+ def self.safely_delete_remote_branch(remote, branch_name, opts = {})
108
+ Logger.info "Try deleting remote branch: #{remote}/#{branch_name}" if opts[:print_info]
109
+ Shell.new.run_safely 'git', 'push', remote, ":#{branch_name}"
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'pastel'
4
+
5
+ module Rlt
6
+ module Utils
7
+ class Logger
8
+ def self.verbose(msg)
9
+ puts ColoredText.verbose(msg)
10
+ end
11
+
12
+ def self.info(msg)
13
+ puts ColoredText.info(msg)
14
+ end
15
+
16
+ def self.desc(msg)
17
+ puts ColoredText.desc(msg)
18
+ end
19
+
20
+ def self.warn(msg)
21
+ puts ColoredText.warn(msg)
22
+ end
23
+
24
+ def self.error(msg)
25
+ puts ColoredText.error(msg)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'tty-command'
4
+
5
+ module Rlt
6
+ module Utils
7
+ class Shell
8
+ def initialize(opts = {})
9
+ @cmd = TTY::Command.new(printer: printer(opts), pty: true, dry_run: Rlt.debug)
10
+ end
11
+
12
+ def run(*args)
13
+ result = @cmd.run(*args, user: current_user)
14
+ puts '' if Rlt.debug
15
+ result
16
+ end
17
+
18
+ def run_safely(*args)
19
+ result = @cmd.run!(*args, user: current_user)
20
+ puts '' if Rlt.debug
21
+ result
22
+ end
23
+
24
+ def current_user
25
+ ENV['USER'] || ENV['USERNAME']
26
+ end
27
+
28
+ private
29
+
30
+ def printer(opts)
31
+ if Rlt.debug
32
+ :quiet
33
+ else
34
+ opts[:no_output] ? :null : :quiet
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rlt
4
+ module Utils
5
+ class StringUtil
6
+ def self.underscore(str)
7
+ str.gsub(/::/, '/')
8
+ .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
9
+ .gsub(/([a-z\d])([A-Z])/, '\1_\2')
10
+ .tr('-', '_')
11
+ .downcase
12
+ end
13
+
14
+ def self.short_random_string
15
+ (0...4).map { rand(65..90).chr }.join
16
+ end
17
+ end
18
+ end
19
+ end
data/lib/rlt/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Rlt
4
- VERSION = '0.1.5'
4
+ VERSION = '0.1.6'
5
5
  end
data/lib/rlt.rb CHANGED
@@ -1,24 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'rlt/version'
4
- require 'rlt/shell'
5
- require 'rlt/colored_text'
6
- require 'rlt/logger'
7
- require 'rlt/base_command'
8
- require 'rlt/git_native_command_builder'
9
- Dir["#{__dir__}/rlt/commands/**/*.rb"].each { |f| require f }
10
- require 'rlt/register_commands'
11
- require 'rlt/register_aliases'
12
- require 'rlt/command_runner'
13
4
  require 'rlt/config'
14
-
15
- module Rlt
16
- def self.debug
17
- ENV['RLT_DEBUG']
18
- end
19
- extend Config
20
- extend CommandRunner
21
-
22
- RegisterCommands.register
23
- RegisterAliases.register
24
- end
5
+ require 'rlt/utils/shell'
6
+ require 'rlt/utils/colored_text'
7
+ require 'rlt/utils/logger'
8
+ require 'rlt/utils/string_util'
9
+ require 'rlt/utils/git_util'
10
+ require 'rlt/debug'
11
+ require 'rlt/error'
12
+ require 'rlt/cli'