absgit 0.1.3 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +4 -4
- data/Gemfile.lock +4 -12
- data/README.md +1 -1
- data/Rakefile +15 -3
- data/absgit.gemspec +2 -2
- data/doc/absgit.md +14 -15
- data/lib/absgit.rb +25 -14
- data/lib/absgit/version.rb +1 -1
- data/lib/utils.rb +30 -0
- data/rakelib/utils.rake +7 -0
- data/test/absgit_test.rb +84 -10
- data/test/utils_test.rb +42 -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: 3e5b421181caae16aa6117e6b3a69da27869d11e
|
4
|
+
data.tar.gz: 6018b58723501e31f4d410d56035467a314f0cba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e018de14b4a7f2267a7d7a9f62cd821ba9d9c9eabaa841595b168f8d681d6898ed4a4409f04d6ff430021fa57767e7d1284f723684463fd1058ab785bc6d783b
|
7
|
+
data.tar.gz: d78ac731320c1f902af6d320858344766b5ae90cd033acf45156760cf00e3ef9e531514132982f5bb17a552b0bc82c8147092466bde300df03f9171e018b2624
|
data/Gemfile
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
gem 'methadone', '~> 1.3.0'
|
2
|
+
gem 'minitest', '~> 4.7.3'
|
3
|
+
gem 'minitest-reporters', '~> 0.14.17'
|
4
|
+
gem 'rake', '~> 10.0.4'
|
data/Gemfile.lock
CHANGED
@@ -1,16 +1,9 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
absgit (0.1.0)
|
5
|
-
methadone (~> 1.2.6)
|
6
|
-
|
7
1
|
GEM
|
8
|
-
remote: https://rubygems.org/
|
9
2
|
specs:
|
10
3
|
ansi (1.4.3)
|
11
4
|
builder (3.0.4)
|
12
5
|
hashie (2.0.4)
|
13
|
-
methadone (1.
|
6
|
+
methadone (1.3.0)
|
14
7
|
bundler
|
15
8
|
minitest (4.7.3)
|
16
9
|
minitest-reporters (0.14.17)
|
@@ -27,8 +20,7 @@ PLATFORMS
|
|
27
20
|
ruby
|
28
21
|
|
29
22
|
DEPENDENCIES
|
30
|
-
|
31
|
-
|
32
|
-
minitest (~> 4.0)
|
23
|
+
methadone (~> 1.3.0)
|
24
|
+
minitest (~> 4.7.3)
|
33
25
|
minitest-reporters (~> 0.14.17)
|
34
|
-
rake
|
26
|
+
rake (~> 10.0.4)
|
data/README.md
CHANGED
data/Rakefile
CHANGED
@@ -1,7 +1,19 @@
|
|
1
1
|
require 'bundler/gem_tasks'
|
2
2
|
|
3
|
+
desc 'Run absgit'
|
4
|
+
task :run, [:absgit_args] do |dummy, args|
|
5
|
+
system(
|
6
|
+
*with_bundler(
|
7
|
+
'ruby', '-I', 'lib', 'bin/absgit', *args.absgit_args.split
|
8
|
+
)
|
9
|
+
)
|
10
|
+
end
|
11
|
+
|
3
12
|
desc 'Run the test suite'
|
4
13
|
task :test do
|
14
|
+
cmd = 'minitest4', 'test'
|
15
|
+
cmd = 'minitest4', '-p', 'test', '--', '-v'
|
16
|
+
|
5
17
|
#> we need to set RUBYLIB, because the test suite
|
6
18
|
# invokes the application as a separate process
|
7
19
|
|
@@ -9,11 +21,11 @@ task :test do
|
|
9
21
|
{
|
10
22
|
'RUBYLIB' =>
|
11
23
|
(
|
12
|
-
|
13
|
-
|
24
|
+
[File.join(__dir__, 'lib')] +
|
25
|
+
ENV.fetch('RUBYLIB', '').split(':')
|
14
26
|
).join(':')
|
15
27
|
},
|
16
|
-
|
28
|
+
*with_bundler(*cmd)
|
17
29
|
)
|
18
30
|
end
|
19
31
|
|
data/absgit.gemspec
CHANGED
@@ -14,8 +14,8 @@ Gem::Specification.new do |spec|
|
|
14
14
|
|
15
15
|
spec.description = %q{
|
16
16
|
This gem contains a program which allows one to
|
17
|
-
manipulate files in a Git repository
|
18
|
-
|
17
|
+
manipulate files in a Git repository
|
18
|
+
from any location in the filesystem.
|
19
19
|
}.split.join(' ')
|
20
20
|
|
21
21
|
spec.homepage = "https://github.com/ruafozy/absgit"
|
data/doc/absgit.md
CHANGED
@@ -23,25 +23,25 @@ For example:
|
|
23
23
|
|
24
24
|
absgit commit --message blah /some/absolute/path
|
25
25
|
|
26
|
-
Its logic is
|
26
|
+
Its logic is simple.
|
27
27
|
It skips over the Git subcommand and iterates
|
28
28
|
over the remaining arguments, looking
|
29
29
|
for the first argument which contains a slash and
|
30
30
|
names a path inside a Git repository.
|
31
|
-
If it finds such
|
31
|
+
If it finds no such argument, it simply delegates to
|
32
|
+
Git.
|
33
|
+
|
34
|
+
On the other hand, if it *does*
|
35
|
+
find such an argument,
|
32
36
|
it infers `GIT_DIR` and `GIT_WORK_TREE`,
|
33
37
|
then invokes `git` with these
|
34
38
|
variables in its environment.
|
35
39
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
absgit log -3
|
43
|
-
|
44
|
-
git log -3
|
40
|
+
Also,
|
41
|
+
any argument which contains a slash and denotes
|
42
|
+
a path inside the repository is turned into an
|
43
|
+
absolute path before being passed to Git.
|
44
|
+
This enables relative paths and symlinks to work.
|
45
45
|
|
46
46
|
## Options
|
47
47
|
|
@@ -49,7 +49,6 @@ two commands are essentially equivalent:
|
|
49
49
|
|
50
50
|
## Origin of name
|
51
51
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
as a short version of "absolute".
|
52
|
+
‘abs’ is from ‘absolute’;
|
53
|
+
the software is commonly used with
|
54
|
+
absolute pathnames.
|
data/lib/absgit.rb
CHANGED
@@ -2,15 +2,17 @@ require 'absgit/version'
|
|
2
2
|
require 'methadone'
|
3
3
|
require 'optparse'
|
4
4
|
require 'pathname'
|
5
|
+
require 'utils'
|
5
6
|
|
6
7
|
class Absgit
|
7
8
|
include Methadone::CLILogging
|
9
|
+
include Utils
|
8
10
|
|
9
11
|
GIT_DIR_BASE = '.git'
|
10
12
|
PROGRAM_NAME = 'absgit'
|
11
13
|
|
12
14
|
def initialize(args)
|
13
|
-
@args = args
|
15
|
+
@args = args.dup
|
14
16
|
@options = {}
|
15
17
|
end
|
16
18
|
|
@@ -74,25 +76,34 @@ class Absgit
|
|
74
76
|
break repo if !repo.nil?
|
75
77
|
}
|
76
78
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
79
|
+
if repo_path.nil?
|
80
|
+
env = {}
|
81
|
+
|
82
|
+
git_args = @args
|
83
|
+
else
|
84
|
+
env = {
|
85
|
+
'GIT_DIR' => (repo_path + GIT_DIR_BASE).to_s,
|
86
|
+
'GIT_WORK_TREE' => repo_path.to_s,
|
87
|
+
}
|
88
|
+
|
89
|
+
git_args = @args.map { |arg|
|
90
|
+
make_tracked_files_relative_to_repo(repo_path, arg)
|
91
|
+
}
|
92
|
+
end
|
93
|
+
|
94
|
+
command = ['git'] + git_args
|
86
95
|
|
96
|
+
debug(command.inspect)
|
97
|
+
debug(env.inspect)
|
98
|
+
|
99
|
+
system(env, *command)
|
100
|
+
#
|
87
101
|
#< it seems better to use environment variables
|
88
102
|
# rather than "--git-dir" and "--work-tree", because
|
89
103
|
# environment variables will be inherited by processes
|
90
104
|
# spawned by git aliases.
|
91
105
|
|
92
|
-
|
93
|
-
debug(command.inspect)
|
94
|
-
debug(env.inspect)
|
95
|
-
system(env, *command)
|
106
|
+
exit($?.exited? ? $?.exitstatus: 1)
|
96
107
|
end
|
97
108
|
end
|
98
109
|
|
data/lib/absgit/version.rb
CHANGED
data/lib/utils.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
module Utils
|
2
|
+
private
|
3
|
+
|
4
|
+
def make_tracked_files_relative_to_repo(repo_dir, x)
|
5
|
+
repo_dir_real = Pathname.new(repo_dir).realpath.to_s
|
6
|
+
|
7
|
+
catch(:finished) do
|
8
|
+
if x.include?('/')
|
9
|
+
discards = []
|
10
|
+
|
11
|
+
Pathname.new(x).ascend do |path|
|
12
|
+
if path.exist?
|
13
|
+
real = path.realpath.to_s
|
14
|
+
|
15
|
+
if real == repo_dir_real ||
|
16
|
+
real.start_with?(repo_dir_real + '/')
|
17
|
+
then
|
18
|
+
x = File.join(real, *discards)
|
19
|
+
throw :finished
|
20
|
+
end
|
21
|
+
else
|
22
|
+
discards.unshift(path.basename)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
x
|
29
|
+
end
|
30
|
+
end
|
data/rakelib/utils.rake
ADDED
data/test/absgit_test.rb
CHANGED
@@ -1,16 +1,8 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
gem 'minitest', '~> 4.0'
|
3
|
-
|
4
|
-
require 'minitest/unit'
|
5
|
-
MiniTest::Unit.autorun
|
6
|
-
|
7
|
-
require "minitest/reporters"
|
8
|
-
MiniTest::Reporters.use!
|
9
|
-
|
10
1
|
require 'absgit'
|
11
2
|
require 'fileutils'
|
12
3
|
require 'shellwords'
|
13
4
|
require 'tmpdir'
|
5
|
+
require 'minitest/unit'
|
14
6
|
|
15
7
|
class AbsgitTest < MiniTest::Unit::TestCase
|
16
8
|
APP_PATH = File.expand_path(
|
@@ -87,6 +79,46 @@ class AbsgitTest < MiniTest::Unit::TestCase
|
|
87
79
|
)
|
88
80
|
end
|
89
81
|
|
82
|
+
def test_rel_path_works
|
83
|
+
# Given
|
84
|
+
|
85
|
+
repo = 'repo'
|
86
|
+
Dir.mkdir(repo)
|
87
|
+
system(*%W{git init --quiet #{repo}})
|
88
|
+
filename = 'f'
|
89
|
+
rel_path = File.join(repo, filename)
|
90
|
+
FileUtils.touch(rel_path)
|
91
|
+
|
92
|
+
# When
|
93
|
+
|
94
|
+
system(APP_PATH, 'add', rel_path)
|
95
|
+
|
96
|
+
# Then
|
97
|
+
|
98
|
+
assert_equal(1, files_in_index(repo).size)
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_symlink_works
|
102
|
+
# Given
|
103
|
+
|
104
|
+
repo = 'repo'
|
105
|
+
Dir.mkdir(repo)
|
106
|
+
system(*%W{git init --quiet #{repo}})
|
107
|
+
filename = 'f'
|
108
|
+
rel_path = File.join(repo, filename)
|
109
|
+
FileUtils.touch(rel_path)
|
110
|
+
symlink = './symlink'
|
111
|
+
File.symlink(rel_path, symlink)
|
112
|
+
|
113
|
+
# When
|
114
|
+
|
115
|
+
system(APP_PATH, 'add', symlink)
|
116
|
+
|
117
|
+
# Then
|
118
|
+
|
119
|
+
assert_equal(1, files_in_index(repo).size)
|
120
|
+
end
|
121
|
+
|
90
122
|
def test_commit_does_not_require_chdir_to_repo
|
91
123
|
# Given
|
92
124
|
|
@@ -151,8 +183,44 @@ class AbsgitTest < MiniTest::Unit::TestCase
|
|
151
183
|
assert_equal(num_commits_before + 1, num_commits(repo))
|
152
184
|
end
|
153
185
|
|
186
|
+
class InRepo < self
|
187
|
+
def setup
|
188
|
+
super
|
189
|
+
Dir.chdir(get_repo)
|
190
|
+
end
|
191
|
+
|
192
|
+
def test_exit_status_preserved
|
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
|
215
|
+
|
154
216
|
private
|
155
217
|
|
218
|
+
def files_in_index(repo)
|
219
|
+
Dir.chdir(repo) do
|
220
|
+
%x{git ls-files}.split("\n")
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
156
224
|
def num_commits(repo_dir)
|
157
225
|
Dir.chdir(repo_dir) {
|
158
226
|
`git rev-list --count HEAD`.match(/\A\d+\n\z/) { |m|
|
@@ -160,9 +228,15 @@ class AbsgitTest < MiniTest::Unit::TestCase
|
|
160
228
|
}
|
161
229
|
}
|
162
230
|
end
|
231
|
+
|
232
|
+
def get_repo
|
233
|
+
dir = Dir.mktmpdir(nil, '.')
|
234
|
+
system('git', 'init', '--quiet', dir)
|
235
|
+
dir
|
236
|
+
end
|
163
237
|
end
|
164
238
|
|
165
|
-
|
239
|
+
0.times do
|
166
240
|
module Kernel
|
167
241
|
alias old_system system
|
168
242
|
|
data/test/utils_test.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'minitest/unit'
|
3
|
+
require 'tmpdir'
|
4
|
+
require 'utils'
|
5
|
+
|
6
|
+
class UtilsTest < MiniTest::Unit::TestCase
|
7
|
+
include Utils
|
8
|
+
|
9
|
+
def setup
|
10
|
+
@saved_dir = Dir.pwd
|
11
|
+
@temp_dir = Dir.mktmpdir
|
12
|
+
Dir.chdir(@temp_dir)
|
13
|
+
end
|
14
|
+
|
15
|
+
def teardown
|
16
|
+
Dir.chdir(@saved_dir)
|
17
|
+
FileUtils.rm_r(@temp_dir, secure: true)
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_make_tracked_files_relative_to_repo
|
21
|
+
# Given
|
22
|
+
|
23
|
+
name1 = 'a/b/c/d'
|
24
|
+
FileUtils.makedirs(name1)
|
25
|
+
|
26
|
+
symlink = 'a/b/c/symlink'
|
27
|
+
File.symlink('d', symlink)
|
28
|
+
|
29
|
+
name2 = "#{symlink}/e/f/g/h"
|
30
|
+
|
31
|
+
# When
|
32
|
+
|
33
|
+
result = make_tracked_files_relative_to_repo(name1, name2)
|
34
|
+
|
35
|
+
# Then
|
36
|
+
|
37
|
+
assert_equal(
|
38
|
+
File.join(File.realpath(name1), 'e/f/g/h'),
|
39
|
+
result
|
40
|
+
)
|
41
|
+
end
|
42
|
+
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.1
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ruafozy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-06-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: methadone
|
@@ -81,7 +81,7 @@ dependencies:
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
description: This gem contains a program which allows one to manipulate files in a
|
84
|
-
Git repository
|
84
|
+
Git repository from any location in the filesystem.
|
85
85
|
email:
|
86
86
|
executables:
|
87
87
|
- absgit
|
@@ -99,7 +99,10 @@ files:
|
|
99
99
|
- doc/absgit.md
|
100
100
|
- lib/absgit.rb
|
101
101
|
- lib/absgit/version.rb
|
102
|
+
- lib/utils.rb
|
103
|
+
- rakelib/utils.rake
|
102
104
|
- test/absgit_test.rb
|
105
|
+
- test/utils_test.rb
|
103
106
|
homepage: https://github.com/ruafozy/absgit
|
104
107
|
licenses:
|
105
108
|
- MIT
|