git-inside-branch 0.0.1
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.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/LICENSE +9 -0
- data/README +57 -0
- data/Rakefile +16 -0
- data/bin/git-inside-branch +22 -0
- data/git-inside-branch.gemspec +24 -0
- data/lib/git-inside-branch.rb +91 -0
- data/lib/git-inside-branch/version.rb +7 -0
- data/task.rb +64 -0
- data/test/git-inside-branch_test.rb +84 -0
- data/test/test_helper.rb +55 -0
- metadata +90 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
Copyright (c) 2011, Guillermo Álvarez <guillermo@cientifico.net>
|
2
|
+
All rights reserved.
|
3
|
+
|
4
|
+
"THE BEER-WARE LICENSE" (Revision 42):
|
5
|
+
<guillermo@cientifico.net> wrote this file. As long as you retain this notice you
|
6
|
+
can do whatever you want with this stuff. If we meet some day, and you think
|
7
|
+
this stuff is worth it, you can buy me a beer in return Guillermo Álvarez.
|
8
|
+
|
9
|
+
|
data/README
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
git-inside-branch
|
4
|
+
=================
|
5
|
+
|
6
|
+
git-inside-branch allows you to inspect and modify another branch in a temporarily directory without affecting current working tree.
|
7
|
+
|
8
|
+
|
9
|
+
Usage
|
10
|
+
=====
|
11
|
+
|
12
|
+
From command line
|
13
|
+
-----------------
|
14
|
+
|
15
|
+
git inside-branch doc_branch bash
|
16
|
+
|
17
|
+
This will checkout doc_branch and run bash. Then you edit your docs with vim or emacs, commit the results and exit bash.
|
18
|
+
|
19
|
+
git inside-branch gh_pages "cp $HOME/projects/my_proj/rdoc . && git add . && git commit -am 'Doc updates' && git push"
|
20
|
+
|
21
|
+
|
22
|
+
From ruby
|
23
|
+
---------
|
24
|
+
|
25
|
+
Git::Inside::Branch.tempory_checkout("gh_pages") do
|
26
|
+
`cp $HOME/projects/my_lib/rdoc .`
|
27
|
+
`git commit -a -m 'Doc updates' && git push`
|
28
|
+
end
|
29
|
+
|
30
|
+
I think is easy.
|
31
|
+
|
32
|
+
Documentation
|
33
|
+
=============
|
34
|
+
|
35
|
+
* Git::Inside::Branch.tempory_checkout( *branch_name*, *&block* )
|
36
|
+
|
37
|
+
Run the code passed in the block in another temporarily checkouted directory from the branch __branch_name__
|
38
|
+
|
39
|
+
AUTHOR
|
40
|
+
======
|
41
|
+
|
42
|
+
* Guillermo Álvarez <guillermo@cientifico.net>
|
43
|
+
|
44
|
+
|
45
|
+
LICENSE
|
46
|
+
=======
|
47
|
+
|
48
|
+
|
49
|
+
Copyright (c) 2011, Guillermo Álvarez <guillermo@cientifico.net>
|
50
|
+
All rights reserved.
|
51
|
+
|
52
|
+
"THE BEER-WARE LICENSE" (Revision 42):
|
53
|
+
<guillermo@cientifico.net> wrote this file. As long as you retain this notice you
|
54
|
+
can do whatever you want with this stuff. If we meet some day, and you think
|
55
|
+
this stuff is worth it, you can buy me a beer in return Guillermo Álvarez.
|
56
|
+
|
57
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
Bundler.require(:default)
|
4
|
+
require 'rake/testtask'
|
5
|
+
|
6
|
+
|
7
|
+
Bundler::GemHelper.install_tasks
|
8
|
+
|
9
|
+
Rake::TestTask.new do |t|
|
10
|
+
t.libs << "test"
|
11
|
+
t.test_files = FileList['test/*_test.rb']
|
12
|
+
t.verbose = true
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
task :default => :test
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'git-inside-branch'
|
4
|
+
|
5
|
+
args = ARGV.dup
|
6
|
+
if args.size > 0 || args.include?("-h") || args.include?("--help")
|
7
|
+
|
8
|
+
Git::Inside::Branch.tempory_checkout(args.shift) do
|
9
|
+
args = %(bash) if args.empty?
|
10
|
+
pid = fork do
|
11
|
+
exec(*args)
|
12
|
+
end
|
13
|
+
Process.wait(pid)
|
14
|
+
end
|
15
|
+
|
16
|
+
else
|
17
|
+
|
18
|
+
$stderr.puts "usage: #{$0} branch_name [command]\n\n"
|
19
|
+
$stderr.puts " If no command given, bash will be used."
|
20
|
+
$stderr.puts "WARNING: Do work with both checkouts at the same time."
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "git-inside-branch/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "git-inside-branch"
|
7
|
+
s.version = Git::Inside::Branch::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Guillermo Álvarez"]
|
10
|
+
s.email = ["guillermo@cientifico.net"]
|
11
|
+
s.homepage = ""
|
12
|
+
s.summary = %q{git-inside-branch let you inspect and modify other branches without affecting current directory}
|
13
|
+
s.description = %q{It set GIT_DIR, GIT_WORK_TREE and GIT_INDEX_FILE and checkout temporarily in a temp directory}
|
14
|
+
|
15
|
+
s.rubyforge_project = "git-inside-branch"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
s.add_development_dependency "rake"
|
23
|
+
s.add_development_dependency "bundler"
|
24
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'tmpdir'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
module Git
|
5
|
+
module Inside
|
6
|
+
class Branch
|
7
|
+
|
8
|
+
def self.tempory_checkout(branch)
|
9
|
+
dir = find_git_dir
|
10
|
+
return dir unless dir || !block_given?
|
11
|
+
|
12
|
+
new(dir,branch).start do
|
13
|
+
yield if block_given?
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize(git_dir, branch)
|
18
|
+
@branch, @git_dir = branch, git_dir
|
19
|
+
end
|
20
|
+
|
21
|
+
def start
|
22
|
+
prepare do |temp_dir|
|
23
|
+
Dir.chdir(temp_dir) do
|
24
|
+
`git co #{@branch} 2>&1`
|
25
|
+
yield
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
protected
|
31
|
+
|
32
|
+
def self.find_git_dir
|
33
|
+
dir = File.expand_path Dir.pwd
|
34
|
+
|
35
|
+
found = false
|
36
|
+
dir = Dir.basename(dir) until(found = File.directory?(File.join(dir,'.git')) || dir == "/")
|
37
|
+
|
38
|
+
return found ? File.join(dir,'.git') : false
|
39
|
+
end
|
40
|
+
|
41
|
+
def prepare
|
42
|
+
in_temp_dir do
|
43
|
+
preserve_head do
|
44
|
+
set_git_env do |code_dir|
|
45
|
+
yield code_dir
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def in_temp_dir()
|
52
|
+
@temp_dir = Dir.mktmpdir(@branch)
|
53
|
+
yield
|
54
|
+
ensure
|
55
|
+
FileUtils.remove_entry_secure @temp_dir if File.directory? @temp_dir
|
56
|
+
end
|
57
|
+
|
58
|
+
def preserve_head(*args)
|
59
|
+
old_HEAD_ref = `git symbolic-ref HEAD 2>&1`.strip
|
60
|
+
`git symbolic-ref HEAD refs/heads/#{@branch} 2>&1`
|
61
|
+
|
62
|
+
yield *args
|
63
|
+
|
64
|
+
ensure
|
65
|
+
`git symbolic-ref HEAD #{old_HEAD_ref} 2>&1` unless old_HEAD_ref.empty?
|
66
|
+
end
|
67
|
+
|
68
|
+
def set_git_env
|
69
|
+
code_dir = File.join(@temp_dir, "code")
|
70
|
+
old_env = ENV.dup
|
71
|
+
Dir.mkdir(code_dir)
|
72
|
+
|
73
|
+
ENV["GIT_INDEX_FILE"] = File.join(@temp_dir,'index')
|
74
|
+
ENV["GIT_WORK_TREE"] = code_dir
|
75
|
+
ENV["GIT_DIR"] = @git_dir
|
76
|
+
yield code_dir
|
77
|
+
ensure
|
78
|
+
ENV.delete "GIT_INDEX_FILE"
|
79
|
+
ENV.delete "GIT_WORK_TREE"
|
80
|
+
ENV.delete "GIT_DIR"
|
81
|
+
end
|
82
|
+
|
83
|
+
def in_git_dir?
|
84
|
+
return false if `git status --porcelain 2>&1 2>&1` =~ /^fatal.*/
|
85
|
+
true
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
data/task.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'tmpdir'
|
4
|
+
require 'fileutils'
|
5
|
+
|
6
|
+
module Task
|
7
|
+
extend self
|
8
|
+
|
9
|
+
def start
|
10
|
+
look_for_git_dir
|
11
|
+
|
12
|
+
prepare_git do |temp_dir|
|
13
|
+
`git clean -fdx && git co taskwarrior`
|
14
|
+
begin
|
15
|
+
old_home = ENV["HOME"]
|
16
|
+
ENV["HOME"] = temp_dir
|
17
|
+
#system("task", *ARGV)
|
18
|
+
system( *ARGV)
|
19
|
+
ensure
|
20
|
+
ENV["HOME"] = old_home
|
21
|
+
end
|
22
|
+
|
23
|
+
`find #{temp_dir} | xargs git add `
|
24
|
+
`git commit -m "Changes"`
|
25
|
+
end
|
26
|
+
|
27
|
+
# create_temp_dir
|
28
|
+
# import_files_from_git
|
29
|
+
# call_taskwarrior
|
30
|
+
# export_files_to_git
|
31
|
+
# push_changes
|
32
|
+
end
|
33
|
+
|
34
|
+
protected
|
35
|
+
|
36
|
+
def prepare_git
|
37
|
+
temp_dir = Dir.mktmpdir("git-task")
|
38
|
+
old_HEAD_ref = `git symbolic-ref HEAD`.strip
|
39
|
+
`git symbolic-ref HEAD refs/heads/taskwarrior`
|
40
|
+
code_dir = File.join(temp_dir, "code")
|
41
|
+
|
42
|
+
Dir.mkdir(File.join(code_dir))
|
43
|
+
|
44
|
+
ENV["GIT_INDEX_FILE"] = File.join(temp_dir,'index')
|
45
|
+
ENV["GIT_WORK_TREE"] = code_dir
|
46
|
+
yield code_dir
|
47
|
+
ensure
|
48
|
+
`git symbolic-ref HEAD #{old_HEAD_ref}`
|
49
|
+
FileUtils.remove_entry_secure temp_dir if File.directory? temp_dir
|
50
|
+
end
|
51
|
+
|
52
|
+
def look_for_git_dir
|
53
|
+
die("You are not in a git tracked directory!") if `git status --porcelain 2>&1` =~ /^fatal.*/
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
def die(msg)
|
58
|
+
$stderr.puts(msg)
|
59
|
+
exit -1
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
Task.start
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
#
|
3
|
+
|
4
|
+
require "test_helper"
|
5
|
+
|
6
|
+
class TestGitInsideBranch < Test::Unit::TestCase
|
7
|
+
include Git::Inside::Branch::Assertions
|
8
|
+
|
9
|
+
def test_env_setup_correctly
|
10
|
+
assert_git_doesnt_change do
|
11
|
+
assert_match /Guillermo.*initial import/m, `git log`
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_env_doesnt_change_on_non_existing_branches
|
16
|
+
assert_git_doesnt_change do
|
17
|
+
Git::Inside::Branch.tempory_checkout("pepe")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
def test_env_doesnt_change_on_existing_branch
|
23
|
+
assert_git_doesnt_change do
|
24
|
+
Git::Inside::Branch.tempory_checkout("other_branch")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_env_doesnt_change_when_doing_operations
|
29
|
+
assert_git_doesnt_change do
|
30
|
+
Git::Inside::Branch.tempory_checkout("other_branch") do
|
31
|
+
assert_match /clean/, `git status`
|
32
|
+
assert_match /other_branch/, `git branch -a | grep '*'`
|
33
|
+
assert_match /other_branch/i, Dir.pwd
|
34
|
+
`echo ¿Qué tal? > Hello2.txt`
|
35
|
+
`echo adios >> Hello.txt`
|
36
|
+
`git add .`
|
37
|
+
`git commit -m "New cambios"`
|
38
|
+
end
|
39
|
+
assert_no_match /other_branch/i, Dir.pwd
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_correct_dir
|
44
|
+
assert_git_doesnt_change do
|
45
|
+
|
46
|
+
Git::Inside::Branch.tempory_checkout("other_branch") do
|
47
|
+
assert_match /.*\/code\z/, Dir.pwd
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_changes_are_persistent
|
55
|
+
assert_git_doesnt_change do
|
56
|
+
Git::Inside::Branch.tempory_checkout("other_branch") do
|
57
|
+
`echo Hola2 >> Hello.txt`
|
58
|
+
`git add *`
|
59
|
+
`git commit -a -m "que pasa tron" `
|
60
|
+
assert_match /que pasa tron/, `git log`
|
61
|
+
end
|
62
|
+
Git::Inside::Branch.tempory_checkout("other_branch") do
|
63
|
+
assert_match /que pasa tron/, `git log`
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_a_new_branch_is_created_correctly
|
70
|
+
assert_git_doesnt_change do
|
71
|
+
Git::Inside::Branch.tempory_checkout("new_branch") do
|
72
|
+
`echo Hola2 >> Hello.txt`
|
73
|
+
`git add *`
|
74
|
+
`git commit -a -m "que pasa tron" `
|
75
|
+
assert_match /que pasa tron/, `git log`
|
76
|
+
end
|
77
|
+
Git::Inside::Branch.tempory_checkout("new_branch") do
|
78
|
+
assert_match /que pasa tron/, `git log`
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'test/unit'
|
3
|
+
require 'git-inside-branch'
|
4
|
+
require 'tmpdir'
|
5
|
+
require 'fileutils'
|
6
|
+
|
7
|
+
|
8
|
+
module Git::Inside::Branch::Assertions
|
9
|
+
|
10
|
+
def assert_git_doesnt_change
|
11
|
+
in_new_repo do
|
12
|
+
info = get_git_info()
|
13
|
+
yield
|
14
|
+
assert_equal get_git_info, info, "The environment changed and it should not."
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_git_info
|
19
|
+
info = {}
|
20
|
+
info["HEAD"] = `git symbolic-ref HEAD 2>&1`.strip
|
21
|
+
info["status"] = `git status --porcelain 2>&1`.strip
|
22
|
+
info["branch"] = `git branch -a | grep '*' 2>&1`.strip
|
23
|
+
info["env"] = `env 2>&1`.strip
|
24
|
+
info
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
def in_new_repo
|
29
|
+
dir = new_repo
|
30
|
+
Dir.chdir(dir) do
|
31
|
+
yield dir
|
32
|
+
end
|
33
|
+
ensure
|
34
|
+
remove_repo dir
|
35
|
+
end
|
36
|
+
|
37
|
+
def new_repo
|
38
|
+
dir = Dir.mktmpdir("git-inside-branch_test-repo")
|
39
|
+
Dir.chdir(dir) do
|
40
|
+
`git init 2>&1`
|
41
|
+
`echo Hola > Hello.txt 2>&1`
|
42
|
+
`git add Hello.txt 2>&1`
|
43
|
+
`git commit -a -m 'initial import' --author 'Guillermo Álvarez <guillermo@cientifico.net>' 2>&1`
|
44
|
+
`git checkout -b other_branch 2>&1`
|
45
|
+
`git checkout master 2>&1`
|
46
|
+
assert `git log 2>&1`.include?("initial import"), "The repository could not be created correctly"
|
47
|
+
end
|
48
|
+
return dir
|
49
|
+
end
|
50
|
+
|
51
|
+
def remove_repo(repo)
|
52
|
+
FileUtils.remove_entry_secure repo if File.directory? repo
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
metadata
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: git-inside-branch
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Guillermo Álvarez
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-10-10 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: &2152690840 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *2152690840
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: bundler
|
27
|
+
requirement: &2152689700 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *2152689700
|
36
|
+
description: It set GIT_DIR, GIT_WORK_TREE and GIT_INDEX_FILE and checkout temporarily
|
37
|
+
in a temp directory
|
38
|
+
email:
|
39
|
+
- guillermo@cientifico.net
|
40
|
+
executables:
|
41
|
+
- git-inside-branch
|
42
|
+
extensions: []
|
43
|
+
extra_rdoc_files: []
|
44
|
+
files:
|
45
|
+
- .gitignore
|
46
|
+
- Gemfile
|
47
|
+
- LICENSE
|
48
|
+
- README
|
49
|
+
- Rakefile
|
50
|
+
- bin/git-inside-branch
|
51
|
+
- git-inside-branch.gemspec
|
52
|
+
- lib/git-inside-branch.rb
|
53
|
+
- lib/git-inside-branch/version.rb
|
54
|
+
- task.rb
|
55
|
+
- test/git-inside-branch_test.rb
|
56
|
+
- test/test_helper.rb
|
57
|
+
homepage: ''
|
58
|
+
licenses: []
|
59
|
+
post_install_message:
|
60
|
+
rdoc_options: []
|
61
|
+
require_paths:
|
62
|
+
- lib
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
none: false
|
65
|
+
requirements:
|
66
|
+
- - ! '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
segments:
|
70
|
+
- 0
|
71
|
+
hash: 965474215564295548
|
72
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
segments:
|
79
|
+
- 0
|
80
|
+
hash: 965474215564295548
|
81
|
+
requirements: []
|
82
|
+
rubyforge_project: git-inside-branch
|
83
|
+
rubygems_version: 1.8.6
|
84
|
+
signing_key:
|
85
|
+
specification_version: 3
|
86
|
+
summary: git-inside-branch let you inspect and modify other branches without affecting
|
87
|
+
current directory
|
88
|
+
test_files:
|
89
|
+
- test/git-inside-branch_test.rb
|
90
|
+
- test/test_helper.rb
|