public async Task <string> CloneAsync(string repoUrl, string targetParentFolderPath) { Directory.CreateDirectory(targetParentFolderPath); string localTemplateFolder = GetClonedFolder(repoUrl, targetParentFolderPath); if (Directory.Exists(localTemplateFolder)) { ShellUtils.DeleteDirectory(localTemplateFolder); } var arguments = new string[] { "clone", repoUrl }; using (var output = ProcessOutput.Run(_gitExeFilePath, arguments, targetParentFolderPath, null, false, _redirector)) { await output; var r = new ProcessOutputResult() { ExeFileName = _gitExeFilePath, ExitCode = output.ExitCode, }; if (r.ExitCode < 0) { throw new ProcessException(r); } if (!Directory.Exists(localTemplateFolder)) { throw new ProcessException(r); } return(localTemplateFolder); } }
public Task DeleteTemplateAsync(TemplateViewModel template) { try { string remote = template.RemoteUrl; _outputWindow.WriteLine(string.Format(CultureInfo.CurrentUICulture, Strings.DeletingTemplateStarted, template.ClonedPath)); ShellUtils.DeleteDirectory(template.ClonedPath); _outputWindow.WriteLine(string.Empty); _outputWindow.WriteLine(string.Format(CultureInfo.CurrentUICulture, Strings.DeletingTemplateSuccess, template.ClonedPath)); _outputWindow.ShowAndActivate(); ReportTemplateEvent(CookiecutterTelemetry.TelemetryArea.Template, CookiecutterTelemetry.TemplateEvents.Delete, template); if (!string.IsNullOrEmpty(remote)) { var t = Installed.Templates.SingleOrDefault(current => (current as TemplateViewModel)?.RemoteUrl == remote) as TemplateViewModel; if (t != null) { Installed.Templates.Remove(t); } t = Recommended.Templates.SingleOrDefault(current => (current as TemplateViewModel)?.RemoteUrl == remote) as TemplateViewModel; if (t != null) { t.ClonedPath = string.Empty; } t = GitHub.Templates.SingleOrDefault(current => (current as TemplateViewModel)?.RemoteUrl == remote) as TemplateViewModel; if (t != null) { t.ClonedPath = string.Empty; } } else { if (Installed.Templates.Contains(template)) { Installed.Templates.Remove(template); } } } catch (Exception ex) when(!ex.IsCriticalException()) { _outputWindow.WriteErrorLine(ex.Message); _outputWindow.WriteLine(string.Empty); _outputWindow.WriteLine(string.Format(CultureInfo.CurrentUICulture, Strings.DeletingTemplateFailed, template.ClonedPath)); _outputWindow.ShowAndActivate(); ReportTemplateEvent(CookiecutterTelemetry.TelemetryArea.Template, CookiecutterTelemetry.TemplateEvents.Delete, template, ex); } return(Task.CompletedTask); }
public async Task DeleteTemplateAsync(string repoPath) { if (_cache == null) { await BuildCacheAsync(); } ShellUtils.DeleteDirectory(repoPath); _cache.RemoveAll(t => PathUtils.IsSameDirectory(t.LocalFolderPath, repoPath)); }
public async Task <Tuple <string, ProcessOutputResult> > CloneAsync(string repoUrl, string targetParentFolderPath) { Directory.CreateDirectory(targetParentFolderPath); string localTemplateFolder = GetClonedFolder(repoUrl, targetParentFolderPath); if (Directory.Exists(localTemplateFolder)) { ShellUtils.DeleteDirectory(localTemplateFolder); } var arguments = new string[] { "clone", repoUrl }; var output = ProcessOutput.Run(_gitExeFilePath, arguments, targetParentFolderPath, null, false, null); using (output) { await output; var r = new ProcessOutputResult() { ExeFileName = _gitExeFilePath, ExitCode = output.ExitCode, StandardOutputLines = output.StandardOutputLines.ToArray(), StandardErrorLines = output.StandardErrorLines.ToArray(), }; if (r.ExitCode < 0) { throw new ProcessException(r); } if (!Directory.Exists(localTemplateFolder)) { throw new ProcessException(r); } return(Tuple.Create(localTemplateFolder, r)); } }
public async Task <string> CloneAsync(string repoUrl, string targetParentFolderPath) { Directory.CreateDirectory(targetParentFolderPath); string localTemplateFolder = GetClonedFolder(repoUrl, targetParentFolderPath); if (Directory.Exists(localTemplateFolder)) { ShellUtils.DeleteDirectory(localTemplateFolder); } // Ensure we always capture the output, because we need to check for errors in stderr var stdOut = new List <string>(); var stdErr = new List <string>(); Redirector redirector; if (_redirector != null) { redirector = new TeeRedirector(_redirector, new ListRedirector(stdOut, stdErr)); } else { redirector = new ListRedirector(stdOut, stdErr); } var arguments = new string[] { "clone", repoUrl }; using (var output = ProcessOutput.Run(_gitExeFilePath, arguments, targetParentFolderPath, GetEnvironment(), false, redirector)) { await output; var r = new ProcessOutputResult() { ExeFileName = _gitExeFilePath, ExitCode = output.ExitCode, StandardOutputLines = stdOut.ToArray(), StandardErrorLines = stdErr.ToArray(), }; if (output.ExitCode < 0 || HasFatalError(stdErr)) { if (Directory.Exists(localTemplateFolder)) { // Don't leave a failed clone on disk try { ShellUtils.DeleteDirectory(localTemplateFolder); } catch (Exception ex) when(!ex.IsCriticalException()) { } } throw new ProcessException(r); } if (!Directory.Exists(localTemplateFolder)) { throw new ProcessException(r); } return(localTemplateFolder); } }