Load .gitmodules config before adding values to it

This prevents existing entries from being cleared when the
.gitmodules config is saved after the new submodule configuration
is added.

Change-Id: I66841f5e758a7527e2e6e25cf1318e5fea91a909
Signed-off-by: Kevin Sawicki <kevin@github.com>
This commit is contained in:
Sascha Scholz 2012-03-02 09:31:09 -08:00 committed by Kevin Sawicki
parent 1515d7b7d5
commit a1f877e312
2 changed files with 49 additions and 4 deletions

View File

@ -66,6 +66,7 @@
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryTestCase;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.storage.file.FileBasedConfig;
import org.junit.Test;
/**
@ -212,4 +213,44 @@ public void addSubmoduleWithRelativeUri() throws Exception {
assertTrue(status.getAdded().contains(Constants.DOT_GIT_MODULES));
assertTrue(status.getAdded().contains(path));
}
@Test
public void addSubmoduleWithExistingSubmoduleDefined() throws Exception {
String path1 = "sub1";
String url1 = "git://server/repo1.git";
String path2 = "sub2";
FileBasedConfig modulesConfig = new FileBasedConfig(new File(
db.getWorkTree(), Constants.DOT_GIT_MODULES), db.getFS());
modulesConfig.setString(ConfigConstants.CONFIG_SUBMODULE_SECTION,
path1, ConfigConstants.CONFIG_KEY_PATH, path1);
modulesConfig.setString(ConfigConstants.CONFIG_SUBMODULE_SECTION,
path1, ConfigConstants.CONFIG_KEY_URL, url1);
modulesConfig.save();
Git git = new Git(db);
writeTrashFile("file.txt", "content");
git.add().addFilepattern("file.txt").call();
assertNotNull(git.commit().setMessage("create file").call());
SubmoduleAddCommand command = new SubmoduleAddCommand(db);
command.setPath(path2);
String url2 = db.getDirectory().toURI().toString();
command.setURI(url2);
assertNotNull(command.call());
modulesConfig.load();
assertEquals(path1, modulesConfig.getString(
ConfigConstants.CONFIG_SUBMODULE_SECTION, path1,
ConfigConstants.CONFIG_KEY_PATH));
assertEquals(url1, modulesConfig.getString(
ConfigConstants.CONFIG_SUBMODULE_SECTION, path1,
ConfigConstants.CONFIG_KEY_URL));
assertEquals(path2, modulesConfig.getString(
ConfigConstants.CONFIG_SUBMODULE_SECTION, path2,
ConfigConstants.CONFIG_KEY_PATH));
assertEquals(url2, modulesConfig.getString(
ConfigConstants.CONFIG_SUBMODULE_SECTION, path2,
ConfigConstants.CONFIG_KEY_URL));
}
}

View File

@ -49,6 +49,7 @@
import org.eclipse.jgit.JGitText;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.api.errors.NoFilepatternException;
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.lib.ConfigConstants;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.NullProgressMonitor;
@ -177,14 +178,17 @@ public Repository call() throws JGitInternalException {
// Save path and URL to parent repository's .gitmodules file
FileBasedConfig modulesConfig = new FileBasedConfig(new File(
repo.getWorkTree(), Constants.DOT_GIT_MODULES), repo.getFS());
modulesConfig.setString(ConfigConstants.CONFIG_SUBMODULE_SECTION, path,
ConfigConstants.CONFIG_KEY_PATH, path);
modulesConfig.setString(ConfigConstants.CONFIG_SUBMODULE_SECTION, path,
ConfigConstants.CONFIG_KEY_URL, uri);
try {
modulesConfig.load();
modulesConfig.setString(ConfigConstants.CONFIG_SUBMODULE_SECTION,
path, ConfigConstants.CONFIG_KEY_PATH, path);
modulesConfig.setString(ConfigConstants.CONFIG_SUBMODULE_SECTION,
path, ConfigConstants.CONFIG_KEY_URL, uri);
modulesConfig.save();
} catch (IOException e) {
throw new JGitInternalException(e.getMessage(), e);
} catch (ConfigInvalidException e) {
throw new JGitInternalException(e.getMessage(), e);
}
AddCommand add = new AddCommand(repo);