ronin-repos 0.1.0 → 0.2.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/.document +0 -1
  3. data/.github/workflows/ruby.yml +16 -1
  4. data/.gitignore +1 -0
  5. data/.rubocop.yml +21 -0
  6. data/ChangeLog.md +28 -1
  7. data/Gemfile +11 -5
  8. data/README.md +19 -5
  9. data/Rakefile +12 -2
  10. data/bin/ronin-repos +6 -7
  11. data/data/completions/ronin-repos +139 -0
  12. data/data/completions/ronin-repos.yml +10 -0
  13. data/data/templates/repo/README.md.erb +1 -1
  14. data/gemspec.yml +11 -2
  15. data/lib/ronin/repos/cache_dir.rb +6 -7
  16. data/lib/ronin/repos/class_dir.rb +21 -14
  17. data/lib/ronin/repos/cli/command.rb +5 -3
  18. data/lib/ronin/repos/cli/commands/completion.rb +61 -0
  19. data/lib/ronin/repos/cli/commands/install.rb +7 -3
  20. data/lib/ronin/repos/cli/commands/list.rb +15 -18
  21. data/lib/ronin/repos/cli/commands/new.rb +7 -3
  22. data/lib/ronin/repos/cli/commands/purge.rb +17 -2
  23. data/lib/ronin/repos/cli/commands/remove.rb +1 -1
  24. data/lib/ronin/repos/cli/commands/show.rb +93 -0
  25. data/lib/ronin/repos/cli/commands/update.rb +2 -2
  26. data/lib/ronin/repos/cli.rb +5 -4
  27. data/lib/ronin/repos/exceptions.rb +4 -4
  28. data/lib/ronin/repos/repository.rb +33 -4
  29. data/lib/ronin/repos/root.rb +1 -1
  30. data/lib/ronin/repos/version.rb +2 -2
  31. data/lib/ronin/repos.rb +19 -5
  32. data/man/ronin-repos-completion.1 +76 -0
  33. data/man/ronin-repos-completion.1.md +78 -0
  34. data/man/ronin-repos-install.1 +27 -37
  35. data/man/ronin-repos-install.1.md +22 -15
  36. data/man/ronin-repos-list.1 +27 -33
  37. data/man/ronin-repos-list.1.md +22 -15
  38. data/man/ronin-repos-new.1 +17 -18
  39. data/man/ronin-repos-new.1.md +34 -0
  40. data/man/ronin-repos-purge.1 +26 -33
  41. data/man/ronin-repos-purge.1.md +20 -13
  42. data/man/ronin-repos-remove.1 +23 -35
  43. data/man/ronin-repos-remove.1.md +18 -14
  44. data/man/ronin-repos-show.1 +48 -0
  45. data/man/ronin-repos-show.1.md +48 -0
  46. data/man/ronin-repos-update.1 +26 -36
  47. data/man/ronin-repos-update.1.md +22 -15
  48. data/man/ronin-repos.1 +43 -31
  49. data/man/ronin-repos.1.md +35 -11
  50. data/ronin-repos.gemspec +4 -3
  51. data/scripts/setup +58 -0
  52. metadata +19 -7
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
4
+ #
5
+ # ronin-repos is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU Lesser General Public License as published
7
+ # by the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # ronin-repos is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU Lesser General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public License
16
+ # along with ronin-repos. If not, see <https://www.gnu.org/licenses/>.
17
+ #
18
+
19
+ require 'ronin/repos/root'
20
+ require 'ronin/core/cli/completion_command'
21
+
22
+ module Ronin
23
+ module Repos
24
+ class CLI
25
+ module Commands
26
+ #
27
+ # Manages the shell completion rules for `ronin-repos`.
28
+ #
29
+ # ## Usage
30
+ #
31
+ # ronin-repos completion [options]
32
+ #
33
+ # ## Options
34
+ #
35
+ # --print Prints the shell completion file
36
+ # --install Installs the shell completion file
37
+ # --uninstall Uninstalls the shell completion file
38
+ # -h, --help Print help information
39
+ #
40
+ # ## Examples
41
+ #
42
+ # ronin-repos completion --print
43
+ # ronin-repos completion --install
44
+ # ronin-repos completion --uninstall
45
+ #
46
+ # @since 0.2.0
47
+ #
48
+ class Completion < Core::CLI::CompletionCommand
49
+
50
+ completion_file File.join(ROOT,'data','completions','ronin-repos')
51
+
52
+ man_dir File.join(ROOT,'man')
53
+ man_page 'ronin-repos-completion.1'
54
+
55
+ description 'Manages the shell completion rules for ronin-repos'
56
+
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  #
3
- # Copyright (c) 2021-2023 Hal Brodigan (postmodern.mod3 at gmail.com)
3
+ # Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
4
4
  #
