qb 0.3.15 → 0.3.16
Sign up to get free protection for your applications and to get access to all the features.
- 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'
|