Solved

visual source safe automation

Posted on 2010-08-16
2
522 Views
Last Modified: 2013-12-17
I am using c# in vs 2008 and the Interop.SourceSafeTypeLib.dll for vss 6.0d.  I see methods for check-in and check-out files, but how do I do a "get latest version"?
0
Comment
Question by:dhenderson12
2 Comments
 
LVL 96

Accepted Solution

by:
Bob Learned earned 500 total points
ID: 33453500
Here is a class that I used to use with Visual SourceSafe (before Team Foundation Server).  It has been a long time, so I would consider it an untested class.




// Add a COM reference to Micro$oft SourceSafe type library. 

using System;
using SourceSafeTypeLib;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Forms;

public class SourceSafe
{

    private VSSDatabase _database;
    private VSSItem _project;

    public event UpdateStatusEventHandler UpdateStatus;
    public delegate void UpdateStatusEventHandler(string text);
    public event GetFileEventHandler GetFile;
    public delegate void GetFileEventHandler(string name);


    public SourceSafe()
    {

        _database = new VSSDatabase();
        _database.Open("", "", "");

    }

    ~SourceSafe()
    {
        Marshal.ReleaseComObject(_database);
        _database = null;
    }


    public VSSItem Project
    {
        get { return _project; }
        set { _project = value; }
    }

    public void BuildProjectTree(TreeView treeProjects, string initialProject)
    {

        VSSItem rootProject = null;

        try
        {

            rootProject = _database.get_VSSItem("$/", false);
        }

        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }

        if (rootProject != null)
        {
            this.EnumerateProjects(rootProject, treeProjects, null, initialProject);
        }

    }

    public bool CheckIn(string fileName, string localPath, string fileComment, bool keepCheckout)
    {

        int flags = 0;

        if (keepCheckout)
        {
            // Check in the change, but keep the file checked Outlook 
            flags = flags | (int)VSSFlags.VSSFLAG_KEEPYES;
        }

        // Look for a checked-out file. 
        foreach (VSSItem itemCurrent in this.Project.get_Items(false))
        {

            if (itemCurrent.Name == fileName)
            {

                if (itemCurrent.Checkouts.Count > 0)
                {

                    // Check in the file with the chosen flags, and 
                    // give the check out the specified comment. If 
                    // the local path is not blank, then override the 
                    // default working path for the project. 
                    itemCurrent.Checkin(fileComment, localPath, 0);

                    // File found. 
                    return true;
                }

            }

        }
        return false;
    }

    public bool CheckOut(string fileName, string localPath, string fileComment, bool getLocal, bool recurseSubProjects)
    {
        int flags = 0;

        if (!getLocal)
        {
            // Don't get local copy, but still check the file Outlook 
            flags = flags | (int)VSSFlags.VSSFLAG_GETNO;
        }

        if (recurseSubProjects)
        {
            // Check out files in sub projects. 
            flags = flags | (int)VSSFlags.VSSFLAG_RECURSYES;
        }

        // Search for the file name to check Outlook 
        foreach (VSSItem itemCurrent in this.Project.get_Items(false))
        {

            if (itemCurrent.Name == fileName)
            {

                if (itemCurrent.Checkouts.Count == 0)
                {

                    // Check out the file with the chosen flags, and 
                    // give the check out the specified comment. If 
                    // the local path is not blank, then override the 
                    // default working path for the project. 
                    itemCurrent.Checkout(fileComment, localPath, flags);

                    // File found. 
                    return true;
                }

            }

        }

        // File not found. 
        return false;

    }

    private void EnumerateProjects(VSSItem project, TreeView treeDisplay, TreeNode parentNode, string initialProject)
    {
        foreach (VSSItem itemCurrent in project.get_Items(false))
        {
            if (itemCurrent.Type == 0)
            {
                TreeNode newNode;

                if (parentNode == null)
                {
                    newNode = treeDisplay.Nodes.Add(itemCurrent.Name);
                }
                else
                {
                    newNode = parentNode.Nodes.Add(itemCurrent.Name);
                }

                newNode.Tag = itemCurrent.Spec;

                if (itemCurrent.Spec.Equals(initialProject))
                {

                    treeDisplay.SelectedNode = newNode;

                    newNode.EnsureVisible();
                }

                this.EnumerateProjects(itemCurrent, treeDisplay, newNode, initialProject);
            }

        }

    }
    //EnumerateProjects 


    public void GetProject(string itemSpec, string workingDirectory)
    {

        VSSItem currentItem = _database.get_VSSItem(itemSpec, false);

        if (UpdateStatus != null)
        {
            UpdateStatus("Checking project " + currentItem.Spec + "...");
        }

        foreach (VSSItem subItem in currentItem.get_Items(false))
        {

            if (subItem.Type != 0)
            {

                string filePath = Path.Combine(workingDirectory, subItem.Name);

                // New file? 
                if (!File.Exists(filePath))
                {
                    subItem.Get(ref filePath, 0);

                    if (GetFile != null)
                    {
                        GetFile("Getting " + subItem.Name);
                    }
                }

                // Update file? 
                else if (subItem.get_IsDifferent(filePath))
                {
                    subItem.Get(ref filePath, 0);

                    if (GetFile != null)
                    {
                        GetFile("Replacing " + subItem.Name);
                    }
                }
            }

            else
            {
                // Recursively get any sub-projects. 
                this.GetProject(subItem.Spec, Path.Combine(workingDirectory, subItem.Name));
            }
        }
    }
}

Open in new window

0
 

Author Comment

by:dhenderson12
ID: 33460759
awesome .. thanks for the help.  The class works like a champ, and I'm learning more about the automation.
0

Featured Post

Courses: Start Training Online With Pros, Today

Brush up on the basics or master the advanced techniques required to earn essential industry certifications, with Courses. Enroll in a course and start learning today. Training topics range from Android App Dev to the Xen Virtualization Platform.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

A basic question.. “What is the Garbage Collector?” The usual answer given back: “Garbage collector is a background thread run by the CLR for freeing up the memory space used by the objects which are no longer used by the program.” I wondered …
The object model of .Net can be overwhelming at times – so overwhelming that quite trivial tasks often take hours of research. In this case, the task at hand was to populate the datagrid from SQL Server database in Visual Studio 2008 Windows applica…
In a recent question (https://www.experts-exchange.com/questions/28997919/Pagination-in-Adobe-Acrobat.html) here at Experts Exchange, a member asked how to add page numbers to a PDF file using Adobe Acrobat XI Pro. This short video Micro Tutorial sh…
Although Jacob Bernoulli (1654-1705) has been credited as the creator of "Binomial Distribution Table", Gottfried Leibniz (1646-1716) did his dissertation on the subject in 1666; Leibniz you may recall is the co-inventor of "Calculus" and beat Isaac…

813 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

18 Experts available now in Live!

Get 1:1 Help Now