absgit 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +10 -4
- data/doc/absgit.md +2 -2
- data/lib/absgit.rb +24 -7
- data/lib/absgit/version.rb +1 -1
- data/test/{absgit_test.rb → absgit_above_repo_test.rb} +44 -83
- data/test/absgit_within_repo_test.rb +35 -0
- data/test/lib/absgit_common.rb +60 -0
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cd29facc8a9fc8d0fd30f4c06f532780ce7e16be
|
4
|
+
data.tar.gz: f3cf9946f25f02229d4d345a0d2daea7b3ffcf37
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1ce175e288ab5067c4103d08c4fa88c15fd84a30d81a6520e80e0396e0d343426a09bf849c3a258c63b575fcbfa89c4783868abad9fa2821860946fd20d9e287
|
7
|
+
data.tar.gz: af63a1d19436a28ca56ca8d4a24c9054db1759d99fb73f6caa984a88b21aeb467df7b667fb5ed1300a52e0063f22c3c2ce0dea3f93db1b622cce9c634c88b857
|
data/Rakefile
CHANGED
@@ -9,11 +9,14 @@ task :run, [:absgit_args] do |dummy, args|
|
|
9
9
|
)
|
10
10
|
end
|
11
11
|
|
12
|
-
desc
|
13
|
-
task :test do
|
14
|
-
cmd = 'minitest4', 'test'
|
12
|
+
desc %q{Run the test suite (`pat' is used with "-n")}
|
13
|
+
task :test, [:pat] do |dummy, args|
|
15
14
|
cmd = 'minitest4', '-p', 'test', '--', '-v'
|
16
15
|
|
16
|
+
if args.pat
|
17
|
+
cmd += ['-n', args.pat]
|
18
|
+
end
|
19
|
+
|
17
20
|
#> we need to set RUBYLIB, because the test suite
|
18
21
|
# invokes the application as a separate process
|
19
22
|
|
@@ -21,7 +24,10 @@ task :test do
|
|
21
24
|
{
|
22
25
|
'RUBYLIB' =>
|
23
26
|
(
|
24
|
-
[
|
27
|
+
[
|
28
|
+
File.join(__dir__, 'lib'),
|
29
|
+
File.join(__dir__, 'test', 'lib'),
|
30
|
+
] +
|
25
31
|
ENV.fetch('RUBYLIB', '').split(':')
|
26
32
|
).join(':')
|
27
33
|
},
|
data/doc/absgit.md
CHANGED
@@ -39,8 +39,8 @@ variables in its environment.
|
|
39
39
|
|
40
40
|
Also,
|
41
41
|
any argument which contains a slash and denotes
|
42
|
-
a path inside the repository is turned into
|
43
|
-
absolute
|
42
|
+
a path inside the repository is turned into a
|
43
|
+
canonicalised absolute pathname before being passed to Git.
|
44
44
|
This enables relative paths and symlinks to work.
|
45
45
|
|
46
46
|
## Options
|
data/lib/absgit.rb
CHANGED
@@ -41,6 +41,12 @@ class Absgit
|
|
41
41
|
@options[:help] = true
|
42
42
|
end
|
43
43
|
|
44
|
+
parser.on(
|
45
|
+
'-p', '--path PATH', 'Use PATH to determine Git repository'
|
46
|
+
) do |path|
|
47
|
+
@options[:path] = path
|
48
|
+
end
|
49
|
+
|
44
50
|
parser.on('--version', 'Show program name and version') do
|
45
51
|
@options[:version] = true
|
46
52
|
end
|
@@ -49,7 +55,7 @@ class Absgit
|
|
49
55
|
|
50
56
|
def run
|
51
57
|
begin
|
52
|
-
option_parser.order!
|
58
|
+
option_parser.order!(@args)
|
53
59
|
rescue OptionParser::ParseError
|
54
60
|
$stderr.puts 'Error: incorrect usage'
|
55
61
|
$stderr.puts ''
|
@@ -69,12 +75,23 @@ class Absgit
|
|
69
75
|
elsif @options[:help]
|
70
76
|
puts option_parser
|
71
77
|
else
|
72
|
-
|
73
|
-
@
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
+
if @options[:path]
|
79
|
+
repo_path = self.class.get_repo_path(@options[:path])
|
80
|
+
|
81
|
+
if repo_path.nil?
|
82
|
+
$stderr.puts \
|
83
|
+
"Fatal error: cannot " +
|
84
|
+
"map path to Git repository: #{@options[:path]}"
|
85
|
+
exit(1)
|
86
|
+
end
|
87
|
+
else
|
88
|
+
repo_path =
|
89
|
+
@args[1..-1].find_all { |arg| repo_object_candidate?(arg) }.
|
90
|
+
each_with_object(nil) { |arg|
|
91
|
+
repo = self.class.get_repo_path(arg)
|
92
|
+
break repo if !repo.nil?
|
93
|
+
}
|
94
|
+
end
|
78
95
|
|
79
96
|
if repo_path.nil?
|
80
97
|
env = {}
|
data/lib/absgit/version.rb
CHANGED
@@ -1,44 +1,21 @@
|
|
1
1
|
require 'absgit'
|
2
|
+
require 'absgit_common'
|
2
3
|
require 'fileutils'
|
3
4
|
require 'shellwords'
|
4
5
|
require 'tmpdir'
|
5
6
|
require 'minitest/unit'
|
6
7
|
|
7
|
-
class
|
8
|
-
|
9
|
-
"../../bin/#{Absgit::PROGRAM_NAME}",
|
10
|
-
__FILE__
|
11
|
-
)
|
12
|
-
APP_PATH_ESC = Shellwords.escape(APP_PATH)
|
13
|
-
|
14
|
-
def setup
|
15
|
-
@saved_dir = Dir.pwd
|
16
|
-
|
17
|
-
@temp_dir = Dir.mktmpdir
|
18
|
-
|
19
|
-
Dir.chdir(@temp_dir)
|
20
|
-
end
|
21
|
-
|
22
|
-
def teardown
|
23
|
-
Dir.chdir(@saved_dir)
|
24
|
-
|
25
|
-
FileUtils.rm_r(@temp_dir, secure: true)
|
26
|
-
end
|
8
|
+
class AbsgitAboveRepoTest < MiniTest::Unit::TestCase
|
9
|
+
include AbsgitCommon
|
27
10
|
|
28
11
|
def test_help_message_is_output
|
29
12
|
assert_match(/--help\b/, `#{APP_PATH_ESC} --help`)
|
30
13
|
end
|
31
14
|
|
32
15
|
def test_options_for_git_are_left_alone
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
#> any program that consumes its input will do
|
37
|
-
# instead of "wc"
|
38
|
-
|
39
|
-
%x{
|
40
|
-
PAGER=wc #{APP_PATH_ESC} log --help
|
41
|
-
}
|
16
|
+
refute_equal(
|
17
|
+
`#{APP_PATH_ESC} --help`,
|
18
|
+
`#{APP_PATH_ESC} log --help`
|
42
19
|
)
|
43
20
|
end
|
44
21
|
|
@@ -183,68 +160,52 @@ class AbsgitTest < MiniTest::Unit::TestCase
|
|
183
160
|
assert_equal(num_commits_before + 1, num_commits(repo))
|
184
161
|
end
|
185
162
|
|
186
|
-
|
187
|
-
|
188
|
-
super
|
189
|
-
Dir.chdir(get_repo)
|
190
|
-
end
|
163
|
+
def test_path_option_works_for_symlink
|
164
|
+
# Given
|
191
165
|
|
192
|
-
|
193
|
-
[
|
194
|
-
%w{ls-files},
|
195
|
-
%w{ls-files --non-existent-option},
|
196
|
-
%w{add non-existent-file},
|
197
|
-
].each do |args|
|
198
|
-
# Given & When
|
199
|
-
|
200
|
-
opts = {
|
201
|
-
err: '/dev/null',
|
202
|
-
out: '/dev/null',
|
203
|
-
}
|
204
|
-
system(*(%w{git} + args), opts)
|
205
|
-
git_exit_status = $?.exitstatus
|
206
|
-
system(*([APP_PATH] + args), opts)
|
207
|
-
absgit_exit_status = $?.exitstatus
|
208
|
-
|
209
|
-
# Then
|
210
|
-
|
211
|
-
assert_equal(git_exit_status, absgit_exit_status)
|
212
|
-
end
|
213
|
-
end
|
214
|
-
end
|
166
|
+
repo = get_repo
|
215
167
|
|
216
|
-
|
168
|
+
tracked_file = File.join(repo, 'tracked_file')
|
169
|
+
FileUtils.touch(tracked_file)
|
217
170
|
|
218
|
-
|
219
|
-
|
220
|
-
%x{git ls-files}.split("\n")
|
221
|
-
end
|
222
|
-
end
|
171
|
+
symlink = './symlink'
|
172
|
+
File.symlink(tracked_file, symlink)
|
223
173
|
|
224
|
-
|
225
|
-
Dir.chdir(repo_dir) {
|
226
|
-
`git rev-list --count HEAD`.match(/\A\d+\n\z/) { |m|
|
227
|
-
m[0].to_i
|
228
|
-
}
|
229
|
-
}
|
230
|
-
end
|
174
|
+
# When
|
231
175
|
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
176
|
+
system(APP_PATH, '--path', symlink, 'add', symlink)
|
177
|
+
|
178
|
+
# Then
|
179
|
+
|
180
|
+
assert_equal(1, files_in_index(repo).size)
|
236
181
|
end
|
237
|
-
end
|
238
182
|
|
239
|
-
|
240
|
-
|
241
|
-
|
183
|
+
def test_path_option_works_for_real_path
|
184
|
+
# Given
|
185
|
+
|
186
|
+
repo = get_repo
|
187
|
+
|
188
|
+
tracked_file = File.join(repo, 'tracked_file')
|
189
|
+
FileUtils.touch(tracked_file)
|
190
|
+
|
191
|
+
real_path = File.realpath(tracked_file)
|
242
192
|
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
193
|
+
# When
|
194
|
+
|
195
|
+
system(APP_PATH, '--path', real_path, 'add', real_path)
|
196
|
+
|
197
|
+
# Then
|
198
|
+
|
199
|
+
assert_equal(1, files_in_index(repo).size)
|
200
|
+
end
|
201
|
+
|
202
|
+
def test_error_behaviour_for_path_option
|
203
|
+
output, err_msg = capture_subprocess_io do
|
204
|
+
system(APP_PATH, '--path', '/', 'log')
|
248
205
|
end
|
206
|
+
|
207
|
+
refute $?.success?
|
208
|
+
assert_equal('', output)
|
209
|
+
assert_match(/./, err_msg)
|
249
210
|
end
|
250
211
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'absgit'
|
2
|
+
require 'absgit_common'
|
3
|
+
require 'minitest/unit'
|
4
|
+
|
5
|
+
class AbsgitWithinRepoTest < MiniTest::Unit::TestCase
|
6
|
+
include AbsgitCommon
|
7
|
+
|
8
|
+
def setup
|
9
|
+
super
|
10
|
+
Dir.chdir(get_repo)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_exit_status_preserved
|
14
|
+
[
|
15
|
+
%w{ls-files},
|
16
|
+
%w{ls-files --non-existent-option},
|
17
|
+
%w{add non-existent-file},
|
18
|
+
].each do |args|
|
19
|
+
# Given & When
|
20
|
+
|
21
|
+
opts = {
|
22
|
+
err: '/dev/null',
|
23
|
+
out: '/dev/null',
|
24
|
+
}
|
25
|
+
system(*(%w{git} + args), opts)
|
26
|
+
git_exit_status = $?.exitstatus
|
27
|
+
system(*([APP_PATH] + args), opts)
|
28
|
+
absgit_exit_status = $?.exitstatus
|
29
|
+
|
30
|
+
# Then
|
31
|
+
|
32
|
+
assert_equal(git_exit_status, absgit_exit_status)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'shellwords'
|
3
|
+
require 'tmpdir'
|
4
|
+
|
5
|
+
module AbsgitCommon
|
6
|
+
APP_PATH = File.expand_path(
|
7
|
+
"../../../bin/#{Absgit::PROGRAM_NAME}",
|
8
|
+
__FILE__
|
9
|
+
)
|
10
|
+
APP_PATH_ESC = Shellwords.escape(APP_PATH)
|
11
|
+
|
12
|
+
def setup
|
13
|
+
@saved_dir = Dir.pwd
|
14
|
+
|
15
|
+
@temp_dir = Dir.mktmpdir
|
16
|
+
|
17
|
+
Dir.chdir(@temp_dir)
|
18
|
+
end
|
19
|
+
|
20
|
+
def teardown
|
21
|
+
Dir.chdir(@saved_dir)
|
22
|
+
|
23
|
+
FileUtils.rm_r(@temp_dir, secure: true)
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def files_in_index(repo)
|
29
|
+
Dir.chdir(repo) do
|
30
|
+
%x{git ls-files}.split("\n")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def num_commits(repo_dir)
|
35
|
+
Dir.chdir(repo_dir) {
|
36
|
+
`git rev-list --count HEAD`.match(/\A\d+\n\z/) { |m|
|
37
|
+
m[0].to_i
|
38
|
+
}
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
42
|
+
def get_repo
|
43
|
+
dir = Dir.mktmpdir(nil, '.')
|
44
|
+
system('git', 'init', '--quiet', dir)
|
45
|
+
dir
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
0.times do
|
50
|
+
module Kernel
|
51
|
+
alias old_system system
|
52
|
+
|
53
|
+
def system(*a)
|
54
|
+
puts "\ndebug: about to call #{__method__} with " +
|
55
|
+
"these parameters: #{a.inspect}"
|
56
|
+
old_system(*a)
|
57
|
+
puts "\ndebug: call to #{__method__} completed"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: absgit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ruafozy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-06-
|
11
|
+
date: 2013-06-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: methadone
|
@@ -101,7 +101,9 @@ files:
|
|
101
101
|
- lib/absgit/version.rb
|
102
102
|
- lib/utils.rb
|
103
103
|
- rakelib/utils.rake
|
104
|
-
- test/
|
104
|
+
- test/absgit_above_repo_test.rb
|
105
|
+
- test/absgit_within_repo_test.rb
|
106
|
+
- test/lib/absgit_common.rb
|
105
107
|
- test/utils_test.rb
|
106
108
|
homepage: https://github.com/ruafozy/absgit
|
107
109
|
licenses:
|
@@ -128,3 +130,4 @@ signing_key:
|
|
128
130
|
specification_version: 4
|
129
131
|
summary: Allow manipulating Git repository files outside a repository
|
130
132
|
test_files: []
|
133
|
+
has_rdoc: false
|