1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129 |
- /*
- * Copyright (C) 2014, Google Inc.
- * and other copyright owners as documented in the project's IP log.
- *
- * This program and the accompanying materials are made available
- * under the terms of the Eclipse Distribution License v1.0 which
- * accompanies this distribution, is reproduced below, and is
- * available at http://www.eclipse.org/org/documents/edl-v10.php
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or
- * without modification, are permitted provided that the following
- * conditions are met:
- *
- * - Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials provided
- * with the distribution.
- *
- * - Neither the name of the Eclipse Foundation, Inc. nor the
- * names of its contributors may be used to endorse or promote
- * products derived from this software without specific prior
- * written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- package org.eclipse.jgit.gitrepo;
-
- import static java.nio.charset.StandardCharsets.UTF_8;
- import static org.junit.Assert.assertEquals;
- import static org.junit.Assert.assertFalse;
- import static org.junit.Assert.assertNull;
- import static org.junit.Assert.assertTrue;
- import static org.junit.Assert.fail;
-
- import java.io.BufferedReader;
- import java.io.ByteArrayInputStream;
- import java.io.File;
- import java.io.FileReader;
- import java.io.IOException;
- import java.net.URI;
- import java.util.HashMap;
- import java.util.Map;
-
- import org.eclipse.jgit.api.Git;
- import org.eclipse.jgit.api.errors.GitAPIException;
- import org.eclipse.jgit.api.errors.InvalidRemoteException;
- import org.eclipse.jgit.api.errors.RefNotFoundException;
- import org.eclipse.jgit.junit.JGitTestUtil;
- import org.eclipse.jgit.junit.RepositoryTestCase;
- import org.eclipse.jgit.lib.BlobBasedConfig;
- import org.eclipse.jgit.lib.Config;
- import org.eclipse.jgit.lib.Constants;
- import org.eclipse.jgit.lib.ObjectId;
- import org.eclipse.jgit.lib.ObjectReader;
- import org.eclipse.jgit.lib.Ref;
- import org.eclipse.jgit.lib.Repository;
- import org.eclipse.jgit.revwalk.RevCommit;
- import org.eclipse.jgit.storage.file.FileBasedConfig;
- import org.eclipse.jgit.util.FS;
- import org.junit.Test;
-
- public class RepoCommandTest extends RepositoryTestCase {
-
- private static final String BRANCH = "branch";
- private static final String TAG = "release";
-
- private Repository defaultDb;
- private Repository notDefaultDb;
- private Repository groupADb;
- private Repository groupBDb;
-
- private String rootUri;
- private String defaultUri;
- private String notDefaultUri;
- private String groupAUri;
- private String groupBUri;
-
- private ObjectId oldCommitId;
-
- @Override
- public void setUp() throws Exception {
- super.setUp();
-
- defaultDb = createWorkRepository();
- try (Git git = new Git(defaultDb)) {
- JGitTestUtil.writeTrashFile(defaultDb, "hello.txt", "branch world");
- git.add().addFilepattern("hello.txt").call();
- oldCommitId = git.commit().setMessage("Initial commit").call().getId();
- git.checkout().setName(BRANCH).setCreateBranch(true).call();
- git.checkout().setName("master").call();
- git.tag().setName(TAG).call();
- JGitTestUtil.writeTrashFile(defaultDb, "hello.txt", "master world");
- git.add().addFilepattern("hello.txt").call();
- git.commit().setMessage("Second commit").call();
- addRepoToClose(defaultDb);
- }
-
- notDefaultDb = createWorkRepository();
- try (Git git = new Git(notDefaultDb)) {
- JGitTestUtil.writeTrashFile(notDefaultDb, "world.txt", "hello");
- git.add().addFilepattern("world.txt").call();
- git.commit().setMessage("Initial commit").call();
- addRepoToClose(notDefaultDb);
- }
-
- groupADb = createWorkRepository();
- try (Git git = new Git(groupADb)) {
- JGitTestUtil.writeTrashFile(groupADb, "a.txt", "world");
- git.add().addFilepattern("a.txt").call();
- git.commit().setMessage("Initial commit").call();
- addRepoToClose(groupADb);
- }
-
- groupBDb = createWorkRepository();
- try (Git git = new Git(groupBDb)) {
- JGitTestUtil.writeTrashFile(groupBDb, "b.txt", "world");
- git.add().addFilepattern("b.txt").call();
- git.commit().setMessage("Initial commit").call();
- addRepoToClose(groupBDb);
- }
-
- resolveRelativeUris();
- }
-
- class IndexedRepos implements RepoCommand.RemoteReader {
- Map<String, Repository> uriRepoMap;
- IndexedRepos() {
- uriRepoMap = new HashMap<>();
- }
-
- void put(String u, Repository r) {
- uriRepoMap.put(u, r);
- }
-
- @Override
- public ObjectId sha1(String uri, String refname) throws GitAPIException {
- if (!uriRepoMap.containsKey(uri)) {
- return null;
- }
-
- Repository r = uriRepoMap.get(uri);
- try {
- Ref ref = r.findRef(refname);
- if (ref == null) return null;
-
- ref = r.peel(ref);
- ObjectId id = ref.getObjectId();
- return id;
- } catch (IOException e) {
- throw new InvalidRemoteException("", e);
- }
- }
-
- @Override
- public byte[] readFile(String uri, String refName, String path)
- throws GitAPIException, IOException {
- Repository repo = uriRepoMap.get(uri);
-
- String idStr = refName + ":" + path;
- ObjectId id = repo.resolve(idStr);
- if (id == null) {
- throw new RefNotFoundException(
- String.format("repo %s does not have %s", repo.toString(), idStr));
- }
- try (ObjectReader reader = repo.newObjectReader()) {
- return reader.open(id).getCachedBytes(Integer.MAX_VALUE);
- }
- }
- }
-
- @Test
- public void androidSetup() throws Exception {
- Repository child = Git.cloneRepository()
- .setURI(groupADb.getDirectory().toURI().toString())
- .setDirectory(createUniqueTestGitDir(true)).setBare(true).call()
- .getRepository();
-
- Repository dest = Git.cloneRepository()
- .setURI(db.getDirectory().toURI().toString())
- .setDirectory(createUniqueTestGitDir(true)).setBare(true).call()
- .getRepository();
-
- assertTrue(dest.isBare());
- assertTrue(child.isBare());
-
- StringBuilder xmlContent = new StringBuilder();
- xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
- .append("<manifest>")
- .append("<remote name=\"remote1\" fetch=\"..\" />")
- .append("<default revision=\"master\" remote=\"remote1\" />")
- .append("<project path=\"base\" name=\"platform/base\" />")
- .append("</manifest>");
- RepoCommand cmd = new RepoCommand(dest);
-
- IndexedRepos repos = new IndexedRepos();
- repos.put("platform/base", child);
-
- RevCommit commit = cmd
- .setInputStream(new ByteArrayInputStream(
- xmlContent.toString().getBytes(UTF_8)))
- .setRemoteReader(repos)
- .setURI("platform/")
- .setTargetURI("platform/superproject")
- .setRecordRemoteBranch(true)
- .setRecordSubmoduleLabels(true)
- .call();
-
- String idStr = commit.getId().name() + ":" + ".gitmodules";
- ObjectId modId = dest.resolve(idStr);
-
- try (ObjectReader reader = dest.newObjectReader()) {
- byte[] bytes = reader.open(modId).getCachedBytes(Integer.MAX_VALUE);
- Config base = new Config();
- BlobBasedConfig cfg = new BlobBasedConfig(base, bytes);
- String subUrl = cfg.getString("submodule", "base", "url");
- assertEquals(subUrl, "../base");
- }
-
- child.close();
- dest.close();
- }
-
- @Test
- public void gerritSetup() throws Exception {
- Repository child =
- Git.cloneRepository().setURI(groupADb.getDirectory().toURI().toString())
- .setDirectory(createUniqueTestGitDir(true))
- .setBare(true).call().getRepository();
-
- Repository dest = Git.cloneRepository()
- .setURI(db.getDirectory().toURI().toString()).setDirectory(createUniqueTestGitDir(true))
- .setBare(true).call().getRepository();
-
- assertTrue(dest.isBare());
- assertTrue(child.isBare());
-
- StringBuilder xmlContent = new StringBuilder();
- xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
- .append("<manifest>")
- .append("<remote name=\"remote1\" fetch=\".\" />")
- .append("<default revision=\"master\" remote=\"remote1\" />")
- .append("<project path=\"plugins/cookbook\" name=\"plugins/cookbook\" />")
- .append("</manifest>");
- RepoCommand cmd = new RepoCommand(dest);
-
- IndexedRepos repos = new IndexedRepos();
- repos.put("plugins/cookbook", child);
-
- RevCommit commit = cmd
- .setInputStream(new ByteArrayInputStream(xmlContent.toString().getBytes(UTF_8)))
- .setRemoteReader(repos)
- .setURI("")
- .setTargetURI("gerrit")
- .setRecordRemoteBranch(true)
- .setRecordSubmoduleLabels(true)
- .call();
-
- String idStr = commit.getId().name() + ":" + ".gitmodules";
- ObjectId modId = dest.resolve(idStr);
-
- try (ObjectReader reader = dest.newObjectReader()) {
- byte[] bytes = reader.open(modId).getCachedBytes(Integer.MAX_VALUE);
- Config base = new Config();
- BlobBasedConfig cfg = new BlobBasedConfig(base, bytes);
- String subUrl = cfg.getString("submodule", "plugins/cookbook", "url");
- assertEquals(subUrl, "../plugins/cookbook");
- }
-
- child.close();
- dest.close();
- }
-
- @Test
- public void absoluteRemoteURL() throws Exception {
- Repository child =
- Git.cloneRepository().setURI(groupADb.getDirectory().toURI().toString())
- .setDirectory(createUniqueTestGitDir(true))
- .setBare(true).call().getRepository();
- Repository dest = Git.cloneRepository()
- .setURI(db.getDirectory().toURI().toString()).setDirectory(createUniqueTestGitDir(true))
- .setBare(true).call().getRepository();
- String abs = "https://chromium.googlesource.com";
- String repoUrl = "https://chromium.googlesource.com/chromium/src";
- boolean fetchSlash = false;
- boolean baseSlash = false;
- do {
- do {
- String fetchUrl = fetchSlash ? abs + "/" : abs;
- String baseUrl = baseSlash ? abs + "/" : abs;
-
- StringBuilder xmlContent = new StringBuilder();
- xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
- .append("<manifest>")
- .append("<remote name=\"origin\" fetch=\"" + fetchUrl + "\" />")
- .append("<default revision=\"master\" remote=\"origin\" />")
- .append("<project path=\"src\" name=\"chromium/src\" />")
- .append("</manifest>");
- RepoCommand cmd = new RepoCommand(dest);
-
- IndexedRepos repos = new IndexedRepos();
- repos.put(repoUrl, child);
-
- RevCommit commit = cmd
- .setInputStream(new ByteArrayInputStream(xmlContent.toString().getBytes(UTF_8)))
- .setRemoteReader(repos)
- .setURI(baseUrl)
- .setTargetURI("gerrit")
- .setRecordRemoteBranch(true)
- .setRecordSubmoduleLabels(true)
- .call();
-
- String idStr = commit.getId().name() + ":" + ".gitmodules";
- ObjectId modId = dest.resolve(idStr);
-
- try (ObjectReader reader = dest.newObjectReader()) {
- byte[] bytes = reader.open(modId).getCachedBytes(Integer.MAX_VALUE);
- Config base = new Config();
- BlobBasedConfig cfg = new BlobBasedConfig(base, bytes);
- String subUrl = cfg.getString("submodule", "src", "url");
- assertEquals("https://chromium.googlesource.com/chromium/src", subUrl);
- }
- fetchSlash = !fetchSlash;
- } while (fetchSlash);
- baseSlash = !baseSlash;
- } while (baseSlash);
- child.close();
- dest.close();
- }
-
- @Test
- public void testAddRepoManifest() throws Exception {
- StringBuilder xmlContent = new StringBuilder();
- xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
- .append("<manifest>")
- .append("<remote name=\"remote1\" fetch=\".\" />")
- .append("<default revision=\"master\" remote=\"remote1\" />")
- .append("<project path=\"foo\" name=\"")
- .append(defaultUri)
- .append("\" />")
- .append("</manifest>");
- writeTrashFile("manifest.xml", xmlContent.toString());
- RepoCommand command = new RepoCommand(db);
- command.setPath(db.getWorkTree().getAbsolutePath() + "/manifest.xml")
- .setURI(rootUri)
- .call();
- File hello = new File(db.getWorkTree(), "foo/hello.txt");
- assertTrue("submodule should be checked out", hello.exists());
- BufferedReader reader = new BufferedReader(new FileReader(hello));
- String content = reader.readLine();
- reader.close();
- assertEquals("submodule content should be as expected",
- "master world", content);
- }
-
- @Test
- public void testRepoManifestGroups() throws Exception {
- StringBuilder xmlContent = new StringBuilder();
- xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
- .append("<manifest>")
- .append("<remote name=\"remote1\" fetch=\".\" />")
- .append("<default revision=\"master\" remote=\"remote1\" />")
- .append("<project path=\"foo\" name=\"")
- .append(defaultUri)
- .append("\" groups=\"a,test\" />")
- .append("<project path=\"bar\" name=\"")
- .append(notDefaultUri)
- .append("\" groups=\"notdefault\" />")
- .append("<project path=\"a\" name=\"")
- .append(groupAUri)
- .append("\" groups=\"a\" />")
- .append("<project path=\"b\" name=\"")
- .append(groupBUri)
- .append("\" groups=\"b\" />")
- .append("</manifest>");
-
- // default should have foo, a & b
- Repository localDb = createWorkRepository();
- JGitTestUtil.writeTrashFile(
- localDb, "manifest.xml", xmlContent.toString());
- RepoCommand command = new RepoCommand(localDb);
- command
- .setPath(localDb.getWorkTree().getAbsolutePath() + "/manifest.xml")
- .setURI(rootUri)
- .call();
- File file = new File(localDb.getWorkTree(), "foo/hello.txt");
- assertTrue("default should have foo", file.exists());
- file = new File(localDb.getWorkTree(), "bar/world.txt");
- assertFalse("default shouldn't have bar", file.exists());
- file = new File(localDb.getWorkTree(), "a/a.txt");
- assertTrue("default should have a", file.exists());
- file = new File(localDb.getWorkTree(), "b/b.txt");
- assertTrue("default should have b", file.exists());
-
- // all,-a should have bar & b
- localDb = createWorkRepository();
- JGitTestUtil.writeTrashFile(
- localDb, "manifest.xml", xmlContent.toString());
- command = new RepoCommand(localDb);
- command
- .setPath(localDb.getWorkTree().getAbsolutePath() + "/manifest.xml")
- .setURI(rootUri)
- .setGroups("all,-a")
- .call();
- file = new File(localDb.getWorkTree(), "foo/hello.txt");
- assertFalse("\"all,-a\" shouldn't have foo", file.exists());
- file = new File(localDb.getWorkTree(), "bar/world.txt");
- assertTrue("\"all,-a\" should have bar", file.exists());
- file = new File(localDb.getWorkTree(), "a/a.txt");
- assertFalse("\"all,-a\" shuoldn't have a", file.exists());
- file = new File(localDb.getWorkTree(), "b/b.txt");
- assertTrue("\"all,-a\" should have b", file.exists());
- }
-
- @Test
- public void testRepoManifestCopyFile() throws Exception {
- Repository localDb = createWorkRepository();
- StringBuilder xmlContent = new StringBuilder();
- xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
- .append("<manifest>")
- .append("<remote name=\"remote1\" fetch=\".\" />")
- .append("<default revision=\"master\" remote=\"remote1\" />")
- .append("<project path=\"foo\" name=\"")
- .append(defaultUri)
- .append("\">")
- .append("<copyfile src=\"hello.txt\" dest=\"Hello\" />")
- .append("</project>")
- .append("</manifest>");
- JGitTestUtil.writeTrashFile(
- localDb, "manifest.xml", xmlContent.toString());
- RepoCommand command = new RepoCommand(localDb);
- command
- .setPath(localDb.getWorkTree().getAbsolutePath() + "/manifest.xml")
- .setURI(rootUri)
- .call();
- // The original file should exist
- File hello = new File(localDb.getWorkTree(), "foo/hello.txt");
- assertTrue("The original file should exist", hello.exists());
- BufferedReader reader = new BufferedReader(new FileReader(hello));
- String content = reader.readLine();
- reader.close();
- assertEquals("The original file should have expected content",
- "master world", content);
- // The dest file should also exist
- hello = new File(localDb.getWorkTree(), "Hello");
- assertTrue("The destination file should exist", hello.exists());
- reader = new BufferedReader(new FileReader(hello));
- content = reader.readLine();
- reader.close();
- assertEquals("The destination file should have expected content",
- "master world", content);
- }
-
- @Test
- public void testBareRepo() throws Exception {
- Repository remoteDb = createBareRepository();
- Repository tempDb = createWorkRepository();
-
- StringBuilder xmlContent = new StringBuilder();
- xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
- .append("<manifest>")
- .append("<remote name=\"remote1\" fetch=\".\" />")
- .append("<default revision=\"master\" remote=\"remote1\" />")
- .append("<project path=\"foo\" name=\"").append(defaultUri)
- .append("\" />").append("</manifest>");
- JGitTestUtil.writeTrashFile(tempDb, "manifest.xml",
- xmlContent.toString());
- RepoCommand command = new RepoCommand(remoteDb);
- command.setPath(
- tempDb.getWorkTree().getAbsolutePath() + "/manifest.xml")
- .setURI(rootUri).call();
- // Clone it
- File directory = createTempDirectory("testBareRepo");
- Repository localDb = Git.cloneRepository().setDirectory(directory)
- .setURI(remoteDb.getDirectory().toURI().toString()).call()
- .getRepository();
- // The .gitmodules file should exist
- File gitmodules = new File(localDb.getWorkTree(), ".gitmodules");
- assertTrue("The .gitmodules file should exist", gitmodules.exists());
- // The first line of .gitmodules file should be expected
- BufferedReader reader = new BufferedReader(new FileReader(gitmodules));
- String content = reader.readLine();
- reader.close();
- assertEquals("The first line of .gitmodules file should be as expected",
- "[submodule \"foo\"]", content);
- // The gitlink should be the same as remote head sha1
- String gitlink = localDb.resolve(Constants.HEAD + ":foo").name();
- localDb.close();
- String remote = defaultDb.resolve(Constants.HEAD).name();
- assertEquals("The gitlink should be the same as remote head", remote,
- gitlink);
- }
-
- @Test
- public void testRevision() throws Exception {
- StringBuilder xmlContent = new StringBuilder();
- xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
- .append("<manifest>")
- .append("<remote name=\"remote1\" fetch=\".\" />")
- .append("<default revision=\"master\" remote=\"remote1\" />")
- .append("<project path=\"foo\" name=\"")
- .append(defaultUri)
- .append("\" revision=\"")
- .append(oldCommitId.name())
- .append("\" />")
- .append("</manifest>");
- writeTrashFile("manifest.xml", xmlContent.toString());
- RepoCommand command = new RepoCommand(db);
- command.setPath(db.getWorkTree().getAbsolutePath() + "/manifest.xml")
- .setURI(rootUri)
- .call();
- File hello = new File(db.getWorkTree(), "foo/hello.txt");
- BufferedReader reader = new BufferedReader(new FileReader(hello));
- String content = reader.readLine();
- reader.close();
- assertEquals("submodule content should be as expected",
- "branch world", content);
- }
-
- @Test
- public void testRevisionBranch() throws Exception {
- StringBuilder xmlContent = new StringBuilder();
- xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
- .append("<manifest>")
- .append("<remote name=\"remote1\" fetch=\".\" />")
- .append("<default revision=\"")
- .append(BRANCH)
- .append("\" remote=\"remote1\" />")
- .append("<project path=\"foo\" name=\"")
- .append(defaultUri)
- .append("\" />")
- .append("</manifest>");
- writeTrashFile("manifest.xml", xmlContent.toString());
- RepoCommand command = new RepoCommand(db);
- command.setPath(db.getWorkTree().getAbsolutePath() + "/manifest.xml")
- .setURI(rootUri)
- .call();
- File hello = new File(db.getWorkTree(), "foo/hello.txt");
- BufferedReader reader = new BufferedReader(new FileReader(hello));
- String content = reader.readLine();
- reader.close();
- assertEquals("submodule content should be as expected",
- "branch world", content);
- }
-
- @Test
- public void testRevisionTag() throws Exception {
- StringBuilder xmlContent = new StringBuilder();
- xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
- .append("<manifest>")
- .append("<remote name=\"remote1\" fetch=\".\" />")
- .append("<default revision=\"master\" remote=\"remote1\" />")
- .append("<project path=\"foo\" name=\"")
- .append(defaultUri)
- .append("\" revision=\"")
- .append(TAG)
- .append("\" />")
- .append("</manifest>");
- writeTrashFile("manifest.xml", xmlContent.toString());
- RepoCommand command = new RepoCommand(db);
- command.setPath(db.getWorkTree().getAbsolutePath() + "/manifest.xml")
- .setURI(rootUri)
- .call();
- File hello = new File(db.getWorkTree(), "foo/hello.txt");
- BufferedReader reader = new BufferedReader(new FileReader(hello));
- String content = reader.readLine();
- reader.close();
- assertEquals("submodule content should be as expected",
- "branch world", content);
- }
-
- @Test
- public void testRevisionBare() throws Exception {
- Repository remoteDb = createBareRepository();
- Repository tempDb = createWorkRepository();
-
- StringBuilder xmlContent = new StringBuilder();
- xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
- .append("<manifest>")
- .append("<remote name=\"remote1\" fetch=\".\" />")
- .append("<default revision=\"").append(BRANCH)
- .append("\" remote=\"remote1\" />")
- .append("<project path=\"foo\" name=\"").append(defaultUri)
- .append("\" />").append("</manifest>");
- JGitTestUtil.writeTrashFile(tempDb, "manifest.xml",
- xmlContent.toString());
- RepoCommand command = new RepoCommand(remoteDb);
- command.setPath(
- tempDb.getWorkTree().getAbsolutePath() + "/manifest.xml")
- .setURI(rootUri).call();
- // Clone it
- File directory = createTempDirectory("testRevisionBare");
- Repository localDb = Git.cloneRepository().setDirectory(directory)
- .setURI(remoteDb.getDirectory().toURI().toString()).call()
- .getRepository();
- // The gitlink should be the same as oldCommitId
- String gitlink = localDb.resolve(Constants.HEAD + ":foo").name();
- localDb.close();
- assertEquals("The gitlink is same as remote head", oldCommitId.name(),
- gitlink);
- }
-
- @Test
- public void testCopyFileBare() throws Exception {
- Repository remoteDb = createBareRepository();
- Repository tempDb = createWorkRepository();
-
- StringBuilder xmlContent = new StringBuilder();
- xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
- .append("<manifest>")
- .append("<remote name=\"remote1\" fetch=\".\" />")
- .append("<default revision=\"master\" remote=\"remote1\" />")
- .append("<project path=\"foo\" name=\"").append(defaultUri)
- .append("\" revision=\"").append(BRANCH).append("\" >")
- .append("<copyfile src=\"hello.txt\" dest=\"Hello\" />")
- .append("<copyfile src=\"hello.txt\" dest=\"foo/Hello\" />")
- .append("</project>").append("</manifest>");
- JGitTestUtil.writeTrashFile(tempDb, "manifest.xml",
- xmlContent.toString());
- RepoCommand command = new RepoCommand(remoteDb);
- command.setPath(
- tempDb.getWorkTree().getAbsolutePath() + "/manifest.xml")
- .setURI(rootUri).call();
- // Clone it
- File directory = createTempDirectory("testCopyFileBare");
- Repository localDb = Git.cloneRepository().setDirectory(directory)
- .setURI(remoteDb.getDirectory().toURI().toString()).call()
- .getRepository();
- // The Hello file should exist
- File hello = new File(localDb.getWorkTree(), "Hello");
- assertTrue("The Hello file should exist", hello.exists());
- // The foo/Hello file should be skipped.
- File foohello = new File(localDb.getWorkTree(), "foo/Hello");
- assertFalse("The foo/Hello file should be skipped", foohello.exists());
- localDb.close();
- // The content of Hello file should be expected
- BufferedReader reader = new BufferedReader(new FileReader(hello));
- String content = reader.readLine();
- reader.close();
- assertEquals("The Hello file should have expected content",
- "branch world", content);
- }
-
- @Test
- public void testReplaceManifestBare() throws Exception {
- Repository remoteDb = createBareRepository();
- Repository tempDb = createWorkRepository();
-
- StringBuilder xmlContent = new StringBuilder();
- xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
- .append("<manifest>")
- .append("<remote name=\"remote1\" fetch=\".\" />")
- .append("<default revision=\"master\" remote=\"remote1\" />")
- .append("<project path=\"foo\" name=\"").append(defaultUri)
- .append("\" revision=\"").append(BRANCH).append("\" >")
- .append("<copyfile src=\"hello.txt\" dest=\"Hello\" />")
- .append("</project>").append("</manifest>");
- JGitTestUtil.writeTrashFile(tempDb, "old.xml", xmlContent.toString());
- RepoCommand command = new RepoCommand(remoteDb);
- command.setPath(tempDb.getWorkTree().getAbsolutePath() + "/old.xml")
- .setURI(rootUri).call();
- xmlContent = new StringBuilder();
- xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
- .append("<manifest>")
- .append("<remote name=\"remote1\" fetch=\".\" />")
- .append("<default revision=\"master\" remote=\"remote1\" />")
- .append("<project path=\"bar\" name=\"").append(defaultUri)
- .append("\" revision=\"").append(BRANCH).append("\" >")
- .append("<copyfile src=\"hello.txt\" dest=\"Hello.txt\" />")
- .append("</project>").append("</manifest>");
- JGitTestUtil.writeTrashFile(tempDb, "new.xml", xmlContent.toString());
- command = new RepoCommand(remoteDb);
- command.setPath(tempDb.getWorkTree().getAbsolutePath() + "/new.xml")
- .setURI(rootUri).call();
- // Clone it
- File directory = createTempDirectory("testReplaceManifestBare");
- Repository localDb = Git.cloneRepository().setDirectory(directory)
- .setURI(remoteDb.getDirectory().toURI().toString()).call()
- .getRepository();
- // The Hello file should not exist
- File hello = new File(localDb.getWorkTree(), "Hello");
- assertFalse("The Hello file shouldn't exist", hello.exists());
- // The Hello.txt file should exist
- File hellotxt = new File(localDb.getWorkTree(), "Hello.txt");
- assertTrue("The Hello.txt file should exist", hellotxt.exists());
- // The .gitmodules file should have 'submodule "bar"' and shouldn't
- // have
- // 'submodule "foo"' lines.
- File dotmodules = new File(localDb.getWorkTree(),
- Constants.DOT_GIT_MODULES);
- localDb.close();
- BufferedReader reader = new BufferedReader(new FileReader(dotmodules));
- boolean foo = false;
- boolean bar = false;
- while (true) {
- String line = reader.readLine();
- if (line == null)
- break;
- if (line.contains("submodule \"foo\""))
- foo = true;
- if (line.contains("submodule \"bar\""))
- bar = true;
- }
- reader.close();
- assertTrue("The bar submodule should exist", bar);
- assertFalse("The foo submodule shouldn't exist", foo);
- }
-
- @Test
- public void testRemoveOverlappingBare() throws Exception {
- Repository remoteDb = createBareRepository();
- Repository tempDb = createWorkRepository();
-
- StringBuilder xmlContent = new StringBuilder();
- xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
- .append("<manifest>")
- .append("<remote name=\"remote1\" fetch=\".\" />")
- .append("<default revision=\"master\" remote=\"remote1\" />")
- .append("<project path=\"foo/bar\" name=\"").append(groupBUri)
- .append("\" />").append("<project path=\"a\" name=\"")
- .append(groupAUri).append("\" />")
- .append("<project path=\"foo\" name=\"").append(defaultUri)
- .append("\" />").append("</manifest>");
- JGitTestUtil.writeTrashFile(tempDb, "manifest.xml",
- xmlContent.toString());
- RepoCommand command = new RepoCommand(remoteDb);
- command.setPath(
- tempDb.getWorkTree().getAbsolutePath() + "/manifest.xml")
- .setURI(rootUri).call();
- // Clone it
- File directory = createTempDirectory("testRemoveOverlappingBare");
- Repository localDb = Git.cloneRepository().setDirectory(directory)
- .setURI(remoteDb.getDirectory().toURI().toString()).call()
- .getRepository();
- // The .gitmodules file should have 'submodule "foo"' and shouldn't
- // have
- // 'submodule "foo/bar"' lines.
- File dotmodules = new File(localDb.getWorkTree(),
- Constants.DOT_GIT_MODULES);
- localDb.close();
- BufferedReader reader = new BufferedReader(new FileReader(dotmodules));
- boolean foo = false;
- boolean foobar = false;
- boolean a = false;
- while (true) {
- String line = reader.readLine();
- if (line == null)
- break;
- if (line.contains("submodule \"foo\""))
- foo = true;
- if (line.contains("submodule \"foo/bar\""))
- foobar = true;
- if (line.contains("submodule \"a\""))
- a = true;
- }
- reader.close();
- assertTrue("The foo submodule should exist", foo);
- assertFalse("The foo/bar submodule shouldn't exist", foobar);
- assertTrue("The a submodule should exist", a);
- }
-
- @Test
- public void testIncludeTag() throws Exception {
- Repository localDb = createWorkRepository();
- Repository tempDb = createWorkRepository();
-
- StringBuilder xmlContent = new StringBuilder();
- xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
- .append("<manifest>")
- .append("<include name=\"_include.xml\" />")
- .append("<default revision=\"master\" remote=\"remote1\" />")
- .append("</manifest>");
- JGitTestUtil.writeTrashFile(
- tempDb, "manifest.xml", xmlContent.toString());
-
- xmlContent = new StringBuilder();
- xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
- .append("<manifest>")
- .append("<remote name=\"remote1\" fetch=\".\" />")
- .append("<default revision=\"master\" remote=\"remote1\" />")
- .append("<project path=\"foo\" name=\"")
- .append(defaultUri)
- .append("\" />")
- .append("</manifest>");
- JGitTestUtil.writeTrashFile(
- tempDb, "_include.xml", xmlContent.toString());
-
- RepoCommand command = new RepoCommand(localDb);
- command
- .setPath(tempDb.getWorkTree().getAbsolutePath() + "/manifest.xml")
- .setURI(rootUri)
- .call();
- File hello = new File(localDb.getWorkTree(), "foo/hello.txt");
- assertTrue("submodule should be checked out", hello.exists());
- BufferedReader reader = new BufferedReader(new FileReader(hello));
- String content = reader.readLine();
- reader.close();
- assertEquals("submodule content should be as expected",
- "master world", content);
- }
-
- @Test
- public void testNonDefaultRemotes() throws Exception {
- StringBuilder xmlContent = new StringBuilder();
- xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
- .append("<manifest>")
- .append("<remote name=\"remote1\" fetch=\".\" />")
- .append("<remote name=\"remote2\" fetch=\"")
- .append(notDefaultUri)
- .append("\" />")
- .append("<default revision=\"master\" remote=\"remote1\" />")
- .append("<project path=\"foo\" name=\"")
- .append(defaultUri)
- .append("\" />")
- .append("<project path=\"bar\" name=\".\" remote=\"remote2\" />")
- .append("</manifest>");
-
- Repository localDb = createWorkRepository();
- JGitTestUtil.writeTrashFile(
- localDb, "manifest.xml", xmlContent.toString());
- RepoCommand command = new RepoCommand(localDb);
- command
- .setPath(localDb.getWorkTree().getAbsolutePath() + "/manifest.xml")
- .setURI(rootUri)
- .call();
- File file = new File(localDb.getWorkTree(), "foo/hello.txt");
- assertTrue("We should have foo", file.exists());
- file = new File(localDb.getWorkTree(), "bar/world.txt");
- assertTrue("We should have bar", file.exists());
- }
-
- @Test
- public void testRemoteAlias() throws Exception {
- StringBuilder xmlContent = new StringBuilder();
- xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
- .append("<manifest>")
- .append("<remote name=\"remote1\" fetch=\".\" alias=\"remote2\" />")
- .append("<default revision=\"master\" remote=\"remote2\" />")
- .append("<project path=\"foo\" name=\"")
- .append(defaultUri)
- .append("\" />")
- .append("</manifest>");
-
- Repository localDb = createWorkRepository();
- JGitTestUtil.writeTrashFile(
- localDb, "manifest.xml", xmlContent.toString());
- RepoCommand command = new RepoCommand(localDb);
- command
- .setPath(localDb.getWorkTree().getAbsolutePath() + "/manifest.xml")
- .setURI(rootUri)
- .call();
- File file = new File(localDb.getWorkTree(), "foo/hello.txt");
- assertTrue("We should have foo", file.exists());
- }
-
- @Test
- public void testTargetBranch() throws Exception {
- Repository remoteDb1 = createBareRepository();
- Repository remoteDb2 = createBareRepository();
- Repository tempDb = createWorkRepository();
-
- StringBuilder xmlContent = new StringBuilder();
- xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
- .append("<manifest>")
- .append("<remote name=\"remote1\" fetch=\".\" />")
- .append("<default revision=\"master\" remote=\"remote1\" />")
- .append("<project path=\"foo\" name=\"").append(defaultUri)
- .append("\" />").append("</manifest>");
- JGitTestUtil.writeTrashFile(tempDb, "manifest.xml",
- xmlContent.toString());
- RepoCommand command = new RepoCommand(remoteDb1);
- command.setPath(
- tempDb.getWorkTree().getAbsolutePath() + "/manifest.xml")
- .setURI(rootUri).setTargetBranch("test").call();
- ObjectId branchId = remoteDb1
- .resolve(Constants.R_HEADS + "test^{tree}");
- command = new RepoCommand(remoteDb2);
- command.setPath(
- tempDb.getWorkTree().getAbsolutePath() + "/manifest.xml")
- .setURI(rootUri).call();
- ObjectId defaultId = remoteDb2.resolve(Constants.HEAD + "^{tree}");
- assertEquals(
- "The tree id of branch db and default db should be the same",
- branchId, defaultId);
- }
-
- @Test
- public void testRecordRemoteBranch() throws Exception {
- Repository remoteDb = createBareRepository();
- Repository tempDb = createWorkRepository();
-
- StringBuilder xmlContent = new StringBuilder();
- xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
- .append("<manifest>")
- .append("<remote name=\"remote1\" fetch=\".\" />")
- .append("<default revision=\"master\" remote=\"remote1\" />")
- .append("<project path=\"with-branch\" ")
- .append("revision=\"master\" ").append("name=\"")
- .append(notDefaultUri).append("\" />")
- .append("<project path=\"with-long-branch\" ")
- .append("revision=\"refs/heads/master\" ").append("name=\"")
- .append(defaultUri).append("\" />").append("</manifest>");
- JGitTestUtil.writeTrashFile(tempDb, "manifest.xml",
- xmlContent.toString());
-
- RepoCommand command = new RepoCommand(remoteDb);
- command.setPath(
- tempDb.getWorkTree().getAbsolutePath() + "/manifest.xml")
- .setURI(rootUri).setRecordRemoteBranch(true).call();
- // Clone it
- File directory = createTempDirectory("testBareRepo");
- try (Repository localDb = Git.cloneRepository().setDirectory(directory)
- .setURI(remoteDb.getDirectory().toURI().toString()).call()
- .getRepository();) {
- // The .gitmodules file should exist
- File gitmodules = new File(localDb.getWorkTree(), ".gitmodules");
- assertTrue("The .gitmodules file should exist",
- gitmodules.exists());
- FileBasedConfig c = new FileBasedConfig(gitmodules, FS.DETECTED);
- c.load();
- assertEquals(
- "Recording remote branches should work for short branch descriptions",
- "master",
- c.getString("submodule", "with-branch", "branch"));
- assertEquals(
- "Recording remote branches should work for full ref specs",
- "refs/heads/master",
- c.getString("submodule", "with-long-branch", "branch"));
- }
- }
-
-
- @Test
- public void testRecordSubmoduleLabels() throws Exception {
- Repository remoteDb = createBareRepository();
- Repository tempDb = createWorkRepository();
-
- StringBuilder xmlContent = new StringBuilder();
- xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
- .append("<manifest>")
- .append("<remote name=\"remote1\" fetch=\".\" />")
- .append("<default revision=\"master\" remote=\"remote1\" />")
- .append("<project path=\"test\" ")
- .append("revision=\"master\" ").append("name=\"")
- .append(notDefaultUri).append("\" ")
- .append("groups=\"a1,a2\" />").append("</manifest>");
- JGitTestUtil.writeTrashFile(tempDb, "manifest.xml",
- xmlContent.toString());
-
- RepoCommand command = new RepoCommand(remoteDb);
- command.setPath(
- tempDb.getWorkTree().getAbsolutePath() + "/manifest.xml")
- .setURI(rootUri).setRecordSubmoduleLabels(true).call();
- // Clone it
- File directory = createTempDirectory("testBareRepo");
- try (Repository localDb = Git.cloneRepository().setDirectory(directory)
- .setURI(remoteDb.getDirectory().toURI().toString()).call()
- .getRepository();) {
- // The .gitattributes file should exist
- File gitattributes = new File(localDb.getWorkTree(),
- ".gitattributes");
- assertTrue("The .gitattributes file should exist",
- gitattributes.exists());
- try (BufferedReader reader = new BufferedReader(
- new FileReader(gitattributes));) {
- String content = reader.readLine();
- assertEquals(".gitattributes content should be as expected",
- "/test a1 a2", content);
- }
- }
- }
-
- @Test
- public void testRecordShallowRecommendation() throws Exception {
- Repository remoteDb = createBareRepository();
- Repository tempDb = createWorkRepository();
-
- StringBuilder xmlContent = new StringBuilder();
- xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
- .append("<manifest>")
- .append("<remote name=\"remote1\" fetch=\".\" />")
- .append("<default revision=\"master\" remote=\"remote1\" />")
- .append("<project path=\"shallow-please\" ").append("name=\"")
- .append(defaultUri).append("\" ").append("clone-depth=\"1\" />")
- .append("<project path=\"non-shallow\" ").append("name=\"")
- .append(defaultUri).append("\" />").append("</manifest>");
- JGitTestUtil.writeTrashFile(tempDb, "manifest.xml",
- xmlContent.toString());
-
- RepoCommand command = new RepoCommand(remoteDb);
- command.setPath(
- tempDb.getWorkTree().getAbsolutePath() + "/manifest.xml")
- .setURI(rootUri).setRecommendShallow(true).call();
- // Clone it
- File directory = createTempDirectory("testBareRepo");
- try (Repository localDb = Git.cloneRepository().setDirectory(directory)
- .setURI(remoteDb.getDirectory().toURI().toString()).call()
- .getRepository();) {
- // The .gitmodules file should exist
- File gitmodules = new File(localDb.getWorkTree(), ".gitmodules");
- assertTrue("The .gitmodules file should exist",
- gitmodules.exists());
- FileBasedConfig c = new FileBasedConfig(gitmodules, FS.DETECTED);
- c.load();
- assertEquals("Recording shallow configuration should work", "true",
- c.getString("submodule", "shallow-please", "shallow"));
- assertNull("Recording non shallow configuration should work",
- c.getString("submodule", "non-shallow", "shallow"));
- }
- }
-
- @Test
- public void testRemoteRevision() throws Exception {
- StringBuilder xmlContent = new StringBuilder();
- xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
- .append("<manifest>")
- .append("<remote name=\"remote1\" fetch=\".\" />")
- .append("<remote name=\"remote2\" fetch=\".\" revision=\"")
- .append(BRANCH)
- .append("\" />")
- .append("<default remote=\"remote1\" revision=\"master\" />")
- .append("<project path=\"foo\" remote=\"remote2\" name=\"")
- .append(defaultUri)
- .append("\" />")
- .append("</manifest>");
- writeTrashFile("manifest.xml", xmlContent.toString());
- RepoCommand command = new RepoCommand(db);
- command.setPath(db.getWorkTree().getAbsolutePath() + "/manifest.xml")
- .setURI(rootUri)
- .call();
- File hello = new File(db.getWorkTree(), "foo/hello.txt");
- BufferedReader reader = new BufferedReader(new FileReader(hello));
- String content = reader.readLine();
- reader.close();
- assertEquals("submodule content should be as expected",
- "branch world", content);
- }
-
- @Test
- public void testDefaultRemoteRevision() throws Exception {
- StringBuilder xmlContent = new StringBuilder();
- xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
- .append("<manifest>")
- .append("<remote name=\"remote1\" fetch=\".\" revision=\"")
- .append(BRANCH)
- .append("\" />")
- .append("<default remote=\"remote1\" />")
- .append("<project path=\"foo\" name=\"")
- .append(defaultUri)
- .append("\" />")
- .append("</manifest>");
- writeTrashFile("manifest.xml", xmlContent.toString());
- RepoCommand command = new RepoCommand(db);
- command.setPath(db.getWorkTree().getAbsolutePath() + "/manifest.xml")
- .setURI(rootUri)
- .call();
- File hello = new File(db.getWorkTree(), "foo/hello.txt");
- BufferedReader reader = new BufferedReader(new FileReader(hello));
- String content = reader.readLine();
- reader.close();
- assertEquals("submodule content should be as expected",
- "branch world", content);
- }
-
- private void resolveRelativeUris() {
- // Find the longest common prefix ends with "/" as rootUri.
- defaultUri = defaultDb.getDirectory().toURI().toString();
- notDefaultUri = notDefaultDb.getDirectory().toURI().toString();
- groupAUri = groupADb.getDirectory().toURI().toString();
- groupBUri = groupBDb.getDirectory().toURI().toString();
- int start = 0;
- while (start <= defaultUri.length()) {
- int newStart = defaultUri.indexOf('/', start + 1);
- String prefix = defaultUri.substring(0, newStart);
- if (!notDefaultUri.startsWith(prefix) ||
- !groupAUri.startsWith(prefix) ||
- !groupBUri.startsWith(prefix)) {
- start++;
- rootUri = defaultUri.substring(0, start) + "manifest";
- defaultUri = defaultUri.substring(start);
- notDefaultUri = notDefaultUri.substring(start);
- groupAUri = groupAUri.substring(start);
- groupBUri = groupBUri.substring(start);
- return;
- }
- start = newStart;
- }
- }
-
- void testRelative(String a, String b, String want) {
- String got = RepoCommand.relativize(URI.create(a), URI.create(b)).toString();
-
- if (!got.equals(want)) {
- fail(String.format("relative('%s', '%s') = '%s', want '%s'", a, b, got, want));
- }
- }
-
- @Test
- public void relative() {
- testRelative("a/b/", "a/", "../");
- // Normalization:
- testRelative("a/p/..//b/", "a/", "../");
- testRelative("a/b", "a/", "");
- testRelative("a/", "a/b/", "b/");
- testRelative("a/", "a/b", "b");
- testRelative("/a/b/c", "/b/c", "../../b/c");
- testRelative("/abc", "bcd", "bcd");
- testRelative("abc", "def", "def");
- testRelative("abc", "/bcd", "/bcd");
- testRelative("http://a", "a/b", "a/b");
- testRelative("http://base.com/a/", "http://child.com/a/b", "http://child.com/a/b");
- }
- }
|