git-friendly 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/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Joshua Wehner
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README ADDED
@@ -0,0 +1,78 @@
1
+ git-friendly
2
+ ============
3
+
4
+ GitFriendly currently contains two commands that make working with remote branches easier in git.
5
+
6
+
7
+ git-publish
8
+ -----------
9
+ So, you've been working happily on feature_branch, and now you've come to the point where you'd like to
10
+ share your work with others. But you can never remember the series of arcane commands to coerce git into
11
+ publishing your branch to a remote. You try `git push`, but that doesn't do anything yet.
12
+
13
+ Enter git-publish.
14
+
15
+ Example:
16
+ $ git publish remote_name [branch_name]
17
+
18
+ remote_name is the name of the remote you'd like to publish to. You need to have configured this remote
19
+ already, configuring a new remote is beyond what git-publish is currently capable of doing
20
+ for you. Luckily, adding a new remote is not really that hard.
21
+
22
+ branch_name is optional. If you omit it, git-publish will assume you want to publish the currently
23
+ checked out branch. So, if you aren't working on the branch you'd like to publish, add
24
+ it here.
25
+
26
+ Here's what'll happen next:
27
+ $ git publish remote_name [branch_name]
28
+ >> Publish branch bug_fix/utf8_sphinx to jaw6 ? [Y/n]
29
+
30
+ If you hit enter, or y, or Y, or anything that isn't the letter n (n stands for "no"), then it'll go
31
+ ahead and do this:
32
+
33
+ git push #{remote_name} #{branch_name}:refs/heads/#{branch_name}"
34
+ git fetch #{remote_name}"
35
+ git config branch.#{branch_name}.remote #{remote_name}
36
+ git config branch.#{branch_name}.merge refs/heads/#{branch_name}"
37
+
38
+ From then on, you'll be able to push and pull as you'd expect.
39
+
40
+ git-follow
41
+ ----------
42
+ So, someone just sent you an IM that says, "hey, I published that stuff on a branch, it's called
43
+ stuff_im_workin_on". You'd like to set up a tracking branch, but maybe you'd rather it be called
44
+ "new_feature_from_josh" locally. git-follow to the rescue!
45
+
46
+ Examples:
47
+ $ git follow remote_name/branch_name
48
+ $ git follow https://github.com/jaw6/reponame/tree/stuff_im_workin_on
49
+ $ git follow branch_name # will assume remote = 'origin'
50
+
51
+ Note that if you only provide a branch name, and it has slashes in it (like, "feature/branch_name"),
52
+ then git-follow will assume everything before the first slash is the remote_name (eg, "feature"). So, if
53
+ branch_name has slashes, you should probably explicity provide a remote_name. But don't worry if you
54
+ forget, because...
55
+
56
+ Here's what'll happen next:
57
+ >> What remote/branch should be tracked? [remote_name/branch_name]
58
+ >> What should it be called locally? [branch_name]
59
+
60
+ git-follow will show you the assumptions it's made, and allow you to override them. If you'd like the
61
+ branch to be called something else locally, you can tell it, and it'll do the right thing. If the
62
+ assumptions are correct, hit your enter key twice, and you'll be on your merry way.
63
+
64
+ And then this will happen in the background:
65
+
66
+ git fetch #{remote_name}
67
+ git branch --track #{local_branch_name} #{remote_name}/#{branch_name}
68
+ git checkout #{local_branch_name}
69
+
70
+
71
+
72
+ Do keep in mind
73
+ ---------------
74
+ If you like working with remote branches so much, you should also check out Aanand Prasad's fantastic
75
+ git-up (https://github.com/aanand/git-up), which honestly has inspired quite a bit of what git-friendly
76
+ is trying to do.
77
+
78
+ Also: I might not actually know what I'm doing.
data/Rakefile ADDED
@@ -0,0 +1,35 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ def gemspec
5
+ @gemspec ||= begin
6
+ file = File.expand_path('../git-friendly.gemspec', __FILE__)
7
+ eval(File.read(file), binding, file)
8
+ end
9
+ end
10
+
11
+ begin
12
+ require 'rake/gempackagetask'
13
+ rescue LoadError
14
+ task(:gem) { $stderr.puts '`gem install rake` to package gems' }
15
+ else
16
+ Rake::GemPackageTask.new(gemspec) do |pkg|
17
+ pkg.gem_spec = gemspec
18
+ end
19
+ task :gem => :gemspec
20
+ end
21
+
22
+ desc "validate the gemspec"
23
+ task :gemspec do
24
+ gemspec.validate
25
+ end
26
+
27
+ require 'rake/rdoctask'
28
+ Rake::RDocTask.new do |rdoc|
29
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
30
+
31
+ rdoc.rdoc_dir = 'rdoc'
32
+ rdoc.title = "git-friendly #{version}"
33
+ rdoc.rdoc_files.include('README*')
34
+ rdoc.rdoc_files.include('lib/**/*.rb')
35
+ end
data/bin/git-follow ADDED
@@ -0,0 +1,77 @@
1
+ #!/usr/local/bin/ruby
2
+
3
+ require 'rubygems'
4
+ require 'colored' rescue nil
5
+
6
+ def colored?
7
+ String.new.respond_to?(:yellow)
8
+ end
9
+
10
+ abort("You didn't tell me which branch to follow!".send(colored? ? :red : 'to_s')) unless ARGV[0]
11
+
12
+ def remote_and_branch_from_github_url(string)
13
+ # example: https://github.com/jaw6/shopify/tree/bug_fix/utf8_sphinx -- .com/:remote_name/:repo/tree/:branch_name
14
+ if string =~ %r{\Ahttp[s]*://github\.com/([^/]+)/[^/]+/tree/(.+)\Z}
15
+ [$1, $2]
16
+ end
17
+ end
18
+
19
+ def remote_and_branch_from_input(string)
20
+ split_arg = string.split('/')
21
+ if split_arg.size == 1 # just one argument = that's a branch name, remote is 'origin'
22
+ remote_name, branch_name = 'origin', string
23
+ else
24
+ remote_name = split_arg.shift
25
+ branch_name = split_arg.join('/')
26
+ end
27
+ [remote_name, branch_name]
28
+ end
29
+
30
+ def question1(branch_name, remote_name, color=colored?)
31
+ msg = ''
32
+ if color
33
+ msg << '>> What remote/branch should be tracked? '.yellow
34
+ msg << " [#{remote_name}/#{branch_name}] ".white
35
+ else
36
+ msg = ">> What remote/branch should be tracked? [#{remote_name}/#{branch_name}] "
37
+ end
38
+ msg
39
+ end
40
+
41
+ def question2(branch_name, color=colored?)
42
+ msg = ''
43
+ if color
44
+ msg << '>> What should it be called locally? '.yellow
45
+ msg << " [#{branch_name}] ".white
46
+ else
47
+ msg = ">> What should it be called locally? [#{branch_name}] "
48
+ end
49
+ msg
50
+ end
51
+
52
+ def remote_and_branch(answer)
53
+ remote_and_branch_from_github_url(answer) || remote_and_branch_from_input(answer)
54
+ end
55
+
56
+ def get_remote_and_branch_from_user
57
+ remote_name, branch_name = remote_and_branch(ARGV[0])
58
+ print question1(branch_name, remote_name)
59
+ answer = STDIN.gets.strip
60
+ answer.empty? ? [remote_name, branch_name] : remote_and_branch(answer)
61
+ end
62
+
63
+ def get_local_branch_name_from_user(branch_name)
64
+ print question2(branch_name)
65
+ answer = STDIN.gets.strip
66
+ answer.empty? ? branch_name : answer
67
+ end
68
+
69
+ if (remote_name, branch_name = get_remote_and_branch_from_user) and local_branch_name = get_local_branch_name_from_user(branch_name)
70
+ commands = []
71
+ commands << fetch = "git fetch #{remote_name}"
72
+ commands << config_branch = "git branch --track #{local_branch_name} #{remote_name}/#{branch_name}"
73
+ commands << checkout = "git checkout #{local_branch_name}"
74
+ if `#{commands.join(' && ')}`
75
+ puts " ... success! Checked out #{local_branch_name} tracking #{remote_name}/#{branch_name}...".send(colored? ? :green : 'to_s')
76
+ end
77
+ end
data/bin/git-publish ADDED
@@ -0,0 +1,48 @@
1
+ #!/usr/local/bin/ruby
2
+
3
+ require 'rubygems'
4
+ colored = require 'colored' rescue nil
5
+
6
+ def load_grit_or_die!
7
+ require 'grit'
8
+ rescue
9
+ abort "Unable to load grit"
10
+ end
11
+
12
+ load_grit_or_die!
13
+
14
+ def get_branch_name
15
+ git_dir = `git rev-parse --git-dir`
16
+ repo = Grit::Repo.new(File.dirname(git_dir))
17
+ repo.head.name
18
+ rescue
19
+ abort "Cannot locate git repo"
20
+ end
21
+
22
+ remote_name = ARGV[0] || 'origin'
23
+ branch_name = ARGV[1] || get_branch_name
24
+
25
+ def question(branch_name, remote_name, color=false)
26
+ msg = ''
27
+ if color
28
+ msg << '>> Publish branch '.yellow
29
+ msg << branch_name.white
30
+ msg << ' to '.yellow
31
+ msg << remote_name.white
32
+ msg << ' ? [Y/n] '
33
+ else
34
+ msg = ">> Publish branch #{branch_name} to #{remote_name}? [Y/n] "
35
+ end
36
+ msg
37
+ end
38
+
39
+ print question(branch_name, remote_name, colored)
40
+ if STDIN.gets != "n\n"
41
+ commands = []
42
+ commands << push_to_remote = "git push #{remote_name} #{branch_name}:refs/heads/#{branch_name}"
43
+ commands << fetch = "git fetch #{remote_name}"
44
+ commands << config_branch = "git config branch.#{branch_name}.remote #{remote_name} && git config branch.#{branch_name}.merge refs/heads/#{branch_name}"
45
+ if `#{commands.join(' && ')}`
46
+ puts " ... success! Published to #{remote_name}:#{branch_name}...".send(colored ? :green : 'to_s')
47
+ end
48
+ end
@@ -0,0 +1,6 @@
1
+ require 'colored'
2
+ require 'grit'
3
+
4
+ class GitFriendly
5
+ VERSION = "0.0.1"
6
+ end
metadata ADDED
@@ -0,0 +1,76 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: git-friendly
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - joshua wehner
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-10-05 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: colored
16
+ requirement: &2157432420 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '1.2'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *2157432420
25
+ - !ruby/object:Gem::Dependency
26
+ name: grit
27
+ requirement: &2157431360 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *2157431360
36
+ description: GitFriendly currently contains two commands that make working with remote
37
+ branches easier in git.
38
+ email:
39
+ - joshua.wehner@gmail.com
40
+ executables:
41
+ - git-follow
42
+ - git-publish
43
+ extensions: []
44
+ extra_rdoc_files: []
45
+ files:
46
+ - bin/git-follow
47
+ - bin/git-publish
48
+ - lib/git-friendly.rb
49
+ - LICENSE
50
+ - README
51
+ - Rakefile
52
+ homepage: http://github.com/jaw6/git-friendly
53
+ licenses: []
54
+ post_install_message:
55
+ rdoc_options: []
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ! '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ requirements: []
71
+ rubyforge_project:
72
+ rubygems_version: 1.8.7
73
+ signing_key:
74
+ specification_version: 3
75
+ summary: git commands to make tracking and publishing remote branches easier for everyone
76
+ test_files: []