5
5
  # ronin-repos is free software: you can redistribute it and/or modify
6
6
  # it under the terms of the GNU Lesser General Public License as published
@@ -18,6 +18,8 @@
18
18
 
19
19
  require 'ronin/repos/cli/command'
20
20
 
21
+ require 'ronin/core/cli/logging'
22
+
21
23
  module Ronin
22
24
  module Repos
23
25
  class CLI
@@ -40,6 +42,8 @@ module Ronin
40
42
  #
41
43
  class Install < Command
42
44
 
45
+ include Core::CLI::Logging
46
+
43
47
  usage '[options] URI'
44
48
 
45
49
  argument :uri, required: true,
@@ -58,8 +62,8 @@ module Ronin
58
62
  #
59
63
  def run(uri)
60
64
  log_info "Installing repository from #{uri} ..."
61
- cache_dir.download(uri)
62
- rescue CommandFailed => error
65
+ cache_dir.install(uri)
66
+ rescue CommandNotInstalled, CommandFailed => error
63
67
  print_error(error.message)
64
68
  exit(-1)
65
69
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  #
3
- # Copyright (c) 2021-2023 Hal Brodigan (postmodern.mod3 at gmail.com)
3
+ # Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
4
4
  #
5
5
  # ronin-repos is free software: you can redistribute it and/or modify
6
6
  # it under the terms of the GNU Lesser General Public License as published
@@ -27,7 +27,7 @@ module Ronin
27
27
  #
28
28
  # ## Usage
29
29
  #
30
- # ronin-repos list [options] [REPO]
30
+ # ronin-repos list [options] [NAME]
31
31
  #
32
32
  # ## Options
33
33
  #
@@ -36,15 +36,15 @@ module Ronin
36
36
  #
37
37
  # ## Arguments
38
38
  #
39
- # [REPO] Optional repository name to list
39
+ # [NAME] Optional repository name(s) to list
40
40
  #
41
41
  class List < Command
42
42
 
43
- usage '[options] [REPO]'
43
+ usage '[options] [NAME]'
44
44
 
45
45
  argument :name, required: false,
46
- usage: 'REPO',
47
- desc: 'Optional repository name to list'
46
+ usage: 'NAME',
47
+ desc: 'Optional repository name(s) to list'
48
48
 
49
49
  description 'Lists all repositories in the cache directory'
50
50
 
@@ -57,19 +57,16 @@ module Ronin
57
57
  # The optional repo name to list.
58
58
  #
59
59
  def run(name=nil)
60
- if name
61
- begin
62
- repo = cache_dir[name]
60
+ repos = if name
61
+ cache_dir.select do |repo|
62
+ repo.name.include?(name)
63
+ end
64
+ else
65
+ cache_dir.each
66
+ end
63
67
 
64
- puts " #{repo}"
65
- rescue RepositoryNotFound => error
66
- print_error(error.message)
67
- exit(-1)
68
- end
69
- else
70
- cache_dir.each do |repo|
71
- puts " #{repo}"
72
- end
68
+ repos.each do |repo|
69
+ puts " #{repo}"
73
70
  end
74
71
  end
75
72
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  #
3
- # Copyright (c) 2021-2023 Hal Brodigan (postmodern.mod3 at gmail.com)
3
+ # Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
4
4
  #
5
5
  # ronin-repos is free software: you can redistribute it and/or modify
6
6
  # it under the terms of the GNU Lesser General Public License as published
