Exemplo n.º 1
0
        public bool CreateTag(TagCommandOptions options)
        {
            bool ok;

            var svn = new Svn();

            svn.User = options.User.Text ?? Svn.DefaultUser;
            svn.Pass = options.Pass.Text ?? Svn.DefaultPass;
            ok       = svn.Fill();
            if (!ok)
            {
                return(Prompt.PrintCannotContinue());
            }

            var pack = new Library.PackDm.PackDm();

            pack.PackConf = options.PackConf.Text;
            pack.PackInfo = options.PackInfo.Text;
            ok            = pack.Fill();
            if (!ok)
            {
                return(Prompt.PrintCannotContinue());
            }

            //
            // Validando
            //
            if (svn.IsTag)
            {
                return(Prompt.PrintCannotContinue(
                           "Não é possível criar uma tag a partir de outra tag diretamente.\n"
                           + "O comando deve ser executado a partir de uma pasta trunk ou branch."));
            }

            if (!svn.IsTrunk && !svn.IsBranch)
            {
                return(Prompt.PrintCannotContinue(
                           "O comando deve ser executado a partir de uma pasta trunk ou branch."));
            }

            if (svn.HasChanges && !options.Force.On)
            {
                return(Prompt.PrintCannotContinue(
                           "Existem alterações pendentes:\n"
                           + "---------- SVN STATUS ----------\n"
                           + $"{svn.Changes}\n"
                           + "--------------------------------\n"
                           + "Resolva as pendências do subversion ou use o argumento --force."));
            }

            //
            // Coletando parametros
            //
            var revision = svn.Revision;

            var tagVersion = pack.Version;
            var newVersion = SemVer.IncreaseMinor(tagVersion);

            var relPath = svn.Url.Strip("/(trunk|branches).*");
            var curPath = svn.Url;
            var tagPath = curPath.Replace(relPath, $"/tags/{tagVersion}");

            if (options.PreRelease.On)
            {
                int    rev = 0;
                string version;
                string path;
                do
                {
                    rev++;
                    version = $"{tagVersion}-{options.PreRelease.Text}{rev}";
                    path    = $"{tagPath}-{options.PreRelease.Text}{rev}";
                } while (svn.Exists(path));
                tagVersion = version;
                tagPath    = path;
            }

            //
            // Criando a tag
            //
            ok = svn.Info(pack.PackInfo); // Apenas imprime informacao de revisao no console
            if (!ok)
            {
                return(Prompt.PrintCannotContinue());
            }

            ok = svn.Copy(curPath, tagPath, $"Fechada a tag {tagVersion} a partir da revisão {revision} de {relPath}.");
            if (!ok)
            {
                return(Prompt.PrintCannotContinue());
            }

            ok = EditRevisionInfo(options, tagPath, tagVersion);
            if (!ok)
            {
                return(Prompt.PrintCannotContinue());
            }

            //
            // Incrementando a versao do trunk, se aplicavel
            //
            if (!options.PreRelease.On)
            {
                pack.Version = newVersion;
                pack.Save();
                if (!ok)
                {
                    return(Prompt.PrintCannotContinue());
                }

                ok = svn.Commit(pack.PackInfo, $"Versão de {relPath} incrementada para: {newVersion}");
                if (!ok)
                {
                    return(Prompt.PrintCannotContinue());
                }
            }

            return(true);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Editando os arquivos pack.info e REVISION.txt de uma tag recém criada.
        /// </summary>
        private bool EditRevisionInfo(TagCommandOptions options, string tagPath, string tagVersion)
        {
            var curDir = Directory.GetCurrentDirectory();
            var tmpDir = PathEx.CreateTempFolder();

            try
            {
                bool ok;

                Directory.SetCurrentDirectory(tmpDir);

                var svn = new Svn();
                svn.User = options.User.Text ?? Svn.DefaultUser;
                svn.Pass = options.Pass.Text ?? Svn.DefaultPass;

                ok = svn.Checkout(tagPath, depth: "empty");
                if (!ok)
                {
                    return(Prompt.PrintCannotContinue());
                }

                //ok = svn.Update("pack.info pack.conf REVISION.txt");
                ok = svn.Update("REVISION.txt");
                if (!ok)
                {
                    return(Prompt.PrintCannotContinue());
                }

                //// editando o pack.info
                //{
                //  var pack = new Library.PackDm.PackDm();
                //  pack.PackConf = "pack.conf";
                //  pack.PackInfo = "pack.info";

                //  ok = pack.Fill();
                //  if (!ok) return Prompt.PrintCannotContinue();

                //  pack.Version = tagVersion;

                //  ok = pack.Save();
                //  if (!ok) return Prompt.PrintCannotContinue();
                //}

                // editando o REVISION.txt
                {
                    File.WriteAllText("REVISION.txt", tagVersion);

                    // garantindo o versionmanto do arquivo caso ainda nao exista
                    svn.Add("REVISION.txt");
                }

                //ok = svn.Commit("pack.info pack.conf REVISION.txt", "Atualizando informação de versão da tag recém criada.");
                ok = svn.Commit("REVISION.txt", "Atualizando informação de versão da tag recém criada.");
                if (!ok)
                {
                    return(Prompt.PrintCannotContinue());
                }

                return(true);
            }
            catch (Exception ex)
            {
                Prompt.PrintFault(ex);
                return(false);
            }
            finally
            {
                Directory.SetCurrentDirectory(curDir);
                try
                {
                    PathEx.DeleteFolder(tmpDir);
                }
                catch
                {
                    // Nada a fazer.
                }
            }
        }