riquedafreak-github 0.3.1 → 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- data/Manifest +15 -11
- data/README +1 -1
- data/bin/gh +4 -1
- data/bin/github +4 -1
- data/github-gem.gemspec +3 -3
- data/lib/commands/commands.rb +206 -0
- data/{commands → lib/commands}/helpers.rb +35 -14
- data/lib/commands/network.rb +113 -0
- data/lib/github.rb +50 -23
- data/lib/github/command.rb +38 -8
- data/lib/github/extensions.rb +11 -0
- data/spec/github_spec.rb +20 -0
- metadata +6 -4
- data/commands/commands.rb +0 -242
data/Manifest
CHANGED
@@ -1,19 +1,23 @@
|
|
1
|
-
|
2
|
-
Manifest
|
3
|
-
README
|
4
|
-
bin/gh
|
5
|
-
bin/github
|
6
|
-
commands/commands.rb
|
7
|
-
commands/helpers.rb
|
1
|
+
setup.rb
|
8
2
|
github-gem.gemspec
|
3
|
+
lib/github.rb
|
4
|
+
lib/commands/commands.rb
|
5
|
+
lib/commands/helpers.rb
|
6
|
+
lib/commands/network.rb
|
7
|
+
lib/github/helper.rb
|
9
8
|
lib/github/command.rb
|
10
9
|
lib/github/extensions.rb
|
11
|
-
|
12
|
-
|
13
|
-
spec/command_spec.rb
|
10
|
+
bin/gh
|
11
|
+
bin/github
|
14
12
|
spec/extensions_spec.rb
|
13
|
+
spec/spec_helper.rb
|
15
14
|
spec/github_spec.rb
|
15
|
+
spec/command_spec.rb
|
16
16
|
spec/helper_spec.rb
|
17
|
-
spec/spec_helper.rb
|
18
17
|
spec/ui_spec.rb
|
19
18
|
spec/windoze_spec.rb
|
19
|
+
Manifest
|
20
|
+
Rakefile
|
21
|
+
History.txt
|
22
|
+
README
|
23
|
+
LICENSE
|
data/README
CHANGED
data/bin/gh
CHANGED
data/bin/github
CHANGED
data/github-gem.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "github"
|
3
|
-
s.version = "0.3.
|
3
|
+
s.version = "0.3.4"
|
4
4
|
|
5
5
|
s.specification_version = 2 if s.respond_to? :specification_version=
|
6
6
|
|
@@ -12,7 +12,7 @@ Gem::Specification.new do |s|
|
|
12
12
|
s.email = %q{chris@ozmm.org}
|
13
13
|
s.executables = ["github", "gh"]
|
14
14
|
s.extra_rdoc_files = ["bin/github", "bin/gh", "lib/github/extensions.rb", "lib/github/command.rb", "lib/github/helper.rb", "lib/github.rb", "LICENSE", "README"]
|
15
|
-
s.files = ["bin/github", "commands/commands.rb", "commands/helpers.rb", "lib/github/extensions.rb", "lib/github/command.rb", "lib/github/helper.rb", "lib/github.rb", "LICENSE", "Manifest", "README", "spec/command_spec.rb", "spec/extensions_spec.rb", "spec/github_spec.rb", "spec/helper_spec.rb", "spec/spec_helper.rb", "spec/ui_spec.rb", "spec/windoze_spec.rb", "github-gem.gemspec"]
|
15
|
+
s.files = ["bin/github", "lib/commands/network.rb", "lib/commands/commands.rb", "lib/commands/helpers.rb", "lib/github/extensions.rb", "lib/github/command.rb", "lib/github/helper.rb", "lib/github.rb", "LICENSE", "Manifest", "README", "spec/command_spec.rb", "spec/extensions_spec.rb", "spec/github_spec.rb", "spec/helper_spec.rb", "spec/spec_helper.rb", "spec/ui_spec.rb", "spec/windoze_spec.rb", "github-gem.gemspec"]
|
16
16
|
s.has_rdoc = true
|
17
17
|
s.homepage = %q{http://github.com/}
|
18
18
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Github", "--main", "README"]
|
@@ -22,5 +22,5 @@ Gem::Specification.new do |s|
|
|
22
22
|
s.summary = %q{The official `github` command line helper for simplifying your GitHub experience.}
|
23
23
|
|
24
24
|
# s.add_dependency(%q<launchy>, [">= 0"])
|
25
|
-
s.add_dependency('
|
25
|
+
s.add_dependency('json_pure', [">= 0"])
|
26
26
|
end
|
@@ -0,0 +1,206 @@
|
|
1
|
+
desc "Open this repo's master branch in a web browser."
|
2
|
+
command :home do |user|
|
3
|
+
if helper.project
|
4
|
+
helper.open helper.homepage_for(user || helper.owner, 'master')
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
desc "Automatically set configuration info, or pass args to specify."
|
9
|
+
usage "github config [my_username] [my_repo_name]"
|
10
|
+
command :config do |user, repo|
|
11
|
+
user ||= ENV['USER']
|
12
|
+
repo ||= File.basename(FileUtils.pwd)
|
13
|
+
git "config --global github.user #{user}"
|
14
|
+
git "config github.repo #{repo}"
|
15
|
+
puts "Configured with github.user #{user}, github.repo #{repo}"
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "Open this repo in a web browser."
|
19
|
+
usage "github browse [user] [branch]"
|
20
|
+
command :browse do |user, branch|
|
21
|
+
if helper.project
|
22
|
+
# if one arg given, treat it as a branch name
|
23
|
+
# unless it maches user/branch, then split it
|
24
|
+
# if two args given, treat as user branch
|
25
|
+
# if no args given, use defaults
|
26
|
+
user, branch = user.split("/", 2) if branch.nil? unless user.nil?
|
27
|
+
branch = user and user = nil if branch.nil?
|
28
|
+
user ||= helper.branch_user
|
29
|
+
branch ||= helper.branch_name
|
30
|
+
helper.open helper.homepage_for(user, branch)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
desc "Info about this project."
|
36
|
+
command :info do
|
37
|
+
puts "== Info for #{helper.project}"
|
38
|
+
puts "You are #{helper.owner}"
|
39
|
+
puts "Currently tracking:"
|
40
|
+
helper.tracking.sort { |(a,),(b,)| a == helper.origin ? -1 : b == helper.origin ? 1 : a.to_s <=> b.to_s }.each do |(name,user_or_url)|
|
41
|
+
puts " - #{user_or_url} (as #{name})"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
desc "Track another user's repository."
|
46
|
+
usage "github track remote [user]"
|
47
|
+
usage "github track remote [user/repo]"
|
48
|
+
usage "github track [user]"
|
49
|
+
usage "github track [user/repo]"
|
50
|
+
flags :private => "Use git@github.com: instead of git://github.com/."
|
51
|
+
flags :ssh => 'Equivalent to --private'
|
52
|
+
command :track do |remote, user|
|
53
|
+
# track remote user
|
54
|
+
# track remote user/repo
|
55
|
+
# track user
|
56
|
+
# track user/repo
|
57
|
+
user, remote = remote, nil if user.nil?
|
58
|
+
die "Specify a user to track" if user.nil?
|
59
|
+
user, repo = user.split("/", 2)
|
60
|
+
die "Already tracking #{user}" if helper.tracking?(user)
|
61
|
+
repo = @helper.project if repo.nil?
|
62
|
+
repo.chomp!(".git")
|
63
|
+
remote ||= user
|
64
|
+
|
65
|
+
if options[:private] || options[:ssh]
|
66
|
+
git "remote add #{remote} #{helper.private_url_for_user_and_repo(user, repo)}"
|
67
|
+
else
|
68
|
+
git "remote add #{remote} #{helper.public_url_for_user_and_repo(user, repo)}"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
desc "Fetch all refs from a user"
|
73
|
+
command :fetch_all do |user|
|
74
|
+
GitHub.invoke(:track, user) unless helper.tracking?(user)
|
75
|
+
git "fetch #{user}"
|
76
|
+
end
|
77
|
+
|
78
|
+
desc "Fetch from a remote to a local branch."
|
79
|
+
command :fetch do |user, branch|
|
80
|
+
die "Specify a user to pull from" if user.nil?
|
81
|
+
user, branch = user.split("/", 2) if branch.nil?
|
82
|
+
branch ||= 'master'
|
83
|
+
GitHub.invoke(:track, user) unless helper.tracking?(user)
|
84
|
+
|
85
|
+
die "Unknown branch (#{branch}) specified" unless helper.remote_branch?(user, branch)
|
86
|
+
die "Unable to switch branches, your current branch has uncommitted changes" if helper.branch_dirty?
|
87
|
+
|
88
|
+
puts "Fetching #{user}/#{branch}"
|
89
|
+
git "fetch #{user} #{branch}:refs/remotes/#{user}/#{branch}"
|
90
|
+
git "update-ref refs/heads/#{user}/#{branch} refs/remotes/#{user}/#{branch}"
|
91
|
+
git_exec "checkout #{user}/#{branch}"
|
92
|
+
end
|
93
|
+
|
94
|
+
desc "Pull from a remote."
|
95
|
+
usage "github pull [user] [branch]"
|
96
|
+
flags :merge => "Automatically merge remote's changes into your master."
|
97
|
+
command :pull do |user, branch|
|
98
|
+
die "Specify a user to pull from" if user.nil?
|
99
|
+
user, branch = user.split("/", 2) if branch.nil?
|
100
|
+
|
101
|
+
if !helper.network_members.include?(user)
|
102
|
+
git_exec "#{helper.argv.join(' ')}".strip
|
103
|
+
end
|
104
|
+
|
105
|
+
branch ||= 'master'
|
106
|
+
GitHub.invoke(:track, user) unless helper.tracking?(user)
|
107
|
+
|
108
|
+
if options[:merge]
|
109
|
+
git_exec "pull #{user} #{branch}"
|
110
|
+
else
|
111
|
+
puts "Switching to #{user}-#{branch}"
|
112
|
+
git "fetch #{user}"
|
113
|
+
git_exec "checkout -b #{user}/#{branch} #{user}/#{branch}"
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
desc "Clone a repo. Uses ssh if current user is "
|
118
|
+
usage "github clone [user] [repo] [dir]"
|
119
|
+
flags :ssh => "Clone using the git@github.com style url."
|
120
|
+
command :clone do |user, repo, dir|
|
121
|
+
die "Specify a user to pull from" if user.nil?
|
122
|
+
if user.include?('/') && !user.include?('@') && !user.include?(':')
|
123
|
+
die "Expected user/repo dir, given extra argument" if dir
|
124
|
+
(user, repo), dir = [user.split('/', 2), repo]
|
125
|
+
end
|
126
|
+
|
127
|
+
if options[:ssh] || current_user?(user)
|
128
|
+
git_exec "clone git@github.com:#{user}/#{repo}.git" + (dir ? " #{dir}" : "")
|
129
|
+
elsif repo
|
130
|
+
git_exec "clone git://github.com/#{user}/#{repo}.git" + (dir ? " #{dir}" : "")
|
131
|
+
else
|
132
|
+
git_exec "#{helper.argv.join(' ')}".strip
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
desc "Generate the text for a pull request."
|
137
|
+
usage "github pull-request [user] [branch]"
|
138
|
+
command 'pull-request' do |user, branch|
|
139
|
+
if helper.project
|
140
|
+
die "Specify a user for the pull request" if user.nil?
|
141
|
+
user, branch = user.split('/', 2) if branch.nil?
|
142
|
+
branch ||= 'master'
|
143
|
+
GitHub.invoke(:track, user) unless helper.tracking?(user)
|
144
|
+
|
145
|
+
git_exec "request-pull #{user}/#{branch} #{helper.origin}"
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
desc "Create a new, empty GitHub repository"
|
150
|
+
usage "github create [repo]"
|
151
|
+
flags :markdown => 'Create README.markdown'
|
152
|
+
flags :mdown => 'Create README.mdown'
|
153
|
+
flags :textile => 'Create README.textile'
|
154
|
+
flags :rdoc => 'Create README.rdoc'
|
155
|
+
flags :rst => 'Create README.rst'
|
156
|
+
flags :private => 'Create private repository'
|
157
|
+
command :create do |repo|
|
158
|
+
sh "curl -F 'repository[name]=#{repo}' -F 'repository[public]=#{!options[:private]}' -F 'login=#{github_user}' -F 'token=#{github_token}' http://github.com/repositories"
|
159
|
+
mkdir repo
|
160
|
+
cd repo
|
161
|
+
git "init"
|
162
|
+
extension = options.keys.first
|
163
|
+
touch extension ? "README.#{extension}" : "README"
|
164
|
+
git "add *"
|
165
|
+
git "commit -m 'First commit!'"
|
166
|
+
git "remote add origin git@github.com:#{github_user}/#{repo}.git"
|
167
|
+
git_exec "push origin master"
|
168
|
+
end
|
169
|
+
|
170
|
+
desc "Forks a GitHub repository"
|
171
|
+
usage "github fork"
|
172
|
+
usage "github fork [user]/[repo]"
|
173
|
+
command :fork do |user, repo|
|
174
|
+
if repo.nil?
|
175
|
+
if user
|
176
|
+
user, repo = user.split('/')
|
177
|
+
else
|
178
|
+
is_repo = true
|
179
|
+
user = helper.owner
|
180
|
+
repo = helper.project
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
sh "curl -F 'login=#{github_user}' -F 'token=#{github_token}' http://github.com/#{user}/#{repo}/fork"
|
185
|
+
|
186
|
+
url = "git@github.com:#{github_user}/#{repo}.git"
|
187
|
+
if is_repo
|
188
|
+
git "config remote.origin.url #{url}"
|
189
|
+
puts "#{user}/#{repo} forked"
|
190
|
+
else
|
191
|
+
puts "Giving GitHub a moment to create the fork..."
|
192
|
+
sleep 3
|
193
|
+
git_exec "clone #{url}"
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
desc "Create a new GitHub repository from the current local repository"
|
198
|
+
command 'create-from-local' do
|
199
|
+
cwd = sh "pwd"
|
200
|
+
repo = File.basename(cwd)
|
201
|
+
is_repo = !git("status").match(/fatal/)
|
202
|
+
raise "Not a git repository. Use gh create instead" unless is_repo
|
203
|
+
sh "curl -F 'repository[name]=#{repo}' -F 'login=#{github_user}' -F 'token=#{github_token}' http://github.com/repositories"
|
204
|
+
git "remote add origin git@github.com:#{github_user}/#{repo}.git"
|
205
|
+
git_exec "push origin master"
|
206
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
DEV_NULL = File.exist?("/dev/null") ? "/dev/null" : "nul:"
|
2
|
+
|
1
3
|
helper :user_and_repo_from do |url|
|
2
4
|
case url
|
3
5
|
when %r|^git://github\.com/([^/]+/[^/]+)$|: $1.split('/')
|
@@ -17,10 +19,16 @@ helper :repo_for do |remote|
|
|
17
19
|
user_and_repo_for(remote).try.last
|
18
20
|
end
|
19
21
|
|
22
|
+
helper :origin do
|
23
|
+
orig = `git config --get github.origin`.chomp
|
24
|
+
orig = nil if orig.empty?
|
25
|
+
orig || 'origin'
|
26
|
+
end
|
27
|
+
|
20
28
|
helper :project do
|
21
|
-
repo = repo_for(
|
29
|
+
repo = repo_for(origin)
|
22
30
|
if repo.nil?
|
23
|
-
if url_for(
|
31
|
+
if url_for(origin) == ""
|
24
32
|
STDERR.puts "Error: missing remote 'origin'"
|
25
33
|
else
|
26
34
|
STDERR.puts "Error: remote 'origin' is not a github URL"
|
@@ -39,7 +47,7 @@ helper :local_heads do
|
|
39
47
|
end
|
40
48
|
|
41
49
|
helper :has_commit? do |sha|
|
42
|
-
`git show #{sha}
|
50
|
+
`git show #{sha} >#{DEV_NULL} 2>#{DEV_NULL}`
|
43
51
|
$?.exitstatus == 0
|
44
52
|
end
|
45
53
|
|
@@ -135,7 +143,7 @@ helper :print_commits do |our_commits, options|
|
|
135
143
|
end
|
136
144
|
|
137
145
|
helper :applies_cleanly do |sha|
|
138
|
-
`git diff ...#{sha} | git apply --check
|
146
|
+
`git diff ...#{sha} | git apply --check >#{DEV_NULL} 2>#{DEV_NULL}`
|
139
147
|
$?.exitstatus == 0
|
140
148
|
end
|
141
149
|
|
@@ -150,7 +158,7 @@ helper :remotes do
|
|
150
158
|
end
|
151
159
|
|
152
160
|
helper :remote_branches_for do |user|
|
153
|
-
`git ls-remote -h #{user} 2>
|
161
|
+
`git ls-remote -h #{user} 2> #{DEV_NULL}`.split(/\n/).inject({}) do |memo, line|
|
154
162
|
hash, head = line.split(/\t/, 2)
|
155
163
|
head = head[%r{refs/heads/(.+)$},1] unless head.nil?
|
156
164
|
memo[head] = hash unless head.nil?
|
@@ -167,7 +175,7 @@ helper :branch_dirty? do
|
|
167
175
|
# originally, we were going to use git-ls-files but that could only
|
168
176
|
# report modified track files...not files that have been staged
|
169
177
|
# for committal
|
170
|
-
!(system("git diff --quiet 2
|
178
|
+
!(system("git diff --quiet 2>#{DEV_NULL}") or !system("git diff --cached --quiet 2>#{DEV_NULL}"))
|
171
179
|
end
|
172
180
|
|
173
181
|
helper :tracking do
|
@@ -186,7 +194,7 @@ helper :tracking? do |user|
|
|
186
194
|
end
|
187
195
|
|
188
196
|
helper :owner do
|
189
|
-
user_for(
|
197
|
+
user_for(origin)
|
190
198
|
end
|
191
199
|
|
192
200
|
helper :current_branch do
|
@@ -239,6 +247,9 @@ helper :network_meta_for do |user|
|
|
239
247
|
"http://github.com/#{user}/#{project}/network_meta"
|
240
248
|
end
|
241
249
|
|
250
|
+
helper :network_members_for do |user|
|
251
|
+
"http://github.com/#{user}/#{project}/network/members.json"
|
252
|
+
end
|
242
253
|
|
243
254
|
helper :has_launchy? do |blk|
|
244
255
|
begin
|
@@ -290,9 +301,9 @@ These are all the commits that other people have pushed that you have not
|
|
290
301
|
applied or ignored yet (see 'github ignore'). Some things you might want to do:
|
291
302
|
|
292
303
|
* You can run 'github fetch user/branch' (sans '~N') to pull into a local branch for testing
|
293
|
-
* You can run '
|
294
|
-
* You can run '
|
295
|
-
* You can ignore all
|
304
|
+
* You can run 'github cherry-pick [SHA]' to apply a single patch
|
305
|
+
* You can run 'github merge user/branch' to merge a commit and all the '~N' variants.
|
306
|
+
* You can ignore all commits from a branch with 'github ignore ..user/branch'
|
296
307
|
=========================================================================================
|
297
308
|
|
298
309
|
"
|
@@ -303,9 +314,7 @@ helper :argv do
|
|
303
314
|
end
|
304
315
|
|
305
316
|
helper :network_members do
|
306
|
-
|
307
|
-
hash['name']
|
308
|
-
end
|
317
|
+
get_network_members(owner, {}).map {|member| member['owner']['login'] }
|
309
318
|
end
|
310
319
|
|
311
320
|
|
@@ -314,12 +323,24 @@ helper :get_network_data do |user, options|
|
|
314
323
|
return get_cache
|
315
324
|
end
|
316
325
|
if cache_network_data(options)
|
317
|
-
|
326
|
+
begin
|
327
|
+
return cache_data(user)
|
328
|
+
rescue SocketError
|
329
|
+
STDERR.puts "*** Warning: There was a problem accessing the network."
|
330
|
+
rv = get_cache
|
331
|
+
STDERR.puts "Using cached data."
|
332
|
+
rv
|
333
|
+
end
|
318
334
|
else
|
319
335
|
return get_cache
|
320
336
|
end
|
321
337
|
end
|
322
338
|
|
339
|
+
helper :get_network_members do |user, options|
|
340
|
+
json = Kernel.open(network_members_for(user)).read
|
341
|
+
JSON.parse(json)["users"]
|
342
|
+
end
|
343
|
+
|
323
344
|
helper :cache_commits do |commits|
|
324
345
|
File.open( commits_cache_path, 'w' ) do |out|
|
325
346
|
out.write(commits.to_yaml)
|
@@ -0,0 +1,113 @@
|
|
1
|
+
desc "Project network tools - sub-commands : web [user], list, fetch, commits"
|
2
|
+
flags :after => "Only show commits after a certain date"
|
3
|
+
flags :before => "Only show commits before a certain date"
|
4
|
+
flags :shas => "Only show shas"
|
5
|
+
flags :project => "Filter commits on a certain project"
|
6
|
+
flags :author => "Filter commits on a email address of author"
|
7
|
+
flags :applies => "Filter commits to patches that apply cleanly"
|
8
|
+
flags :noapply => "Filter commits to patches that do not apply cleanly"
|
9
|
+
flags :nocache => "Do not use the cached network data"
|
10
|
+
flags :cache => "Use the network data even if it's expired"
|
11
|
+
flags :sort => "How to sort : date(*), branch, author"
|
12
|
+
flags :common => "Show common branch point"
|
13
|
+
flags :thisbranch => "Look at branches that match the current one"
|
14
|
+
flags :limit => "Only look through the first X heads - useful for really large projects"
|
15
|
+
command :network do |command, user|
|
16
|
+
return if !helper.project
|
17
|
+
user ||= helper.owner
|
18
|
+
|
19
|
+
case command
|
20
|
+
when 'web'
|
21
|
+
helper.open helper.network_page_for(user)
|
22
|
+
when 'list'
|
23
|
+
members = helper.get_network_members(user, options)
|
24
|
+
members.each do |hsh|
|
25
|
+
puts hsh["owner"]["login"]
|
26
|
+
end
|
27
|
+
when 'fetch'
|
28
|
+
# fetch each remote we don't have
|
29
|
+
data = helper.get_network_data(user, options)
|
30
|
+
data['users'].each do |hsh|
|
31
|
+
u = hsh['name']
|
32
|
+
GitHub.invoke(:track, u) unless helper.tracking?(u)
|
33
|
+
puts "fetching #{u}"
|
34
|
+
GitHub.invoke(:fetch_all, u)
|
35
|
+
end
|
36
|
+
when 'commits'
|
37
|
+
# show commits we don't have yet
|
38
|
+
|
39
|
+
$stderr.puts 'gathering heads'
|
40
|
+
cherry = []
|
41
|
+
|
42
|
+
if helper.cache_commits_data(options)
|
43
|
+
ids = []
|
44
|
+
data = helper.get_network_data(user, options)
|
45
|
+
data['users'].each do |hsh|
|
46
|
+
u = hsh['name']
|
47
|
+
if options[:thisbranch]
|
48
|
+
user_ids = hsh['heads'].map { |a| a['id'] if a['name'] == helper.current_branch }.compact
|
49
|
+
else
|
50
|
+
user_ids = hsh['heads'].map { |a| a['id'] }
|
51
|
+
end
|
52
|
+
user_ids.each do |id|
|
53
|
+
if !helper.has_commit?(id) && helper.cache_expired?
|
54
|
+
GitHub.invoke(:track, u) unless helper.tracking?(u)
|
55
|
+
puts "fetching #{u}"
|
56
|
+
GitHub.invoke(:fetch_all, u)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
ids += user_ids
|
60
|
+
end
|
61
|
+
ids.uniq!
|
62
|
+
|
63
|
+
$stderr.puts 'has heads'
|
64
|
+
|
65
|
+
# check that we have all these shas locally
|
66
|
+
local_heads = helper.local_heads
|
67
|
+
local_heads_not = local_heads.map { |a| "^#{a}"}
|
68
|
+
looking_for = (ids - local_heads) + local_heads_not
|
69
|
+
commits = helper.get_commits(looking_for)
|
70
|
+
|
71
|
+
$stderr.puts 'ID SIZE:' + ids.size.to_s
|
72
|
+
|
73
|
+
ignores = helper.ignore_sha_array
|
74
|
+
|
75
|
+
ids.each do |id|
|
76
|
+
next if ignores[id] || !commits.assoc(id)
|
77
|
+
cherries = helper.get_cherry(id)
|
78
|
+
cherries = helper.remove_ignored(cherries, ignores)
|
79
|
+
cherry += cherries
|
80
|
+
helper.ignore_shas([id]) if cherries.size == 0
|
81
|
+
$stderr.puts "checking head #{id} : #{cherry.size.to_s}"
|
82
|
+
break if options[:limit] && cherry.size > options[:limit].to_i
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
if cherry.size > 0 || !helper.cache_commits_data(options)
|
87
|
+
helper.print_network_cherry_help if !options[:shas]
|
88
|
+
|
89
|
+
if helper.cache_commits_data(options)
|
90
|
+
$stderr.puts "caching..."
|
91
|
+
$stderr.puts "commits: " + cherry.size.to_s
|
92
|
+
our_commits = cherry.map { |item| c = commits.assoc(item[1]); [item, c] if c }
|
93
|
+
our_commits.delete_if { |item| item == nil }
|
94
|
+
helper.cache_commits(our_commits)
|
95
|
+
else
|
96
|
+
$stderr.puts "using cached..."
|
97
|
+
our_commits = helper.commits_cache
|
98
|
+
end
|
99
|
+
|
100
|
+
helper.print_commits(our_commits, options)
|
101
|
+
else
|
102
|
+
puts "no unapplied commits"
|
103
|
+
end
|
104
|
+
else
|
105
|
+
helper.print_network_help
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
desc "Ignore a SHA (from 'github network commits')"
|
110
|
+
command :ignore do |sha|
|
111
|
+
commits = helper.resolve_commits(sha)
|
112
|
+
helper.ignore_shas(commits) # add to .git/ignore-shas file
|
113
|
+
end
|
data/lib/github.rb
CHANGED
@@ -2,6 +2,7 @@ $:.unshift File.dirname(__FILE__)
|
|
2
2
|
require 'github/extensions'
|
3
3
|
require 'github/command'
|
4
4
|
require 'github/helper'
|
5
|
+
require 'fileutils'
|
5
6
|
require 'rubygems'
|
6
7
|
require 'open-uri'
|
7
8
|
require 'json'
|
@@ -16,22 +17,25 @@ require 'yaml'
|
|
16
17
|
# whatever
|
17
18
|
# end
|
18
19
|
#
|
19
|
-
# We'll probably want to use the `choice` gem for concise, tasty DSL
|
20
|
-
# arg parsing action.
|
21
|
-
#
|
22
20
|
|
23
21
|
module GitHub
|
24
22
|
extend self
|
25
23
|
|
26
|
-
BasePath = File.expand_path(File.dirname(__FILE__)
|
24
|
+
BasePath = File.expand_path(File.dirname(__FILE__))
|
27
25
|
|
28
|
-
def command(command, &block)
|
26
|
+
def command(command, options = {}, &block)
|
27
|
+
command = command.to_s
|
29
28
|
debug "Registered `#{command}`"
|
30
29
|
descriptions[command] = @next_description if @next_description
|
31
30
|
@next_description = nil
|
32
31
|
flag_descriptions[command].update @next_flags if @next_flags
|
32
|
+
usage_descriptions[command] = @next_usage if @next_usage
|
33
33
|
@next_flags = nil
|
34
|
-
|
34
|
+
@next_usage = []
|
35
|
+
commands[command] = Command.new(block)
|
36
|
+
Array(options[:alias] || options[:aliases]).each do |command_alias|
|
37
|
+
commands[command_alias.to_s] = commands[command.to_s]
|
38
|
+
end
|
35
39
|
end
|
36
40
|
|
37
41
|
def desc(str)
|
@@ -43,6 +47,11 @@ module GitHub
|
|
43
47
|
@next_flags.update hash
|
44
48
|
end
|
45
49
|
|
50
|
+
def usage(string)
|
51
|
+
@next_usage ||= []
|
52
|
+
@next_usage << string
|
53
|
+
end
|
54
|
+
|
46
55
|
def helper(command, &block)
|
47
56
|
debug "Helper'd `#{command}`"
|
48
57
|
Helper.send :define_method, command, &block
|
@@ -51,9 +60,11 @@ module GitHub
|
|
51
60
|
def activate(args)
|
52
61
|
@@original_args = args.clone
|
53
62
|
@options = parse_options(args)
|
54
|
-
@debug = @options
|
55
|
-
|
56
|
-
|
63
|
+
@debug = @options.delete(:debug)
|
64
|
+
@learn = @options.delete(:learn)
|
65
|
+
Dir[BasePath + '/commands/*.rb'].each do |command|
|
66
|
+
load command
|
67
|
+
end
|
57
68
|
invoke(args.shift, *args)
|
58
69
|
end
|
59
70
|
|
@@ -80,6 +91,10 @@ module GitHub
|
|
80
91
|
@flagdescs ||= Hash.new { |h, k| h[k] = {} }
|
81
92
|
end
|
82
93
|
|
94
|
+
def usage_descriptions
|
95
|
+
@usage_descriptions ||= Hash.new { |h, k| h[k] = [] }
|
96
|
+
end
|
97
|
+
|
83
98
|
def options
|
84
99
|
@options
|
85
100
|
end
|
@@ -108,29 +123,47 @@ module GitHub
|
|
108
123
|
end
|
109
124
|
end
|
110
125
|
|
111
|
-
def load(file)
|
112
|
-
file[0] == ?/ ? path = file : path = BasePath + "/commands/#{file}"
|
113
|
-
data = File.read(path)
|
114
|
-
GitHub.module_eval data, path
|
115
|
-
end
|
116
|
-
|
117
126
|
def debug(*messages)
|
118
127
|
puts *messages.map { |m| "== #{m}" } if debug?
|
119
128
|
end
|
120
129
|
|
130
|
+
def learn(message)
|
131
|
+
if learn?
|
132
|
+
puts "== " + Color.yellow(message)
|
133
|
+
else
|
134
|
+
debug(message)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def learn?
|
139
|
+
!!@learn
|
140
|
+
end
|
141
|
+
|
121
142
|
def debug?
|
122
143
|
!!@debug
|
123
144
|
end
|
145
|
+
|
146
|
+
def load(file)
|
147
|
+
file[0] =~ /^\// ? path = file : path = BasePath + "/commands/#{File.basename(file)}"
|
148
|
+
data = File.read(path)
|
149
|
+
GitHub.module_eval data, path
|
150
|
+
end
|
124
151
|
end
|
125
152
|
|
126
|
-
GitHub.command :default do
|
153
|
+
GitHub.command :default, :aliases => ['', '-h', 'help', '-help', '--help'] do
|
127
154
|
puts "Usage: github command <space separated arguments>", ''
|
128
155
|
puts "Available commands:", ''
|
129
156
|
longest = GitHub.descriptions.map { |d,| d.to_s.size }.max
|
130
|
-
GitHub.descriptions.each do |command, desc|
|
157
|
+
GitHub.descriptions.sort {|a,b| a.to_s <=> b.to_s }.each do |command, desc|
|
131
158
|
cmdstr = "%-#{longest}s" % command
|
132
159
|
puts " #{cmdstr} => #{desc}"
|
133
160
|
flongest = GitHub.flag_descriptions[command].map { |d,| "--#{d}".size }.max
|
161
|
+
GitHub.usage_descriptions[command].each do |usage_descriptions|
|
162
|
+
usage_descriptions.each do |usage|
|
163
|
+
usage_str = "#{" " * longest} %% %-#{flongest}s" % usage
|
164
|
+
puts usage_str
|
165
|
+
end
|
166
|
+
end
|
134
167
|
GitHub.flag_descriptions[command].each do |flag, fdesc|
|
135
168
|
flagstr = "#{" " * longest} %-#{flongest}s" % "--#{flag}"
|
136
169
|
puts " #{flagstr}: #{fdesc}"
|
@@ -138,9 +171,3 @@ GitHub.command :default do
|
|
138
171
|
end
|
139
172
|
puts
|
140
173
|
end
|
141
|
-
|
142
|
-
GitHub.commands[''] = GitHub.commands['default']
|
143
|
-
GitHub.commands['-h'] = GitHub.commands['default']
|
144
|
-
GitHub.commands['--help'] = GitHub.commands['default']
|
145
|
-
GitHub.commands['-help'] = GitHub.commands['default']
|
146
|
-
GitHub.commands['help'] = GitHub.commands['default']
|
data/lib/github/command.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
1
3
|
if RUBY_PLATFORM =~ /mswin|mingw/
|
2
4
|
begin
|
3
5
|
require 'win32/open3'
|
@@ -11,6 +13,8 @@ end
|
|
11
13
|
|
12
14
|
module GitHub
|
13
15
|
class Command
|
16
|
+
include FileUtils
|
17
|
+
|
14
18
|
def initialize(block)
|
15
19
|
(class << self;self end).send :define_method, :command, &block
|
16
20
|
end
|
@@ -33,25 +37,51 @@ module GitHub
|
|
33
37
|
puts git(*command)
|
34
38
|
end
|
35
39
|
|
36
|
-
def git(
|
37
|
-
sh
|
40
|
+
def git(command)
|
41
|
+
run :sh, command
|
42
|
+
end
|
43
|
+
|
44
|
+
def git_exec(command)
|
45
|
+
run :exec, command
|
38
46
|
end
|
39
47
|
|
40
|
-
def
|
41
|
-
|
42
|
-
|
43
|
-
|
48
|
+
def run(method, command)
|
49
|
+
if command.is_a? Array
|
50
|
+
command = [ 'git', command ].flatten
|
51
|
+
GitHub.learn command.join(' ')
|
52
|
+
else
|
53
|
+
command = 'git ' + command
|
54
|
+
GitHub.learn command
|
55
|
+
end
|
56
|
+
|
57
|
+
send method, *command
|
44
58
|
end
|
45
59
|
|
46
60
|
def sh(*command)
|
47
61
|
Shell.new(*command).run
|
48
62
|
end
|
49
|
-
|
63
|
+
|
50
64
|
def die(message)
|
51
65
|
puts "=> #{message}"
|
52
66
|
exit!
|
53
67
|
end
|
54
68
|
|
69
|
+
def github_user
|
70
|
+
git("config --get github.user")
|
71
|
+
end
|
72
|
+
|
73
|
+
def github_token
|
74
|
+
git("config --get github.token")
|
75
|
+
end
|
76
|
+
|
77
|
+
def shell_user
|
78
|
+
ENV['USER']
|
79
|
+
end
|
80
|
+
|
81
|
+
def current_user?(user)
|
82
|
+
user == github_user || user == shell_user
|
83
|
+
end
|
84
|
+
|
55
85
|
class Shell < String
|
56
86
|
attr_reader :error
|
57
87
|
attr_reader :out
|
@@ -93,7 +123,7 @@ module GitHub
|
|
93
123
|
end
|
94
124
|
|
95
125
|
def command(*args)
|
96
|
-
git_exec
|
126
|
+
git_exec [ @name, args ]
|
97
127
|
end
|
98
128
|
end
|
99
129
|
end
|
data/lib/github/extensions.rb
CHANGED
@@ -26,3 +26,14 @@ class Object
|
|
26
26
|
self
|
27
27
|
end
|
28
28
|
end
|
29
|
+
|
30
|
+
# cute
|
31
|
+
module Color
|
32
|
+
COLORS = { :clear => 0, :red => 31, :green => 32, :yellow => 33 }
|
33
|
+
def self.method_missing(color_name, *args)
|
34
|
+
color(color_name) + args.first + color(:clear)
|
35
|
+
end
|
36
|
+
def self.color(color)
|
37
|
+
"\e[#{COLORS[color.to_sym]}m"
|
38
|
+
end
|
39
|
+
end
|
data/spec/github_spec.rb
CHANGED
@@ -62,4 +62,24 @@ describe "GitHub.parse_options" do
|
|
62
62
|
GitHub.activate(['default', '--debug'])
|
63
63
|
GitHub.should be_debug
|
64
64
|
end
|
65
|
+
|
66
|
+
it "should allow for an alias on a commad" do
|
67
|
+
GitHub.command 'some-command', :aliases => 'an-alias' do
|
68
|
+
end
|
69
|
+
GitHub.commands['an-alias'].should_not be_nil
|
70
|
+
GitHub.commands['an-alias'].should_not == GitHub.commands['non-existant-command']
|
71
|
+
GitHub.commands['an-alias'].should == GitHub.commands['some-command']
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should allow for an array of aliases on a commad" do
|
75
|
+
GitHub.command 'another-command', :aliases => ['some-alias-1', 'some-alias-2'] do
|
76
|
+
end
|
77
|
+
GitHub.commands['some-alias-1'].should_not be_nil
|
78
|
+
GitHub.commands['some-alias-1'].should_not == GitHub.commands['non-existant-command']
|
79
|
+
GitHub.commands['some-alias-1'].should_not be_nil
|
80
|
+
GitHub.commands['some-alias-1'].should_not == GitHub.commands['non-existant-command']
|
81
|
+
GitHub.commands['some-alias-1'].should == GitHub.commands['another-command']
|
82
|
+
GitHub.commands['some-alias-2'].should == GitHub.commands['another-command']
|
83
|
+
end
|
84
|
+
|
65
85
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: riquedafreak-github
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Wanstrath, Kevin Ballard, Scott Chacon
|
@@ -13,7 +13,8 @@ date: 2008-05-18 00:00:00 -07:00
|
|
13
13
|
default_executable: gh
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
16
|
+
name: json_pure
|
17
|
+
type: :runtime
|
17
18
|
version_requirement:
|
18
19
|
version_requirements: !ruby/object:Gem::Requirement
|
19
20
|
requirements:
|
@@ -39,8 +40,9 @@ extra_rdoc_files:
|
|
39
40
|
- README
|
40
41
|
files:
|
41
42
|
- bin/github
|
42
|
-
- commands/
|
43
|
-
- commands/
|
43
|
+
- lib/commands/network.rb
|
44
|
+
- lib/commands/commands.rb
|
45
|
+
- lib/commands/helpers.rb
|
44
46
|
- lib/github/extensions.rb
|
45
47
|
- lib/github/command.rb
|
46
48
|
- lib/github/helper.rb
|
data/commands/commands.rb
DELETED
@@ -1,242 +0,0 @@
|
|
1
|
-
desc "Open this repo's master branch in a web browser."
|
2
|
-
command :home do |user|
|
3
|
-
if helper.project
|
4
|
-
helper.open helper.homepage_for(user || helper.owner, 'master')
|
5
|
-
end
|
6
|
-
end
|
7
|
-
|
8
|
-
desc "Open this repo in a web browser."
|
9
|
-
command :browse do |user, branch|
|
10
|
-
if helper.project
|
11
|
-
# if one arg given, treat it as a branch name
|
12
|
-
# unless it maches user/branch, then split it
|
13
|
-
# if two args given, treat as user branch
|
14
|
-
# if no args given, use defaults
|
15
|
-
user, branch = user.split("/", 2) if branch.nil? unless user.nil?
|
16
|
-
branch = user and user = nil if branch.nil?
|
17
|
-
user ||= helper.branch_user
|
18
|
-
branch ||= helper.branch_name
|
19
|
-
helper.open helper.homepage_for(user, branch)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
desc "Project network tools - sub-commands : web [user], list, fetch, commits"
|
24
|
-
flags :after => "Only show commits after a certain date"
|
25
|
-
flags :before => "Only show commits before a certain date"
|
26
|
-
flags :shas => "Only show shas"
|
27
|
-
flags :project => "Filter commits on a certain project"
|
28
|
-
flags :author => "Filter commits on a email address of author"
|
29
|
-
flags :applies => "Filter commits to patches that apply cleanly"
|
30
|
-
flags :noapply => "Filter commits to patches that do not apply cleanly"
|
31
|
-
flags :nocache => "Do not use the cached network data"
|
32
|
-
flags :cache => "Use the network data even if it's expired"
|
33
|
-
flags :sort => "How to sort : date(*), branch, author"
|
34
|
-
flags :common => "Show common branch point"
|
35
|
-
flags :thisbranch => "Look at branches that match the current one"
|
36
|
-
flags :limit => "Only look through the first X heads - useful for really large projects"
|
37
|
-
command :network do |command, user|
|
38
|
-
return if !helper.project
|
39
|
-
user ||= helper.owner
|
40
|
-
|
41
|
-
case command
|
42
|
-
when 'web'
|
43
|
-
helper.open helper.network_page_for(user)
|
44
|
-
when 'list'
|
45
|
-
data = helper.get_network_data(user, options)
|
46
|
-
data['users'].each do |hsh|
|
47
|
-
puts [ hsh['name'].ljust(20), hsh['heads'].map {|a| a['name']}.uniq.join(', ') ].join(' ')
|
48
|
-
end
|
49
|
-
when 'fetch'
|
50
|
-
# fetch each remote we don't have
|
51
|
-
data = helper.get_network_data(user, options)
|
52
|
-
data['users'].each do |hsh|
|
53
|
-
u = hsh['name']
|
54
|
-
GitHub.invoke(:track, u) unless helper.tracking?(u)
|
55
|
-
puts "fetching #{u}"
|
56
|
-
GitHub.invoke(:fetch_all, u)
|
57
|
-
end
|
58
|
-
when 'commits'
|
59
|
-
# show commits we don't have yet
|
60
|
-
|
61
|
-
$stderr.puts 'gathering heads'
|
62
|
-
cherry = []
|
63
|
-
|
64
|
-
if helper.cache_commits_data(options)
|
65
|
-
ids = []
|
66
|
-
data = helper.get_network_data(user, options)
|
67
|
-
data['users'].each do |hsh|
|
68
|
-
u = hsh['name']
|
69
|
-
if options[:thisbranch]
|
70
|
-
user_ids = hsh['heads'].map { |a| a['id'] if a['name'] == helper.current_branch }.compact
|
71
|
-
else
|
72
|
-
user_ids = hsh['heads'].map { |a| a['id'] }
|
73
|
-
end
|
74
|
-
user_ids.each do |id|
|
75
|
-
if !helper.has_commit?(id) && helper.cache_expired?
|
76
|
-
GitHub.invoke(:track, u) unless helper.tracking?(u)
|
77
|
-
puts "fetching #{u}"
|
78
|
-
GitHub.invoke(:fetch_all, u)
|
79
|
-
end
|
80
|
-
end
|
81
|
-
ids += user_ids
|
82
|
-
end
|
83
|
-
ids.uniq!
|
84
|
-
|
85
|
-
$stderr.puts 'has heads'
|
86
|
-
|
87
|
-
# check that we have all these shas locally
|
88
|
-
local_heads = helper.local_heads
|
89
|
-
local_heads_not = local_heads.map { |a| "^#{a}"}
|
90
|
-
looking_for = (ids - local_heads) + local_heads_not
|
91
|
-
commits = helper.get_commits(looking_for)
|
92
|
-
|
93
|
-
$stderr.puts 'ID SIZE:' + ids.size.to_s
|
94
|
-
|
95
|
-
ignores = helper.ignore_sha_array
|
96
|
-
|
97
|
-
ids.each do |id|
|
98
|
-
next if ignores[id] || !commits.assoc(id)
|
99
|
-
cherries = helper.get_cherry(id)
|
100
|
-
cherries = helper.remove_ignored(cherries, ignores)
|
101
|
-
cherry += cherries
|
102
|
-
helper.ignore_shas([id]) if cherries.size == 0
|
103
|
-
$stderr.puts "checking head #{id} : #{cherry.size.to_s}"
|
104
|
-
break if options[:limit] && cherry.size > options[:limit].to_i
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
if cherry.size > 0 || !helper.cache_commits_data(options)
|
109
|
-
helper.print_network_cherry_help if !options[:shas]
|
110
|
-
|
111
|
-
if helper.cache_commits_data(options)
|
112
|
-
$stderr.puts "caching..."
|
113
|
-
$stderr.puts "commits: " + cherry.size.to_s
|
114
|
-
our_commits = cherry.map { |item| c = commits.assoc(item[1]); [item, c] if c }
|
115
|
-
our_commits.delete_if { |item| item == nil }
|
116
|
-
helper.cache_commits(our_commits)
|
117
|
-
else
|
118
|
-
$stderr.puts "using cached..."
|
119
|
-
our_commits = helper.commits_cache
|
120
|
-
end
|
121
|
-
|
122
|
-
helper.print_commits(our_commits, options)
|
123
|
-
else
|
124
|
-
puts "no unapplied commits"
|
125
|
-
end
|
126
|
-
else
|
127
|
-
helper.print_network_help
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
desc "Ignore a SHA (from 'github network commits')"
|
132
|
-
command :ignore do |sha|
|
133
|
-
commits = helper.resolve_commits(sha)
|
134
|
-
helper.ignore_shas(commits) # add to .git/ignore-shas file
|
135
|
-
end
|
136
|
-
|
137
|
-
desc "Info about this project."
|
138
|
-
command :info do
|
139
|
-
puts "== Info for #{helper.project}"
|
140
|
-
puts "You are #{helper.owner}"
|
141
|
-
puts "Currently tracking:"
|
142
|
-
helper.tracking.sort { |(a,),(b,)| a == :origin ? -1 : b == :origin ? 1 : a.to_s <=> b.to_s }.each do |(name,user_or_url)|
|
143
|
-
puts " - #{user_or_url} (as #{name})"
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
desc "Track another user's repository."
|
148
|
-
flags :private => "Use git@github.com: instead of git://github.com/."
|
149
|
-
flags :ssh => 'Equivalent to --private'
|
150
|
-
command :track do |remote, user|
|
151
|
-
# track remote user
|
152
|
-
# track remote user/repo
|
153
|
-
# track user
|
154
|
-
# track user/repo
|
155
|
-
user, remote = remote, nil if user.nil?
|
156
|
-
die "Specify a user to track" if user.nil?
|
157
|
-
user, repo = user.split("/", 2)
|
158
|
-
die "Already tracking #{user}" if helper.tracking?(user)
|
159
|
-
repo = @helper.project if repo.nil?
|
160
|
-
repo.chomp!(".git")
|
161
|
-
remote ||= user
|
162
|
-
|
163
|
-
if options[:private] || options[:ssh]
|
164
|
-
git "remote add #{remote} #{helper.private_url_for_user_and_repo(user, repo)}"
|
165
|
-
else
|
166
|
-
git "remote add #{remote} #{helper.public_url_for_user_and_repo(user, repo)}"
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
desc "Fetch all refs from a user"
|
171
|
-
command :fetch_all do |user|
|
172
|
-
GitHub.invoke(:track, user) unless helper.tracking?(user)
|
173
|
-
git "fetch #{user}"
|
174
|
-
end
|
175
|
-
|
176
|
-
desc "Fetch from a remote to a local branch."
|
177
|
-
command :fetch do |user, branch|
|
178
|
-
die "Specify a user to pull from" if user.nil?
|
179
|
-
user, branch = user.split("/", 2) if branch.nil?
|
180
|
-
branch ||= 'master'
|
181
|
-
GitHub.invoke(:track, user) unless helper.tracking?(user)
|
182
|
-
|
183
|
-
die "Unknown branch (#{branch}) specified" unless helper.remote_branch?(user, branch)
|
184
|
-
die "Unable to switch branches, your current branch has uncommitted changes" if helper.branch_dirty?
|
185
|
-
|
186
|
-
puts "Fetching #{user}/#{branch}"
|
187
|
-
git "fetch #{user} #{branch}:refs/remotes/#{user}/#{branch}"
|
188
|
-
git "update-ref refs/heads/#{user}/#{branch} refs/remotes/#{user}/#{branch}"
|
189
|
-
git_exec "checkout #{user}/#{branch}"
|
190
|
-
end
|
191
|
-
|
192
|
-
desc "Pull from a remote."
|
193
|
-
flags :merge => "Automatically merge remote's changes into your master."
|
194
|
-
command :pull do |user, branch|
|
195
|
-
die "Specify a user to pull from" if user.nil?
|
196
|
-
user, branch = user.split("/", 2) if branch.nil?
|
197
|
-
|
198
|
-
if !helper.network_members.include?(user)
|
199
|
-
git_exec "#{helper.argv.join(' ')}".strip
|
200
|
-
end
|
201
|
-
|
202
|
-
branch ||= 'master'
|
203
|
-
GitHub.invoke(:track, user) unless helper.tracking?(user)
|
204
|
-
|
205
|
-
if options[:merge]
|
206
|
-
git_exec "pull #{user} #{branch}"
|
207
|
-
else
|
208
|
-
puts "Switching to #{user}/#{branch}"
|
209
|
-
git "update-ref refs/heads/#{user}/#{branch} HEAD"
|
210
|
-
git "checkout #{user}/#{branch}"
|
211
|
-
end
|
212
|
-
end
|
213
|
-
|
214
|
-
desc "Clone a repo."
|
215
|
-
flags :ssh => "Clone using the git@github.com style url."
|
216
|
-
command :clone do |user, repo, dir|
|
217
|
-
die "Specify a user to pull from" if user.nil?
|
218
|
-
if user.include?('/') && !user.include?('@') && !user.include?(':')
|
219
|
-
die "Expected user/repo dir, given extra argument" if dir
|
220
|
-
(user, repo), dir = [user.split('/', 2), repo]
|
221
|
-
end
|
222
|
-
|
223
|
-
if options[:ssh]
|
224
|
-
git_exec "clone git@github.com:#{user}/#{repo}.git" + (dir ? " #{dir}" : "")
|
225
|
-
elsif repo
|
226
|
-
git_exec "clone git://github.com/#{user}/#{repo}.git" + (dir ? " #{dir}" : "")
|
227
|
-
else
|
228
|
-
git_exec "#{helper.argv.join(' ')}".strip
|
229
|
-
end
|
230
|
-
end
|
231
|
-
|
232
|
-
desc "Generate the text for a pull request."
|
233
|
-
command :'pull-request' do |user, branch|
|
234
|
-
if helper.project
|
235
|
-
die "Specify a user for the pull request" if user.nil?
|
236
|
-
user, branch = user.split('/', 2) if branch.nil?
|
237
|
-
branch ||= 'master'
|
238
|
-
GitHub.invoke(:track, user) unless helper.tracking?(user)
|
239
|
-
|
240
|
-
git_exec "request-pull #{user}/#{branch} origin"
|
241
|
-
end
|
242
|
-
end
|