absgit 0.2.1 → 0.3.0
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/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
|