lolcommits 0.9.3.pre1 → 0.9.3.pre2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +45 -12
- data/CHANGELOG.md +6 -3
- data/README.md +59 -39
- data/bin/lolcommits +16 -33
- data/lib/lolcommits/backends/installation_git.rb +11 -7
- data/lib/lolcommits/backends/installation_mercurial.rb +6 -4
- data/lib/lolcommits/configuration.rb +16 -21
- data/lib/lolcommits/gem_plugin.rb +25 -10
- data/lib/lolcommits/plugin/base.rb +9 -3
- data/lib/lolcommits/plugin_manager.rb +44 -22
- data/lib/lolcommits/runner.rb +8 -20
- data/lib/lolcommits/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c7f9361b802d1360887f9abf9851379a40a006af
|
4
|
+
data.tar.gz: f6eaccaf5bcd60b3de0919d0e2d50cd0c9b42c60
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7760ce09dbb11464c376382c1d7aad4503affba32f36aaae686f0095ad0348e97f5dc6d20185bbe26709936cca5e68f60aa99f6e705252a21479a44868c366dc
|
7
|
+
data.tar.gz: a55a968ffcb164820a4b7ca18994ebd58a7da8ca95cf06033e4ab069a5560cb0f22459757a374a74be3382bba48399b635c31c2c66d8e9d9b58523768daf5d08
|
data/.rubocop_todo.yml
CHANGED
@@ -1,50 +1,83 @@
|
|
1
1
|
# This configuration was generated by
|
2
2
|
# `rubocop --auto-gen-config`
|
3
|
-
# on
|
3
|
+
# on 2017-04-04 11:42:26 +0100 using RuboCop version 0.48.1.
|
4
4
|
# The point is for the user to remove these configuration records
|
5
5
|
# one by one as the offenses are removed from the code base.
|
6
6
|
# Note that changes in the inspected code, or installation of new
|
7
7
|
# versions of RuboCop, may require this file to be generated again.
|
8
8
|
|
9
|
+
# Offense count: 1
|
10
|
+
Lint/AmbiguousBlockAssociation:
|
11
|
+
Exclude:
|
12
|
+
- 'lib/lolcommits/cli/process_runner.rb'
|
13
|
+
|
9
14
|
# Offense count: 35
|
10
15
|
Metrics/AbcSize:
|
11
|
-
Max:
|
16
|
+
Max: 37
|
12
17
|
|
13
18
|
# Offense count: 2
|
14
|
-
# Configuration parameters: CountComments.
|
19
|
+
# Configuration parameters: CountComments, ExcludedMethods.
|
15
20
|
Metrics/BlockLength:
|
16
|
-
Max:
|
21
|
+
Max: 40
|
17
22
|
|
18
23
|
# Offense count: 5
|
19
24
|
# Configuration parameters: CountComments.
|
20
25
|
Metrics/ClassLength:
|
21
|
-
Max:
|
26
|
+
Max: 149
|
22
27
|
|
23
28
|
# Offense count: 6
|
24
29
|
Metrics/CyclomaticComplexity:
|
25
|
-
Max:
|
30
|
+
Max: 8
|
26
31
|
|
27
|
-
# Offense count:
|
32
|
+
# Offense count: 152
|
28
33
|
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
|
29
34
|
# URISchemes: http, https
|
30
35
|
Metrics/LineLength:
|
31
36
|
Max: 161
|
32
37
|
|
33
|
-
# Offense count:
|
38
|
+
# Offense count: 42
|
34
39
|
# Configuration parameters: CountComments.
|
35
40
|
Metrics/MethodLength:
|
36
41
|
Max: 31
|
37
42
|
|
38
43
|
# Offense count: 5
|
39
44
|
Metrics/PerceivedComplexity:
|
40
|
-
Max:
|
45
|
+
Max: 10
|
41
46
|
|
42
|
-
# Offense count:
|
47
|
+
# Offense count: 1
|
48
|
+
# Cop supports --auto-correct.
|
49
|
+
Security/YAMLLoad:
|
50
|
+
Exclude:
|
51
|
+
- 'lib/lolcommits/configuration.rb'
|
52
|
+
|
53
|
+
# Offense count: 37
|
43
54
|
Style/Documentation:
|
44
55
|
Enabled: false
|
45
56
|
|
57
|
+
# Offense count: 2
|
58
|
+
# Cop supports --auto-correct.
|
59
|
+
Style/EmptyLinesAroundBeginBody:
|
60
|
+
Exclude:
|
61
|
+
- 'lib/lolcommits/plugin/lol_flowdock.rb'
|
62
|
+
- 'lib/lolcommits/plugin/lol_slack.rb'
|
63
|
+
|
46
64
|
# Offense count: 1
|
47
65
|
# Cop supports --auto-correct.
|
48
|
-
|
66
|
+
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
67
|
+
# SupportedStyles: auto_detection, squiggly, active_support, powerpack, unindent
|
68
|
+
Style/IndentHeredoc:
|
49
69
|
Exclude:
|
50
|
-
- 'lib/lolcommits/
|
70
|
+
- 'lib/lolcommits/backends/installation_git.rb'
|
71
|
+
|
72
|
+
# Offense count: 77
|
73
|
+
# Cop supports --auto-correct.
|
74
|
+
# Configuration parameters: PreferredDelimiters.
|
75
|
+
Style/PercentLiteralDelimiters:
|
76
|
+
Enabled: false
|
77
|
+
|
78
|
+
# Offense count: 1
|
79
|
+
# Cop supports --auto-correct.
|
80
|
+
# Configuration parameters: SupportedStyles.
|
81
|
+
# SupportedStyles: percent, brackets
|
82
|
+
Style/SymbolArray:
|
83
|
+
EnforcedStyle: brackets
|
data/CHANGELOG.md
CHANGED
@@ -8,8 +8,9 @@ project adheres to [Semantic Versioning][Semver].
|
|
8
8
|
* WIP - extract more plugins to gems ...
|
9
9
|
* Your contribution here!
|
10
10
|
|
11
|
-
## [0.9.3][] (
|
12
|
-
*
|
11
|
+
## [0.9.3][] (5 April 2017)
|
12
|
+
* LOLCOMMITS_CAPTURE_DISABLED env var (@williamboman [#338][])
|
13
|
+
* Plugin Manager and Gem plugin support (@matthutchinson [#332][])
|
13
14
|
* Add North gravity for ImageMagick (@domudall [#331][])
|
14
15
|
* remove Ruby 1.9 magic comments (@matthutchinson [#330][])
|
15
16
|
* add links to PRs in CHANGELOG (@bfontaine [#329][])
|
@@ -272,7 +273,8 @@ project adheres to [Semantic Versioning][Semver].
|
|
272
273
|
instead of compositing multiply image Caption objects (this seems to be more
|
273
274
|
reliable to not glitch.)
|
274
275
|
|
275
|
-
[Unreleased]: https://github.com/mroth/lolcommits/compare/v0.9.
|
276
|
+
[Unreleased]: https://github.com/mroth/lolcommits/compare/v0.9.3...HEAD
|
277
|
+
[0.9.3]: https://github.com/mroth/lolcommits/compare/v0.9.2...v0.9.3
|
276
278
|
[0.9.2]: https://github.com/mroth/lolcommits/compare/v0.9.1...v0.9.2
|
277
279
|
[0.9.1]: https://github.com/mroth/lolcommits/compare/v0.9.0...v0.9.1
|
278
280
|
[0.9.0]: https://github.com/mroth/lolcommits/compare/v0.8.1...v0.9.0
|
@@ -429,3 +431,4 @@ project adheres to [Semantic Versioning][Semver].
|
|
429
431
|
[#330]: https://github.com/mroth/lolcommits/pull/330
|
430
432
|
[#331]: https://github.com/mroth/lolcommits/pull/331
|
431
433
|
[#332]: https://github.com/mroth/lolcommits/pull/332
|
434
|
+
[#338]: https://github.com/mroth/lolcommits/pull/338
|
data/README.md
CHANGED
@@ -17,9 +17,9 @@ By default, the lol images are stored by a Github style short SHA in a
|
|
17
17
|
|
18
18
|
<img src="https://lolcommits.github.io/assets/img/gallery.jpeg" />
|
19
19
|
|
20
|
-
Please add your own lolcommit
|
20
|
+
Please add your own lolcommit to the [People Using
|
21
21
|
Lolcommits](https://github.com/mroth/lolcommits/wiki/Lolcommits-from-around-the-world%21)
|
22
|
-
page on our wiki
|
22
|
+
page on our wiki!
|
23
23
|
|
24
24
|
|
25
25
|
## Requirements
|
@@ -33,7 +33,7 @@ page on our wiki.
|
|
33
33
|
## Installation
|
34
34
|
|
35
35
|
|
36
|
-
###
|
36
|
+
### macOS
|
37
37
|
|
38
38
|
You'll need ImageMagick installed. [Homebrew](http://mxcl.github.com/homebrew/)
|
39
39
|
makes this easy.
|
@@ -45,13 +45,10 @@ Then install with:
|
|
45
45
|
[sudo] gem install lolcommits
|
46
46
|
|
47
47
|
If you're using RVM (or rbenv), you can/should probably omit the sudo, but the
|
48
|
-
default
|
49
|
-
|
50
|
-
If [Boxen](https://boxen.github.com) is your thing, [try
|
51
|
-
this](https://github.com/AssuredLabor/puppet-lolcommits).
|
48
|
+
default macOS Ruby install is dumb and requires it.
|
52
49
|
|
53
50
|
Lolcommits v0.8.1 was the last release to support Ruby < 2.0. If you'd like to
|
54
|
-
use
|
51
|
+
use older Rubies try:
|
55
52
|
|
56
53
|
[sudo] gem install lolcommits --version 0.8.1 # for Ruby 1.9
|
57
54
|
[sudo] gem install lolcommits --version 0.7.0 # for Ruby 1.8
|
@@ -59,14 +56,14 @@ use this program on older rubies try:
|
|
59
56
|
|
60
57
|
### Linux
|
61
58
|
|
62
|
-
Install dependencies using your package manager of choice, for example in
|
59
|
+
Install these dependencies using your package manager of choice, for example in
|
63
60
|
Ubuntu:
|
64
61
|
|
65
62
|
sudo apt-get install mplayer imagemagick libmagickwand-dev
|
66
63
|
|
67
64
|
For Ubuntu 14.04 or newer, you need to manually install ffmpeg since it no
|
68
|
-
longer ships with the default Ubuntu sources
|
69
|
-
|
65
|
+
longer ships with the default Ubuntu sources ([downloads
|
66
|
+
here](http://ffmpeg.org/download.html)).
|
70
67
|
|
71
68
|
Then install with:
|
72
69
|
|
@@ -88,14 +85,15 @@ Windows](https://github.com/mroth/lolcommits/wiki/Installing-on-Windows).
|
|
88
85
|
|
89
86
|
### Enabling and basic usage
|
90
87
|
|
91
|
-
|
92
|
-
|
93
|
-
lolcommits are stored in `~/.lolcommits`
|
94
|
-
|
88
|
+
Within any git repository, simply run `lolcommits --enable`. From that point on,
|
89
|
+
any git commit will automatically trigger a lolcommit capture! By default, all
|
90
|
+
lolcommits are stored in `~/.lolcommits` and placed in a subdirectory by project
|
91
|
+
name, with a filename matching the commit hash.
|
95
92
|
|
96
|
-
|
93
|
+
Follow [these
|
97
94
|
steps](https://github.com/mroth/lolcommits/wiki/Enabling-Lolcommits-for-all-your-Git-Repositories)
|
98
|
-
to
|
95
|
+
to enable lolcommits across all your repos; using `git init` and the
|
96
|
+
`init.templatedir` setting.
|
99
97
|
|
100
98
|
Don't worry about it too much, half the fun of lolcommits is forgetting it's
|
101
99
|
installed!
|
@@ -103,7 +101,7 @@ installed!
|
|
103
101
|
|
104
102
|
### Other commands
|
105
103
|
|
106
|
-
|
104
|
+
OK, if you insist... Since you know about `--enable`, common sense suggests
|
107
105
|
there is also a repository specific `--disable`, hopefully you can guess what
|
108
106
|
that does.
|
109
107
|
|
@@ -118,10 +116,10 @@ git post-hook capture command. For example;
|
|
118
116
|
lolcommits --enable --delay 5 --animate 4 --fork
|
119
117
|
|
120
118
|
Will configure capturing of an animated gif (4 secs) after a 5 sec delay in a
|
121
|
-
forked process. See the section below for more capture configuration
|
119
|
+
forked process. See the section below for more capture configuration options.
|
122
120
|
|
123
121
|
|
124
|
-
### Capture configuration
|
122
|
+
### Capture configuration options
|
125
123
|
|
126
124
|
lolcommits has some capture options for additional lulz. You can enable these
|
127
125
|
via environment variables like so;
|
@@ -129,14 +127,18 @@ via environment variables like so;
|
|
129
127
|
* `LOLCOMMITS_DEVICE` set a webcam device - **mac and linux only**
|
130
128
|
* `LOLCOMMITS_ANIMATE` (in seconds) set time for capturing an animated gif -
|
131
129
|
**requires ffmpeg**
|
132
|
-
* `LOLCOMMITS_DELAY` (in seconds) set delay
|
133
|
-
warmup)
|
130
|
+
* `LOLCOMMITS_DELAY` (in seconds) set delay time before capturing (for slow
|
131
|
+
webcams to warmup)
|
134
132
|
* `LOLCOMMITS_FORK` fork lolcommit runner (capture command forks to a new
|
135
133
|
process, speedily returning you to your terminal)
|
136
|
-
* `LOLCOMMITS_STEALTH` disable notification messages
|
137
|
-
* `LOLCOMMITS_DIR` set the output directory used for all repositories (defaults
|
134
|
+
* `LOLCOMMITS_STEALTH` disable all notification messages when capturing
|
135
|
+
* `LOLCOMMITS_DIR` set the output directory used for all repositories (defaults
|
136
|
+
to ~/.lolcommits)
|
137
|
+
* `LOLCOMMITS_CAPTURE_DISABLED` disables lolcommit capturing in the commit hook
|
138
|
+
(when set as 'true')
|
139
|
+
|
138
140
|
|
139
|
-
Or they can be set with
|
141
|
+
Or they can be set with arguments to the capture command (located in your
|
140
142
|
repository's `.git/hooks/post-commit` file).
|
141
143
|
|
142
144
|
* `--device {name}` or `-d {name}`
|
@@ -154,7 +156,8 @@ loltext plugin with this command:
|
|
154
156
|
|
155
157
|
lolcommits --config -p loltext
|
156
158
|
|
157
|
-
To find out more, read about [loltext
|
159
|
+
To find out more about styling, read about the [loltext
|
160
|
+
options](https://github.com/mroth/lolcommits/wiki/Configure-Commit-Capturing#loltext-options).
|
158
161
|
|
159
162
|
|
160
163
|
### Animated Gif Capturing
|
@@ -164,7 +167,7 @@ you capture and the capabilities of your machine).
|
|
164
167
|
[ffmpeg](https://www.ffmpeg.org) is required and can be installed like so;
|
165
168
|
|
166
169
|
* Linux - [follow this guide](https://www.ffmpeg.org/download.html#build-linux)
|
167
|
-
*
|
170
|
+
* macOS - `brew install ffmpeg`
|
168
171
|
|
169
172
|
To enable, just set the `LOLCOMMITS_ANIMATE` environment variable with the
|
170
173
|
number of seconds to capture. If you find animated capturing takes too long, try
|
@@ -180,21 +183,38 @@ animated lolcommit gif")
|
|
180
183
|
|
181
184
|
A growing number of plugins are available, allowing you to transform or share
|
182
185
|
your lolcommits with others. The default plugin simply appends your commit
|
183
|
-
message and sha to the captured image. Others can
|
184
|
-
|
185
|
-
[lolspeak](http://www.urbandictionary.com/define.php?term=lolspeak).
|
186
|
-
|
186
|
+
message and sha to the captured image. Others can post to Twitter, Tumblr (and
|
187
|
+
other services), or even translate your commit messages to
|
188
|
+
[lolspeak](http://www.urbandictionary.com/define.php?term=lolspeak). Check them
|
189
|
+
out on our [plugins
|
190
|
+
page](https://github.com/mroth/lolcommits/wiki/Configuring-Plugins).
|
191
|
+
|
192
|
+
Until recently, all plugins lived inside the main lolcommits gem. We are in the
|
193
|
+
process of extracting them to individual gems. For [gem
|
194
|
+
plugins](https://github.com/lolcommits), you'll need
|
195
|
+
to install the gem first:
|
196
|
+
|
197
|
+
[sudo] gem install lolcommits-plugin-sample
|
198
|
+
|
199
|
+
To list available/installed plugins use:
|
200
|
+
|
201
|
+
lolcommits --plugins
|
202
|
+
|
203
|
+
Plugins can be easily enabled, configured or disabled with the `--config`
|
204
|
+
option:
|
187
205
|
|
188
206
|
lolcommits --config
|
207
|
+
# or
|
208
|
+
lolcommits --config -p loltxt
|
189
209
|
|
190
|
-
|
191
|
-
|
210
|
+
Interested in developing your own plugin? Follow this [this simple
|
211
|
+
guide](https://github.com/lolcommits/lolcommits-plugin-sample) for the
|
212
|
+
Lolcommits Plugin Sample gem.
|
192
213
|
|
193
214
|
|
194
215
|
## Timelapse
|
195
216
|
|
196
|
-
|
197
|
-
timelapse gif.
|
217
|
+
Watch your face decay while you program, with an animated timelapse gif!
|
198
218
|
|
199
219
|
lolcommits --timelapse
|
200
220
|
# or for just today's lolcommits
|
@@ -203,10 +223,10 @@ timelapse gif.
|
|
203
223
|
## Troubles?
|
204
224
|
|
205
225
|
Try our trouble-shooting [FAQ](https://github.com/mroth/lolcommits/wiki/FAQ), or
|
206
|
-
take a read through our [wiki](https://github.com/mroth/lolcommits/wiki)
|
207
|
-
|
208
|
-
issue](https://github.com/mroth/lolcommits/issues) (and please
|
209
|
-
|
226
|
+
take a read through our [wiki](https://github.com/mroth/lolcommits/wiki). If you
|
227
|
+
think something is broken or missing, please raise a [Github
|
228
|
+
issue](https://github.com/mroth/lolcommits/issues) (and please check if we
|
229
|
+
haven't [already
|
210
230
|
addressed](https://github.com/mroth/lolcommits/issues?q=is%3Aissue+is%3Aclosed)
|
211
231
|
it).
|
212
232
|
|
data/bin/lolcommits
CHANGED
@@ -36,13 +36,13 @@ class App
|
|
36
36
|
debug 'Outputting at DEBUG verbosity'
|
37
37
|
end
|
38
38
|
|
39
|
-
|
40
|
-
|
39
|
+
plugin_manager = PluginManager.init
|
40
|
+
config = Configuration.new(plugin_manager, test_mode: options[:test])
|
41
41
|
|
42
42
|
if options[:'show-config']
|
43
|
-
puts
|
43
|
+
puts config
|
44
44
|
elsif options[:plugins]
|
45
|
-
|
45
|
+
config.list_plugins
|
46
46
|
elsif options[:devices]
|
47
47
|
puts Platform.device_list
|
48
48
|
puts device_list_help
|
@@ -59,15 +59,15 @@ class App
|
|
59
59
|
end
|
60
60
|
|
61
61
|
if options[:last]
|
62
|
-
show_last_lolimage
|
62
|
+
show_last_lolimage(config.loldir)
|
63
63
|
elsif options[:browse]
|
64
|
-
Launcher.open_folder(
|
64
|
+
Launcher.open_folder(config.loldir)
|
65
65
|
elsif options[:timelapse]
|
66
|
-
TimelapseGif.new(
|
66
|
+
TimelapseGif.new(config).run(options[:period])
|
67
67
|
elsif options[:config]
|
68
|
-
|
68
|
+
config.do_configure!(options[:plugin])
|
69
69
|
elsif options[:capture]
|
70
|
-
capture_lolcommit
|
70
|
+
capture_lolcommit(config)
|
71
71
|
end
|
72
72
|
end
|
73
73
|
end
|
@@ -75,7 +75,7 @@ class App
|
|
75
75
|
|
76
76
|
on('--test', 'run in test mode')
|
77
77
|
on('--debug', 'show debugging info')
|
78
|
-
on('--show-config', 'show
|
78
|
+
on('--show-config', 'show config file')
|
79
79
|
on('--devices', 'list available capture devices (mac only)')
|
80
80
|
on('--plugins', 'list all available plugins')
|
81
81
|
on('--config', 'configure a plugin')
|
@@ -109,34 +109,17 @@ class App
|
|
109
109
|
'Or: lolcommits --help'
|
110
110
|
end
|
111
111
|
|
112
|
-
# Gets a configuration object. If running in test mode will override the
|
113
|
-
# LOLDIR for the configuration.
|
114
|
-
#
|
115
|
-
# @return [Lolcommits::Configuration]
|
116
|
-
def self.configuration
|
117
|
-
if options[:test]
|
118
|
-
Configuration.new(loldir: Configuration.loldir_for('test'))
|
119
|
-
else
|
120
|
-
Configuration.new
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
112
|
def self.debug_enabled?
|
125
113
|
options[:debug] || ENV['LOLCOMMITS_DEBUG'] || false
|
126
114
|
end
|
127
115
|
|
128
|
-
def self.load_plugins
|
129
|
-
pm = Lolcommits::PluginManager.new
|
130
|
-
pm.locate_plugins
|
131
|
-
pm.load_plugins
|
132
|
-
end
|
133
|
-
|
134
116
|
def self.device_list_help
|
135
117
|
'Specify a device with --device "{device name}" or set the LOLCOMMITS_DEVICE env variable'
|
136
118
|
end
|
137
119
|
|
138
|
-
def self.show_last_lolimage
|
139
|
-
lolimage =
|
120
|
+
def self.show_last_lolimage(loldir)
|
121
|
+
lolimage = Dir.glob(File.join(loldir, '*.{jpg,gif}')).max_by { |f| File.mtime(f) }
|
122
|
+
|
140
123
|
if lolimage.nil?
|
141
124
|
warn 'No lolcommits have been captured for this repository yet.'
|
142
125
|
exit 1
|
@@ -150,7 +133,7 @@ class App
|
|
150
133
|
result
|
151
134
|
end
|
152
135
|
|
153
|
-
def self.capture_lolcommit
|
136
|
+
def self.capture_lolcommit(config)
|
154
137
|
should_we_fork = options[:fork] || ENV['LOLCOMMITS_FORK'] || false
|
155
138
|
capture_stealth = options[:stealth] || ENV['LOLCOMMITS_STEALTH'] || false
|
156
139
|
capture_delay = (options[:delay] || ENV['LOLCOMMITS_DELAY']).to_i
|
@@ -160,10 +143,10 @@ class App
|
|
160
143
|
capture_stealth: capture_stealth,
|
161
144
|
capture_device: capture_device,
|
162
145
|
capture_animate: capture_animate,
|
163
|
-
config:
|
146
|
+
config: config
|
164
147
|
}
|
165
148
|
|
166
|
-
process_runner = ProcessRunner.new(
|
149
|
+
process_runner = ProcessRunner.new(config)
|
167
150
|
process_runner.fork_me?(should_we_fork) do
|
168
151
|
if options[:test]
|
169
152
|
info '*** Capturing in test mode.'
|
@@ -58,22 +58,26 @@ module Lolcommits
|
|
58
58
|
end
|
59
59
|
|
60
60
|
def self.hook_script(capture_args = '')
|
61
|
+
# TODO: have this return a single line bash like mercurial install, and DRY
|
62
|
+
# this method (only different in git is the rebase-merge check which could
|
63
|
+
# be extracted
|
61
64
|
ruby_path = Lolcommits::Platform.command_which('ruby', true)
|
62
65
|
imagick_path = Lolcommits::Platform.command_which('identify', true)
|
66
|
+
capture_cmd = 'lolcommits --capture'
|
63
67
|
|
64
68
|
if Lolcommits::Platform.platform_windows?
|
65
|
-
|
69
|
+
capture_cmd = 'if "%LOLCOMMITS_CAPTURE_DISABLED%"=="true" (exit)'
|
70
|
+
capture_cmd = "set path=#{ruby_path};#{imagick_path};%PATH%&&#{capture_cmd}"
|
66
71
|
else
|
67
|
-
locale_export = "
|
68
|
-
hook_export = "
|
72
|
+
locale_export = "LANG=\"#{ENV['LANG']}\""
|
73
|
+
hook_export = "PATH=\"#{ruby_path}:#{imagick_path}:$PATH\""
|
74
|
+
capture_cmd = "#{locale_export} #{hook_export} #{capture_cmd}"
|
69
75
|
end
|
70
76
|
|
71
|
-
capture_cmd = 'lolcommits --capture'
|
72
|
-
|
73
77
|
<<-EOS
|
74
78
|
### lolcommits hook (begin) ###
|
75
|
-
if [ ! -d "$GIT_DIR/rebase-merge" ]; then
|
76
|
-
#{
|
79
|
+
if [ ! -d "$GIT_DIR/rebase-merge" ] && [ "$LOLCOMMITS_CAPTURE_DISABLED" != "true" ]; then
|
80
|
+
#{capture_cmd} #{capture_args}
|
77
81
|
fi
|
78
82
|
### lolcommits hook (end) ###
|
79
83
|
EOS
|
@@ -43,14 +43,16 @@ module Lolcommits
|
|
43
43
|
capture_cmd = 'lolcommits --capture'
|
44
44
|
|
45
45
|
if Lolcommits::Platform.platform_windows?
|
46
|
-
capture_cmd = "
|
46
|
+
capture_cmd = 'if "%LOLCOMMITS_CAPTURE_DISABLED%"=="true" (exit)'
|
47
|
+
capture_cmd = "set path=#{ruby_path};#{imagick_path};%PATH%&&#{capture_cmd} #{capture_args}"
|
47
48
|
else
|
48
49
|
locale_export = "LANG=\"#{ENV['LANG']}\""
|
49
50
|
hook_export = "PATH=\"#{ruby_path}:#{imagick_path}:$PATH\""
|
50
|
-
capture_cmd
|
51
|
+
capture_cmd = "#{locale_export} #{hook_export} #{capture_cmd}"
|
52
|
+
capture_cmd = "if [ \"$LOLCOMMITS_CAPTURE_DISABLED\" != \"true\" ]; then #{capture_cmd} #{capture_args}; fi"
|
51
53
|
end
|
52
54
|
|
53
|
-
|
55
|
+
capture_cmd
|
54
56
|
end
|
55
57
|
|
56
58
|
def self.repository
|
@@ -60,7 +62,7 @@ module Lolcommits
|
|
60
62
|
# does a mercurial hook exist with lolcommits commands?
|
61
63
|
def self.lolcommits_hook_exists?
|
62
64
|
config = repository.config
|
63
|
-
config.exists? && config.setting_exists?(HOOK_SECTION, 'post-
|
65
|
+
config.exists? && config.setting_exists?(HOOK_SECTION, 'post-crecord.lolcommits')
|
64
66
|
end
|
65
67
|
|
66
68
|
# can we load the hgrc?
|
@@ -2,12 +2,11 @@ module Lolcommits
|
|
2
2
|
class Configuration
|
3
3
|
LOLCOMMITS_BASE = ENV['LOLCOMMITS_DIR'] || File.join(ENV['HOME'], '.lolcommits')
|
4
4
|
LOLCOMMITS_ROOT = File.join(File.dirname(__FILE__), '../..')
|
5
|
-
|
5
|
+
attr_accessor :plugin_manager, :loldir
|
6
6
|
|
7
|
-
def initialize(
|
8
|
-
|
9
|
-
|
10
|
-
end
|
7
|
+
def initialize(plugin_manager, test_mode: false)
|
8
|
+
@plugin_manager = plugin_manager
|
9
|
+
@loldir = Configuration.loldir_for('test') if test_mode
|
11
10
|
end
|
12
11
|
|
13
12
|
def read_configuration
|
@@ -39,10 +38,6 @@ module Lolcommits
|
|
39
38
|
dir
|
40
39
|
end
|
41
40
|
|
42
|
-
def most_recent
|
43
|
-
Dir.glob(File.join(loldir, '*.{jpg,gif}')).max_by { |f| File.mtime(f) }
|
44
|
-
end
|
45
|
-
|
46
41
|
def jpg_images
|
47
42
|
Dir.glob(File.join(loldir, '*.jpg')).sort_by { |f| File.mtime(f) }
|
48
43
|
end
|
@@ -67,26 +62,26 @@ module Lolcommits
|
|
67
62
|
File.join(loldir, 'tmp_frames')
|
68
63
|
end
|
69
64
|
|
70
|
-
def
|
71
|
-
"Available plugins: \n * #{
|
72
|
-
end
|
73
|
-
|
74
|
-
def ask_for_plugin_name
|
75
|
-
puts plugins_list
|
76
|
-
print 'Name of plugin to configure: '
|
77
|
-
gets.strip
|
65
|
+
def list_plugins
|
66
|
+
puts "Available plugins: \n * #{plugin_manager.plugin_names.join("\n * ")}"
|
78
67
|
end
|
79
68
|
|
80
69
|
def find_plugin(plugin_name_option)
|
81
70
|
plugin_name = plugin_name_option.empty? ? ask_for_plugin_name : plugin_name_option
|
71
|
+
return if plugin_name.empty?
|
82
72
|
|
83
|
-
|
84
|
-
|
85
|
-
end
|
73
|
+
plugin_klass = plugin_manager.find_by_name(plugin_name)
|
74
|
+
return plugin_klass.new(nil) if plugin_klass
|
86
75
|
|
87
76
|
puts "Unable to find plugin: '#{plugin_name}'"
|
88
77
|
return if plugin_name_option.empty?
|
89
|
-
|
78
|
+
list_plugins
|
79
|
+
end
|
80
|
+
|
81
|
+
def ask_for_plugin_name
|
82
|
+
list_plugins
|
83
|
+
print 'Name of plugin to configure: '
|
84
|
+
gets.strip
|
90
85
|
end
|
91
86
|
|
92
87
|
def do_configure!(plugin_name)
|
@@ -1,12 +1,9 @@
|
|
1
1
|
module Lolcommits
|
2
2
|
class GemPlugin
|
3
|
-
attr_accessor :
|
3
|
+
attr_accessor :gem_spec, :required
|
4
4
|
|
5
|
-
def initialize(
|
6
|
-
@
|
7
|
-
@gem_name = gem_name
|
8
|
-
@spec = spec
|
9
|
-
@required = false
|
5
|
+
def initialize(gem_spec)
|
6
|
+
@gem_spec = gem_spec
|
10
7
|
end
|
11
8
|
|
12
9
|
# activate the plugin (require the gem - enables/loads the plugin
|
@@ -15,13 +12,13 @@ module Lolcommits
|
|
15
12
|
begin
|
16
13
|
require gem_path unless required?
|
17
14
|
rescue LoadError => e
|
18
|
-
warn "Found plugin #{
|
15
|
+
warn "Found plugin #{name}, but could not require gem '#{gem_name}'"
|
19
16
|
warn e
|
20
17
|
rescue => e
|
21
|
-
warn "require '#{gem_name}'
|
18
|
+
warn "require gem '#{gem_name}' failed with: #{e}"
|
22
19
|
end
|
23
20
|
|
24
|
-
|
21
|
+
@required = true
|
25
22
|
end
|
26
23
|
|
27
24
|
alias required? required
|
@@ -29,7 +26,7 @@ module Lolcommits
|
|
29
26
|
def supported?
|
30
27
|
# false if the plugin gem does not support this version of Lolcommits
|
31
28
|
lolcommits_version = Gem::Version.new(::Lolcommits::VERSION)
|
32
|
-
|
29
|
+
gem_spec.dependencies.each do |dependency|
|
33
30
|
if dependency.name == Lolcommits::GEM_NAME
|
34
31
|
return dependency.requirement.satisfied_by?(lolcommits_version)
|
35
32
|
end
|
@@ -37,10 +34,28 @@ module Lolcommits
|
|
37
34
|
true
|
38
35
|
end
|
39
36
|
|
37
|
+
def name
|
38
|
+
gem_name.split('-', 2).last
|
39
|
+
end
|
40
|
+
|
41
|
+
def plugin_klass
|
42
|
+
self.class.const_get(plugin_klass_name)
|
43
|
+
rescue => e
|
44
|
+
warn "failed to load constant from plugin gem '#{plugin_klass_name}: #{e}'"
|
45
|
+
end
|
46
|
+
|
40
47
|
private
|
41
48
|
|
49
|
+
def gem_name
|
50
|
+
gem_spec.name
|
51
|
+
end
|
52
|
+
|
42
53
|
def gem_path
|
43
54
|
gem_name.gsub(/-|_/, '/')
|
44
55
|
end
|
56
|
+
|
57
|
+
def plugin_klass_name
|
58
|
+
gem_path.split('/').map(&:capitalize).join('::')
|
59
|
+
end
|
45
60
|
end
|
46
61
|
end
|
@@ -100,10 +100,16 @@ module Lolcommits
|
|
100
100
|
'plugin'
|
101
101
|
end
|
102
102
|
|
103
|
-
# a plugin
|
104
|
-
#
|
103
|
+
# Returns position(s) of when a plugin should run during the capture
|
104
|
+
# process.
|
105
|
+
#
|
106
|
+
# Defines when the plugin will execute in the capture process. This must
|
107
|
+
# be defined, if the method returns nil, or [] the plugin will never run.
|
108
|
+
#
|
109
|
+
# @return [Array] the position(s) (:precapture and/or :postcapture)
|
110
|
+
#
|
105
111
|
def self.runner_order
|
106
|
-
|
112
|
+
[]
|
107
113
|
end
|
108
114
|
end
|
109
115
|
end
|
@@ -1,41 +1,63 @@
|
|
1
1
|
module Lolcommits
|
2
2
|
class PluginManager
|
3
|
-
GEM_NAME_PREFIX = /^lolcommits
|
3
|
+
GEM_NAME_PREFIX = /^lolcommits-/
|
4
|
+
|
5
|
+
def self.init
|
6
|
+
pm = new
|
7
|
+
pm.load_plugins
|
8
|
+
pm
|
9
|
+
end
|
4
10
|
|
5
11
|
def initialize
|
6
12
|
@plugins = []
|
7
13
|
end
|
8
14
|
|
9
|
-
#
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
plugin_name = gem.name.split('-', 2).last
|
15
|
-
plugin = GemPlugin.new(plugin_name, gem.name, gem)
|
15
|
+
# find and require all plugins
|
16
|
+
def load_plugins
|
17
|
+
find_plugins
|
18
|
+
@plugins.map(&:activate!)
|
19
|
+
end
|
16
20
|
|
17
|
-
|
18
|
-
|
19
|
-
@plugins
|
21
|
+
def plugins_for(position)
|
22
|
+
plugin_klasses.select { |p| Array(p.runner_order).include?(position) }
|
20
23
|
end
|
21
24
|
|
22
|
-
# @return [
|
23
|
-
|
24
|
-
|
25
|
-
h = {}
|
26
|
-
@plugins.each do |plugin|
|
27
|
-
h[plugin.name] = plugin
|
28
|
-
end
|
29
|
-
h
|
25
|
+
# @return [Lolcommits::Plugin] find first plugin matching name
|
26
|
+
def find_by_name(name)
|
27
|
+
plugin_klasses.find { |plugin| plugin.name =~ /^#{name}/ }
|
30
28
|
end
|
31
29
|
|
32
|
-
|
33
|
-
|
34
|
-
@plugins.map(&:
|
30
|
+
def plugin_names
|
31
|
+
# TODO: when all plugins are gems, get names from GemPlugin with
|
32
|
+
# @plugins.map(&:name)
|
33
|
+
plugin_klasses.map(&:name).sort
|
35
34
|
end
|
36
35
|
|
37
36
|
private
|
38
37
|
|
38
|
+
# @return [Array] find all classes inheriting from Lolcommits::Plugin::Base
|
39
|
+
def plugin_klasses
|
40
|
+
# TODO: when all plugins are gems, change this to
|
41
|
+
# @plugins.map(&:plugin_klass)
|
42
|
+
ObjectSpace.each_object(Class).select { |klass| klass < Lolcommits::Plugin::Base }
|
43
|
+
end
|
44
|
+
|
45
|
+
# @return [Array] find all installed and supported plugins, populate
|
46
|
+
# @plugins array and return it
|
47
|
+
def find_plugins
|
48
|
+
find_gems.map do |gem|
|
49
|
+
plugin = GemPlugin.new(gem)
|
50
|
+
@plugins << plugin if plugin.supported? && !plugin_located?(plugin)
|
51
|
+
end
|
52
|
+
|
53
|
+
@plugins
|
54
|
+
end
|
55
|
+
|
56
|
+
# @return [Array] find all installed gems matching GEM_NAME_PREFIX
|
57
|
+
def find_gems
|
58
|
+
gem_list.select { |gem| gem.name =~ GEM_NAME_PREFIX }
|
59
|
+
end
|
60
|
+
|
39
61
|
def plugin_located?(plugin)
|
40
62
|
@plugins.any? { |existing| existing.gem_name == plugin.gem_name }
|
41
63
|
end
|
data/lib/lolcommits/runner.rb
CHANGED
@@ -28,15 +28,11 @@ module Lolcommits
|
|
28
28
|
# this used to be handled with ActiveSupport::Callbacks, but
|
29
29
|
# now we're just using a simple procedural list
|
30
30
|
def run
|
31
|
-
# do
|
32
|
-
|
33
|
-
# do native plugins that need to happen before capture
|
34
|
-
plugins_for(:precapture).each do |plugin|
|
31
|
+
# do plugins that need to happen before capture
|
32
|
+
plugin_manager.plugins_for(:precapture).each do |plugin|
|
35
33
|
plugin.new(self).execute_precapture
|
36
34
|
end
|
37
35
|
|
38
|
-
# do gem plugins that need to happen before capture?
|
39
|
-
|
40
36
|
# do main capture to snapshot_loc
|
41
37
|
run_capture
|
42
38
|
|
@@ -51,13 +47,11 @@ module Lolcommits
|
|
51
47
|
# reserve just for us and handle manually...?
|
52
48
|
Lolcommits::Plugin::Loltext.new(self).execute_postcapture
|
53
49
|
|
54
|
-
# do
|
55
|
-
plugins_for(:postcapture).each do |plugin|
|
50
|
+
# do plugins that need to happen after capture
|
51
|
+
plugin_manager.plugins_for(:postcapture).each do |plugin|
|
56
52
|
plugin.new(self).execute_postcapture
|
57
53
|
end
|
58
54
|
|
59
|
-
# do gem plugins that need to happen after capture?
|
60
|
-
|
61
55
|
# do things that should happen last
|
62
56
|
cleanup!
|
63
57
|
else
|
@@ -66,16 +60,6 @@ module Lolcommits
|
|
66
60
|
end
|
67
61
|
end
|
68
62
|
|
69
|
-
# TODO: - move these plugin methods to Lolcommits::PluginManager after all
|
70
|
-
# plugins get "gemified"
|
71
|
-
def plugins_for(position)
|
72
|
-
self.class.plugins.select { |p| p.runner_order == position }
|
73
|
-
end
|
74
|
-
|
75
|
-
def self.plugins
|
76
|
-
Lolcommits::Plugin.constants.map(&Lolcommits::Plugin.method(:const_get)) - [Lolcommits::Plugin::Base]
|
77
|
-
end
|
78
|
-
|
79
63
|
# the main capture
|
80
64
|
def run_capture
|
81
65
|
puts '*** Preserving this moment in history.' unless capture_stealth
|
@@ -99,6 +83,10 @@ module Lolcommits
|
|
99
83
|
|
100
84
|
private
|
101
85
|
|
86
|
+
def plugin_manager
|
87
|
+
@plugin_manager ||= config.plugin_manager
|
88
|
+
end
|
89
|
+
|
102
90
|
def image_file_type
|
103
91
|
capture_animated? ? 'gif' : 'jpg'
|
104
92
|
end
|
data/lib/lolcommits/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lolcommits
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.3.
|
4
|
+
version: 0.9.3.pre2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthew Rothenberg
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-
|
12
|
+
date: 2017-04-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: aruba
|