@@ -54,7 +54,7 @@ module Ronin
54
54
 
55
55
  description 'Creates a new git repository'
56
56
 
57
- man_page 'ronin-repos.1'
57
+ man_page 'ronin-repos-new.1'
58
58
 
59
59
  #
60
60
  # Runs the `ronin-repos new` command.
@@ -63,10 +63,14 @@ module Ronin
63
63
  # The path to the new repo directory to create.
64
64
  #
65
65
  def run(path)
66
- @name = File.basename(path)
66
+ @name = File.basename(path)
67
67
  @github_user = Core::Git.github_user || ENV['USER']
68
68
 
69
69
  mkdir path
70
+ mkdir File.join(path,'exploits')
71
+ mkdir File.join(path,'payloads')
72
+ mkdir File.join(path,'recon')
73
+ mkdir File.join(path,'brute')
70
74
  erb 'README.md.erb', File.join(path,'README.md')
71
75
 
72
76
  Dir.chdir(path) do
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  #
3
- # Copyright (c) 2021-2023 Hal Brodigan (postmodern.mod3 at gmail.com)
3
+ # Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
4
4
  #
5
5
  # ronin-repos is free software: you can redistribute it and/or modify
6
6
  # it under the terms of the GNU Lesser General Public License as published
@@ -22,12 +22,27 @@ module Ronin
22
22
  module Repos
23
23
  class CLI
24
24
  module Commands
25
+ #
26
+ # The `ronin-repos purge` command.
27
+ #
28
+ # ## Usage
29
+ #
30
+ # ronin-repos purge [options]
31
+ #
32
+ # ## Options
33
+ #
34
+ # -C, --cache-dir DIR Overrides the default cache directory
35
+ # -h, --help Print help information
36
+ #
25
37
  class Purge < Command
26
38
 
27
39
  description 'Removes all git repository from the cache directory'
28
40
 
29
- man_page 'ronin-repos-download.1'
41
+ man_page 'ronin-repos-purge.1'
30
42
 
43
+ #
44
+ # Runs the `ronin-repos purge` command.
45
+ #
31
46
  def run
32
47
  cache_dir.purge
33
48
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  #
3
- # Copyright (c) 2021-2023 Hal Brodigan (postmodern.mod3 at gmail.com)
3
+ # Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
4
4
  #
5
5
  # ronin-repos is free software: you can redistribute it and/or modify
6
6
  # it under the terms of the GNU Lesser General Public License as published
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
4
+ #
5
+ # ronin-repos is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU Lesser General Public License as published
7
+ # by the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # ronin-repos is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU Lesser General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public License
16
+ # along with ronin-repos. If not, see <https://www.gnu.org/licenses/>.
17
+ #
18
+
19
+ require 'ronin/repos/cli/command'
20
+
21
+ require 'command_kit/printing/fields'
22
+ require 'command_kit/printing/lists'
23
+
24
+ module Ronin
25
+ module Repos
26
+ class CLI
27
+ module Commands
28
+ #
29
+ # Prints information about a specific repository in the cache directory.
30
+ #
31
+ # ## Usage
32
+ #
33
+ # ronin-repos show [options] REPO
34
+ #
35
+ # ## Options
36
+ #
37
+ # -C, --cache-dir DIR Overrides the default cache directory
38
+ # -h, --help Print help information
39
+ #
40
+ # ## Arguments
41
+ #
42
+ # REPO The repository to display
43
+ #
44
+ # @since 0.2.0
45
+ #
46
+ class Show < Command
47
+
48
+ include CommandKit::Printing::Fields
49
+ include CommandKit::Printing::Lists
50
+
51
+ usage '[options] [REPO]'
52
+
53
+ argument :name, required: true,
54
+ usage: 'REPO',
55
+ desc: 'The repository to display'
56
+
57
+ description 'Prints information about a repository in the cache directory'
58
+
59
+ man_page 'ronin-repos-show.1'
60
+
61
+ #
62
+ # Runs the `ronin-repos show` command.
63
+ #
64
+ # @param [String] name
65
+ # The repo name to display.
66
+ #
67
+ def run(name=nil)
68
+ repo = cache_dir[name]
69
+
70
+ puts "[ #{repo} ]"
71
+ puts
72
+
73
+ indent do
74
+ print_fields(
75
+ 'Name' => repo.name,
76
+ 'URI' => repo.url,
77
+ 'Files' => nil
78
+ )
79
+
80
+ indent do
81
+ print_list(repo.list_files)
82
+ end
83
+ end
84
+ rescue RepositoryNotFound => error
85
+ print_error(error.message)
86
+ exit(-1)
87
+ end
88
+
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  #
3
- # Copyright (c) 2021-2023 Hal Brodigan (postmodern.mod3 at gmail.com)
3
+ # Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
4
4
  #
