public bool CreateLatestTag(TagCommandOptions options) { bool ok; var user = options.User.Text ?? Svn.DefaultUser; var pass = options.Pass.Text ?? Svn.DefaultPass; var remote = new SvnRemote(user, pass); var workcopy = new SvnWorkcopy(".", user, pass); var uri = workcopy.GetInfo(Properties.Url); var tagNames = remote.GetTagNames(uri, "HEAD"); if (options.PreRelease.On) { var regex = new Regex($@"^\d+.\d+.\d+-{options.PreRelease.Text}\d*$"); tagNames = tagNames.Where(x => regex.IsMatch(x)).ToArray(); } else { var regex = new Regex(@"^\d+.\d+.\d+$"); tagNames = tagNames.Where(x => regex.IsMatch(x)).ToArray(); } var maxTag = SemVer.GetMaxVersion(tagNames); if (maxTag == null) { return(Prompt.PrintCannotContinue("Não foram encontradas tags válidas na pasta: /tags")); } var tagsUri = remote.MakeSpecialFolderUri(uri, $"tags/{maxTag}"); var tagsLatest = remote.MakeSpecialFolderUri(uri, $"tags/latest"); if (options.PreRelease.On) { tagsLatest = $"{tagsLatest}-{options.PreRelease.Text}"; } if (remote.Exists(tagsLatest, "HEAD")) { ok = remote.Remove(tagsLatest, "Descartando a revisão \"latest\" para ser recriada."); if (!ok) { return(Prompt.PrintCannotContinue()); } } ok = remote.Copy(tagsUri, tagsLatest, "HEAD", $"Criando a revisão \"latest\" com base na revisão {maxTag}"); if (!ok) { return(Prompt.PrintCannotContinue()); } return(true); }