qb 0.3.15 → 0.3.16
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/qb/ansible/module.rb +80 -10
- data/lib/qb/package.rb +4 -14
- data/lib/qb/path.rb +21 -18
- data/lib/qb/repo.rb +5 -15
- data/lib/qb/repo/git.rb +69 -53
- data/lib/qb/repo/git/github.rb +12 -4
- data/lib/qb/repo/git/user.rb +33 -0
- data/lib/qb/role.rb +22 -22
- data/lib/qb/version.rb +1 -1
- data/library/path_facts +0 -90
- data/qb.gemspec +2 -2
- data/roles/qb/git/check/clean/defaults/main.yml +7 -0
- data/roles/qb/git/check/clean/meta/qb.yml +48 -0
- data/roles/qb/git/check/clean/tasks/main.yml +26 -10
- data/roles/qb/role/meta/qb.yml +3 -3
- data/roles/qb/role/qb/templates/qb.yml.j2 +1 -1
- data/roles/qb/ruby/dependency/.qb-options.yml +4 -0
- data/roles/qb/ruby/dependency/defaults/main.yml +23 -0
- data/roles/qb/ruby/dependency/filter_plugins/dependency_filters.py +207 -0
- data/roles/qb/ruby/dependency/meta/main.yml +10 -0
- data/roles/qb/ruby/dependency/meta/qb.yml +49 -0
- data/roles/qb/ruby/dependency/tasks/detect_type.yml +18 -0
- data/roles/qb/ruby/dependency/tasks/main.yml +16 -0
- data/roles/qb/ruby/dependency/tasks/types/gemfile.yml +6 -0
- data/roles/qb/ruby/dependency/tasks/types/gemspec.yml +71 -0
- data/roles/qb/{gem → ruby/gem}/bin_stubs/defaults/main.yml +1 -1
- data/roles/qb/{gem → ruby/gem}/bin_stubs/meta/main.yml +1 -1
- data/roles/qb/{gem → ruby/gem}/bin_stubs/meta/qb.yml +1 -1
- data/roles/qb/{gem → ruby/gem}/bin_stubs/tasks/main.yml +1 -1
- data/roles/qb/ruby/gem/bin_stubs/templates/console +33 -0
- data/roles/qb/{gem → ruby/gem}/bin_stubs/templates/rake +0 -0
- data/roles/qb/{gem → ruby/gem}/bin_stubs/templates/rspec +0 -0
- data/roles/qb/{gem → ruby/gem}/build/defaults/main.yml +1 -1
- data/roles/qb/{gem → ruby/gem}/build/meta/main.yml +0 -0
- data/roles/qb/{gem → ruby/gem}/build/meta/qb.yml +1 -1
- data/roles/qb/{gem → ruby/gem}/build/tasks/main.yml +1 -1
- data/roles/qb/{gem → ruby/gem}/install/defaults/main.yml +0 -0
- data/roles/qb/{gem → ruby/gem}/install/meta/main.yml +1 -1
- data/roles/qb/{gem → ruby/gem}/install/meta/qb.yml +0 -0
- data/roles/qb/{gem → ruby/gem}/install/tasks/main.yml +0 -0
- data/roles/qb/{gem → ruby/gem}/new/defaults/main.yml +1 -1
- data/roles/qb/{gem → ruby/gem}/new/meta/main.yml +1 -1
- data/roles/qb/{gem → ruby/gem}/new/meta/qb.yml +1 -1
- data/roles/qb/{gem → ruby/gem}/new/tasks/bundle_gem.yml +0 -0
- data/roles/qb/{gem → ruby/gem}/new/tasks/main.yml +1 -1
- data/roles/qb/ruby/gem/release/defaults/main.yml +5 -0
- data/roles/qb/{gem → ruby/gem}/release/meta/main.yml +1 -1
- data/roles/qb/ruby/gem/release/meta/qb.yml +27 -0
- data/roles/qb/{gem → ruby/gem}/release/tasks/main.yml +4 -6
- data/roles/qb/ruby/gem/release/tasks/release.yml +42 -0
- data/roles/qb/ruby/rspec/setup/defaults/main.yml +7 -0
- data/roles/qb/ruby/rspec/setup/meta/main.yml +9 -0
- data/roles/qb/ruby/rspec/setup/meta/qb.yml +47 -0
- data/roles/qb/ruby/rspec/setup/tasks/main.yml +4 -0
- data/roles/qb/ruby/rspec/setup/tasks/persistence.yml +0 -0
- data/roles/qb/ruby/yard/clean/defaults/main.yml +7 -0
- data/roles/qb/ruby/yard/clean/meta/main.yml +9 -0
- data/roles/qb/ruby/yard/clean/meta/qb.yml +48 -0
- data/roles/qb/ruby/yard/clean/tasks/main.yml +27 -0
- data/roles/qb/ruby/yard/config/.qb-options.yml +4 -0
- data/roles/qb/ruby/yard/config/defaults/main.yml +15 -0
- data/roles/qb/ruby/yard/config/library/yard.get_output_dir +59 -0
- data/roles/qb/ruby/yard/config/meta/main.yml +10 -0
- data/roles/qb/ruby/yard/config/meta/qb.yml +49 -0
- data/roles/qb/ruby/yard/config/tasks/get_yard_output_dir.yml +10 -0
- data/roles/qb/ruby/yard/config/tasks/main.yml +4 -0
- data/roles/qb/ruby/yard/setup/defaults/main.yml +6 -0
- data/roles/qb/ruby/yard/{meta → setup/meta}/main.yml +2 -1
- data/roles/qb/ruby/yard/{meta → setup/meta}/qb.yml +5 -5
- data/roles/qb/ruby/yard/setup/tasks/main.yml +35 -0
- data/roles/qb/ruby/yard/setup/tasks/versions/v0.9.yml +32 -0
- data/roles/qb/ruby/yard/setup/tasks/yardopts.yml +59 -0
- metadata +65 -35
- data/roles/qb/gem/bin_stubs/templates/console +0 -25
- data/roles/qb/gem/release/defaults/main.yml +0 -5
- data/roles/qb/gem/release/meta/qb.yml +0 -21
- data/roles/qb/ruby/yard/defaults/args.yml +0 -2
- data/roles/qb/ruby/yard/defaults/main.yml +0 -9
- data/roles/qb/ruby/yard/tasks/main.yml +0 -28
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2c65f9c354ec520a8f1ac149b0cd94584b17f597
|
|
4
|
+
data.tar.gz: 7627ef3fee17449eeed1421aa99c31fda9c8c4b5
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1f61779f264ece1c9d6bc5f6dbfce675b0d8603d9dca96ea5b8653cd169a4c041cb5a1eafa108f0356c8b2482e41c8edcde8394324367b7742ff15d763d7270b
|
|
7
|
+
data.tar.gz: 0b5caaf19c3ce3ccba500b16289aac12e09ceae5f9eabf1d1a93371ea4ea79646f337af00adaa8e6c8f008289b2f80b8baaddbaf2f63d9edd0449fe21b265234
|
data/lib/qb/ansible/module.rb
CHANGED
|
@@ -2,6 +2,13 @@ require 'json'
|
|
|
2
2
|
require 'pp'
|
|
3
3
|
|
|
4
4
|
|
|
5
|
+
# Refinements
|
|
6
|
+
# =======================================================================
|
|
7
|
+
|
|
8
|
+
using NRSER
|
|
9
|
+
using NRSER::Types
|
|
10
|
+
|
|
11
|
+
|
|
5
12
|
# Declarations
|
|
6
13
|
# =====================================================================
|
|
7
14
|
|
|
@@ -33,14 +40,16 @@ class QB::Ansible::Module
|
|
|
33
40
|
end
|
|
34
41
|
|
|
35
42
|
|
|
36
|
-
#
|
|
43
|
+
# Construction
|
|
37
44
|
# =====================================================================
|
|
38
45
|
|
|
39
46
|
def initialize
|
|
40
47
|
@changed = false
|
|
41
|
-
@input_file = ARGV[0]
|
|
42
|
-
@input = File.read @input_file
|
|
43
|
-
@args = JSON.load @input
|
|
48
|
+
# @input_file = ARGV[0]
|
|
49
|
+
# @input = File.read @input_file
|
|
50
|
+
# @args = JSON.load @input
|
|
51
|
+
init_set_args!
|
|
52
|
+
|
|
44
53
|
@facts = {}
|
|
45
54
|
@warnings = []
|
|
46
55
|
|
|
@@ -82,12 +91,73 @@ class QB::Ansible::Module
|
|
|
82
91
|
END
|
|
83
92
|
end
|
|
84
93
|
|
|
85
|
-
|
|
86
|
-
|
|
94
|
+
value = type.check( @args[key.to_s] ) do |type:, value:|
|
|
95
|
+
all_args = @args
|
|
96
|
+
|
|
97
|
+
binding.erb <<-END
|
|
98
|
+
Value
|
|
99
|
+
|
|
100
|
+
<%= value.pretty_inspect %>
|
|
101
|
+
|
|
102
|
+
for argument <%= key.inspect %> is not valid for type
|
|
103
|
+
|
|
104
|
+
<%= type %>
|
|
105
|
+
|
|
106
|
+
Arguments:
|
|
107
|
+
|
|
108
|
+
<%= all_args.pretty_inspect %>
|
|
109
|
+
|
|
110
|
+
END
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
instance_variable_set var_name, value
|
|
87
114
|
}
|
|
88
115
|
end
|
|
89
116
|
|
|
90
117
|
|
|
118
|
+
protected
|
|
119
|
+
# ========================================================================
|
|
120
|
+
|
|
121
|
+
def init_set_args!
|
|
122
|
+
if ARGV.length == 1 && File.file?( ARGV[0] )
|
|
123
|
+
# "Standard" Ansible-invoked mode, where the args written in JSON format
|
|
124
|
+
# to a file and the path is provided as the only CLI argument
|
|
125
|
+
#
|
|
126
|
+
@input_file = ARGV[0]
|
|
127
|
+
@input = File.read @input_file
|
|
128
|
+
@args = JSON.load @input
|
|
129
|
+
|
|
130
|
+
else
|
|
131
|
+
# QB-specific "fiddle-mode": if we don't have a single valid file path
|
|
132
|
+
# as CLI arguments, parse the CLI options we have in the common
|
|
133
|
+
#
|
|
134
|
+
# `--name=value`
|
|
135
|
+
#
|
|
136
|
+
# format into the `@args` hash.
|
|
137
|
+
#
|
|
138
|
+
# This lets us run the module file **directly** from the terminal, which
|
|
139
|
+
# is just a quick and dirty way of flushing things out.
|
|
140
|
+
#
|
|
141
|
+
@fiddle_mode = true
|
|
142
|
+
@args = {}
|
|
143
|
+
|
|
144
|
+
ARGV.each do |arg|
|
|
145
|
+
if arg.start_with? '--'
|
|
146
|
+
key, value = arg[2..-1].split( '=', 2 )
|
|
147
|
+
|
|
148
|
+
@args[key] = begin
|
|
149
|
+
JSON.load value
|
|
150
|
+
rescue
|
|
151
|
+
value
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end # #init_set_args!
|
|
157
|
+
|
|
158
|
+
# end protected
|
|
159
|
+
public
|
|
160
|
+
|
|
91
161
|
|
|
92
162
|
# Instance Methods
|
|
93
163
|
# =====================================================================
|
|
@@ -102,10 +172,10 @@ class QB::Ansible::Module
|
|
|
102
172
|
#
|
|
103
173
|
# When run inside of QB (targeting localhost only at the moment, sadly)
|
|
104
174
|
# we expose additional IO channels for STDIN, STDOUT and STDERR through
|
|
105
|
-
# opening unix socket files that the main QB process spawns threads to
|
|
175
|
+
# opening unix socket files that the main QB process spawns threads to
|
|
106
176
|
# listen to, and we provide those file paths via environment variables
|
|
107
177
|
# so modules can pick those up and interact with those streams, allowing
|
|
108
|
-
# them to act like regular scripts inside Ansible-world (see
|
|
178
|
+
# them to act like regular scripts inside Ansible-world (see
|
|
109
179
|
# QB::Util::STDIO for details and implementation).
|
|
110
180
|
#
|
|
111
181
|
# We use those channels if present to provide logging mechanisms.
|
|
@@ -170,7 +240,7 @@ class QB::Ansible::Module
|
|
|
170
240
|
def exit_json hash
|
|
171
241
|
# print JSON response to process' actual STDOUT (instead of $stdout,
|
|
172
242
|
# which may be pointing to the qb parent process)
|
|
173
|
-
STDOUT.print JSON.
|
|
243
|
+
STDOUT.print JSON.pretty_generate(self.class.stringify_keys(hash))
|
|
174
244
|
|
|
175
245
|
[
|
|
176
246
|
[:stdin, @qb_stdio_in],
|
|
@@ -191,4 +261,4 @@ class QB::Ansible::Module
|
|
|
191
261
|
def fail msg
|
|
192
262
|
exit_json failed: true, msg: msg, warnings: @warnings
|
|
193
263
|
end
|
|
194
|
-
end # class QB::Ansible::Module
|
|
264
|
+
end # class QB::Ansible::Module
|
data/lib/qb/package.rb
CHANGED
|
@@ -18,19 +18,10 @@ require_relative './package/version'
|
|
|
18
18
|
# Refinements
|
|
19
19
|
# =======================================================================
|
|
20
20
|
|
|
21
|
-
require 'nrser/refinements'
|
|
22
21
|
using NRSER
|
|
23
|
-
|
|
24
|
-
require 'nrser/refinements/types'
|
|
25
22
|
using NRSER::Types
|
|
26
23
|
|
|
27
24
|
|
|
28
|
-
# Declarations
|
|
29
|
-
# =======================================================================
|
|
30
|
-
|
|
31
|
-
module QB; end
|
|
32
|
-
|
|
33
|
-
|
|
34
25
|
# Definitions
|
|
35
26
|
# =======================================================================
|
|
36
27
|
|
|
@@ -54,14 +45,14 @@ class QB::Package < QB::Util::Resource
|
|
|
54
45
|
# User-provided path value used to construct the resource instance, if any.
|
|
55
46
|
#
|
|
56
47
|
# This may not be the same as a root path for the resource, such as with
|
|
57
|
-
# resource classes that can be constructed from any path *inside* the
|
|
48
|
+
# resource classes that can be constructed from any path *inside* the
|
|
58
49
|
# directory, like a {QB::Repo::Git}.
|
|
59
50
|
#
|
|
60
51
|
# @return [String | Pathname]
|
|
61
52
|
# If the resource instance was constructed based on a path argument.
|
|
62
53
|
#
|
|
63
54
|
# @return [nil]
|
|
64
|
-
# If the resource instance was *not* constructed based on a path
|
|
55
|
+
# If the resource instance was *not* constructed based on a path
|
|
65
56
|
# argument.
|
|
66
57
|
#
|
|
67
58
|
prop :ref_path, type: t.maybe( t.dir_path )
|
|
@@ -144,7 +135,7 @@ class QB::Package < QB::Util::Resource
|
|
|
144
135
|
|
|
145
136
|
# Relative path from the {#repo} root to the {#root_path}.
|
|
146
137
|
#
|
|
147
|
-
# Used as the version tag prefix (unless it's `.` - when the repo root is
|
|
138
|
+
# Used as the version tag prefix (unless it's `.` - when the repo root is
|
|
148
139
|
# the root path).
|
|
149
140
|
#
|
|
150
141
|
# @return [Pathname]
|
|
@@ -159,7 +150,7 @@ class QB::Package < QB::Util::Resource
|
|
|
159
150
|
# Only makes any sense if the package is in a recognized repo, and will error
|
|
160
151
|
# out if that's not the case.
|
|
161
152
|
#
|
|
162
|
-
# The most basic prefix is "v" for packages located at the root of the
|
|
153
|
+
# The most basic prefix is "v" for packages located at the root of the
|
|
163
154
|
# repository.
|
|
164
155
|
#
|
|
165
156
|
# @example
|
|
@@ -230,4 +221,3 @@ end # class QB::Package
|
|
|
230
221
|
# =======================================================================
|
|
231
222
|
|
|
232
223
|
require_relative './package/gem'
|
|
233
|
-
|
data/lib/qb/path.rb
CHANGED
|
@@ -3,38 +3,24 @@
|
|
|
3
3
|
|
|
4
4
|
# Stdlib
|
|
5
5
|
# -----------------------------------------------------------------------
|
|
6
|
-
|
|
7
6
|
require 'pathname'
|
|
8
7
|
|
|
9
|
-
|
|
10
8
|
# Deps
|
|
11
9
|
# -----------------------------------------------------------------------
|
|
12
|
-
|
|
13
10
|
require 'nrser'
|
|
14
11
|
|
|
15
|
-
|
|
16
12
|
# Package
|
|
17
13
|
# -----------------------------------------------------------------------
|
|
18
|
-
|
|
19
14
|
require 'qb/repo/git'
|
|
20
15
|
|
|
21
16
|
|
|
22
17
|
# Refinements
|
|
23
18
|
# =======================================================================
|
|
24
19
|
|
|
25
|
-
require 'nrser/refinements'
|
|
26
20
|
using NRSER
|
|
27
|
-
|
|
28
|
-
require 'nrser/refinements/types'
|
|
29
21
|
using NRSER::Types
|
|
30
22
|
|
|
31
23
|
|
|
32
|
-
# Declarations
|
|
33
|
-
# =======================================================================
|
|
34
|
-
|
|
35
|
-
module QB; end
|
|
36
|
-
|
|
37
|
-
|
|
38
24
|
# Definitions
|
|
39
25
|
# =======================================================================
|
|
40
26
|
|
|
@@ -62,7 +48,7 @@ class QB::Path < Pathname
|
|
|
62
48
|
# and where the instance was created, which may be on a totally different
|
|
63
49
|
# system if the instance was loaded from data.
|
|
64
50
|
#
|
|
65
|
-
# TODO Not totally flushed out yet, could imagine a lot of problems and
|
|
51
|
+
# TODO Not totally flushed out yet, could imagine a lot of problems and
|
|
66
52
|
# weirdness, but it seems like we need something like this to make
|
|
67
53
|
# instances transportable. Issues with relative paths come to mind...
|
|
68
54
|
#
|
|
@@ -73,7 +59,7 @@ class QB::Path < Pathname
|
|
|
73
59
|
# The raw path argument used to instantiate the path object.
|
|
74
60
|
#
|
|
75
61
|
# NOTE Because we reduce {Pathname} instances to {String} when converting
|
|
76
|
-
# to data, there is some lossy-ness. I guess it's similar to how
|
|
62
|
+
# to data, there is some lossy-ness. I guess it's similar to how
|
|
77
63
|
# symbols and strings all become strings when run through {JSON}
|
|
78
64
|
# dump and load.
|
|
79
65
|
#
|
|
@@ -120,6 +106,10 @@ class QB::Path < Pathname
|
|
|
120
106
|
type: t.bool,
|
|
121
107
|
source: :cwd?
|
|
122
108
|
|
|
109
|
+
prop :is_symlink,
|
|
110
|
+
type: t.bool,
|
|
111
|
+
source: :symlink?
|
|
112
|
+
|
|
123
113
|
prop :relative,
|
|
124
114
|
type: t.maybe( t.path ),
|
|
125
115
|
source: :relative,
|
|
@@ -146,6 +136,18 @@ class QB::Path < Pathname
|
|
|
146
136
|
source: :git
|
|
147
137
|
|
|
148
138
|
|
|
139
|
+
# # Value would be *loadable* via init
|
|
140
|
+
# prop :packages,
|
|
141
|
+
# type: t.map( keys: t.sym, values: QB::Package ),
|
|
142
|
+
# default: ->() { QB::Package.all_from_path self }
|
|
143
|
+
#
|
|
144
|
+
#
|
|
145
|
+
# # Value would be ignored by init and re-computed
|
|
146
|
+
# prop :packages,
|
|
147
|
+
# type: t.map( keys: t.sym, values: QB::Package ),
|
|
148
|
+
# source: ->() { QB::Package.all_from_path self },
|
|
149
|
+
# cache: true
|
|
150
|
+
|
|
149
151
|
# Constructor
|
|
150
152
|
# ======================================================================
|
|
151
153
|
|
|
@@ -163,7 +165,7 @@ class QB::Path < Pathname
|
|
|
163
165
|
# The {#raw} value is passed up to {Pathname#initialize}.
|
|
164
166
|
#
|
|
165
167
|
# {#cwd} is accepted in `values`, allowing a re-instantiated object to
|
|
166
|
-
# "make sense" when the process' current directory may no longer be the
|
|
168
|
+
# "make sense" when the process' current directory may no longer be the
|
|
167
169
|
# one that data was constructed against.
|
|
168
170
|
#
|
|
169
171
|
# {#cwd} defaults to the current directory (via {Pathname.getwd}) if not
|
|
@@ -254,6 +256,8 @@ class QB::Path < Pathname
|
|
|
254
256
|
Pathname.new self
|
|
255
257
|
end
|
|
256
258
|
|
|
259
|
+
alias_method :pathname, :path
|
|
260
|
+
|
|
257
261
|
|
|
258
262
|
# Composed Sub-Instances
|
|
259
263
|
# ---------------------------------------------------------------------
|
|
@@ -285,4 +289,3 @@ class QB::Path < Pathname
|
|
|
285
289
|
end
|
|
286
290
|
|
|
287
291
|
end # class QB::Path
|
|
288
|
-
|
data/lib/qb/repo.rb
CHANGED
|
@@ -6,30 +6,26 @@
|
|
|
6
6
|
|
|
7
7
|
# Deps
|
|
8
8
|
# -----------------------------------------------------------------------
|
|
9
|
+
require 'nrser'
|
|
9
10
|
|
|
10
11
|
# Project / Package
|
|
11
12
|
# -----------------------------------------------------------------------
|
|
13
|
+
require 'qb/util/resource'
|
|
12
14
|
|
|
13
15
|
|
|
14
16
|
# Refinements
|
|
15
17
|
# =======================================================================
|
|
16
18
|
|
|
17
|
-
require 'nrser/refinements'
|
|
18
19
|
using NRSER
|
|
19
|
-
|
|
20
|
-
require 'nrser/refinements/types'
|
|
21
20
|
using NRSER::Types
|
|
22
21
|
|
|
23
22
|
|
|
24
|
-
# Declarations
|
|
25
|
-
# =======================================================================
|
|
26
|
-
|
|
27
|
-
|
|
28
23
|
# Definitions
|
|
29
24
|
# =======================================================================
|
|
30
25
|
|
|
31
26
|
# @todo document QB::Repo class.
|
|
32
27
|
class QB::Repo < QB::Util::Resource
|
|
28
|
+
autoload :Git, 'qb/repo/git'
|
|
33
29
|
|
|
34
30
|
# Constants
|
|
35
31
|
# ======================================================================
|
|
@@ -83,14 +79,14 @@ class QB::Repo < QB::Util::Resource
|
|
|
83
79
|
# User-provided path value used to construct the resource instance, if any.
|
|
84
80
|
#
|
|
85
81
|
# This may not be the same as a root path for the resource, such as with
|
|
86
|
-
# resource classes that can be constructed from any path *inside* the
|
|
82
|
+
# resource classes that can be constructed from any path *inside* the
|
|
87
83
|
# directory, like a {QB::Repo::Git}.
|
|
88
84
|
#
|
|
89
85
|
# @return [String | Pathname]
|
|
90
86
|
# If the resource instance was constructed based on a path argument.
|
|
91
87
|
#
|
|
92
88
|
# @return [nil]
|
|
93
|
-
# If the resource instance was *not* constructed based on a path
|
|
89
|
+
# If the resource instance was *not* constructed based on a path
|
|
94
90
|
# argument.
|
|
95
91
|
#
|
|
96
92
|
prop :ref_path, type: t.maybe( t.path )
|
|
@@ -129,9 +125,3 @@ class QB::Repo < QB::Util::Resource
|
|
|
129
125
|
|
|
130
126
|
|
|
131
127
|
end # class QB::Repo
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
# Post-Processing
|
|
135
|
-
# =======================================================================
|
|
136
|
-
|
|
137
|
-
require 'qb/repo/git'
|
data/lib/qb/repo/git.rb
CHANGED
|
@@ -17,10 +17,7 @@ require 'qb/util/resource'
|
|
|
17
17
|
# Refinements
|
|
18
18
|
# =======================================================================
|
|
19
19
|
|
|
20
|
-
require 'nrser/refinements'
|
|
21
20
|
using NRSER
|
|
22
|
-
|
|
23
|
-
require 'nrser/refinements/types'
|
|
24
21
|
using NRSER::Types
|
|
25
22
|
|
|
26
23
|
|
|
@@ -37,16 +34,33 @@ class QB::Repo < QB::Util::Resource; end
|
|
|
37
34
|
# Encapsulate information about a Git repository and expose useful operations as
|
|
38
35
|
# instance methods.
|
|
39
36
|
#
|
|
40
|
-
# The main entry point is {QB::Repo::Git.from_path}, which creates a
|
|
37
|
+
# The main entry point is {QB::Repo::Git.from_path}, which creates a
|
|
41
38
|
#
|
|
42
39
|
class QB::Repo::Git < QB::Repo
|
|
43
|
-
|
|
44
|
-
|
|
40
|
+
autoload :User, 'qb/repo/git/user'
|
|
41
|
+
autoload :GitHub, 'qb/repo/git/github'
|
|
45
42
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
43
|
+
# Props
|
|
44
|
+
# =====================================================================
|
|
45
|
+
|
|
46
|
+
prop :user, type: User
|
|
47
|
+
prop :head, type: t.maybe(t.str)
|
|
48
|
+
prop :branch, type: t.maybe(t.str)
|
|
49
|
+
prop :origin, type: t.maybe(t.str)
|
|
50
|
+
prop :owner, type: t.maybe(t.str)
|
|
51
|
+
prop :github, type: t.maybe(t.hash_)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
# Derived Properties
|
|
55
|
+
# ---------------------------------------------------------------------
|
|
56
|
+
|
|
57
|
+
prop :head_short, type: t.maybe(t.str), source: :head_short
|
|
58
|
+
prop :full_name, type: t.maybe(t.str), source: :full_name
|
|
59
|
+
prop :is_github, type: t.bool, source: :github?
|
|
60
|
+
prop :is_clean, type: t.bool, source: :clean?
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
|
|
50
64
|
|
|
51
65
|
|
|
52
66
|
# class GitHubRemote < NRSER::Meta::Props::Base
|
|
@@ -64,11 +78,11 @@ class QB::Repo::Git < QB::Repo
|
|
|
64
78
|
# # =====================================================================
|
|
65
79
|
#
|
|
66
80
|
# # Test if a Git SSH or HTTPS remote url points to GitHub.
|
|
67
|
-
# #
|
|
81
|
+
# #
|
|
68
82
|
# # @param [String] url
|
|
69
|
-
# #
|
|
83
|
+
# #
|
|
70
84
|
# # @return [Boolean]
|
|
71
|
-
# #
|
|
85
|
+
# #
|
|
72
86
|
# def self.url? url
|
|
73
87
|
# SSH_URL_RE.match(url) || HTTPS_URL_RE.match(url)
|
|
74
88
|
# end # .url?
|
|
@@ -76,13 +90,13 @@ class QB::Repo::Git < QB::Repo
|
|
|
76
90
|
#
|
|
77
91
|
# # Instantiate an instance from a Git SSH or HTTPS remote url that points
|
|
78
92
|
# # to GitHub.
|
|
79
|
-
# #
|
|
93
|
+
# #
|
|
80
94
|
# # @param [type] arg_name
|
|
81
95
|
# # @todo Add name param description.
|
|
82
|
-
# #
|
|
96
|
+
# #
|
|
83
97
|
# # @return [QB::Repo::Git::GitHubRemote]
|
|
84
98
|
# # @todo Document return value.
|
|
85
|
-
# #
|
|
99
|
+
# #
|
|
86
100
|
# def self.from_url url, use_api: false
|
|
87
101
|
# match = SSH_URL_RE.match(git.origin) ||
|
|
88
102
|
# HTTPS_URL_RE.match(git.origin)
|
|
@@ -104,13 +118,13 @@ class QB::Repo::Git < QB::Repo
|
|
|
104
118
|
#
|
|
105
119
|
#
|
|
106
120
|
# # @todo Document full_name method.
|
|
107
|
-
# #
|
|
121
|
+
# #
|
|
108
122
|
# # @param [type] arg_name
|
|
109
123
|
# # @todo Add name param description.
|
|
110
|
-
# #
|
|
124
|
+
# #
|
|
111
125
|
# # @return [return_type]
|
|
112
126
|
# # @todo Document return value.
|
|
113
|
-
# #
|
|
127
|
+
# #
|
|
114
128
|
# def full_name arg_name
|
|
115
129
|
# "#{ owner }/#{ name }"
|
|
116
130
|
# end # #full_name
|
|
@@ -139,8 +153,8 @@ class QB::Repo::Git < QB::Repo
|
|
|
139
153
|
# the {QB::Repo::Git#github} property for repos that have a GitHub origin
|
|
140
154
|
# URL.
|
|
141
155
|
#
|
|
142
|
-
# Otherwise we will just assume GitHub repos are private since it's the
|
|
143
|
-
# safe guess, resulting in a {QB::Repo::Git#github} value of
|
|
156
|
+
# Otherwise we will just assume GitHub repos are private since it's the
|
|
157
|
+
# safe guess, resulting in a {QB::Repo::Git#github} value of
|
|
144
158
|
# `{private: true}`.
|
|
145
159
|
#
|
|
146
160
|
# @return [QB::Repo::Git]
|
|
@@ -150,7 +164,7 @@ class QB::Repo::Git < QB::Repo
|
|
|
150
164
|
# If `path` is not in a Git repo.
|
|
151
165
|
#
|
|
152
166
|
# @raise [QB::FSStateError]
|
|
153
|
-
# - If we can't find any existing directory to look in based on
|
|
167
|
+
# - If we can't find any existing directory to look in based on
|
|
154
168
|
# `input_path`.
|
|
155
169
|
#
|
|
156
170
|
def self.from_path path, use_github_api: false
|
|
@@ -283,7 +297,7 @@ class QB::Repo::Git < QB::Repo
|
|
|
283
297
|
# @return [QB::Repo::Git]
|
|
284
298
|
#
|
|
285
299
|
# @raise [QB::FSStateError]
|
|
286
|
-
# - If we can't find any existing directory to look in based on
|
|
300
|
+
# - If we can't find any existing directory to look in based on
|
|
287
301
|
# `input_path`.
|
|
288
302
|
#
|
|
289
303
|
# - If the directory we do find to look in does not seems to be part of
|
|
@@ -300,26 +314,6 @@ class QB::Repo::Git < QB::Repo
|
|
|
300
314
|
end # #from_path!
|
|
301
315
|
|
|
302
316
|
|
|
303
|
-
# Props
|
|
304
|
-
# =====================================================================
|
|
305
|
-
|
|
306
|
-
prop :user, type: User
|
|
307
|
-
prop :is_clean, type: t.bool
|
|
308
|
-
prop :head, type: t.maybe(t.str)
|
|
309
|
-
prop :branch, type: t.maybe(t.str)
|
|
310
|
-
prop :origin, type: t.maybe(t.str)
|
|
311
|
-
prop :owner, type: t.maybe(t.str)
|
|
312
|
-
prop :github, type: t.maybe(t.hash_)
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
# Derived Properties
|
|
316
|
-
# ---------------------------------------------------------------------
|
|
317
|
-
|
|
318
|
-
prop :head_short, type: t.maybe(t.str), source: :head_short
|
|
319
|
-
prop :full_name, type: t.maybe(t.str), source: :full_name
|
|
320
|
-
prop :is_github, type: t.bool, source: :github?
|
|
321
|
-
|
|
322
|
-
|
|
323
317
|
# Instance Methods
|
|
324
318
|
# =====================================================================
|
|
325
319
|
|
|
@@ -331,11 +325,22 @@ class QB::Repo::Git < QB::Repo
|
|
|
331
325
|
head[0...7] if head
|
|
332
326
|
end
|
|
333
327
|
|
|
328
|
+
|
|
329
|
+
# Always returns `false`, where {QB::Repo::Git::GitHub#github?} always
|
|
330
|
+
# returns `true`.
|
|
331
|
+
#
|
|
332
|
+
# Use {.from_path} to construct instances so you end up with the right
|
|
333
|
+
# class.
|
|
334
|
+
#
|
|
335
|
+
# @return [false]
|
|
336
|
+
#
|
|
334
337
|
def github?
|
|
335
|
-
|
|
338
|
+
# origin && QB::Repo::Git::GitHub.url?( origin )
|
|
339
|
+
false
|
|
336
340
|
end
|
|
337
341
|
|
|
338
|
-
|
|
342
|
+
|
|
343
|
+
def api
|
|
339
344
|
@api ||= ::Git.open root_path
|
|
340
345
|
end
|
|
341
346
|
|
|
@@ -343,11 +348,28 @@ class QB::Repo::Git < QB::Repo
|
|
|
343
348
|
# Reading Repo State
|
|
344
349
|
# ---------------------------------------------------------------------
|
|
345
350
|
|
|
351
|
+
def status
|
|
352
|
+
Cmds.new( 'git status --porcelain', chdir: root_path ).
|
|
353
|
+
out!.lines.map( &:chomp ).map { |line|
|
|
354
|
+
m = /\A\s*(?<mode>\S+)\s*(?<path>.*)\z/.match line
|
|
355
|
+
|
|
356
|
+
[m['path'], m['mode']]
|
|
357
|
+
}.to_h
|
|
358
|
+
end
|
|
359
|
+
|
|
360
|
+
|
|
346
361
|
# @return [Boolean]
|
|
347
362
|
# `false` if the repo has any uncommitted changes or untracked files.
|
|
348
363
|
#
|
|
349
|
-
def clean?
|
|
350
|
-
|
|
364
|
+
def clean? ignore: nil
|
|
365
|
+
if ignore
|
|
366
|
+
ignore = [*ignore]
|
|
367
|
+
status.reject { |path, mode|
|
|
368
|
+
ignore.any? { |pattern| File.fnmatch? pattern, path }
|
|
369
|
+
}.empty?
|
|
370
|
+
else
|
|
371
|
+
status.empty?
|
|
372
|
+
end
|
|
351
373
|
end
|
|
352
374
|
|
|
353
375
|
|
|
@@ -356,9 +378,3 @@ class QB::Repo::Git < QB::Repo
|
|
|
356
378
|
end
|
|
357
379
|
|
|
358
380
|
end # class QB::Repo::Git
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
# Post-Processing
|
|
362
|
-
# =======================================================================
|
|
363
|
-
|
|
364
|
-
require 'qb/repo/git/github'
|