2 * Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com>
3 * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
7 * Redistribution and use in source and binary forms, with or
8 * without modification, are permitted provided that the following
11 * - Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
14 * - Redistributions in binary form must reproduce the above
15 * copyright notice, this list of conditions and the following
16 * disclaimer in the documentation and/or other materials provided
17 * with the distribution.
19 * - Neither the name of the Git Development Community nor the
20 * names of its contributors may be used to endorse or promote
21 * products derived from this software without specific prior
24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
25 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
26 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
27 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
29 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
31 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
32 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
33 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
34 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
36 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39 package org
.spearce
.jgit
.transport
;
42 import java
.io
.FileNotFoundException
;
43 import java
.io
.FileOutputStream
;
44 import java
.io
.IOException
;
45 import java
.io
.UnsupportedEncodingException
;
46 import java
.util
.List
;
48 import org
.spearce
.jgit
.lib
.RepositoryTestCase
;
50 public class RemoteConfigTest
extends RepositoryTestCase
{
51 private void writeConfig(final String dat
) throws FileNotFoundException
,
52 IOException
, UnsupportedEncodingException
{
53 final File file
= new File(db
.getDirectory(), "config");
54 final FileOutputStream stream
= new FileOutputStream(file
, true);
56 stream
.write(dat
.getBytes("UTF-8"));
60 db
.getConfig().load();
63 private static void assertEquals(final String exp
, final URIish act
) {
64 assertEquals(exp
, act
!= null ? act
.toString() : null);
67 public void testSimple() throws Exception
{
68 writeConfig("[remote \"spearce\"]\n"
69 + "url = http://www.spearce.org/egit.git\n"
70 + "fetch = +refs/heads/*:refs/remotes/spearce/*\n");
72 final RemoteConfig rc
= new RemoteConfig(db
.getConfig(), "spearce");
73 final List
<URIish
> allURIs
= rc
.getURIs();
76 assertEquals("spearce", rc
.getName());
77 assertNotNull(allURIs
);
78 assertNotNull(rc
.getFetchRefSpecs());
79 assertNotNull(rc
.getPushRefSpecs());
80 assertNotNull(rc
.getTagOpt());
81 assertSame(TagOpt
.AUTO_FOLLOW
, rc
.getTagOpt());
83 assertEquals(1, allURIs
.size());
84 assertEquals("http://www.spearce.org/egit.git", allURIs
.get(0));
86 assertEquals(1, rc
.getFetchRefSpecs().size());
87 spec
= rc
.getFetchRefSpecs().get(0);
88 assertTrue(spec
.isForceUpdate());
89 assertTrue(spec
.isWildcard());
90 assertEquals("refs/heads/*", spec
.getSource());
91 assertEquals("refs/remotes/spearce/*", spec
.getDestination());
93 assertEquals(0, rc
.getPushRefSpecs().size());
96 public void testSimpleNoTags() throws Exception
{
97 writeConfig("[remote \"spearce\"]\n"
98 + "url = http://www.spearce.org/egit.git\n"
99 + "fetch = +refs/heads/*:refs/remotes/spearce/*\n"
100 + "tagopt = --no-tags\n");
101 final RemoteConfig rc
= new RemoteConfig(db
.getConfig(), "spearce");
102 assertSame(TagOpt
.NO_TAGS
, rc
.getTagOpt());
105 public void testSimpleAlwaysTags() throws Exception
{
106 writeConfig("[remote \"spearce\"]\n"
107 + "url = http://www.spearce.org/egit.git\n"
108 + "fetch = +refs/heads/*:refs/remotes/spearce/*\n"
109 + "tagopt = --tags\n");
110 final RemoteConfig rc
= new RemoteConfig(db
.getConfig(), "spearce");
111 assertSame(TagOpt
.FETCH_TAGS
, rc
.getTagOpt());
114 public void testMirror() throws Exception
{
115 writeConfig("[remote \"spearce\"]\n"
116 + "url = http://www.spearce.org/egit.git\n"
117 + "fetch = +refs/heads/*:refs/heads/*\n"
118 + "fetch = refs/tags/*:refs/tags/*\n");
120 final RemoteConfig rc
= new RemoteConfig(db
.getConfig(), "spearce");
121 final List
<URIish
> allURIs
= rc
.getURIs();
124 assertEquals("spearce", rc
.getName());
125 assertNotNull(allURIs
);
126 assertNotNull(rc
.getFetchRefSpecs());
127 assertNotNull(rc
.getPushRefSpecs());
129 assertEquals(1, allURIs
.size());
130 assertEquals("http://www.spearce.org/egit.git", allURIs
.get(0));
132 assertEquals(2, rc
.getFetchRefSpecs().size());
134 spec
= rc
.getFetchRefSpecs().get(0);
135 assertTrue(spec
.isForceUpdate());
136 assertTrue(spec
.isWildcard());
137 assertEquals("refs/heads/*", spec
.getSource());
138 assertEquals("refs/heads/*", spec
.getDestination());
140 spec
= rc
.getFetchRefSpecs().get(1);
141 assertFalse(spec
.isForceUpdate());
142 assertTrue(spec
.isWildcard());
143 assertEquals("refs/tags/*", spec
.getSource());
144 assertEquals("refs/tags/*", spec
.getDestination());
146 assertEquals(0, rc
.getPushRefSpecs().size());
149 public void testBackup() throws Exception
{
150 writeConfig("[remote \"backup\"]\n"
151 + "url = http://www.spearce.org/egit.git\n"
152 + "url = user@repo.or.cz:/srv/git/egit.git\n"
153 + "push = +refs/heads/*:refs/heads/*\n"
154 + "push = refs/tags/*:refs/tags/*\n");
156 final RemoteConfig rc
= new RemoteConfig(db
.getConfig(), "backup");
157 final List
<URIish
> allURIs
= rc
.getURIs();
160 assertEquals("backup", rc
.getName());
161 assertNotNull(allURIs
);
162 assertNotNull(rc
.getFetchRefSpecs());
163 assertNotNull(rc
.getPushRefSpecs());
165 assertEquals(2, allURIs
.size());
166 assertEquals("http://www.spearce.org/egit.git", allURIs
.get(0));
167 assertEquals("user@repo.or.cz:/srv/git/egit.git", allURIs
.get(1));
169 assertEquals(0, rc
.getFetchRefSpecs().size());
171 assertEquals(2, rc
.getPushRefSpecs().size());
172 spec
= rc
.getPushRefSpecs().get(0);
173 assertTrue(spec
.isForceUpdate());
174 assertTrue(spec
.isWildcard());
175 assertEquals("refs/heads/*", spec
.getSource());
176 assertEquals("refs/heads/*", spec
.getDestination());
178 spec
= rc
.getPushRefSpecs().get(1);
179 assertFalse(spec
.isForceUpdate());
180 assertTrue(spec
.isWildcard());
181 assertEquals("refs/tags/*", spec
.getSource());
182 assertEquals("refs/tags/*", spec
.getDestination());
185 public void testUploadPack() throws Exception
{
186 writeConfig("[remote \"example\"]\n"
187 + "url = user@example.com:egit.git\n"
188 + "fetch = +refs/heads/*:refs/remotes/example/*\n"
189 + "uploadpack = /path/to/git/git-upload-pack\n"
190 + "receivepack = /path/to/git/git-receive-pack\n");
192 final RemoteConfig rc
= new RemoteConfig(db
.getConfig(), "example");
193 final List
<URIish
> allURIs
= rc
.getURIs();
196 assertEquals("example", rc
.getName());
197 assertNotNull(allURIs
);
198 assertNotNull(rc
.getFetchRefSpecs());
199 assertNotNull(rc
.getPushRefSpecs());
201 assertEquals(1, allURIs
.size());
202 assertEquals("user@example.com:egit.git", allURIs
.get(0));
204 assertEquals(1, rc
.getFetchRefSpecs().size());
205 spec
= rc
.getFetchRefSpecs().get(0);
206 assertTrue(spec
.isForceUpdate());
207 assertTrue(spec
.isWildcard());
208 assertEquals("refs/heads/*", spec
.getSource());
209 assertEquals("refs/remotes/example/*", spec
.getDestination());
211 assertEquals(0, rc
.getPushRefSpecs().size());
213 assertEquals("/path/to/git/git-upload-pack", rc
.getUploadPack());
214 assertEquals("/path/to/git/git-receive-pack", rc
.getReceivePack());
217 public void testUnknown() throws Exception
{
220 final RemoteConfig rc
= new RemoteConfig(db
.getConfig(), "backup");
221 assertEquals(0, rc
.getURIs().size());
222 assertEquals(0, rc
.getFetchRefSpecs().size());
223 assertEquals(0, rc
.getPushRefSpecs().size());
224 assertEquals("git-upload-pack", rc
.getUploadPack());
225 assertEquals("git-receive-pack", rc
.getReceivePack());
228 public void testAddURI() throws Exception
{
231 final URIish uri
= new URIish("/some/dir");
232 final RemoteConfig rc
= new RemoteConfig(db
.getConfig(), "backup");
233 assertEquals(0, rc
.getURIs().size());
235 assertTrue(rc
.addURI(uri
));
236 assertEquals(1, rc
.getURIs().size());
237 assertSame(uri
, rc
.getURIs().get(0));
239 assertFalse(rc
.addURI(new URIish(uri
.toString())));
240 assertEquals(1, rc
.getURIs().size());
243 public void testRemoveFirstURI() throws Exception
{
246 final URIish a
= new URIish("/some/dir");
247 final URIish b
= new URIish("/another/dir");
248 final URIish c
= new URIish("/more/dirs");
249 final RemoteConfig rc
= new RemoteConfig(db
.getConfig(), "backup");
250 assertTrue(rc
.addURI(a
));
251 assertTrue(rc
.addURI(b
));
252 assertTrue(rc
.addURI(c
));
254 assertEquals(3, rc
.getURIs().size());
255 assertSame(a
, rc
.getURIs().get(0));
256 assertSame(b
, rc
.getURIs().get(1));
257 assertSame(c
, rc
.getURIs().get(2));
259 assertTrue(rc
.removeURI(a
));
260 assertEquals(2, rc
.getURIs().size());
261 assertSame(b
, rc
.getURIs().get(0));
262 assertSame(c
, rc
.getURIs().get(1));
265 public void testRemoveMiddleURI() throws Exception
{
268 final URIish a
= new URIish("/some/dir");
269 final URIish b
= new URIish("/another/dir");
270 final URIish c
= new URIish("/more/dirs");
271 final RemoteConfig rc
= new RemoteConfig(db
.getConfig(), "backup");
272 assertTrue(rc
.addURI(a
));
273 assertTrue(rc
.addURI(b
));
274 assertTrue(rc
.addURI(c
));
276 assertEquals(3, rc
.getURIs().size());
277 assertSame(a
, rc
.getURIs().get(0));
278 assertSame(b
, rc
.getURIs().get(1));
279 assertSame(c
, rc
.getURIs().get(2));
281 assertTrue(rc
.removeURI(b
));
282 assertEquals(2, rc
.getURIs().size());
283 assertSame(a
, rc
.getURIs().get(0));
284 assertSame(c
, rc
.getURIs().get(1));
287 public void testRemoveLastURI() throws Exception
{
290 final URIish a
= new URIish("/some/dir");
291 final URIish b
= new URIish("/another/dir");
292 final URIish c
= new URIish("/more/dirs");
293 final RemoteConfig rc
= new RemoteConfig(db
.getConfig(), "backup");
294 assertTrue(rc
.addURI(a
));
295 assertTrue(rc
.addURI(b
));
296 assertTrue(rc
.addURI(c
));
298 assertEquals(3, rc
.getURIs().size());
299 assertSame(a
, rc
.getURIs().get(0));
300 assertSame(b
, rc
.getURIs().get(1));
301 assertSame(c
, rc
.getURIs().get(2));
303 assertTrue(rc
.removeURI(c
));
304 assertEquals(2, rc
.getURIs().size());
305 assertSame(a
, rc
.getURIs().get(0));
306 assertSame(b
, rc
.getURIs().get(1));
309 public void testRemoveOnlyURI() throws Exception
{
312 final URIish a
= new URIish("/some/dir");
313 final RemoteConfig rc
= new RemoteConfig(db
.getConfig(), "backup");
314 assertTrue(rc
.addURI(a
));
316 assertEquals(1, rc
.getURIs().size());
317 assertSame(a
, rc
.getURIs().get(0));
319 assertTrue(rc
.removeURI(a
));
320 assertEquals(0, rc
.getURIs().size());
323 public void testCreateOrigin() throws Exception
{
324 final RemoteConfig rc
= new RemoteConfig(db
.getConfig(), "origin");
325 rc
.addURI(new URIish("/some/dir"));
326 rc
.addFetchRefSpec(new RefSpec("+refs/heads/*:refs/remotes/"
327 + rc
.getName() + "/*"));
328 rc
.update(db
.getConfig());
329 db
.getConfig().save();
331 checkFile(new File(db
.getDirectory(), "config"), "[core]\n"
332 + "\trepositoryformatversion = 0\n" + "\tfilemode = true\n"
333 + "[remote \"origin\"]\n" + "\turl = /some/dir\n"
334 + "\tfetch = +refs/heads/*:refs/remotes/origin/*\n");
337 public void testSaveAddURI() throws Exception
{
338 writeConfig("[remote \"spearce\"]\n"
339 + "url = http://www.spearce.org/egit.git\n"
340 + "fetch = +refs/heads/*:refs/remotes/spearce/*\n");
342 final RemoteConfig rc
= new RemoteConfig(db
.getConfig(), "spearce");
343 rc
.addURI(new URIish("/some/dir"));
344 assertEquals(2, rc
.getURIs().size());
345 rc
.update(db
.getConfig());
346 db
.getConfig().save();
348 checkFile(new File(db
.getDirectory(), "config"), "[core]\n"
349 + "\trepositoryformatversion = 0\n" + "\tfilemode = true\n"
350 + "[remote \"spearce\"]\n"
351 + "\turl = http://www.spearce.org/egit.git\n"
352 + "\turl = /some/dir\n"
353 + "\tfetch = +refs/heads/*:refs/remotes/spearce/*\n");
356 public void testSaveRemoveLastURI() throws Exception
{
357 writeConfig("[remote \"spearce\"]\n"
358 + "url = http://www.spearce.org/egit.git\n"
359 + "url = /some/dir\n"
360 + "fetch = +refs/heads/*:refs/remotes/spearce/*\n");
362 final RemoteConfig rc
= new RemoteConfig(db
.getConfig(), "spearce");
363 assertEquals(2, rc
.getURIs().size());
364 rc
.removeURI(new URIish("/some/dir"));
365 assertEquals(1, rc
.getURIs().size());
366 rc
.update(db
.getConfig());
367 db
.getConfig().save();
369 checkFile(new File(db
.getDirectory(), "config"), "[core]\n"
370 + "\trepositoryformatversion = 0\n" + "\tfilemode = true\n"
371 + "[remote \"spearce\"]\n"
372 + "\turl = http://www.spearce.org/egit.git\n"
373 + "\tfetch = +refs/heads/*:refs/remotes/spearce/*\n");
376 public void testSaveRemoveFirstURI() throws Exception
{
377 writeConfig("[remote \"spearce\"]\n"
378 + "url = http://www.spearce.org/egit.git\n"
379 + "url = /some/dir\n"
380 + "fetch = +refs/heads/*:refs/remotes/spearce/*\n");
382 final RemoteConfig rc
= new RemoteConfig(db
.getConfig(), "spearce");
383 assertEquals(2, rc
.getURIs().size());
384 rc
.removeURI(new URIish("http://www.spearce.org/egit.git"));
385 assertEquals(1, rc
.getURIs().size());
386 rc
.update(db
.getConfig());
387 db
.getConfig().save();
389 checkFile(new File(db
.getDirectory(), "config"), "[core]\n"
390 + "\trepositoryformatversion = 0\n" + "\tfilemode = true\n"
391 + "[remote \"spearce\"]\n" + "\turl = /some/dir\n"
392 + "\tfetch = +refs/heads/*:refs/remotes/spearce/*\n");
395 public void testSaveNoTags() throws Exception
{
396 final RemoteConfig rc
= new RemoteConfig(db
.getConfig(), "origin");
397 rc
.addURI(new URIish("/some/dir"));
398 rc
.addFetchRefSpec(new RefSpec("+refs/heads/*:refs/remotes/"
399 + rc
.getName() + "/*"));
400 rc
.setTagOpt(TagOpt
.NO_TAGS
);
401 rc
.update(db
.getConfig());
402 db
.getConfig().save();
404 checkFile(new File(db
.getDirectory(), "config"), "[core]\n"
405 + "\trepositoryformatversion = 0\n" + "\tfilemode = true\n"
406 + "[remote \"origin\"]\n" + "\turl = /some/dir\n"
407 + "\tfetch = +refs/heads/*:refs/remotes/origin/*\n"
408 + "\ttagopt = --no-tags\n");
411 public void testSaveAllTags() throws Exception
{
412 final RemoteConfig rc
= new RemoteConfig(db
.getConfig(), "origin");
413 rc
.addURI(new URIish("/some/dir"));
414 rc
.addFetchRefSpec(new RefSpec("+refs/heads/*:refs/remotes/"
415 + rc
.getName() + "/*"));
416 rc
.setTagOpt(TagOpt
.FETCH_TAGS
);
417 rc
.update(db
.getConfig());
418 db
.getConfig().save();
420 checkFile(new File(db
.getDirectory(), "config"), "[core]\n"
421 + "\trepositoryformatversion = 0\n" + "\tfilemode = true\n"
422 + "[remote \"origin\"]\n" + "\turl = /some/dir\n"
423 + "\tfetch = +refs/heads/*:refs/remotes/origin/*\n"
424 + "\ttagopt = --tags\n");