Cómo crear una twig de Visual Source Safe usando NAnt

Resumen
Actualmente tengo un NAnt compilation NAnt que realiza un vssget en el código fuente más reciente o en una twig específica (usando un parámetro ${branch} ).

Cada vez que hacemos una compilation / implementación de producción, el tree de códigos que se construyó tiene una twig creada (para que podamos continuar con el desarrollo y aún saber qué código base está en producción, algo bastante estándar …)

Problema
El process de creación de esa twig sigue siendo manual, realizado por alguien que ingresa a Visual Source Safe Explorer y realiza el procedimiento de bifurcación. Me preguntaba si hay alguna forma en NAnt de crear una twig de VSS.

Plan actual
Ya sé sobre el uso de <exec program="ss"> y trato de evitar eso, pero a falta de mejores soluciones, esa es la ruta más probable que tomaré.

¿Alguien sabe si hay un objective NAnt o NAntContrib para esto, o si alguien tiene una tarea de script que han utilizado para hacer esto en el pasado y podría proporcionar el código para eso, sería muy apreciado.

Renuncia
Conozco cvs, svn, git y todas las otras soluciones de control de fuente, y cambiar la herramienta no es una opción en la actualidad

Realmente necesitamos esto donde trabajo. Arreglé una pequeña tarea llamada 'vssbranch' (no particularmente creativa pero aquí está el código … un file de compilation de ejemplo y el resultado de su ejecución:

CÓDIGO:

 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", Requinetworking = 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); } } } } 

BUILD FILE:

  <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> 

SALIDA:

NAnt 0.85 (Build 0.85.2478.0; release; 10/14/2006) Copyright (C) 2001-2006 Gerry Shaw http://nant.sourceforge.net

Buildfile: file: /// C: /scm/custom/src/VssBranch/bin/Debug/test.build Marco de destino: Microsoft .NET Framework 2.0 Objetivo (s) especificado (s): ejecutar

correr:

[loadtasks] Escaneado del ensamblado "NAnt.Contrib.Tasks" para las extensiones. [loadtasks] Escaneado del ensamblado "VssBranch" para extensiones. [echo] A punto de ejecutarse: twig de VSS

….

[vssbranch] Ruta de Branching SecurityProto: $ / VSS / Endur's Source / C # / DailyLive / proto / test-branch / SecurityProto

….

CONSTRUIR ÉXITO

Tiempo total: 12.9 segundos.

Obviamente, la salida variaría, estaba tirando de los elementos para ramificar desde un file de text llamado 'params.txt'. Esta tarea realiza lo que se conoce en el mundo de VSS como 'Compartir y sucursal' (bifurcación inmediatamente después de compartir) … otros sistemas de control de fuente no necesitan compartir antes de la bifurcación, eh … eso es por otro día

Las tareas vss viven en el proyecto NAntContrib y no, actualmente no hay ninguna tarea que admita la bifurcación. Sin embargo, siguiendo el model de las tareas de vss existentes (agregar, extraer, registrar, etc.) en NAntContrib, puede tomar la fuente y extenderla usted mismo. Es decir, si la API VSS admite ramificación.