5
5
  # ronin-repos is free software: you can redistribute it and/or modify
6
6
  # it under the terms of the GNU Lesser General Public License as published
@@ -77,7 +77,7 @@ module Ronin
77
77
 
78
78
  begin
79
79
  repo.update
80
- rescue CommandFailed => error
80
+ rescue CommandNotInstalled, CommandFailed => error
81
81
  log_error("failed to update repository #{repo}: #{error.message}")
82
82
  end
83
83
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  #
3
- # Copyright (c) 2021-2023 Hal Brodigan (postmodern.mod3 at gmail.com)
3
+ # Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
4
4
  #
5
5
  # ronin-repos is free software: you can redistribute it and/or modify
6
6
  # it under the terms of the GNU Lesser General Public License as published
@@ -41,9 +41,10 @@ module Ronin
41
41
  command_name 'ronin-repos'
42
42
  version Ronin::Repos::VERSION
43
43
 
44
- command_aliases['ls'] = 'list'
45
- command_aliases['up'] = 'update'
46
- command_aliases['rm'] = 'remove'
44
+ command_aliases['ls'] = 'list'
45
+ command_aliases['up'] = 'update'
46
+ command_aliases['rm'] = 'remove'
47
+ command_aliases['info'] = 'show'
47
48
 
48
49
  end
49
50
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  #
3
- # Copyright (c) 2021-2023 Hal Brodigan (postmodern.mod3 at gmail.com)
3
+ # Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
4
4
  #
5
5
  # ronin-repos is free software: you can redistribute it and/or modify
6
6
  # it under the terms of the GNU Lesser General Public License as published
@@ -21,13 +21,13 @@ module Ronin
21
21
  class Exception < RuntimeError
22
22
  end
23
23
 
24
- class RepositoryNotFound < Exception
24
+ class RepositoryNotFound < Repos::Exception
25
25
  end
26
26
 
27
- class CommandNotInstalled < Exception
27
+ class CommandNotInstalled < Repos::Exception
28
28
  end
29
29
 
30
- class CommandFailed < Exception
30
+ class CommandFailed < Repos::Exception
31
31
  end
32
32
  end
33
33
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  #
3
- # Copyright (c) 2021-2023 Hal Brodigan (postmodern.mod3 at gmail.com)
3
+ # Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
4
4
  #
5
5
  # ronin-repos is free software: you can redistribute it and/or modify
6
6
  # it under the terms of the GNU Lesser General Public License as published
@@ -19,6 +19,7 @@
19
19
  require 'ronin/repos/exceptions'
20
20
 
21
21
  require 'fileutils'
22
+ require 'time'
22
23
 
23
24
  module Ronin
24
25
  module Repos
@@ -66,7 +67,7 @@ module Ronin
66
67
  # Clones a repository.
67
68
  #
68
69
  # @param [String, URI::HTTPS] uri
69
- # The `https://` or `git@HOST:PATH` SSH URI
70
+ # The `https://` or `git@HOST:PATH` SSH URI
70
71
  #
71
72
  # @param [String] path
72
73
  # The path to where the repository will be cloned to.
@@ -109,7 +110,7 @@ module Ronin
109
110
  # path.
110
111
  #
111
112
  # @param [String, URI::HTTPS] uri
112
- # The `https://` or `git@HOST:PATH` SSH URI
113
+ # The `https://` or `git@HOST:PATH` SSH URI
113
114
  #
114
115
  # @param [String] path
