git-it 0.0.7 → 0.0.8

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/README.rdoc CHANGED
@@ -18,9 +18,17 @@ Might not need sudo depending on your setup. To install as /usr/bin/git-it thoug
18
18
 
19
19
  == Use
20
20
 
21
- Open current branch in the web. Use it as an easy way to issue pull request in github.
21
+ Open branch
22
22
 
23
- git it opened_in_the_web #=> open https://github.com/more-ron/git-it/tree/master
23
+ git it opened #=> https://github.com/more-ron/git-it/tree/gh-pages
24
+
25
+ Compare branches
26
+
27
+ git it compared #=> https://github.com/more-ron/git-it/compare/master...gh-pages
28
+
29
+ Issue a pull request
30
+
31
+ git it pulled #=> https://github.com/more-ron/git-it/pull/new/more-ron:master...gh-pages
24
32
 
25
33
 
26
34
 
@@ -40,9 +48,18 @@ You will need to know where git-it got installed. To do that execute the followi
40
48
 
41
49
  [Parameters]
42
50
 
43
- get it opened in the web:
51
+ get it opened:
52
+ --path=$REPO --sha=$SHA opened
53
+
54
+ get it compared:
55
+ --path=$REPO --sha=$SHA compared
56
+ get it compared to release:
57
+ --path=$REPO --sha=$SHA compared --to=release
44
58
 
45
- --path=$REPO --sha=$SHA opened_in_the_web
59
+ get it pulled:
60
+ --path=$REPO --sha=$SHA pulled
61
+ get it pulled to release:
62
+ --path=$REPO --sha=$SHA pulled --to=release
46
63
 
47
64
 
48
65
 
data/bin/git-it CHANGED
@@ -34,20 +34,35 @@ default_value false
34
34
  # = Commands =
35
35
  # ============
36
36
 
37
- desc 'Opens current branch in web browser.'
37
+ desc 'Opens current branch.'
38
+ command :opened do |c|
39
+ c.action do |global_options, options, args|
40
+ GitIt::Commander.new( global_options ).open( args, options )
41
+ end
42
+ end
38
43
 
39
- command :opened_in_the_web do |c|
44
+ desc 'Compares current branch to...'
45
+ command :compared do |c|
40
46
 
41
- c.desc 'Site: auto | github'
42
- c.default_value 'auto'
43
- c.flag :site
47
+ c.desc 'Name of the branch to compare to'
48
+ c.default_value 'master'
49
+ c.flag :to
44
50
 
45
- c.action do |global_options,options,args|
46
- GitIt::Commander.new(global_options).open_in_the_web(args, options)
51
+ c.action do |global_options, options, args|
52
+ GitIt::Commander.new( global_options ).compare( args, options )
47
53
  end
48
54
  end
49
55
 
50
- class Object # :nodoc:
56
+ desc 'Issue pull request for current branch to...'
57
+ command :pulled do |c|
58
+
59
+ c.desc 'Name of the branch to be pulled into'
60
+ c.default_value 'master'
61
+ c.flag :to
62
+
63
+ c.action do |global_options, options, args|
64
+ GitIt::Commander.new( global_options ).pull( args, options )
65
+ end
51
66
  end
52
67
 
53
68
  # ====================
@@ -75,4 +90,7 @@ on_error do |exception|
75
90
  true
76
91
  end
77
92
 
93
+ class Object # :nodoc:
94
+ end
95
+
78
96
  exit run(ARGV)
