git-hub 1.3.0 → 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +25 -0
- data/Rakefile +1 -1
- data/lib/hub/args.rb +1 -1
- data/lib/hub/commands.rb +89 -9
- data/lib/hub/context.rb +11 -1
- data/lib/hub/runner.rb +3 -3
- data/lib/hub/version.rb +1 -1
- data/man/hub.1 +51 -0
- data/man/hub.1.html +35 -0
- data/man/hub.1.ronn +37 -0
- data/test/helper.rb +4 -2
- data/test/hub_test.rb +149 -6
- metadata +2 -2
data/README.md
CHANGED
@@ -131,6 +131,31 @@ superpowers:
|
|
131
131
|
$ git remote add origin
|
132
132
|
> git remote add origin git://github.com/YOUR_USER/CURRENT_REPO.git
|
133
133
|
|
134
|
+
### git fetch
|
135
|
+
|
136
|
+
$ git fetch mislav
|
137
|
+
> git remote add mislav git://github.com/mislav/REPO.git
|
138
|
+
> git fetch mislav
|
139
|
+
|
140
|
+
$ git fetch mislav,xoebus
|
141
|
+
> git remote add mislav ...
|
142
|
+
> git remote add xoebus ...
|
143
|
+
> git fetch --multiple mislav xoebus
|
144
|
+
|
145
|
+
### git cherry-pick
|
146
|
+
|
147
|
+
$ git cherry-pick http://github.com/mislav/REPO/commit/SHA
|
148
|
+
> git remote add -f mislav git://github.com/mislav/REPO.git
|
149
|
+
> git cherry-pick SHA
|
150
|
+
|
151
|
+
$ git cherry-pick mislav@SHA
|
152
|
+
> git remote add -f mislav git://github.com/mislav/CURRENT_REPO.git
|
153
|
+
> git cherry-pick SHA
|
154
|
+
|
155
|
+
$ git cherry-pick mislav@SHA
|
156
|
+
> git fetch mislav
|
157
|
+
> git cherry-pick SHA
|
158
|
+
|
134
159
|
### git fork
|
135
160
|
|
136
161
|
$ git fork
|
data/Rakefile
CHANGED
@@ -100,7 +100,7 @@ end
|
|
100
100
|
desc "Push a new version."
|
101
101
|
task :publish => "gem:publish" do
|
102
102
|
require 'hub/version'
|
103
|
-
|
103
|
+
system "git tag v#{Hub::Version}"
|
104
104
|
sh "git push origin v#{Hub::Version}"
|
105
105
|
sh "git push origin master"
|
106
106
|
sh "gem push pkg/git-hub-#{Hub::Version}.gem"
|
data/lib/hub/args.rb
CHANGED
@@ -52,7 +52,7 @@ module Hub
|
|
52
52
|
# args = Args.new([ 'remote', 'add', '-f', 'tekkub' ])
|
53
53
|
# args.words == [ 'remote', 'add', 'tekkub' ]
|
54
54
|
def words
|
55
|
-
reject { |arg| arg
|
55
|
+
reject { |arg| arg.index('-') == 0 }
|
56
56
|
end
|
57
57
|
|
58
58
|
# All the flags (as opposed to words) contained in this argument
|
data/lib/hub/commands.rb
CHANGED
@@ -135,6 +135,90 @@ module Hub
|
|
135
135
|
args << github_url(:user => user, :repo => repo, :private => ssh)
|
136
136
|
end
|
137
137
|
|
138
|
+
# $ hub fetch mislav
|
139
|
+
# > git remote add mislav git://github.com/mislav/REPO.git
|
140
|
+
# > git fetch mislav
|
141
|
+
#
|
142
|
+
# $ hub fetch --multiple mislav xoebus
|
143
|
+
# > git remote add mislav ...
|
144
|
+
# > git remote add xoebus ...
|
145
|
+
# > git fetch --multiple mislav xoebus
|
146
|
+
def fetch(args)
|
147
|
+
# $ hub fetch --multiple <name1>, <name2>, ...
|
148
|
+
if args.include?('--multiple')
|
149
|
+
names = args.words[1..-1]
|
150
|
+
# $ hub fetch <name>
|
151
|
+
elsif name = args.words[1]
|
152
|
+
# $ hub fetch <name1>,<name2>,...
|
153
|
+
if name =~ /^\w+(,\w+)+$/
|
154
|
+
index = args.index(name)
|
155
|
+
args.delete(name)
|
156
|
+
names = name.split(',')
|
157
|
+
args.insert(index, *names)
|
158
|
+
args.insert(index, '--multiple')
|
159
|
+
else
|
160
|
+
names = [name]
|
161
|
+
end
|
162
|
+
else
|
163
|
+
names = []
|
164
|
+
end
|
165
|
+
|
166
|
+
names.reject! { |name|
|
167
|
+
name =~ /\W/ or remotes.include?(name) or
|
168
|
+
remotes_group(name) or not repo_exists?(name)
|
169
|
+
}
|
170
|
+
|
171
|
+
if names.any?
|
172
|
+
commands = names.map { |name| "git remote add #{name} #{github_url(:user => name)}" }
|
173
|
+
commands << args.to_exec.join(' ')
|
174
|
+
args.replace commands.shift.split(' ')
|
175
|
+
args.shift # don't want "git"
|
176
|
+
args.after commands.join('; ')
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
# $ git cherry-pick http://github.com/mislav/hub/commit/a319d88#comments
|
181
|
+
# > git remote add -f mislav git://github.com/mislav/hub.git
|
182
|
+
# > git cherry-pick a319d88
|
183
|
+
#
|
184
|
+
# $ git cherry-pick mislav@a319d88
|
185
|
+
# > git remote add -f mislav git://github.com/mislav/hub.git
|
186
|
+
# > git cherry-pick a319d88
|
187
|
+
#
|
188
|
+
# $ git cherry-pick mislav@SHA
|
189
|
+
# > git fetch mislav
|
190
|
+
# > git cherry-pick SHA
|
191
|
+
def cherry_pick(args)
|
192
|
+
unless args.include?('-m') or args.include?('--mainline')
|
193
|
+
case ref = args.words.last
|
194
|
+
when %r{^(https?:)//github.com/(.+?)/(.+?)/commit/([a-f1-9]{7,40})}
|
195
|
+
scheme, user, repo, sha = $1, $2, $3, $4
|
196
|
+
args[args.index(ref)] = sha
|
197
|
+
when /^(\w+)@([a-f1-9]{7,40})$/
|
198
|
+
scheme, user, repo, sha = nil, $1, nil, $2
|
199
|
+
args[args.index(ref)] = sha
|
200
|
+
else
|
201
|
+
user = nil
|
202
|
+
end
|
203
|
+
|
204
|
+
if user
|
205
|
+
# cherry-pick comes after the fetch
|
206
|
+
args.after args.to_exec.join(' ')
|
207
|
+
|
208
|
+
if user == repo_owner
|
209
|
+
# fetch from origin if the repo belongs to the user
|
210
|
+
args.replace ['fetch', default_remote]
|
211
|
+
elsif remotes.include?(user)
|
212
|
+
args.replace ['fetch', user]
|
213
|
+
else
|
214
|
+
secure = scheme == 'https:'
|
215
|
+
remote_url = github_url(:user => user, :repo => repo, :private => secure)
|
216
|
+
args.replace ['remote', 'add', '-f', user, remote_url]
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
138
222
|
# $ hub init -g
|
139
223
|
# > git init
|
140
224
|
# > git remote add origin git@github.com:USER/REPO.git
|
@@ -151,11 +235,9 @@ module Hub
|
|
151
235
|
# ... hardcore forking action ...
|
152
236
|
# > git remote add -f YOUR_USER git@github.com:YOUR_USER/CURRENT_REPO.git
|
153
237
|
def fork(args)
|
154
|
-
require 'net/http'
|
155
|
-
|
156
238
|
# can't do anything without token and original owner name
|
157
239
|
if github_user && github_token && repo_owner
|
158
|
-
if
|
240
|
+
if repo_exists?(github_user)
|
159
241
|
puts "#{github_user}/#{repo_name} already exists on GitHub"
|
160
242
|
else
|
161
243
|
fork_repo
|
@@ -530,12 +612,10 @@ help
|
|
530
612
|
end
|
531
613
|
end
|
532
614
|
|
533
|
-
# Determines whether
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
def own_repo_exists?
|
538
|
-
url = API_REPO % [github_user, repo_name]
|
615
|
+
# Determines whether a user has a fork of the current repo on GitHub.
|
616
|
+
def repo_exists?(user)
|
617
|
+
require 'net/http'
|
618
|
+
url = API_REPO % [user, repo_name]
|
539
619
|
Net::HTTPSuccess === Net::HTTP.get_response(URI(url))
|
540
620
|
end
|
541
621
|
|
data/lib/hub/context.rb
CHANGED
@@ -60,12 +60,22 @@ module Hub
|
|
60
60
|
normalize_branch(branch) if branch
|
61
61
|
end
|
62
62
|
|
63
|
+
def remotes
|
64
|
+
list = GIT_CONFIG['remote'].split("\n")
|
65
|
+
main = list.delete('origin') and list.unshift(main)
|
66
|
+
list
|
67
|
+
end
|
68
|
+
|
69
|
+
def remotes_group(name)
|
70
|
+
GIT_CONFIG["config remotes.#{name}"]
|
71
|
+
end
|
72
|
+
|
63
73
|
def current_remote
|
64
74
|
(current_branch && remote_for(current_branch)) || default_remote
|
65
75
|
end
|
66
76
|
|
67
77
|
def default_remote
|
68
|
-
|
78
|
+
remotes.first
|
69
79
|
end
|
70
80
|
|
71
81
|
def normalize_branch(branch)
|
data/lib/hub/runner.rb
CHANGED
@@ -13,9 +13,9 @@ module Hub
|
|
13
13
|
# Hack to emulate git-style
|
14
14
|
@args.unshift 'help' if @args.grep(/^[^-]|version/).empty?
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
# git commands can have dashes
|
17
|
+
cmd = @args[0].sub(/(\w)-/, '\1_')
|
18
|
+
Commands.send(cmd, @args) if Commands.respond_to?(cmd)
|
19
19
|
end
|
20
20
|
|
21
21
|
# Shortcut
|
data/lib/hub/version.rb
CHANGED
data/man/hub.1
CHANGED
@@ -22,6 +22,12 @@
|
|
22
22
|
\fBgit remote add\fR [\fB\-p\fR] \fIOPTIONS\fR \fIUSER\fR[/\fIREPOSITORY\fR]
|
23
23
|
.
|
24
24
|
.br
|
25
|
+
\fBgit fetch\fR \fIUSER\-1\fR,[\fIUSER\-2\fR,...]
|
26
|
+
.
|
27
|
+
.br
|
28
|
+
\fBgit cherry\-pick\fR \fIGITHUB\-REF\fR
|
29
|
+
.
|
30
|
+
.br
|
25
31
|
\fBgit push\fR \fIREMOTE\-1\fR,\fIREMOTE\-2\fR,...,\fIREMOTE\-N\fR \fIREF\fR
|
26
32
|
.
|
27
33
|
.br
|
@@ -68,6 +74,18 @@ current working directory is used. With \fB\-p\fR, use private remote
|
|
68
74
|
then uses your GitHub login.
|
69
75
|
.
|
70
76
|
.TP
|
77
|
+
\fBgit fetch\fR \fIUSER\-1\fR,[\fIUSER\-2\fR,...]
|
78
|
+
Adds missing remote(s) with \fBgit remote add\fR prior to fetching. New
|
79
|
+
remotes are only added if they correspond to valid forks on GitHub.
|
80
|
+
.
|
81
|
+
.TP
|
82
|
+
\fBgit cherry\-pick\fR \fIGITHUB\-REF\fR
|
83
|
+
Cherry\-pick a commit from a fork using either full URL to the commit
|
84
|
+
or GitHub\-flavored Markdown notation, which is \fBuser@sha\fR. If the remote
|
85
|
+
doesn't yet exist, it will be added. A \fBgit fetch <user>\fR is issued
|
86
|
+
prior to the cherry\-pick attempt.
|
87
|
+
.
|
88
|
+
.TP
|
71
89
|
\fBgit push\fR \fIREMOTE\-1\fR,\fIREMOTE\-2\fR,...,\fIREMOTE\-N\fR \fIREF\fR
|
72
90
|
Push \fIREF\fR to each of \fIREMOTE\-1\fR through \fIREMOTE\-N\fR by executing
|
73
91
|
multiple \fBgit push\fR commands.
|
@@ -183,6 +201,39 @@ $ git remote add origin
|
|
183
201
|
.
|
184
202
|
.fi
|
185
203
|
.
|
204
|
+
.SS "git fetch"
|
205
|
+
.
|
206
|
+
.nf
|
207
|
+
|
208
|
+
$ git fetch mislav
|
209
|
+
> git remote add mislav git://github.com/mislav/REPO.git
|
210
|
+
> git fetch mislav
|
211
|
+
|
212
|
+
$ git fetch mislav,xoebus
|
213
|
+
> git remote add mislav ...
|
214
|
+
> git remote add xoebus ...
|
215
|
+
> git fetch \-\-multiple mislav xoebus
|
216
|
+
.
|
217
|
+
.fi
|
218
|
+
.
|
219
|
+
.SS "git cherry\-pick"
|
220
|
+
.
|
221
|
+
.nf
|
222
|
+
|
223
|
+
$ git cherry\-pick http://github.com/mislav/REPO/commit/SHA
|
224
|
+
> git remote add \-f mislav git://github.com/mislav/REPO.git
|
225
|
+
> git cherry\-pick SHA
|
226
|
+
|
227
|
+
$ git cherry\-pick mislav@SHA
|
228
|
+
> git remote add \-f mislav git://github.com/mislav/CURRENT_REPO.git
|
229
|
+
> git cherry\-pick SHA
|
230
|
+
|
231
|
+
$ git cherry\-pick mislav@SHA
|
232
|
+
> git fetch mislav
|
233
|
+
> git cherry\-pick SHA
|
234
|
+
.
|
235
|
+
.fi
|
236
|
+
.
|
186
237
|
.SS "git fork"
|
187
238
|
.
|
188
239
|
.nf
|
data/man/hub.1.html
CHANGED
@@ -73,6 +73,8 @@
|
|
73
73
|
<p><code>git init -g</code> <var>OPTIONS</var><br />
|
74
74
|
<code>git clone</code> [<code>-p</code>] <var>OPTIONS</var> [<var>USER</var>/]<var>REPOSITORY</var> <var>DIRECTORY</var><br />
|
75
75
|
<code>git remote add</code> [<code>-p</code>] <var>OPTIONS</var> <var>USER</var>[/<var>REPOSITORY</var>]<br />
|
76
|
+
<code>git fetch</code> <var>USER-1</var>,[<var>USER-2</var>,...]<br />
|
77
|
+
<code>git cherry-pick</code> <var>GITHUB-REF</var><br />
|
76
78
|
<code>git push</code> <var>REMOTE-1</var>,<var>REMOTE-2</var>,...,<var>REMOTE-N</var> <var>REF</var><br />
|
77
79
|
<code>git browse</code> [<code>-p</code>] [<code>-u</code>] [[<var>USER</var><code>/</code>]<var>REPOSITORY</var>] [SUBPAGE]<br />
|
78
80
|
<code>git compare</code> [<code>-p</code>] [<code>-u</code>] [<var>USER</var>] [<var>START</var>...]<var>END</var><br />
|
@@ -101,6 +103,12 @@ git-remote(1). When /<var>REPOSITORY</var> is omitted, the basename of the
|
|
101
103
|
current working directory is used. With <code>-p</code>, use private remote
|
102
104
|
"git@github.com:<var>USER</var>/<var>REPOSITORY</var>.git". If <var>USER</var> is "origin"
|
103
105
|
then uses your GitHub login.</p></dd>
|
106
|
+
<dt><code>git fetch</code> <var>USER-1</var>,[<var>USER-2</var>,...]</dt><dd><p>Adds missing remote(s) with <code>git remote add</code> prior to fetching. New
|
107
|
+
remotes are only added if they correspond to valid forks on GitHub.</p></dd>
|
108
|
+
<dt><code>git cherry-pick</code> <var>GITHUB-REF</var></dt><dd><p>Cherry-pick a commit from a fork using either full URL to the commit
|
109
|
+
or GitHub-flavored Markdown notation, which is <code>user@sha</code>. If the remote
|
110
|
+
doesn't yet exist, it will be added. A <code>git fetch <user></code> is issued
|
111
|
+
prior to the cherry-pick attempt.</p></dd>
|
104
112
|
<dt><code>git push</code> <var>REMOTE-1</var>,<var>REMOTE-2</var>,...,<var>REMOTE-N</var> <var>REF</var></dt><dd><p>Push <var>REF</var> to each of <var>REMOTE-1</var> through <var>REMOTE-N</var> by executing
|
105
113
|
multiple <code>git push</code> commands.</p></dd>
|
106
114
|
<dt><code>git browse</code> [<code>-p</code>] [<code>-u</code>] [[<var>USER</var><code>/</code>]<var>REPOSITORY</var>] [SUBPAGE]</dt><dd><p>Open repository's GitHub page in the system's default web browser
|
@@ -175,6 +183,33 @@ $ git remote add origin
|
|
175
183
|
> git remote add origin git://github.com/YOUR_USER/CURRENT_REPO.git
|
176
184
|
</code></pre>
|
177
185
|
|
186
|
+
<h3>git fetch</h3>
|
187
|
+
|
188
|
+
<pre><code>$ git fetch mislav
|
189
|
+
> git remote add mislav git://github.com/mislav/REPO.git
|
190
|
+
> git fetch mislav
|
191
|
+
|
192
|
+
$ git fetch mislav,xoebus
|
193
|
+
> git remote add mislav ...
|
194
|
+
> git remote add xoebus ...
|
195
|
+
> git fetch --multiple mislav xoebus
|
196
|
+
</code></pre>
|
197
|
+
|
198
|
+
<h3>git cherry-pick</h3>
|
199
|
+
|
200
|
+
<pre><code>$ git cherry-pick http://github.com/mislav/REPO/commit/SHA
|
201
|
+
> git remote add -f mislav git://github.com/mislav/REPO.git
|
202
|
+
> git cherry-pick SHA
|
203
|
+
|
204
|
+
$ git cherry-pick mislav@SHA
|
205
|
+
> git remote add -f mislav git://github.com/mislav/CURRENT_REPO.git
|
206
|
+
> git cherry-pick SHA
|
207
|
+
|
208
|
+
$ git cherry-pick mislav@SHA
|
209
|
+
> git fetch mislav
|
210
|
+
> git cherry-pick SHA
|
211
|
+
</code></pre>
|
212
|
+
|
178
213
|
<h3>git fork</h3>
|
179
214
|
|
180
215
|
<pre><code>$ git fork
|
data/man/hub.1.ronn
CHANGED
@@ -9,6 +9,8 @@ hub(1) -- git + hub = github
|
|
9
9
|
`git init -g` <OPTIONS>
|
10
10
|
`git clone` [`-p`] <OPTIONS> [<USER>/]<REPOSITORY> <DIRECTORY>
|
11
11
|
`git remote add` [`-p`] <OPTIONS> <USER>[/<REPOSITORY>]
|
12
|
+
`git fetch` <USER-1>,[<USER-2>,...]
|
13
|
+
`git cherry-pick` <GITHUB-REF>
|
12
14
|
`git push` <REMOTE-1>,<REMOTE-2>,...,<REMOTE-N> <REF>
|
13
15
|
`git browse` [`-p`] [`-u`] [[<USER>`/`]<REPOSITORY>] [SUBPAGE]
|
14
16
|
`git compare` [`-p`] [`-u`] [<USER>] [<START>...]<END>
|
@@ -44,6 +46,16 @@ alias command displays information on configuring your environment:
|
|
44
46
|
"git@github.com:<USER>/<REPOSITORY>.git". If <USER> is "origin"
|
45
47
|
then uses your GitHub login.
|
46
48
|
|
49
|
+
* `git fetch` <USER-1>,[<USER-2>,...]:
|
50
|
+
Adds missing remote(s) with `git remote add` prior to fetching. New
|
51
|
+
remotes are only added if they correspond to valid forks on GitHub.
|
52
|
+
|
53
|
+
* `git cherry-pick` <GITHUB-REF>:
|
54
|
+
Cherry-pick a commit from a fork using either full URL to the commit
|
55
|
+
or GitHub-flavored Markdown notation, which is `user@sha`. If the remote
|
56
|
+
doesn't yet exist, it will be added. A `git fetch <user>` is issued
|
57
|
+
prior to the cherry-pick attempt.
|
58
|
+
|
47
59
|
* `git push` <REMOTE-1>,<REMOTE-2>,...,<REMOTE-N> <REF>:
|
48
60
|
Push <REF> to each of <REMOTE-1> through <REMOTE-N> by executing
|
49
61
|
multiple `git push` commands.
|
@@ -122,6 +134,31 @@ cloning:
|
|
122
134
|
$ git remote add origin
|
123
135
|
> git remote add origin git://github.com/YOUR_USER/CURRENT_REPO.git
|
124
136
|
|
137
|
+
### git fetch
|
138
|
+
|
139
|
+
$ git fetch mislav
|
140
|
+
> git remote add mislav git://github.com/mislav/REPO.git
|
141
|
+
> git fetch mislav
|
142
|
+
|
143
|
+
$ git fetch mislav,xoebus
|
144
|
+
> git remote add mislav ...
|
145
|
+
> git remote add xoebus ...
|
146
|
+
> git fetch --multiple mislav xoebus
|
147
|
+
|
148
|
+
### git cherry-pick
|
149
|
+
|
150
|
+
$ git cherry-pick http://github.com/mislav/REPO/commit/SHA
|
151
|
+
> git remote add -f mislav git://github.com/mislav/REPO.git
|
152
|
+
> git cherry-pick SHA
|
153
|
+
|
154
|
+
$ git cherry-pick mislav@SHA
|
155
|
+
> git remote add -f mislav git://github.com/mislav/CURRENT_REPO.git
|
156
|
+
> git cherry-pick SHA
|
157
|
+
|
158
|
+
$ git cherry-pick mislav@SHA
|
159
|
+
> git fetch mislav
|
160
|
+
> git cherry-pick SHA
|
161
|
+
|
125
162
|
### git fork
|
126
163
|
|
127
164
|
$ git fork
|
data/test/helper.rb
CHANGED
@@ -88,11 +88,13 @@ class Test::Unit::TestCase
|
|
88
88
|
|
89
89
|
# Asserts that `haystack` includes `needle`.
|
90
90
|
def assert_includes(needle, haystack)
|
91
|
-
assert haystack.include?(needle)
|
91
|
+
assert haystack.include?(needle),
|
92
|
+
"expected #{needle.inspect} in #{haystack.inspect}"
|
92
93
|
end
|
93
94
|
|
94
95
|
# Asserts that `haystack` does not include `needle`.
|
95
96
|
def assert_not_includes(needle, haystack)
|
96
|
-
assert !haystack.include?(needle)
|
97
|
+
assert !haystack.include?(needle),
|
98
|
+
"didn't expect #{needle.inspect} in #{haystack.inspect}"
|
97
99
|
end
|
98
100
|
end
|
data/test/hub_test.rb
CHANGED
@@ -20,6 +20,7 @@ class HubTest < Test::Unit::TestCase
|
|
20
20
|
@git = Hub::Context::GIT_CONFIG.replace(Hash.new { |h, k|
|
21
21
|
raise ArgumentError, "`git #{k}` not stubbed"
|
22
22
|
}).update(
|
23
|
+
'remote' => "mislav\norigin",
|
23
24
|
'symbolic-ref -q HEAD' => 'refs/heads/master',
|
24
25
|
'config github.user' => 'tpw',
|
25
26
|
'config github.token' => 'abc123',
|
@@ -217,6 +218,134 @@ class HubTest < Test::Unit::TestCase
|
|
217
218
|
assert_command input, command
|
218
219
|
end
|
219
220
|
|
221
|
+
def test_fetch_existing_remote
|
222
|
+
assert_command "fetch mislav", "git fetch mislav"
|
223
|
+
end
|
224
|
+
|
225
|
+
def test_fetch_new_remote
|
226
|
+
stub_remotes_group('xoebus', nil)
|
227
|
+
stub_existing_fork('xoebus')
|
228
|
+
|
229
|
+
h = Hub("fetch xoebus")
|
230
|
+
assert_equal "git remote add xoebus git://github.com/xoebus/hub.git", h.command
|
231
|
+
assert_equal "git fetch xoebus", h.after
|
232
|
+
end
|
233
|
+
|
234
|
+
def test_fetch_new_remote_with_options
|
235
|
+
stub_remotes_group('xoebus', nil)
|
236
|
+
stub_existing_fork('xoebus')
|
237
|
+
|
238
|
+
h = Hub("fetch --depth=1 --prune xoebus")
|
239
|
+
assert_equal "git remote add xoebus git://github.com/xoebus/hub.git", h.command
|
240
|
+
assert_equal "git fetch --depth=1 --prune xoebus", h.after
|
241
|
+
end
|
242
|
+
|
243
|
+
def test_fetch_multiple_new_remotes
|
244
|
+
stub_remotes_group('xoebus', nil)
|
245
|
+
stub_remotes_group('rtomayko', nil)
|
246
|
+
stub_existing_fork('xoebus')
|
247
|
+
stub_existing_fork('rtomayko')
|
248
|
+
|
249
|
+
h = Hub("fetch --multiple xoebus rtomayko")
|
250
|
+
|
251
|
+
assert_equal "git remote add xoebus git://github.com/xoebus/hub.git", h.command
|
252
|
+
expected = ["git remote add rtomayko git://github.com/rtomayko/hub.git"] <<
|
253
|
+
"git fetch --multiple xoebus rtomayko"
|
254
|
+
assert_equal expected.join('; '), h.after
|
255
|
+
end
|
256
|
+
|
257
|
+
def test_fetch_multiple_comma_separated_remotes
|
258
|
+
stub_remotes_group('xoebus', nil)
|
259
|
+
stub_remotes_group('rtomayko', nil)
|
260
|
+
stub_existing_fork('xoebus')
|
261
|
+
stub_existing_fork('rtomayko')
|
262
|
+
|
263
|
+
h = Hub("fetch xoebus,rtomayko")
|
264
|
+
|
265
|
+
assert_equal "git remote add xoebus git://github.com/xoebus/hub.git", h.command
|
266
|
+
expected = ["git remote add rtomayko git://github.com/rtomayko/hub.git"] <<
|
267
|
+
"git fetch --multiple xoebus rtomayko"
|
268
|
+
assert_equal expected.join('; '), h.after
|
269
|
+
end
|
270
|
+
|
271
|
+
def test_fetch_multiple_new_remotes_with_filtering
|
272
|
+
stub_remotes_group('xoebus', nil)
|
273
|
+
stub_remotes_group('mygrp', 'one two')
|
274
|
+
stub_remotes_group('typo', nil)
|
275
|
+
stub_existing_fork('xoebus')
|
276
|
+
stub_nonexisting_fork('typo')
|
277
|
+
|
278
|
+
# mislav: existing remote; skipped
|
279
|
+
# xoebus: new remote, fork exists; added
|
280
|
+
# mygrp: a remotes group; skipped
|
281
|
+
# URL: can't be a username; skipped
|
282
|
+
# typo: fork doesn't exist; skipped
|
283
|
+
h = Hub("fetch --multiple mislav xoebus mygrp git://example.com typo")
|
284
|
+
|
285
|
+
assert_equal "git remote add xoebus git://github.com/xoebus/hub.git", h.command
|
286
|
+
expected = "git fetch --multiple mislav xoebus mygrp git://example.com typo"
|
287
|
+
assert_equal expected, h.after
|
288
|
+
end
|
289
|
+
|
290
|
+
def test_cherry_pick
|
291
|
+
h = Hub("cherry-pick a319d88")
|
292
|
+
assert_equal "git cherry-pick a319d88", h.command
|
293
|
+
assert !h.args.after?
|
294
|
+
end
|
295
|
+
|
296
|
+
def test_cherry_pick_url
|
297
|
+
url = 'http://github.com/mislav/hub/commit/a319d88#comments'
|
298
|
+
h = Hub("cherry-pick #{url}")
|
299
|
+
assert_equal "git fetch mislav", h.command
|
300
|
+
assert_equal "git cherry-pick a319d88", h.after
|
301
|
+
end
|
302
|
+
|
303
|
+
def test_cherry_pick_url_with_remote_add
|
304
|
+
url = 'http://github.com/xoebus/hub/commit/a319d88'
|
305
|
+
h = Hub("cherry-pick #{url}")
|
306
|
+
assert_equal "git remote add -f xoebus git://github.com/xoebus/hub.git", h.command
|
307
|
+
assert_equal "git cherry-pick a319d88", h.after
|
308
|
+
end
|
309
|
+
|
310
|
+
def test_cherry_pick_private_url_with_remote_add
|
311
|
+
url = 'https://github.com/xoebus/hub/commit/a319d88'
|
312
|
+
h = Hub("cherry-pick #{url}")
|
313
|
+
assert_equal "git remote add -f xoebus git@github.com:xoebus/hub.git", h.command
|
314
|
+
assert_equal "git cherry-pick a319d88", h.after
|
315
|
+
end
|
316
|
+
|
317
|
+
def test_cherry_pick_origin_url
|
318
|
+
url = 'https://github.com/defunkt/hub/commit/a319d88'
|
319
|
+
h = Hub("cherry-pick #{url}")
|
320
|
+
assert_equal "git fetch origin", h.command
|
321
|
+
assert_equal "git cherry-pick a319d88", h.after
|
322
|
+
end
|
323
|
+
|
324
|
+
def test_cherry_pick_github_user_notation
|
325
|
+
h = Hub("cherry-pick mislav@a319d88")
|
326
|
+
assert_equal "git fetch mislav", h.command
|
327
|
+
assert_equal "git cherry-pick a319d88", h.after
|
328
|
+
end
|
329
|
+
|
330
|
+
def test_cherry_pick_github_user_repo_notation
|
331
|
+
# not supported
|
332
|
+
h = Hub("cherry-pick mislav/hubbub@a319d88")
|
333
|
+
assert_equal "git cherry-pick mislav/hubbub@a319d88", h.command
|
334
|
+
assert !h.args.after?
|
335
|
+
end
|
336
|
+
|
337
|
+
def test_cherry_pick_github_notation_too_short
|
338
|
+
h = Hub("cherry-pick mislav@a319")
|
339
|
+
assert_equal "git cherry-pick mislav@a319", h.command
|
340
|
+
assert !h.args.after?
|
341
|
+
end
|
342
|
+
|
343
|
+
def test_cherry_pick_github_notation_with_remote_add
|
344
|
+
h = Hub("cherry-pick xoebus@a319d88")
|
345
|
+
assert_equal "git remote add -f xoebus git://github.com/xoebus/hub.git", h.command
|
346
|
+
assert_equal "git cherry-pick a319d88", h.after
|
347
|
+
end
|
348
|
+
|
220
349
|
def test_init
|
221
350
|
h = Hub("init -g")
|
222
351
|
assert_equal "git init", h.command
|
@@ -244,8 +373,7 @@ class HubTest < Test::Unit::TestCase
|
|
244
373
|
end
|
245
374
|
|
246
375
|
def test_fork
|
247
|
-
|
248
|
-
to_return(:status => 404)
|
376
|
+
stub_nonexisting_fork('tpw')
|
249
377
|
stub_request(:post, "github.com/api/v2/yaml/repos/fork/defunkt/hub").with { |req|
|
250
378
|
params = Hash[*req.body.split(/[&=]/)]
|
251
379
|
params == { 'login'=>'tpw', 'token'=>'abc123' }
|
@@ -257,16 +385,14 @@ class HubTest < Test::Unit::TestCase
|
|
257
385
|
end
|
258
386
|
|
259
387
|
def test_fork_no_remote
|
260
|
-
|
261
|
-
to_return(:status => 404)
|
388
|
+
stub_nonexisting_fork('tpw')
|
262
389
|
stub_request(:post, "github.com/api/v2/yaml/repos/fork/defunkt/hub")
|
263
390
|
|
264
391
|
assert_equal "", hub("fork --no-remote") { ENV['GIT'] = 'echo' }
|
265
392
|
end
|
266
393
|
|
267
394
|
def test_fork_already_exists
|
268
|
-
|
269
|
-
to_return(:status => 200)
|
395
|
+
stub_existing_fork('tpw')
|
270
396
|
|
271
397
|
expected = "tpw/hub already exists on GitHub\n"
|
272
398
|
expected << "remote add -f tpw git@github.com:tpw/hub.git\n"
|
@@ -479,6 +605,23 @@ config
|
|
479
605
|
@git['config branch.master.merge'] = nil
|
480
606
|
end
|
481
607
|
|
608
|
+
def stub_remotes_group(name, value)
|
609
|
+
@git["config remotes.#{name}"] = value
|
610
|
+
end
|
611
|
+
|
612
|
+
def stub_existing_fork(user)
|
613
|
+
stub_fork(user, 200)
|
614
|
+
end
|
615
|
+
|
616
|
+
def stub_nonexisting_fork(user)
|
617
|
+
stub_fork(user, 404)
|
618
|
+
end
|
619
|
+
|
620
|
+
def stub_fork(user, status)
|
621
|
+
stub_request(:get, "github.com/api/v2/yaml/repos/show/#{user}/hub").
|
622
|
+
to_return(:status => status)
|
623
|
+
end
|
624
|
+
|
482
625
|
def stub_available_commands(*names)
|
483
626
|
COMMANDS.replace names
|
484
627
|
end
|