115
116
  # The path to where the repository will be cloned to.
@@ -138,6 +139,34 @@ module Ronin
138
139
  return repo
139
140
  end
140
141
 
142
+ #
143
+ # The git URL of the repository.
144
+ #
145
+ # @return [String]
146
+ # The `git:` or `https://` URL for the repository.
147
+ #
148
+ # @since 0.2.0
149
+ #
150
+ def url
151
+ Dir.chdir(@path) do
152
+ `git remote get-url origin`.chomp
153
+ end
154
+ end
155
+
156
+ #
157
+ # Determines when the repository was last updated.
158
+ #
159
+ # @return [Time]
160
+ # The timestamp of the last commit will be returned.
161
+ #
162
+ # @since 0.2.0
163
+ #
164
+ def last_updated_at
165
+ Dir.chdir(@path) do
166
+ Time.parse(`git log --date=iso8601 --pretty="%cd" -1`)
167
+ end
168
+ end
169
+
141
170
  #
142
171
  # Pulls down new git commits.
143
172
  #
@@ -304,7 +333,7 @@ module Ronin
304
333
  #
305
334
  def glob(pattern,&block)
306
335
  path = join(pattern)
307
- matches = Dir.glob(path).sort
336
+ matches = Dir.glob(path)
308
337
 
309
338
  if block then matches.each(&block)
310
339
  else matches
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  #
3
- # Copyright (c) 2021-2023 Hal Brodigan (postmodern.mod3 at gmail.com)
3
+ # Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
4
4
  #
5
5
  # ronin-repos is free software: you can redistribute it and/or modify
6
6
  # it under the terms of the GNU Lesser General Public License as published
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  #
3
- # Copyright (c) 2021-2023 Hal Brodigan (postmodern.mod3 at gmail.com)
3
+ # Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
4
4
  #
5
5
  # ronin-repos is free software: you can redistribute it and/or modify
6
6
  # it under the terms of the GNU Lesser General Public License as published
@@ -19,6 +19,6 @@
19
19
  module Ronin
20
20
  module Repos
21
21
  # ronin-repos version
22
- VERSION = '0.1.0'
22
+ VERSION = '0.2.0.rc1'
23
23
  end
24
24
  end
data/lib/ronin/repos.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  #
3
- # Copyright (c) 2021-2023 Hal Brodigan (postmodern.mod3 at gmail.com)
3
+ # Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
4
4
  #
5
5
  # ronin-repos is free software: you can redistribute it and/or modify
6
6
  # it under the terms of the GNU Lesser General Public License as published
@@ -25,7 +25,21 @@ module Ronin
25
25
  # @api public
26
26
  #
27
27
  module Repos
28
- @@cache_dir = CacheDir.new
28
+ #
29
+ # The global repositories cache directory.
30
+ #
31
+ # @return [CacheDir]
32
+ # The global repositories cache directory (`~/.cache/ronin-repos`).
33
+ #
34
+ # @note This method lazy initializes {CacheDir} when first called.
35
+ #
36
+ # @api private
37
+ #
38
+ # @since 0.2.0
39
+ #
40
+ def self.cache_dir
41
+ @cache_dir ||= CacheDir.new
42
+ end
29
43
 
30
44
  #
31
45
  # Finds the first matching file.
@@ -42,7 +56,7 @@ module Ronin
42
56
  # # => "/home/user/.cache/ronin-repos/foo-repo/wordlists/wordlist.txt"
43
57
  #
44
58
  def self.find_file(path)
45
- @@cache_dir.find_file(path)
59
+ cache_dir.find_file(path)
46
60
  end
47
61
 
48
62
  #
@@ -62,7 +76,7 @@ module Ronin
62
76
  # # "/home/user/.cache/ronin-repos/bar-repo/wordlists/beers.txt"]
63
77
  #
64
78
  def self.glob(pattern,&block)
65
- @@cache_dir.glob(pattern,&block)
79
+ cache_dir.glob(pattern,&block)
66
80
  end
67
81
 
68
82
  #
@@ -75,7 +89,7 @@ module Ronin
75
89
  # The matching files within all repositories.
