]> source.dussan.org Git - jgit.git/commitdiff
Load .gitmodules config before adding values to it 25/5225/2
authorSascha Scholz <sascha.scholz@gmail.com>
Fri, 2 Mar 2012 17:31:09 +0000 (09:31 -0800)
committerKevin Sawicki <kevin@github.com>
Fri, 2 Mar 2012 17:31:09 +0000 (09:31 -0800)
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>
org.eclipse.jgit.test/tst/org/eclipse/jgit/submodule/SubmoduleAddTest.java
org.eclipse.jgit/src/org/eclipse/jgit/api/SubmoduleAddCommand.java

index dee2accf2403aa4ad737c15305544c3ea34174ba..4c5a2c1381626aa781c209a2b7ce9529e3a463b5 100644 (file)
@@ -66,6 +66,7 @@ import org.eclipse.jgit.lib.ObjectId;
 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 class SubmoduleAddTest extends RepositoryTestCase {
                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));
+       }
 }
\ No newline at end of file
index e1b293c43da76171eba47e613b0be61678bd9217..a983134fe460d37ea31dc0045500d1d4fec696d8 100644 (file)
@@ -49,6 +49,7 @@ import java.text.MessageFormat;
 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 class SubmoduleAddCommand extends
                // 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);