absgit 0.1.2

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7f26cd5efa247302f66c97d4ef3f6118d2b6a576
4
+ data.tar.gz: 2af40a800b06f4085875b6ae54935dfb0c97e53d
5
+ SHA512:
6
+ metadata.gz: 114ada2e52cdde5bfea375e52b75721a092a71f299089a2b6bb2350b618c4a1d1a19024b796d04dd73e741924fd9e44d139f5f6a2d92220e2bc4f52d066d3ba3
7
+ data.tar.gz: 9e86941d8c7a81a97746faca2cbccb2bf0b52569a523d886bf241394a4abc4e66323ba76f2fc6dc7a9e326670cfa544f21486acfae18e26c91b957cc9a694a20
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ *.gem
2
+ /pkg/
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in absgit.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,34 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ absgit (0.1.0)
5
+ methadone (~> 1.2.6)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ ansi (1.4.3)
11
+ builder (3.0.4)
12
+ hashie (2.0.4)
13
+ methadone (1.2.6)
14
+ bundler
15
+ minitest (4.7.3)
16
+ minitest-reporters (0.14.17)
17
+ ansi
18
+ builder
19
+ minitest (>= 2.12, < 5.0)
20
+ powerbar
21
+ powerbar (1.0.11)
22
+ ansi (~> 1.4.0)
23
+ hashie (>= 1.1.0)
24
+ rake (10.0.4)
25
+
26
+ PLATFORMS
27
+ ruby
28
+
29
+ DEPENDENCIES
30
+ absgit!
31
+ bundler (~> 1.3)
32
+ minitest (~> 4.0)
33
+ minitest-reporters (~> 0.14.17)
34
+ rake
data/LICENCE.txt ADDED
@@ -0,0 +1,4 @@
1
+ The contents of this repository are made available under the terms of
2
+ the MIT Licence. See:
3
+
4
+ http://opensource.org/licenses/MIT
data/README.md ADDED
@@ -0,0 +1,22 @@
1
+ # absgit
2
+
3
+ ## Introduction
4
+
5
+ This is the repository for a Ruby gem
6
+ called `absgit`.
7
+ It provides a program of the same name
8
+ which
9
+ allows one to manipulate files in a Git repository,
10
+ regardless of whether one is inside it.
11
+
12
+ ## Installation
13
+
14
+ To install the gem, give this command:
15
+
16
+ gem install absgit
17
+
18
+ Ruby 2 is required.
19
+
20
+ ## Documentation
21
+
22
+ See [here](doc/absgit.md).
data/Rakefile ADDED
@@ -0,0 +1,20 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ desc 'Run the test suite'
4
+ task :test do
5
+ #> we need to set RUBYLIB, because the test suite
6
+ # invokes the application as a separate process
7
+
8
+ system(
9
+ {
10
+ 'RUBYLIB' =>
11
+ (
12
+ ENV.fetch('RUBYLIB', '').split(':') +
13
+ [File.join(__dir__, 'lib')]
14
+ ).join(':')
15
+ },
16
+ FileUtils::RUBY, 'test/absgit_test.rb'
17
+ )
18
+ end
19
+
20
+ task :default => :test
data/absgit.gemspec ADDED
@@ -0,0 +1,51 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ require 'absgit/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = "absgit"
9
+ spec.version = Absgit::VERSION
10
+ spec.authors = ["Ruafozy"]
11
+
12
+ spec.summary =
13
+ %q{Allow manipulating Git repository files outside a repository}
14
+
15
+ spec.description = %q{
16
+ This gem contains a program which allows one to
17
+ manipulate files in a Git repository,
18
+ regardless of whether one is inside it.
19
+ }.split.join(' ')
20
+
21
+ spec.homepage = "https://github.com/ruafozy/absgit"
22
+ spec.license = "MIT"
23
+
24
+ spec.files = `git ls-files`.split($/)
25
+
26
+ spec.required_ruby_version = '>= 2.0.0'
27
+
28
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
29
+ spec.test_files = spec.files.grep(%r{\Atest\z/})
30
+ spec.require_paths = ["lib"]
31
+
32
+ [
33
+ ['methadone', ['~> 1.2.6']],
34
+ ].each do |name, ver|
35
+ spec.add_runtime_dependency(name, ver)
36
+ end
37
+
38
+ [
39
+ ['bundler', ['~> 1.3']],
40
+ ['minitest', ['~> 4.0']],
41
+ ['minitest-reporters', ['~> 0.14.17']],
42
+ ['rake'],
43
+ ].each do |gem_info|
44
+ spec.add_development_dependency(*gem_info)
45
+ end
46
+
47
+ #> there seems to be no way to specify in the gemspec
48
+ # that rdoc documentation should not be generated.
49
+ # see http://stackoverflow.com/q/16167876
50
+ spec.has_rdoc = false
51
+ end
data/bin/absgit ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'absgit'
4
+
5
+ Absgit.new(ARGV).run
6
+
7
+ # vim: set syntax=ruby:
data/doc/absgit.md ADDED
@@ -0,0 +1,55 @@
1
+ ## The Problem
2
+
3
+ You can do this:
4
+
5
+ cd /
6
+ svn commit --message blah /some/absolute/path
7
+
8
+ but you can't do this:
9
+
10
+ cd /
11
+ git commit --message blah /some/absolute/path
12
+
13
+ More generally,
14
+ Git requires you to be within the
15
+ repository, whereas Subversion does not.
16
+
17
+ ## The solution
18
+
19
+ A program called `absgit`.
20
+ To use it, simply type your desired Git
21
+ command, replacing the initial "git" with "absgit".
22
+ For example:
23
+
24
+ absgit commit --message blah /some/absolute/path
25
+
26
+ Its logic is very simple.
27
+ It skips over the Git subcommand and iterates
28
+ over the remaining arguments, looking
29
+ for the first argument which contains a slash and
30
+ names a path inside a Git repository.
31
+ If it finds such an argument,
32
+ it infers `GIT_DIR` and `GIT_WORK_TREE`,
33
+ then invokes `git` with these
34
+ variables in its environment.
35
+
36
+ If it finds no such argument,
37
+ then it simply invokes `git` with an
38
+ unchanged environment.
39
+ For example, the following
40
+ two commands are essentially equivalent:
41
+
42
+ absgit log -3
43
+
44
+ git log -3
45
+
46
+ ## Options
47
+
48
+ `absgit` accepts the `--help` and `--version` options.
49
+
50
+ ## Origin of name
51
+
52
+ The software is commonly used in conjunction with
53
+ absolute pathnames,
54
+ so the prefix "abs" was chosen,
55
+ as a short version of "absolute".
@@ -0,0 +1,3 @@
1
+ class Absgit
2
+ VERSION = '0.1.2'
3
+ end
data/lib/absgit.rb ADDED
@@ -0,0 +1,99 @@
1
+ require 'absgit/version'
2
+ require 'methadone'
3
+ require 'optparse'
4
+ require 'pathname'
5
+
6
+ class Absgit
7
+ include Methadone::CLILogging
8
+
9
+ GIT_DIR_BASE = '.git'
10
+ PROGRAM_NAME = 'absgit'
11
+
12
+ def initialize(args)
13
+ @args = args
14
+ @options = {}
15
+ end
16
+
17
+ def self.get_repo_path(file_name)
18
+ path = Pathname.new(file_name)
19
+
20
+ if path.exist?
21
+ path.realpath.ascend do |path2|
22
+ if (path2 + '.git').exist?
23
+ return path2
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ def option_parser
30
+ OptionParser.new do |parser|
31
+ parser.program_name = PROGRAM_NAME
32
+ parser.banner = "Usage: #{PROGRAM_NAME} [options] [GIT_SUBCOMMAND]"
33
+
34
+ parser.on('--debug', 'Show debugging information') do
35
+ @options[:debug] = true
36
+ end
37
+
38
+ parser.on('--help', 'Show this usage summary') do
39
+ @options[:help] = true
40
+ end
41
+
42
+ parser.on('--version', 'Show program name and version') do
43
+ @options[:version] = true
44
+ end
45
+ end
46
+ end
47
+
48
+ def run
49
+ begin
50
+ option_parser.order!
51
+ rescue OptionParser::ParseError
52
+ $stderr.puts 'Error: incorrect usage'
53
+ $stderr.puts ''
54
+ $stderr.puts option_parser
55
+ exit(1)
56
+ end
57
+
58
+ if @options[:debug]
59
+ logger.error_level = Logger::Severity::DEBUG
60
+ end
61
+
62
+ debug(@options.inspect)
63
+ debug(@args.inspect)
64
+
65
+ if @options[:version]
66
+ puts "#{PROGRAM_NAME} #{VERSION}"
67
+ elsif @options[:help]
68
+ puts option_parser
69
+ else
70
+ repo_path =
71
+ @args[1..-1].grep(%r{/}).each_with_object(nil) { |arg|
72
+ repo = self.class.get_repo_path(arg)
73
+ break repo if !repo.nil?
74
+ }
75
+
76
+ env =
77
+ if repo_path.nil?
78
+ {}
79
+ else
80
+ {
81
+ 'GIT_DIR' => (repo_path + GIT_DIR_BASE).to_s,
82
+ 'GIT_WORK_TREE' => repo_path.to_s,
83
+ }
84
+ end
85
+
86
+ #< it seems better to use environment variables
87
+ # rather than "--git-dir" and "--work-tree", because
88
+ # environment variables will be inherited by processes
89
+ # spawned by git aliases.
90
+
91
+ command = ['git'] + @args
92
+ debug(command.inspect)
93
+ debug(env.inspect)
94
+ system(env, *command)
95
+ end
96
+ end
97
+ end
98
+
99
+ # vim: set syntax=ruby:
@@ -0,0 +1,116 @@
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
+ require 'absgit'
11
+ require 'fileutils'
12
+ require 'shellwords'
13
+ require 'tmpdir'
14
+
15
+ class AbsgitTest < MiniTest::Unit::TestCase
16
+ APP_PATH = File.expand_path(
17
+ "../../bin/#{Absgit::PROGRAM_NAME}",
18
+ __FILE__
19
+ )
20
+ APP_PATH_ESC = Shellwords.escape(APP_PATH)
21
+
22
+ def setup
23
+ @temp_dir = Dir.mktmpdir
24
+
25
+ # puts "dir: #@temp_dir"
26
+ end
27
+
28
+ def teardown
29
+ FileUtils.rm_r(@temp_dir, secure: true)
30
+ end
31
+
32
+ def test_symlinks_resolved
33
+ Dir.chdir(@temp_dir) do
34
+ # Given
35
+
36
+ repo = 'a1/a2/a3/repo'
37
+ repo_abs = File.absolute_path(repo)
38
+
39
+ repo_file = File.join(repo, 'b1/b2/b3/file')
40
+ repo_file_abs = File.absolute_path(repo_file)
41
+
42
+ symlink = 'd/symlink'
43
+
44
+ FileUtils.makedirs(File.dirname(repo_file))
45
+ FileUtils.touch(repo_file)
46
+
47
+ Dir.mkdir(File.dirname(symlink))
48
+ File.symlink(repo_file_abs, symlink)
49
+
50
+ system 'git', 'init', '--quiet', repo
51
+
52
+ # When & Then
53
+
54
+ assert_equal(repo_abs, Absgit.get_repo_path(symlink).to_s)
55
+ assert_equal(
56
+ repo_abs, Absgit.get_repo_path(File.absolute_path(symlink)).to_s
57
+ )
58
+ end
59
+ end
60
+
61
+ def test_file_not_in_repo
62
+ f = '/dev/null'
63
+
64
+ if !File.exist?(f)
65
+ skip
66
+ else
67
+ assert_nil(Absgit.get_repo_path(f))
68
+ end
69
+ end
70
+
71
+ def test_commit_does_not_require_chdir_to_repo
72
+ Dir.chdir(@temp_dir) do
73
+ # Given
74
+
75
+ repo = 'repo'
76
+ repo_file = File.join(repo, 'file')
77
+ repo_file_abs = File.absolute_path(repo_file)
78
+
79
+ Dir.mkdir(repo)
80
+ system 'git', 'init', '--quiet', repo
81
+ IO.write(repo_file, "blah\n")
82
+
83
+ # When
84
+
85
+ system(
86
+ "#{APP_PATH_ESC} add #{repo_file_abs.shellescape}"
87
+ )
88
+
89
+ system(
90
+ "#{APP_PATH_ESC} commit --quiet --message blah " +
91
+ repo_file_abs.shellescape
92
+ )
93
+
94
+ # Then
95
+
96
+ Dir.chdir(repo) do
97
+ assert_equal("1\n", `git rev-list --count HEAD`)
98
+ end
99
+ end
100
+ end
101
+
102
+ def test_help_message_is_output
103
+ assert_match(/--help\b/, `#{APP_PATH_ESC} --help`)
104
+ end
105
+
106
+ def test_options_for_git_are_left_alone
107
+ refute_match(
108
+ /--help\b/,
109
+ %x{
110
+ #> any program that consumes its input will do
111
+ # instead of "wc"
112
+ PAGER=wc #{APP_PATH_ESC} log --help
113
+ }
114
+ )
115
+ end
116
+ end
metadata ADDED
@@ -0,0 +1,127 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: absgit
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ platform: ruby
6
+ authors:
7
+ - Ruafozy
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-05-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: methadone
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 1.2.6
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 1.2.6
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '1.3'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '4.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '4.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest-reporters
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 0.14.17
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: 0.14.17
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: This gem contains a program which allows one to manipulate files in a
84
+ Git repository, regardless of whether one is inside it.
85
+ email:
86
+ executables:
87
+ - absgit
88
+ extensions: []
89
+ extra_rdoc_files: []
90
+ files:
91
+ - .gitignore
92
+ - Gemfile
93
+ - Gemfile.lock
94
+ - LICENCE.txt
95
+ - README.md
96
+ - Rakefile
97
+ - absgit.gemspec
98
+ - bin/absgit
99
+ - doc/absgit.md
100
+ - lib/absgit.rb
101
+ - lib/absgit/version.rb
102
+ - test/absgit_test.rb
103
+ homepage: https://github.com/ruafozy/absgit
104
+ licenses:
105
+ - MIT
106
+ metadata: {}
107
+ post_install_message:
108
+ rdoc_options: []
109
+ require_paths:
110
+ - lib
111
+ required_ruby_version: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - '>='
114
+ - !ruby/object:Gem::Version
115
+ version: 2.0.0
116
+ required_rubygems_version: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ requirements: []
122
+ rubyforge_project:
123
+ rubygems_version: 2.0.0
124
+ signing_key:
125
+ specification_version: 4
126
+ summary: Allow manipulating Git repository files outside a repository
127
+ test_files: []