Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        public async Task DeleteTemplateAsync(string repoPath)
        {
            if (_cache == null)
            {
                await BuildCacheAsync();
            }

            ShellUtils.DeleteDirectory(repoPath);

            _cache.RemoveAll(t => PathUtils.IsSameDirectory(t.LocalFolderPath, repoPath));
        }
Ejemplo n.º 4
0
        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));
            }
        }
Ejemplo n.º 5
0
        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);
            }
        }