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);
        }