/// <exception cref="NGit.Api.Errors.GitAPIException"></exception>
 public override ICollection <string> Call()
 {
     CheckCallable();
     try
     {
         SubmoduleWalk generator = SubmoduleWalk.ForIndex(repo);
         if (!paths.IsEmpty())
         {
             generator.SetFilter(PathFilterGroup.CreateFromStrings(paths));
         }
         StoredConfig   config      = repo.GetConfig();
         IList <string> initialized = new AList <string>();
         while (generator.Next())
         {
             // Ignore entry if URL is already present in config file
             if (generator.GetConfigUrl() != null)
             {
                 continue;
             }
             string path = generator.GetPath();
             // Copy 'url' and 'update' fields from .gitmodules to config
             // file
             string url    = generator.GetRemoteUrl();
             string update = generator.GetModulesUpdate();
             if (url != null)
             {
                 config.SetString(ConfigConstants.CONFIG_SUBMODULE_SECTION, path, ConfigConstants.
                                  CONFIG_KEY_URL, url);
             }
             if (update != null)
             {
                 config.SetString(ConfigConstants.CONFIG_SUBMODULE_SECTION, path, ConfigConstants.
                                  CONFIG_KEY_UPDATE, update);
             }
             if (url != null || update != null)
             {
                 initialized.AddItem(path);
             }
         }
         // Save repository config if any values were updated
         if (!initialized.IsEmpty())
         {
             config.Save();
         }
         return(initialized);
     }
     catch (IOException e)
     {
         throw new JGitInternalException(e.Message, e);
     }
     catch (ConfigInvalidException e)
     {
         throw new JGitInternalException(e.Message, e);
     }
 }
 /// <exception cref="NGit.Api.Errors.GitAPIException"></exception>
 public override IDictionary <string, string> Call()
 {
     CheckCallable();
     try
     {
         SubmoduleWalk generator = SubmoduleWalk.ForIndex(repo);
         if (!paths.IsEmpty())
         {
             generator.SetFilter(PathFilterGroup.CreateFromStrings(paths));
         }
         IDictionary <string, string> synced = new Dictionary <string, string>();
         StoredConfig config = repo.GetConfig();
         while (generator.Next())
         {
             string remoteUrl = generator.GetRemoteUrl();
             if (remoteUrl == null)
             {
                 continue;
             }
             string path = generator.GetPath();
             config.SetString(ConfigConstants.CONFIG_SUBMODULE_SECTION, path, ConfigConstants.
                              CONFIG_KEY_URL, remoteUrl);
             synced.Put(path, remoteUrl);
             Repository subRepo = generator.GetRepository();
             if (subRepo == null)
             {
                 continue;
             }
             StoredConfig subConfig;
             string       branch;
             try
             {
                 subConfig = subRepo.GetConfig();
                 // Get name of remote associated with current branch and
                 // fall back to default remote name as last resort
                 branch = GetHeadBranch(subRepo);
                 string remote = null;
                 if (branch != null)
                 {
                     remote = subConfig.GetString(ConfigConstants.CONFIG_BRANCH_SECTION, branch, ConfigConstants
                                                  .CONFIG_KEY_REMOTE);
                 }
                 if (remote == null)
                 {
                     remote = Constants.DEFAULT_REMOTE_NAME;
                 }
                 subConfig.SetString(ConfigConstants.CONFIG_REMOTE_SECTION, remote, ConfigConstants
                                     .CONFIG_KEY_URL, remoteUrl);
                 subConfig.Save();
             }
             finally
             {
                 subRepo.Close();
             }
         }
         if (!synced.IsEmpty())
         {
             config.Save();
         }
         return(synced);
     }
     catch (IOException e)
     {
         throw new JGitInternalException(e.Message, e);
     }
     catch (ConfigInvalidException e)
     {
         throw new JGitInternalException(e.Message, e);
     }
 }