@@ -1,149 +1,207 @@
1
- # Grand central station for git it commands
2
- class GitIt::Commander
3
-
4
- # current git repository
5
- attr_reader :repository
6
-
7
- # current git object
8
- attr_reader :git_object
9
-
10
- # [global options]
11
- # --help:: Show this message
12
- # -p, --path=path:: repository path (default: {{present_working_directory}})
13
- # -s, --sha=sha:: SHA1 (default: {{current_head}})
14
- # --version:: Show gem's version
15
- def initialize(options)
16
- @global_options = options
17
- @repository = Rugged::Repository.new( get_path(options[:path]) )
18
- @git_object = get_object( options[:sha] )
19
- @test_mode = options[:test]
20
- end
1
+ module GitIt
2
+ # Grand central station for git it commands
3
+ class Commander
4
+
5
+ # current git repository
6
+ attr_reader :repository
7
+
8
+ # current git object
9
+ attr_reader :git_object
10
+
11
+ # [global options]
12
+ #
13
+ # --help:: Show this message
14
+ # -p, --path=path:: repository path (default: {{present_working_directory}})
15
+ # -s, --sha=sha:: SHA1 (default: {{current_head}})
16
+ #
17
+ # [sample usage]
18
+ #
19
+ # Open present working directory's repository branch:
20
+ # git it opened
21
+ #
22
+ # Open specified repository in the path:
23
+ # git it --path=the/path/to/the/repo opened
24
+ #
25
+ # Open specified sha1:
26
+ # git it --sha=50m35ha1 opened
27
+ #
28
+ # Open specified repository in the path and sha1:
29
+ # git it --path=the/path/to/the/repo --sha=50m35ha1 opened
30
+ #
31
+ def initialize(options)
32
+ @global_options = options
33
+ @repository = Rugged::Repository.new( get_path(options[:path]) )
34
+ @git_object = get_object( options[:sha] )
35
+ @test_mode = options[:test]
36
+
37
+ @link_generator = LinkGenerator.new( @repository.config["remote.origin.url"] )
38
+ end
21
39
 
22
40
 
23
41
 
24
- # ===========
25
- # = Actions =
26
- # ===========
27
-
28
- # [get it opened in the web]
29
- #
30
- # Opens closest branch in the web.
31
- #
32
- # [commands]
33
- #
34
- # Open present working directory's repository and head in the web:
35
- # git it opened_in_the_web
36
- #
37
- # Open specified repository in the path:
38
- # git it --path=the/path/to/the/repo opened_in_the_web
39
- #
40
- # Open specified sha1:
41
- # git it --sha=50m35ha1 opened_in_the_web
42
- #
43
- # Open specified repository in the path and sha1:
44
- # git it --path=the/path/to/the/repo --sha=50m35ha1 opened_in_the_web
45
- #
46
- # [notes]
47
- #
48
- # * Currently only supports GitHub.com
49
- #
50
- def open_in_the_web(args, options)
51
- closest_branch = closest_remote_branch || closest_local_branch
52
-
53
- if closest_branch
54
- remote_origin_url = repository.config["remote.origin.url"]
55
- #=> git@github.com:more-ron/git-it.git
56
-
57
- github_link = remote_origin_url.gsub("git@github.com:", "https://github.com/")
58
- #=> https://github.com/more-ron/git-it.git
59
-
60
- branch_name = closest_branch.name.gsub("origin/", "")
61
- #=> origin/gh-pages => gh-pages
42
+ # ===========
43
+ # = Actions =
44
+ # ===========
62
45
 
63
- branch_name = closest_remote_branch.target.gsub("refs/remotes/origin/", "") if branch_name == "HEAD"
64
- #=> refs/remotes/origin/master => master
46
+ # [get it opened]
47
+ #
48
+ # Opens the current branch
49
+ #
50
+ # [sample usage]
51
+ #
52
+ # Open the current branch:
53
+ # git it opened
54
+ #
55
+ def open(args, options)
56
+ _closest_branch = closest_branch
65
57
 
66
- github_link = github_link.gsub(".git", "/tree/#{ branch_name }")
67
- #=> https://github.com/more-ron/git-it/tree/master
58
+ if _closest_branch
59
+ branch_name = clean_branch_name_for( _closest_branch )
60
+ link = @link_generator.branch_link( branch_name )
68
61
 
69
- launch github_link
70
- else
71
- fail "Could not find closest remote branch for sha: #{@git_object.oid.inspect}"
62
+ launch link
63
+ else
64
+ fail "Could not find closest remote branch for sha: #{@git_object.oid.inspect}"
65
+ end
72
66
  end
73
- end
74
67
 