76
90
  #
77
91
  def self.list_files(pattern='{**/}*.*')
78
- @@cache_dir.list_files(pattern)
92
+ cache_dir.list_files(pattern)
79
93
  end
80
94
  end
81
95
  end
@@ -0,0 +1,76 @@
1
+ .\" Generated by kramdown-man 1.0.1
2
+ .\" https://github.com/postmodern/kramdown-man#readme
3
+ .TH ronin-repos-completion 1 "2024-01-01" Ronin Repos "User Manuals"
4
+ .SH NAME
5
+ .PP
6
+ ronin\-repos\-completion \- Manages shell completion rules for \fBronin\-repos\fR
7
+ .SH SYNOPSIS
8
+ .PP
9
+ \fBronin\-repos completion\fR \[lB]\fIoptions\fP\[rB]
10
+ .SH DESCRIPTION
11
+ .PP
12
+ The \fBronin\-repos completion\fR command can print, install, or uninstall shell
13
+ completion rules for the \fBronin\-repos\fR command\.
14
+ .PP
15
+ Supports installing completion rules for Bash or Zsh shells\.
16
+ Completion rules for the Fish shell is currently not supported\.
17
+ .SS ZSH SUPPORT
18
+ .PP
19
+ Zsh users will have to add the following lines to their \fB\[ti]\[sl]\.zshrc\fR file in
20
+ order to enable Zsh\[cq]s Bash completion compatibility layer:
21
+ .PP
22
+ .RS 4
23
+ .EX
24
+ autoload \-Uz \[pl]X compinit && compinit
25
+ autoload \-Uz \[pl]X bashcompinit && bashcompinit
26
+ .EE
27
+ .RE
28
+ .SH OPTIONS
29
+ .TP
30
+ \fB\-\-print\fR
31
+ Prints the shell completion file\.
32
+ .TP
33
+ \fB\-\-install\fR
34
+ Installs the shell completion file\.
35
+ .TP
36
+ \fB\-\-uninstall\fR
37
+ Uninstalls the shell completion file\.
38
+ .TP
39
+ \fB\-h\fR, \fB\-\-help\fR
40
+ Prints help information\.
41
+ .SH ENVIRONMENT
42
+ .TP
43
+ \fIPREFIX\fP
44
+ Specifies the root prefix for the file system\.
45
+ .TP
46
+ \fIHOME\fP
47
+ Specifies the home directory of the user\. Ronin will search for the
48
+ \fB\[ti]\[sl]\.cache\[sl]ronin\-repos\fR cache directory within the home directory\.
49
+ .TP
50
+ \fIXDG\[ru]DATA\[ru]HOME\fP
51
+ Specifies the data directory to use\. Defaults to \fB\[Do]HOME\[sl]\.local\[sl]share\fR\.
52
+ .SH FILES
53
+ .TP
54
+ \fB\[ti]\[sl]\.local\[sl]share\[sl]bash\-completion\[sl]completions\[sl]\fR
55
+ The user\-local installation directory for Bash completion files\.
56
+ .TP
57
+ \fB\[sl]usr\[sl]local\[sl]share\[sl]bash\-completion\[sl]completions\[sl]\fR
58
+ The system\-wide installation directory for Bash completions files\.
59
+ .TP
60
+ \fB\[sl]usr\[sl]local\[sl]share\[sl]zsh\[sl]site\-functions\[sl]\fR
61
+ The installation directory for Zsh completion files\.
62
+ .SH EXAMPLES
63
+ .TP
64
+ \fBronin\-repos completion \-\-print\fR
65
+ Prints the shell completion rules instead of installing them\.
66
+ .TP
67
+ \fBronin\-repos completion \-\-install\fR
68
+ Installs the shell completion rules for \fBronin\-repos\fR\.
69
+ .TP
70
+ \fBronin\-repos completion \-\-uninstall\fR
71
+ Uninstalls the shell completion rules for \fBronin\-repos\fR\.
72
+ .SH AUTHOR
73
+ .PP
74
+ Postmodern
75
+ .MT postmodern\.mod3\[at]gmail\.com
76
+ .ME