lolcommits 0.4.6 → 0.5.0.pre1
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/.travis.yml +2 -1
- data/CHANGELOG +12 -2
- data/README.md +12 -2
- data/Rakefile +8 -0
- data/bin/lolcommits +59 -18
- data/config/cucumber.yml +2 -0
- data/features/lolcommits.feature +34 -2
- data/features/step_definitions/lolcommits_steps.rb +10 -1
- data/features/support/env.rb +17 -33
- data/features/support/path_helpers.rb +39 -0
- data/lib/lolcommits.rb +1 -0
- data/lib/lolcommits/capture_linux.rb +11 -3
- data/lib/lolcommits/capture_mac_animated.rb +40 -0
- data/lib/lolcommits/capturer.rb +2 -1
- data/lib/lolcommits/configuration.rb +27 -5
- data/lib/lolcommits/git_info.rb +7 -3
- data/lib/lolcommits/plugins/loltext.rb +2 -2
- data/lib/lolcommits/runner.rb +24 -6
- data/lib/lolcommits/version.rb +1 -1
- data/lib/tranzlate/lolspeak.rb +0 -0
- data/test/test_lolcommits.rb +3 -0
- data/vendor/ext/videosnap/videosnap +0 -0
- metadata +9 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b252177e770c39d76fa39deaa4b0e12d9cfc4238
|
4
|
+
data.tar.gz: 49be41fcd3d15994f4c580bc68aef6c2fdbe2ea2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 61094800f6b1a48aca403f6dc7270edfc8a2d22ac33534d85320bf9ff234f87873afa193ba1723234d5b66222746848f69b95acd548cb86ae1db0084a324c52d
|
7
|
+
data.tar.gz: b8cbf2834655da92461b7c7b7b2ac70a14a4a701b3b3d7fee740375baff711aee6497ac8a23ad4e59f4da4ba8a1a247ecd8118b72d90d6b596cd30d622d9a5ce
|
data/.travis.yml
CHANGED
@@ -8,7 +8,8 @@ rvm:
|
|
8
8
|
before_install:
|
9
9
|
# imagemagick is installed by default on normal travis image now
|
10
10
|
- sudo apt-get update -qq
|
11
|
-
- sudo apt-get install -qq -y mplayer
|
11
|
+
- sudo apt-get install -qq -y mplayer
|
12
|
+
- sudo apt-get install ffmpeg
|
12
13
|
# - sudo apt-get install -qq -y imagemagick libmagickwand-dev
|
13
14
|
|
14
15
|
# matrix:
|
data/CHANGELOG
CHANGED
@@ -1,6 +1,16 @@
|
|
1
|
-
0.
|
1
|
+
0.x.x (in development)
|
2
2
|
* TODO: figure out problems with GUI clients
|
3
3
|
|
4
|
+
0.5.0 (9 September 2013)
|
5
|
+
* better handling of LOLCOMMITS_DELAY (thx @leewillis77, #125)
|
6
|
+
* LOLCOMMITS_DEVICE support on Linux (thx @EbenezerEdelman, #139)
|
7
|
+
* better handling of repository names (thx @drocamor and @andromedado, #145 and #146)
|
8
|
+
* added new LOLCOMMITS_ANIMATE (or `--animate`) option (Mac/OSX only) (#114, #108)
|
9
|
+
- defaults to a 320x240 sized animated gif
|
10
|
+
- new vendored binary videosnap - https://github.com/matthutchinson/videosnap
|
11
|
+
- feature requires ffmpeg
|
12
|
+
- README updated with details and an example
|
13
|
+
|
4
14
|
0.4.6 (12 August 2013)
|
5
15
|
* Fix for incorrect permissioning in gem issue (see #112)
|
6
16
|
|
@@ -23,7 +33,7 @@
|
|
23
33
|
|
24
34
|
0.4.1 (17 February 2013)
|
25
35
|
* add lolsrv plugin (thx @sebastianmarr!, #82)
|
26
|
-
* enable feature to change font (thx @fukayatsu!, #89)
|
36
|
+
* enable feature to change font (thx @fukayatsu!, #89)
|
27
37
|
* correct activesupport gem name in bundle (thx @djbender!, #90)
|
28
38
|
* graceful detection of imagemagick not being installed (#87)
|
29
39
|
* restructure logging slightly to use Methadone::CLILogging in most places
|
data/README.md
CHANGED
@@ -57,20 +57,30 @@ environment variables.
|
|
57
57
|
* Set delay persistently (for slow to warmup webcams) - set
|
58
58
|
`LOLCOMMITS_DELAY` var to time in seconds.
|
59
59
|
* Set font file location - set `LOLCOMMITS_FONT` environment variable.
|
60
|
+
* Animated gifs - set `LOLCOMMITS_ANIMATE=3` (currently Mac/OSX only and requires `ffmpeg`).
|
60
61
|
* Fork lolcommits runner - set `LOLCOMMITS_FORK` environment variable
|
61
62
|
(causes capturing command to fork to a new process, speedily returning you to your terminal).
|
62
63
|
|
63
64
|
For the full list, see the [configuration variables](https://github.com/mroth/lolcommits/wiki/Configuration-Variables).
|
64
65
|
|
65
|
-
###
|
66
|
+
### Animated Gif Capturing
|
67
|
+
Animated gifs (Mac/OSX only) can take a while to generate (depending on the number of seconds you capture and the capabilities of your machine). `ffmpeg` is required and can be installed with brew like so;
|
68
|
+
|
69
|
+
brew install ffmpeg
|
70
|
+
|
71
|
+
To enable, just set the `LOLCOMMITS_ANIMATE` environment variable with the number of seconds to capture.
|
72
|
+
And like regular image captures you can use the env variables `LOLCOMMITS_DEVICE` and `LOLCOMMITS_DELAY` to change the capture device or delay time (seconds) before capturing.
|
73
|
+
If you find capturing an animated gif takes too long, try setting the `LOLCOMMITS_FORK=true` env variable.
|
66
74
|
|
75
|
+

|
76
|
+
|
77
|
+
### Plugins
|
67
78
|
There are a growing amount of plugins for lolcommits to enable things like Twitter upload, translating your commit messages to lolspeak, etc. Check them out on the [plugins wiki page](https://github.com/mroth/lolcommits/wiki/Plugins).
|
68
79
|
|
69
80
|
## Troubles?
|
70
81
|
Started a [FAQ](https://github.com/mroth/lolcommits/wiki/FAQ).
|
71
82
|
|
72
83
|
## Timelapse?
|
73
|
-
|
74
84
|
To watch your face as it decays while you program, you can create a quick mpeg of all your lolcommits snapshots (if you have `imagemagick` and `ffmpeg` installed):
|
75
85
|
|
76
86
|
convert `find . -type f -name "*.jpg" -print0 | xargs -0 ls -tlr | awk '{print $9}'` timelapse.mpeg
|
data/Rakefile
CHANGED
@@ -12,6 +12,14 @@ include Rake::DSL
|
|
12
12
|
|
13
13
|
Bundler::GemHelper.install_tasks
|
14
14
|
|
15
|
+
task :fix_permissions do
|
16
|
+
# Reset all permissions.
|
17
|
+
system 'bash -c "find . -type f -exec chmod 644 {} \; && find . -type d -exec chmod 755 {} \;"'
|
18
|
+
# Executable files.
|
19
|
+
system 'bash -c "chmod +x ./bin/* vendor/ext/imagesnap/imagesnap vendor/ext/videosnap/videosnap"'
|
20
|
+
end
|
21
|
+
|
22
|
+
Rake::Task[:build].prerequisites.unshift :fix_permissions
|
15
23
|
|
16
24
|
Rake::TestTask.new do |t|
|
17
25
|
t.pattern = 'test/test_*.rb'
|
data/bin/lolcommits
CHANGED
@@ -26,9 +26,11 @@ end
|
|
26
26
|
|
27
27
|
def die_on_fatal_conditions!
|
28
28
|
if Configuration.is_mac?
|
29
|
-
|
30
|
-
|
31
|
-
|
29
|
+
%w(imagesnap videosnap).each do |executable|
|
30
|
+
unless File.executable? File.join(Configuration::LOLCOMMITS_ROOT, "vendor", "ext", executable, executable)
|
31
|
+
fatal "Couldn't properly execute #{executable} for some reason, please file a bug?!"
|
32
|
+
exit 1
|
33
|
+
end
|
32
34
|
end
|
33
35
|
elsif Configuration.is_linux?
|
34
36
|
if not command?('mplayer')
|
@@ -40,6 +42,10 @@ def die_on_fatal_conditions!
|
|
40
42
|
fatal "Couldn't properly read Impact font from gem package, please file a bug?!"
|
41
43
|
exit 1
|
42
44
|
end
|
45
|
+
if !Configuration.valid_ffmpeg_installed? && capture_animate
|
46
|
+
fatal "FATAL: ffmpeg does not appear to be properly installed!"
|
47
|
+
exit 1
|
48
|
+
end
|
43
49
|
unless Configuration.valid_imagemagick_installed?
|
44
50
|
fatal "FATAL: ImageMagick does not appear to be properly installed!"
|
45
51
|
exit 1
|
@@ -126,32 +132,42 @@ def configuration
|
|
126
132
|
end
|
127
133
|
end
|
128
134
|
|
135
|
+
def capture_animate
|
136
|
+
if Configuration.can_animate?
|
137
|
+
Choice.choices[:animate] || ENV['LOLCOMMITS_ANIMATE'] || nil
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
129
141
|
#
|
130
142
|
# IF --CAPTURE, DO CAPTURE
|
131
143
|
#
|
132
144
|
def do_capture
|
133
|
-
capture_delay
|
145
|
+
capture_delay = Choice.choices[:delay] || ENV['LOLCOMMITS_DELAY'] || 0
|
134
146
|
capture_device = Choice.choices[:device] || ENV['LOLCOMMITS_DEVICE'] || nil
|
135
|
-
capture_font
|
147
|
+
capture_font = Choice.choices[:font] || ENV['LOLCOMMITS_FONT'] || nil
|
136
148
|
|
137
149
|
fork_me? do
|
138
150
|
if Choice.choices[:test]
|
139
151
|
info "*** Capturing in test mode."
|
140
|
-
runner = Lolcommits::Runner.new(
|
141
|
-
:
|
142
|
-
:
|
143
|
-
:
|
144
|
-
:
|
145
|
-
:
|
146
|
-
|
152
|
+
runner = Lolcommits::Runner.new(
|
153
|
+
:capture_delay => capture_delay,
|
154
|
+
:capture_device => capture_device,
|
155
|
+
:capture_animate => capture_animate,
|
156
|
+
:message => Choice.choices[:msg],
|
157
|
+
:sha => Choice.choices[:sha],
|
158
|
+
:config => configuration,
|
159
|
+
:font => capture_font
|
160
|
+
)
|
147
161
|
runner.run
|
148
162
|
|
149
163
|
Launchy.open(runner.main_image)
|
150
164
|
else
|
151
|
-
runner = Lolcommits::Runner.new(
|
152
|
-
:
|
153
|
-
:
|
154
|
-
:
|
165
|
+
runner = Lolcommits::Runner.new(
|
166
|
+
:capture_delay => capture_delay,
|
167
|
+
:capture_device => capture_device,
|
168
|
+
:capture_animate => capture_animate,
|
169
|
+
:config => configuration,
|
170
|
+
:font => capture_font
|
155
171
|
)
|
156
172
|
runner.run
|
157
173
|
end
|
@@ -160,12 +176,28 @@ end
|
|
160
176
|
|
161
177
|
def fork_me?(&block)
|
162
178
|
if Choice.choices[:fork] || ENV['LOLCOMMITS_FORK']
|
163
|
-
|
179
|
+
$stdout.sync = true
|
180
|
+
write_pid fork {
|
181
|
+
yield block
|
182
|
+
delete_pid
|
183
|
+
}
|
164
184
|
else
|
165
185
|
yield block
|
166
186
|
end
|
167
187
|
end
|
168
188
|
|
189
|
+
def write_pid(pid)
|
190
|
+
File.open(pid_file, 'w') { |f| f.write(pid) }
|
191
|
+
end
|
192
|
+
|
193
|
+
def delete_pid
|
194
|
+
File.delete(pid_file) if File.exist?(pid_file)
|
195
|
+
end
|
196
|
+
|
197
|
+
def pid_file
|
198
|
+
File.join(configuration.loldir, 'lolcommits.pid')
|
199
|
+
end
|
200
|
+
|
169
201
|
def do_configure
|
170
202
|
configuration.do_configure! Choice.choices[:plugin]
|
171
203
|
end
|
@@ -295,7 +327,7 @@ Choice.options do
|
|
295
327
|
|
296
328
|
option :device do
|
297
329
|
long "--device=DEVICE"
|
298
|
-
desc "the device name used to take the snapshot (only mac)"
|
330
|
+
desc "the device name used to take the snapshot (only mac/linux)"
|
299
331
|
end
|
300
332
|
|
301
333
|
option :debug do
|
@@ -315,6 +347,15 @@ Choice.options do
|
|
315
347
|
desc "generate animated gif"
|
316
348
|
end
|
317
349
|
|
350
|
+
if Configuration.can_animate?
|
351
|
+
option :animate do
|
352
|
+
long "--animate=SECONDS"
|
353
|
+
short "-a"
|
354
|
+
cast Integer
|
355
|
+
desc "duration for capturing an animated gif"
|
356
|
+
end
|
357
|
+
end
|
358
|
+
|
318
359
|
option :fork do
|
319
360
|
long "--fork"
|
320
361
|
desc "fork the lolcommits runner to the background"
|
data/config/cucumber.yml
ADDED
data/features/lolcommits.feature
CHANGED
@@ -5,6 +5,18 @@ Feature: Basic UI functionality
|
|
5
5
|
Then the exit status should be 0
|
6
6
|
And the banner should be present
|
7
7
|
|
8
|
+
Scenario: Help should show the animate option on a Mac platform
|
9
|
+
Given I am using a "Mac" platform
|
10
|
+
When I get help for "lolcommits"
|
11
|
+
Then the following options should be documented:
|
12
|
+
|--animate|which is optional|
|
13
|
+
|-a |which is optional|
|
14
|
+
|
15
|
+
Scenario: Help should not show the animate option on a Linux plaftorm
|
16
|
+
Given I am using a "Linux" platform
|
17
|
+
When I get help for "lolcommits"
|
18
|
+
Then the output should not match /\-a\, \-\-animate\=SECONDS/
|
19
|
+
|
8
20
|
Scenario: Enable in a naked git repository
|
9
21
|
Given a git repository named "loltest" with no "post-commit" hook
|
10
22
|
When I cd to "loltest"
|
@@ -31,7 +43,8 @@ Feature: Basic UI functionality
|
|
31
43
|
Given I am in a git repository named "testforkcapture"
|
32
44
|
And I do a git commit
|
33
45
|
When I successfully run `lolcommits --capture --fork`
|
34
|
-
|
46
|
+
Then there should be exactly 1 pid in "../.lolcommits/testforkcapture"
|
47
|
+
When I wait for the child process to exit in "testforkcapture"
|
35
48
|
Then the output should contain "*** Preserving this moment in history."
|
36
49
|
And a directory named "../.lolcommits/testforkcapture" should exist
|
37
50
|
And a file named "../.lolcommits/testforkcapture/tmp_snapshot.jpg" should not exist
|
@@ -90,7 +103,7 @@ Feature: Basic UI functionality
|
|
90
103
|
When I successfully run `lolcommits --show-config`
|
91
104
|
Then the output should contain "loltext:"
|
92
105
|
And the output should contain "enabled: true"
|
93
|
-
|
106
|
+
|
94
107
|
Scenario: Configuring Plugin In Test Mode
|
95
108
|
Given a git repository named "testmode-config-test"
|
96
109
|
When I cd to "testmode-config-test"
|
@@ -169,3 +182,22 @@ Feature: Basic UI functionality
|
|
169
182
|
And a loldir named "randomgitrepo" with 2 lolimages
|
170
183
|
When I successfully run `lolcommits -g today`
|
171
184
|
And there should be exactly 1 gif in "../.lolcommits/randomgitrepo/archive"
|
185
|
+
|
186
|
+
@mac-only
|
187
|
+
Scenario: should generate an animated gif on the Mac platform
|
188
|
+
Given I am in a git repository named "testanimatedcapture"
|
189
|
+
And I do a git commit
|
190
|
+
And I am using a "Mac" platform
|
191
|
+
When I run `lolcommits --capture --animate=1`
|
192
|
+
Then the output should contain "*** Preserving this moment in history."
|
193
|
+
And a directory named "../.lolcommits/testanimatedcapture" should exist
|
194
|
+
And a file named "../.lolcommits/testanimatedcapture/tmp_video.mov" should not exist
|
195
|
+
And a directory named "../.lolcommits/testanimatedcapture/tmp_frames" should not exist
|
196
|
+
And there should be exactly 1 gif in "../.lolcommits/testanimatedcapture"
|
197
|
+
|
198
|
+
@fake-no-ffmpeg
|
199
|
+
Scenario: gracefully fail when ffmpeg is not installed and animate option is used
|
200
|
+
Given I am using a "Mac" platform
|
201
|
+
When I run `lolcommits --animate=3`
|
202
|
+
Then the output should contain "ffmpeg does not appear to be properly installed"
|
203
|
+
And the exit status should be 1
|
@@ -70,7 +70,7 @@ When /^I enter "(.*?)" for "(.*?)"$/ do |input, field|
|
|
70
70
|
@stdin.puts input
|
71
71
|
end
|
72
72
|
|
73
|
-
Then /^there should be (?:exactly|only) (.*?) (jpg|gif)(?:s?) in "(.*?)"$/ do |n, type, folder|
|
73
|
+
Then /^there should be (?:exactly|only) (.*?) (jpg|gif|pid)(?:s?) in "(.*?)"$/ do |n, type, folder|
|
74
74
|
assert_equal n.to_i, Dir["#{current_dir}/#{folder}/*.#{type}"].count
|
75
75
|
end
|
76
76
|
|
@@ -102,3 +102,12 @@ Then /^there should be (\d+) commit entries in the git log$/ do |n|
|
|
102
102
|
assert_equal n.to_i, `git shortlog | grep -E '^[ ]+\w+' | wc -l`.chomp.to_i
|
103
103
|
end
|
104
104
|
|
105
|
+
Given /^I am using a "(.*?)" platform$/ do |platform_name|
|
106
|
+
ENV['LOLCOMMITS_FAKEPLATFORM'] = platform_name
|
107
|
+
end
|
108
|
+
|
109
|
+
When /^I wait for the child process to exit in "(.*?)"$/ do |repo_name|
|
110
|
+
while File.exist?("tmp/aruba/.lolcommits/#{repo_name}/lolcommits.pid")
|
111
|
+
sleep 0.1
|
112
|
+
end
|
113
|
+
end
|
data/features/support/env.rb
CHANGED
@@ -5,11 +5,14 @@ require 'test/unit/assertions'
|
|
5
5
|
include Test::Unit::Assertions
|
6
6
|
require 'faker'
|
7
7
|
require 'lolcommits/configuration'
|
8
|
+
require File.join(File.expand_path(File.dirname(__FILE__)), 'path_helpers')
|
8
9
|
include Lolcommits
|
9
10
|
|
10
11
|
ENV['PATH'] = "#{File.expand_path(File.dirname(__FILE__) + '/../../bin')}#{File::PATH_SEPARATOR}#{ENV['PATH']}"
|
11
12
|
LIB_DIR = File.join(File.expand_path(File.dirname(__FILE__)),'..','..','lib')
|
12
13
|
|
14
|
+
World(PathHelpers)
|
15
|
+
|
13
16
|
Before do
|
14
17
|
# Using "announce" causes massive warnings on 1.9.2
|
15
18
|
@puts = true
|
@@ -36,10 +39,11 @@ After do
|
|
36
39
|
# ENV['LOLCOMMITS_DIR'] = @original_loldir
|
37
40
|
ENV['HOME'] = @original_home
|
38
41
|
ENV['LAUNCHY_DRY_RUN'] = nil
|
42
|
+
ENV['LOLCOMMITS_FAKEPLATFORM'] = nil
|
39
43
|
end
|
40
44
|
|
41
45
|
Before('@fake-interactive-rebase') do
|
42
|
-
# in order to fake an interactive rebase,
|
46
|
+
# in order to fake an interactive rebase,
|
43
47
|
# we replace the editor with a script that simply squashes a few random commits
|
44
48
|
@original_git_editor = ENV['GIT_EDITOR']
|
45
49
|
# ENV['GIT_EDITOR'] = "sed -i -e 'n;s/pick/squash/g'" #every other commit
|
@@ -57,38 +61,18 @@ end
|
|
57
61
|
|
58
62
|
# adjust the path so tests dont see a global imagemagick install
|
59
63
|
Before('@fake-no-imagemagick') do
|
60
|
-
|
61
|
-
# make a new subdir that still contains git and mplayer
|
62
|
-
tmpbindir = File.expand_path(File.join @dirs, "bin")
|
63
|
-
FileUtils.mkdir_p tmpbindir
|
64
|
-
["git","mplayer"].each do |cmd|
|
65
|
-
whichcmd = Lolcommits::Configuration.command_which(cmd)
|
66
|
-
unless whichcmd.nil?
|
67
|
-
FileUtils.ln_s whichcmd, File.join(tmpbindir, File.basename(whichcmd))
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
# use a modified version of Configuration::command_which to detect where IM is installed
|
72
|
-
# and remove that from the path
|
73
|
-
cmd = 'mogrify'
|
74
|
-
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
75
|
-
newpaths = ENV['PATH'].split(File::PATH_SEPARATOR).reject do |path|
|
76
|
-
found_cmd = false
|
77
|
-
exts.each { |ext|
|
78
|
-
exe = "#{path}/#{cmd}#{ext}"
|
79
|
-
found_cmd = true if File.executable? exe
|
80
|
-
}
|
81
|
-
found_cmd
|
82
|
-
end
|
83
|
-
|
84
|
-
# add the temporary directory with git in it back into the path
|
85
|
-
newpaths << tmpbindir
|
86
|
-
|
87
|
-
@original_path = ENV['PATH']
|
88
|
-
ENV['PATH'] = newpaths.join(File::PATH_SEPARATOR)
|
89
|
-
# puts ENV['PATH'] dont need to announce this for debug anymore!
|
64
|
+
reject_paths_with_cmd('mogrify')
|
90
65
|
end
|
91
66
|
|
92
67
|
After('@fake-no-imagemagick') do
|
93
|
-
|
94
|
-
end
|
68
|
+
reset_path
|
69
|
+
end
|
70
|
+
|
71
|
+
# adjust the path so tests dont see a global ffmpeg install
|
72
|
+
Before('@fake-no-ffmpeg') do
|
73
|
+
reject_paths_with_cmd('ffmpeg')
|
74
|
+
end
|
75
|
+
|
76
|
+
After('@fake-no-ffmpeg') do
|
77
|
+
reset_path
|
78
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module PathHelpers
|
2
|
+
|
3
|
+
def reject_paths_with_cmd(cmd)
|
4
|
+
@original_path = ENV['PATH']
|
5
|
+
# make a new subdir that still contains cmds
|
6
|
+
tmpbindir = File.expand_path(File.join @dirs, "bin")
|
7
|
+
FileUtils.mkdir_p tmpbindir
|
8
|
+
|
9
|
+
preseve_cmds_in_path(['git', 'mplayer'], tmpbindir)
|
10
|
+
|
11
|
+
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
12
|
+
newpaths = ENV['PATH'].split(File::PATH_SEPARATOR).reject do |path|
|
13
|
+
found_cmd = false
|
14
|
+
exts.each { |ext|
|
15
|
+
exe = "#{path}/#{cmd}#{ext}"
|
16
|
+
found_cmd = true if File.executable? exe
|
17
|
+
}
|
18
|
+
found_cmd
|
19
|
+
end
|
20
|
+
|
21
|
+
# add the temporary directory with git in it back into the path
|
22
|
+
newpaths << tmpbindir
|
23
|
+
ENV['PATH'] = newpaths.join(File::PATH_SEPARATOR)
|
24
|
+
end
|
25
|
+
|
26
|
+
def preseve_cmds_in_path(cmds, tmpbindir)
|
27
|
+
cmds.each do |cmd|
|
28
|
+
whichcmd = Lolcommits::Configuration.command_which(cmd)
|
29
|
+
unless whichcmd.nil?
|
30
|
+
FileUtils.ln_s whichcmd, File.join(tmpbindir, File.basename(whichcmd))
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def reset_path
|
36
|
+
ENV['PATH'] = @original_path
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
data/lib/lolcommits.rb
CHANGED
@@ -15,6 +15,7 @@ require 'lolcommits/version'
|
|
15
15
|
require 'lolcommits/configuration'
|
16
16
|
require 'lolcommits/capturer'
|
17
17
|
require 'lolcommits/capture_mac'
|
18
|
+
require 'lolcommits/capture_mac_animated'
|
18
19
|
require 'lolcommits/capture_linux'
|
19
20
|
require 'lolcommits/capture_windows'
|
20
21
|
require 'lolcommits/capture_fake'
|
@@ -1,16 +1,24 @@
|
|
1
1
|
module Lolcommits
|
2
2
|
class CaptureLinux < Capturer
|
3
|
+
def capture_device_string
|
4
|
+
@capture_device.nil? ? nil : "-tv device=\"#{@capture_device}\""
|
5
|
+
end
|
6
|
+
|
3
7
|
def capture
|
4
8
|
debug "LinuxCapturer: making tmp directory"
|
5
9
|
tmpdir = Dir.mktmpdir
|
6
10
|
|
11
|
+
# Default delay is 1s
|
12
|
+
delay = if capture_delay != 0 then capture_delay else 1 end
|
13
|
+
|
7
14
|
# There's no way to give a capture delay in mplayer, but a number of frame
|
8
|
-
#
|
9
|
-
|
15
|
+
# mplayer's "delay" is actually a number of frames at 25fps
|
16
|
+
# multiply the set value (in seconds) by 25
|
17
|
+
frames = delay.to_i * 25
|
10
18
|
|
11
19
|
debug "LinuxCapturer: calling out to mplayer to capture image"
|
12
20
|
# mplayer's output is ugly and useless, let's throw it away
|
13
|
-
_, r, _ = Open3.popen3("mplayer -vo jpeg:outdir=#{tmpdir} -frames #{frames} tv://")
|
21
|
+
_, r, _ = Open3.popen3("mplayer -vo jpeg:outdir=#{tmpdir} #{capture_device_string} -frames #{frames} tv://")
|
14
22
|
# looks like we still need to read the output for something to happen
|
15
23
|
r.read
|
16
24
|
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Lolcommits
|
2
|
+
class CaptureMacAnimated < Capturer
|
3
|
+
|
4
|
+
def capture
|
5
|
+
# make a fresh frames directory
|
6
|
+
FileUtils.rm_rf(frames_location)
|
7
|
+
FileUtils.mkdir_p(frames_location)
|
8
|
+
|
9
|
+
# capture the raw video with videosnap
|
10
|
+
system_call "#{videosnap_bin} -s 240 #{capture_device_string}#{capture_delay_string}-t #{animated_duration} --no-audio #{video_location} > /dev/null"
|
11
|
+
if File.exists?(video_location)
|
12
|
+
# convert raw video to png frames with ffmpeg
|
13
|
+
system_call "ffmpeg -v quiet -i #{video_location} -t #{animated_duration} #{frames_location}/%09d.png"
|
14
|
+
# create the looping animated gif from frames (picks every 2nd frame with seq)
|
15
|
+
seq_command = "seq -f #{frames_location}/%09g.png 1 2 #{Dir["#{frames_location}/*"].length}"
|
16
|
+
# delay of 12 between every other frame, 24fps
|
17
|
+
system_call "convert -layers OptimizeTransparency -delay 12 -loop 0 `#{seq_command}` -coalesce #{snapshot_location}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
def system_call(call_str)
|
23
|
+
debug "Capturer: making system call for \n #{call_str}"
|
24
|
+
system(call_str)
|
25
|
+
end
|
26
|
+
|
27
|
+
def videosnap_bin
|
28
|
+
File.join(Configuration::LOLCOMMITS_ROOT, 'vendor', 'ext', 'videosnap', 'videosnap')
|
29
|
+
end
|
30
|
+
|
31
|
+
def capture_device_string
|
32
|
+
"-d '#{capture_device}' " if capture_device
|
33
|
+
end
|
34
|
+
|
35
|
+
def capture_delay_string
|
36
|
+
"-w '#{capture_delay}' " if capture_delay.to_i > 0
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
data/lib/lolcommits/capturer.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
module Lolcommits
|
2
2
|
class Capturer
|
3
3
|
include Methadone::CLILogging
|
4
|
-
attr_accessor :capture_device, :capture_delay, :snapshot_location, :font
|
4
|
+
attr_accessor :capture_device, :capture_delay, :snapshot_location, :font,
|
5
|
+
:video_location, :frames_location, :animated_duration
|
5
6
|
|
6
7
|
def initialize(attributes = Hash.new)
|
7
8
|
attributes.each do |attr, val|
|
@@ -11,7 +11,9 @@ module Lolcommits
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def self.platform
|
14
|
-
if
|
14
|
+
if is_fakeplatform?
|
15
|
+
ENV['LOLCOMMITS_FAKEPLATFORM']
|
16
|
+
elsif is_fakecapture?
|
15
17
|
'Fake'
|
16
18
|
elsif is_mac?
|
17
19
|
'Mac'
|
@@ -74,12 +76,20 @@ module Lolcommits
|
|
74
76
|
images.select { |f| Date.parse(File.mtime(f).to_s) === Date.today }
|
75
77
|
end
|
76
78
|
|
77
|
-
def raw_image
|
78
|
-
File.join self.loldir, "tmp_snapshot
|
79
|
+
def raw_image(image_file_type = 'jpg')
|
80
|
+
File.join self.loldir, "tmp_snapshot.#{image_file_type}"
|
79
81
|
end
|
80
82
|
|
81
|
-
def main_image(commit_sha)
|
82
|
-
File.join self.loldir, "#{commit_sha}
|
83
|
+
def main_image(commit_sha, image_file_type = 'jpg')
|
84
|
+
File.join self.loldir, "#{commit_sha}.#{image_file_type}"
|
85
|
+
end
|
86
|
+
|
87
|
+
def video_loc
|
88
|
+
File.join(self.loldir, 'tmp_video.mov')
|
89
|
+
end
|
90
|
+
|
91
|
+
def frames_loc
|
92
|
+
File.join(self.loldir, 'tmp_frames')
|
83
93
|
end
|
84
94
|
|
85
95
|
def puts_plugins
|
@@ -145,6 +155,10 @@ module Lolcommits
|
|
145
155
|
(ENV['LOLCOMMITS_FAKECAPTURE'] == '1' || false)
|
146
156
|
end
|
147
157
|
|
158
|
+
def self.is_fakeplatform?
|
159
|
+
ENV['LOLCOMMITS_FAKEPLATFORM']
|
160
|
+
end
|
161
|
+
|
148
162
|
def self.valid_imagemagick_installed?
|
149
163
|
return false unless self.command_which('identify')
|
150
164
|
return false unless self.command_which('mogrify')
|
@@ -153,10 +167,18 @@ module Lolcommits
|
|
153
167
|
MiniMagick::valid_version_installed?
|
154
168
|
end
|
155
169
|
|
170
|
+
def self.valid_ffmpeg_installed?
|
171
|
+
self.command_which('ffmpeg')
|
172
|
+
end
|
173
|
+
|
156
174
|
def self.git_config_color_always?
|
157
175
|
`git config color.ui`.chomp =~ /always/
|
158
176
|
end
|
159
177
|
|
178
|
+
def self.can_animate?
|
179
|
+
platform == 'Mac'
|
180
|
+
end
|
181
|
+
|
160
182
|
# Cross-platform way of finding an executable in the $PATH.
|
161
183
|
# idea taken from http://bit.ly/qDaTbY
|
162
184
|
#
|
data/lib/lolcommits/git_info.rb
CHANGED
@@ -13,10 +13,14 @@ module Lolcommits
|
|
13
13
|
self.message = commit.message.split("\n").first
|
14
14
|
self.sha = commit.sha[0..10]
|
15
15
|
self.repo_internal_path = g.repo.path
|
16
|
-
regex = /.*[:\/](\w*).git/
|
16
|
+
regex = /.*[:\/]([\w\-]*).git/
|
17
17
|
match = g.remote.url.match regex if g.remote.url
|
18
|
-
|
19
|
-
|
18
|
+
if match
|
19
|
+
self.repo = match[1]
|
20
|
+
elsif !g.repo.path.empty?
|
21
|
+
self.repo = g.repo.path.split(File::SEPARATOR)[-2]
|
22
|
+
end
|
23
|
+
|
20
24
|
debug "GitInfo: parsed the following values from commit:"
|
21
25
|
debug "GitInfo: \t#{self.message}"
|
22
26
|
debug "GitInfo: \t#{self.sha}"
|
@@ -25,7 +25,7 @@ module Lolcommits
|
|
25
25
|
c.fill 'white'
|
26
26
|
c.stroke 'black'
|
27
27
|
c.strokewidth '2'
|
28
|
-
c.pointsize '48'
|
28
|
+
c.pointsize(self.runner.animate? ? '24' : '48')
|
29
29
|
c.interline_spacing '-9'
|
30
30
|
c.font font_location
|
31
31
|
c.annotate '0', clean_msg(self.runner.message)
|
@@ -36,7 +36,7 @@ module Lolcommits
|
|
36
36
|
c.fill 'white'
|
37
37
|
c.stroke 'black'
|
38
38
|
c.strokewidth '2'
|
39
|
-
c.pointsize '32'
|
39
|
+
c.pointsize(self.runner.animate? ? '21' : '32')
|
40
40
|
c.font font_location
|
41
41
|
c.annotate '0', self.runner.sha
|
42
42
|
end
|
data/lib/lolcommits/runner.rb
CHANGED
@@ -4,7 +4,7 @@ module Lolcommits
|
|
4
4
|
class Runner
|
5
5
|
attr_accessor :capture_delay, :capture_device, :message, :sha,
|
6
6
|
:snapshot_loc, :main_image, :repo, :config, :repo_internal_path,
|
7
|
-
:font
|
7
|
+
:font, :capture_animate
|
8
8
|
|
9
9
|
include Methadone::CLILogging
|
10
10
|
include ActiveSupport::Callbacks
|
@@ -39,18 +39,34 @@ module Lolcommits
|
|
39
39
|
|
40
40
|
run_callbacks :run do
|
41
41
|
puts "*** Preserving this moment in history."
|
42
|
-
self.snapshot_loc = self.config.raw_image
|
43
|
-
self.main_image = self.config.main_image(self.sha)
|
44
|
-
capturer =
|
42
|
+
self.snapshot_loc = self.config.raw_image(image_file_type)
|
43
|
+
self.main_image = self.config.main_image(self.sha, image_file_type)
|
44
|
+
capturer = capturer_class.new(
|
45
45
|
:capture_device => self.capture_device,
|
46
46
|
:capture_delay => self.capture_delay,
|
47
47
|
:snapshot_location => self.snapshot_loc,
|
48
|
-
:font => self.font
|
48
|
+
:font => self.font,
|
49
|
+
:video_location => self.config.video_loc,
|
50
|
+
:frames_location => self.config.frames_loc,
|
51
|
+
:animated_duration => self.capture_animate
|
49
52
|
)
|
50
53
|
capturer.capture
|
51
54
|
resize_snapshot!
|
52
55
|
end
|
53
56
|
end
|
57
|
+
|
58
|
+
def animate?
|
59
|
+
capture_animate && (capture_animate > 0)
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
def capturer_class
|
64
|
+
"Lolcommits::Capture#{Configuration.platform}#{animate? ? 'Animated' : nil}".constantize
|
65
|
+
end
|
66
|
+
|
67
|
+
def image_file_type
|
68
|
+
animate? ? 'gif' : 'jpg'
|
69
|
+
end
|
54
70
|
end
|
55
71
|
|
56
72
|
protected
|
@@ -84,8 +100,10 @@ module Lolcommits
|
|
84
100
|
|
85
101
|
def cleanup!
|
86
102
|
debug "Runner: running cleanup"
|
87
|
-
#clean up the captured image
|
103
|
+
# clean up the captured image and any other raw assets
|
88
104
|
FileUtils.rm(self.snapshot_loc)
|
105
|
+
FileUtils.rm_f(self.config.video_loc)
|
106
|
+
FileUtils.rm_rf(self.config.frames_loc)
|
89
107
|
end
|
90
108
|
|
91
109
|
# register a method called "execute_lolcommits_#{plugin_name}"
|
data/lib/lolcommits/version.rb
CHANGED
data/lib/tranzlate/lolspeak.rb
CHANGED
File without changes
|
data/test/test_lolcommits.rb
CHANGED
@@ -33,10 +33,13 @@ class LolTest < Test::Unit::TestCase
|
|
33
33
|
def test_permissions
|
34
34
|
impact_perms = File.lstat(File.join(Configuration::LOLCOMMITS_ROOT, "vendor", "fonts", "Impact.ttf")).mode & 0777
|
35
35
|
imagesnap_perms = File.lstat(File.join(Configuration::LOLCOMMITS_ROOT, "vendor", "ext", "imagesnap", "imagesnap")).mode & 0777
|
36
|
+
videosnap_perms = File.lstat(File.join(Configuration::LOLCOMMITS_ROOT, "vendor", "ext", "videosnap", "videosnap")).mode & 0777
|
36
37
|
assert impact_perms == 0644 || impact_perms == 0664,
|
37
38
|
"expected perms of 644/664 but instead got #{sprintf '%o', impact_perms}"
|
38
39
|
assert imagesnap_perms == 0755 || imagesnap_perms == 0775,
|
39
40
|
"expected perms of 755/775 but instead got #{sprintf '%o', imagesnap_perms}"
|
41
|
+
assert videosnap_perms == 0755 || videosnap_perms == 0775,
|
42
|
+
"expected perms of 755/775 but instead got #{sprintf '%o', videosnap_perms}"
|
40
43
|
end
|
41
44
|
|
42
45
|
# Hmm.. webcam capture breaks travis-ci tests
|
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lolcommits
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0.pre1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthew Rothenberg
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-09-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mini_magick
|
@@ -267,16 +267,19 @@ files:
|
|
267
267
|
- README.md
|
268
268
|
- Rakefile
|
269
269
|
- bin/lolcommits
|
270
|
+
- config/cucumber.yml
|
270
271
|
- features/bugs.feature
|
271
272
|
- features/lolcommits.feature
|
272
273
|
- features/plugins.feature
|
273
274
|
- features/step_definitions/lolcommits_steps.rb
|
274
275
|
- features/support/env.rb
|
276
|
+
- features/support/path_helpers.rb
|
275
277
|
- lib/core_ext/class.rb
|
276
278
|
- lib/lolcommits.rb
|
277
279
|
- lib/lolcommits/capture_fake.rb
|
278
280
|
- lib/lolcommits/capture_linux.rb
|
279
281
|
- lib/lolcommits/capture_mac.rb
|
282
|
+
- lib/lolcommits/capture_mac_animated.rb
|
280
283
|
- lib/lolcommits/capture_windows.rb
|
281
284
|
- lib/lolcommits/capturer.rb
|
282
285
|
- lib/lolcommits/configuration.rb
|
@@ -299,6 +302,7 @@ files:
|
|
299
302
|
- vendor/ext/CommandCam/LICENSE
|
300
303
|
- vendor/ext/imagesnap/ReadMeOrDont.rtf
|
301
304
|
- vendor/ext/imagesnap/imagesnap
|
305
|
+
- vendor/ext/videosnap/videosnap
|
302
306
|
- vendor/fonts/Impact.ttf
|
303
307
|
homepage: http://mroth.github.com/lolcommits/
|
304
308
|
licenses:
|
@@ -315,9 +319,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
315
319
|
version: '0'
|
316
320
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
317
321
|
requirements:
|
318
|
-
- - '
|
322
|
+
- - '>'
|
319
323
|
- !ruby/object:Gem::Version
|
320
|
-
version:
|
324
|
+
version: 1.3.1
|
321
325
|
requirements: []
|
322
326
|
rubyforge_project: lolcommits
|
323
327
|
rubygems_version: 2.0.3
|
@@ -330,5 +334,6 @@ test_files:
|
|
330
334
|
- features/plugins.feature
|
331
335
|
- features/step_definitions/lolcommits_steps.rb
|
332
336
|
- features/support/env.rb
|
337
|
+
- features/support/path_helpers.rb
|
333
338
|
- test/images/test_image.jpg
|
334
339
|
- test/test_lolcommits.rb
|