68
+ # [get it compared]
69
+ #
70
+ # Compares the current branch to another branch (default: master)
71
+ #
72
+ # [sample usage]
73
+ #
74
+ # Compare the current branch to master branch
75
+ # git it compared
76
+ #
77
+ # Compare the current branch to release branch
78
+ # git it compared --to=release
79
+ #
80
+ def compare(args, options)
81
+ _closest_branch = closest_branch
82
+
83
+ if _closest_branch
84
+ branch_name = clean_branch_name_for( _closest_branch )
85
+ link = @link_generator.compare_branches_link( branch_name, options[:to] || "master" )
86
+
87
+ launch link
88
+ else
89
+ fail "Could not find closest remote branch for sha: #{@git_object.oid.inspect}"
90
+ end
91
+ end
92
+
93
+ # [get it pulled]
94
+ #
95
+ # Issues a pull request of the current branch into another branch (default: master)
96
+ #
97
+ # [sample usage]
98
+ #
99
+ # Issue a pull request of the current branch into master branch
100
+ # git it pulled
101
+ #
102
+ # Issue a pull request of the current branch into release branch
103
+ # git it pulled --to=release
104
+ #
105
+ def pull(args, options)
106
+ _closest_branch = closest_branch
107
+
108
+ if _closest_branch
109
+ branch_name = clean_branch_name_for( _closest_branch )
110
+ link = @link_generator.pull_request_link( branch_name, options[:to] || "master" )
111
+
112
+ launch link
113
+ else
114
+ fail "Could not find closest remote branch for sha: #{@git_object.oid.inspect}"
115
+ end
116
+ end
75
117
 
76
118
 
77
- # ============
78
- # = Privates =
79
- # ============
80
119
 
81
- private
120
+ # ============
121
+ # = Privates =
122
+ # ============
82
123
 
83
- def get_path(path)
84
- path == "{{present_working_directory}}" ? Dir.pwd : path
85
- end
124
+ private
86
125
 
87
- def get_object(sha)
88
- if sha == "{{current_head}}"
89
- repository.lookup( repository.head.target )
90
- else
91
- repository.lookup( sha )
126
+ def get_path(path)
127
+ path == "{{present_working_directory}}" ? Dir.pwd : path
92
128
  end
93
- end
94
129
 
95
- def discover_repository(path)
96
- Rugged::Repository.discover( path )
97
- end
130
+ def get_object(sha)
131
+ if sha == "{{current_head}}"
132
+ repository.lookup( repository.head.target )
133
+ else
134
+ repository.lookup( sha )
135
+ end
136
+ end
98
137
 
99
- def remote_branches
100
- @remote_branches ||= Rugged::Branch.each_name(repository, :remote).sort.collect do |branch_name|
101
- Rugged::Branch.lookup(@repository, branch_name, :remote)
138
+ def discover_repository(path)
139
+ Rugged::Repository.discover( path )
102
140
  end
103
- end
104
141
 
105
- def local_branches
106
- @local_branches ||= Rugged::Branch.each_name(repository, :local).sort.collect do |branch_name|
107
- Rugged::Branch.lookup(@repository, branch_name)
142
+ def remote_branches
143
+ @remote_branches ||= Rugged::Branch.each_name(repository, :remote).sort.collect do |branch_name|
144
+ Rugged::Branch.lookup(@repository, branch_name, :remote)
145
+ end
108
146
  end
109
- end
110
147
 
111
- def closest_remote_branch
112
- remote_branches.min_by do |branch|
113
- distance_in_objects(:from => branch.tip.oid, :to => @git_object.oid)
148
+ def local_branches
149
+ @local_branches ||= Rugged::Branch.each_name(repository, :local).sort.collect do |branch_name|
150
+ Rugged::Branch.lookup(@repository, branch_name)
151
+ end
114
152
  end
115
- end
116
153
 
117
- def closest_local_branch
118
- local_branches.min_by do |branch|
119
- distance_in_objects(:from => branch.tip.oid, :to => @git_object.oid)
154
+ def closest_remote_branch
155
+ remote_branches.min_by do |branch|
156
+ distance_in_objects(:from => branch.tip.oid, :to => @git_object.oid)
157
+ end
158
+ end
159
+
160
+ def closest_local_branch
161
+ local_branches.min_by do |branch|
162
+ distance_in_objects(:from => branch.tip.oid, :to => @git_object.oid)
163
+ end
120
164
  end
121
- end
122
165
 
123
- def distance_in_objects(options = {})
124
- normal_direction_value = _distance_in_objects(options)
125
- opposite_direction_value = _distance_in_objects(:from => options[:to], :to => options[:from])
166
+ def closest_branch
167
+ closest_remote_branch || closest_local_branch
168
+ end
126
169
 
127
- [normal_direction_value, opposite_direction_value].max
128
- end
170
+ def clean_branch_name_for( branch )
171
+ branch_name = branch.name.gsub("origin/", "")
172
+ #=> origin/gh-pages => gh-pages
129
173
 
