using System.Collections.Generic; using System.Text; using System.Threading.Tasks; namespace SourceGit.Commands { public class Submodule : Command { public Submodule(string repo) { WorkingDirectory = repo; Context = repo; } public async Task AddAsync(string url, string relativePath, bool recursive) { Args = $"-c protocol.file.allow=always submodule add \"{url}\" \"{relativePath}\""; var succ = await ExecAsync().ConfigureAwait(false); if (!succ) return false; if (recursive) { Args = $"submodule update --init --recursive -- \"{relativePath}\""; return await ExecAsync().ConfigureAwait(false); } else { Args = $"submodule update --init -- \"{relativePath}\""; return await ExecAsync().ConfigureAwait(false); } } public async Task SetURL(string path, string url) { Args = $"submodule set-url -- \"{path}\" \"{url}\""; return await ExecAsync().ConfigureAwait(false); } public async Task UpdateAsync(List modules, bool init, bool recursive, bool useRemote = false) { var builder = new StringBuilder(); builder.Append("submodule update"); if (init) builder.Append(" --init"); if (recursive) builder.Append(" --recursive"); if (useRemote) builder.Append(" --remote"); if (modules.Count > 0) { builder.Append(" --"); foreach (var module in modules) builder.Append($" \"{module}\""); } Args = builder.ToString(); return await ExecAsync().ConfigureAwait(false); } public async Task DeinitAsync(string module, bool force) { Args = force ? $"submodule deinit -f -- \"{module}\"" : $"submodule deinit -- \"{module}\""; return await ExecAsync().ConfigureAwait(false); } public async Task DeleteAsync(string module) { Args = $"rm -rf \"{module}\""; return await ExecAsync().ConfigureAwait(false); } } }