Как создать ветку Visual Source Safe с помощью NAnt - PullRequest
0 голосов
/ 19 августа 2010

Резюме
В настоящее время у меня есть сценарий сборки NAnt, который выполняет vssget либо для самого последнего исходного кода, либо для конкретной ветви (используя параметр ${branch}).

Всякий раз, когда мы выполняем производственную сборку / развертывание, для созданного дерева кода создается ветвь, (чтобы мы могли продолжить разработку и все еще знать, какая база кода находится в производстве, довольно стандартные вещи ...)

Задача
Процесс создания этой ветви по-прежнему выполняется вручную, когда кто-то входит в Visual Source Safe Explorer и выполняет процедуру ветвления. Мне было интересно, есть ли в NAnt способ создать ветку VSS.

Текущий план
Я уже знаю об использовании <exec program="ss"> и пытаюсь избежать этого, но в отсутствие каких-либо лучших решений, это наиболее вероятный путь, по которому я пойду.

Кто-нибудь знает, существует ли для этого цель NAnt или NAntContrib, или если у кого-то есть задача сценария, которую он использовал для этого в прошлом и может предоставить код для этого, это было бы очень высоко ценится.

Ответственность
Я знаю о cvs, svn, git и всех других решениях Source Control, и изменить инструмент в настоящее время не вариант

Ответы [ 2 ]

1 голос
/ 25 августа 2010

Нам на самом деле нужно это там, где я работаю. Я собрал небольшую задачу под названием «vssbranch» (не особо креативная, но вот код ... пример файла сборки и вывод его выполнения:

КОД:

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

using SourceSafeTypeLib;

using NAnt.Core;
using NAnt.Core.Attributes;

namespace NAnt.Contrib.Tasks.SourceSafe
{
    [TaskName("vssbranch")]
    public sealed class BranchTask : BaseTask
    {
        /// <summary>
        /// The label comment.
        /// </summary>
        [TaskAttribute("comment")]
        public String Comment { get; set; }

        /// <summary>
        /// Determines whether to perform the branch recursively.
        /// The default is <see langword="true"/>
        /// </summary>
        [TaskAttribute("recursive"),
        BooleanValidator()]
        public Boolean Recursive { get; set; }

        [TaskAttribute("branchname", Required = true)]
        public String BranchName { get; set; }


        protected override void ExecuteTask()
        {
            this.Open();
            try
            {
                if (VSSItemType.VSSITEM_PROJECT != (VSSItemType)this.Item.Type)
                    throw new BuildException("Only vss projects can be branched", this.Location);

                IVSSItem newShare = null;
                this.Comment = String.IsNullOrEmpty(this.Comment) ? String.Empty : this.Comment;
                if (null != this.Item.Parent)
                    newShare = this.Item.Parent.NewSubproject(this.BranchName, this.Comment);

                if (null != newShare)
                {
                    newShare.Share(this.Item as VSSItem, this.Comment,
                        (this.Recursive) ?
                            (int)VSSFlags.VSSFLAG_RECURSYES : 0);
                    foreach (IVSSItem item in newShare.get_Items(false))
                        this.BranchItem(item, this.Recursive);
                }
            }
            catch (Exception ex)
            {
                throw new BuildException(String.Format("Failed to branch '{0}' to '{1}'", this.Item.Name, this.BranchName), this.Location, ex);
            }
        }

        private void BranchItem(IVSSItem itemToBranch, Boolean recursive)
        {
            if (null == itemToBranch) return;

            if (this.Verbose)
                this.Log(Level.Info, String.Format("Branching {0} path: {1}", itemToBranch.Name, itemToBranch.Spec));

            if (VSSItemType.VSSITEM_FILE == (VSSItemType)itemToBranch.Type)
                itemToBranch.Branch(this.Comment, 0);
            else if (recursive)
            {
                foreach (IVSSItem item in itemToBranch.get_Items(false))
                    this.BranchItem(item, recursive);
            }
        }
    }
}

СОЗДАТЬ ФАЙЛ:

        <echo message="About to execute: VSS Branch" />

        <echo message="Source Safe Path: ${SourceSafeRootPath}/${CURRENT_FILE}" />

        <vssbranch
              username="my_user_name"
              password="my_password"
              recursive="true"
              comment="attempt to make a branch"
              branchname="test-branch"
              dbpath="${SourceSafeDBPath}"
              path="${SourceSafeRootPath}/${CURRENT_FILE}"
              verbose="true"
            />

    </foreach>
</target>

ВЫВОД:

NAnt 0.85 (сборка 0.85.2478.0; выпуск; 14.10.2006) Copyright (C) 2001-2006 Джерри Шоу http://nant.sourceforge.net

Файл сборки: file: /// C: /scm/custom/src/VssBranch/bin/Debug/test.build Целевая среда: Microsoft .NET Framework 2.0 Заданная цель (и): выполнить

пробег:

[loadtasks] Сканирование сборки «NAnt.Contrib.Tasks» для расширений. [loadtasks] Сканирование сборки "VssBranch" для расширений. [echo] О выполнении: VSS Branch

....

[vssbranch] Ветвящийся путь SecurityProto: $ / VSS / Источник Endur / C # / DailyLive / proto / test-branch / SecurityProto

....

СТРОИТЬ УСПЕШНО

Общее время: 12,9 секунды.

Очевидно, что результат будет разным, я вытягивал элементы для ветвления из текстового файла с именем 'params.txt'. Эта задача выполняет то, что известно в мире VSS как «Совместное использование и ветвление» (ветвление сразу после совместного использования) ... другим системам контроля версий не нужно делиться перед ветвлением, а ... это на другой день

1 голос
/ 20 августа 2010

Задачи vss находятся в проекте NAntContrib и нет, в настоящее время нет задачи, поддерживающей ветвление. Однако, следуя модели существующих задач vss (добавление, извлечение, регистрация и т. Д.) В NAntContrib, вы можете взять источник и расширить его самостоятельно. То есть , если , VSS API поддерживает ветвление.

...