130
- def _distance_in_objects(options = {})
131
- walker = Rugged::Walker.new(repository)
132
- walker.push(options[:to])
133
- walker.hide(options[:from])
134
- walker.count
135
- end
174
+ branch_name = branch.target.gsub("refs/remotes/origin/", "") if branch_name == "HEAD"
175
+ #=> refs/remotes/origin/master => master
136
176
 
137
- def test_mode?
138
- @test_mode
139
- end
177
+ branch_name
178
+ end
179
+
180
+ def distance_in_objects(options = {})
181
+ normal_direction_value = _distance_in_objects(options)
182
+ opposite_direction_value = _distance_in_objects(:from => options[:to], :to => options[:from])
140
183
 
141
- def launch(what)
142
- if test_mode?
143
- puts "Launchy.open( #{what.inspect} )"
144
- else
145
- Launchy.open( what )
184
+ [normal_direction_value, opposite_direction_value].max
185
+ end
186
+
187
+ def _distance_in_objects(options = {})
188
+ walker = Rugged::Walker.new(repository)
189
+ walker.push(options[:to])
190
+ walker.hide(options[:from])
191
+ walker.count
192
+ end
193
+
194
+ def test_mode?
195
+ @test_mode
196
+ end
197
+
198
+ def launch(what)
199
+ if test_mode?
200
+ puts "Launchy.open( #{what.inspect} )"
201
+ else
202
+ Launchy.open( what )
203
+ end
146
204
  end
147
- end
148
205
 
206
+ end
149
207
  end
@@ -0,0 +1,35 @@
1
+ module GitIt
2
+ # Link generator compatible with GitHub like site UI
3
+ class LinkGenerator
4
+
5
+ # git@github.com:more-ron/git-it.git
6
+ attr_reader :repository_url
7
+
8
+ # all you need is the repository url
9
+ def initialize(repository_url)
10
+ @repository_url = repository_url
11
+
12
+ @repo = /^git@(?<site>.*):(?<user>.*)\/(?<proj>.*).git$/.match(@repository_url)
13
+
14
+ @site = @repo[:site]
15
+ @user = @repo[:user]
16
+ @proj = @repo[:proj]
17
+ end
18
+
19
+ # https://github.com/more-ron/git-it/tree/gh-pages
20
+ def branch_link(branch_name)
21
+ "https://#{@site}/#{@user}/#{@proj}/tree/#{branch_name}"
22
+ end
23
+
24
+ # https://github.com/more-ron/git-it/compare/master...gh-pages
25
+ def compare_branches_link(to, from = "master")
26
+ "https://#{@site}/#{@user}/#{@proj}/compare/#{from}...#{to}"
27
+ end
28
+
29
+ # https://github.com/more-ron/git-it/pull/new/more-ron:master...gh-pages
30
+ def pull_request_link(source, destination = "master")
31
+ "https://#{@site}/#{@user}/#{@proj}/pull/new/#{@user}:#{destination}...#{source}"
32
+ end
33
+
34
+ end
35
+ end
@@ -2,5 +2,5 @@
2
2
  module GitIt
3
3
 
4
4
  # Current git-it version
5
- VERSION = '0.0.7'
5
+ VERSION = '0.0.8'
6
6
  end
data/lib/git-it.rb CHANGED
@@ -1,6 +1,7 @@
1
- require 'git-it/version.rb'
2
- require 'git-it/global_helper.rb'
3
- require 'git-it/commander.rb'
1
+ require 'git-it/version'
2
+ require 'git-it/global_helper'
3
+ require 'git-it/commander'
4
+ require 'git-it/link_generator'
4
5
 
5
6
  # Add requires for other files you add to your project here, so
6
7
  # you just need to require this one file in your bin file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: git-it
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -116,11 +116,12 @@ extra_rdoc_files:
116
116
  - README.rdoc
117
117
  - git-it.rdoc
118
118
  files:
119
- - bin/git-it
120
119
  - lib/git-it/commander.rb
121
120
  - lib/git-it/global_helper.rb
121
+ - lib/git-it/link_generator.rb
122
122
  - lib/git-it/version.rb
123
123
  - lib/git-it.rb
124
+ - bin/git-it
124
125
  - README.rdoc
125
126
  - git-it.rdoc
126
127
  homepage: http://more-ron.github.com/git-it/