Visual SourceSafe automation to get shared references





0/5 (0 vote)
This paper would provide a small code snippet which will report all files from VSS (Visual SourceSafe 6.0) with shared reference instances. It will be useful for migrating files from VSS to TFS.
Summary
This paper would provide a small code snippet which will report all the files from VSS (Visual SourceSafe 6.0) with shared reference instances. It will be useful for migrating files from VSS to TFS.
Target Audience
This paper is targeted at software developers with VB.NET and Visual SourceSafe 6.0 skills.
Introduction
VSS is one of the key Microsoft products as a source code repository. Though the later versions (Team Foundation Server) introduced on long back, still plenty of source codes exist in VSS. Organizations are trying to migrate these codes to TFS.
There are some core differences between VSS and TFS and one of them is shared references. VSS allows files that can be shared across different folders/hierarchies. Through this, a file can be shared between multiple folders/sub projects. So any changes to a file can be reflected to all the references.
But TFS does not allow direct shared (linked) references. Instead it suggests for a branching mechanism. In branching, each instance of the file will be moved to individual projects/folders. In order to move with branching for VSS codes, the old shared reference files in VSS needs to be identified and altered. So if a project contains multiple shared files with n number of references, it will be hard to keep track of all the shared references. However, VSS provides an automation mechanism through which the developer can identify all the shared references and plan for a better migration.
Code snippet to find out all the shared instances in VSS
The following code snippet is written in VB.NET and the targeted framework is .NET 2.0. It requires an interop library. The code uses Excel Interop for reporting purposes.
'Interop Libraries to be included:
Imports SourceSafeTypeLib
Imports Microsoft.Office.Interop.Excel
'Interop Libraries to be included
Public Class frm_vss_files
Private Sub cmd_getdata_Click(sender As System.Object, e As System.EventArgs) Handles cmd_getdata.Click
'inputs
_vss_ini_path = txt_ini_path.Text (LIKE “C:\VSS CODE$\SRCSAFE.INI”)
_input_path = txt_root_path.Text (LIKE “$/ROOT/ABC”)
_uid = txt_uid.Text (user name)
_pwd = txt_pwd.Text (password)
_chk_linked_files = chk_get_linked_files.Checked (Flag to identify shared files)
_i_xl_rw_err = 2
'VSS automation call
obj_vss_db.Open(_vss_ini_path, _uid, _pwd)
obj_vss_db.CurrentProject = _input_path
Try
obj_root = obj_vss_db.VSSItem(_input_path & "/", False)
Catch ex As Exception
MsgBox("SourceSafe DB access error!" + vbCrLf + ex.Message)
End Try
obj_excel.Visible = True
oWB = obj_excel.Workbooks.Add
oWB.Sheets(1).Cells(1, COL_FILE_NAME).Value = "File "
oWB.Sheets(1).Cells(1, COL_FOLDER_NAME).Value = "Folder"
oWB.Sheets(1).Cells(1, COL_VSS_PATH).Value = "VSS PATH"
oWB.Sheets(1).Cells(1, COL_SHARED).Value = "SHARED"
oWB.Sheets(1).Cells(1, COL_LINKS).Value = "Shared Paths"
oWB.Sheets(2).Cells(1, COL_ERR_FILE_NAME) = "File"
oWB.Sheets(2).Cells(1, COL_ERR_FOLDER_NAME) = "Folder"
oWB.Sheets(2).Cells(1, COL_ERR_VSS_PATH) = "VSS PATH"
oWB.Sheets(2).Cells(1, COL_ERR_LINKED_PATH) = "SHARED FILE PATH"
oWB.Sheets(2).Cells(1, COL_ERR_DESC) = "ERROR DESC"
oWB.Sheets(2).Name = "Error Details"
oWS = oWB.Worksheets(1)
_i_xl_rw = 2
Call get_sub_items(obj_root)
MsgBox("Completed successfully!", vbInformation, "")
End Sub
'---------------- INPUT PARAMETERS ----------------
'VSS related declarations
Private obj_vss_db As New VSSDatabase
Private obj_root As VSSItem
Private _vss_ini_path As String
Private _input_path As String
Private _uid As String
Private _pwd As String
Private _chk_linked_files As Boolean = False
'---------------- INPUT PARAMETERS ENDS ----------------
'Excel related declarations are used only for reporting/displaying purpose.
'The developers can ignore or change for any other reporting format like txt, csv etc,
Private obj_excel As New Microsoft.Office.Interop.Excel.Application
Private ows As New Worksheet
Private owb As Workbook
Private _i_xl_rw As Integer
Private _i_xl_rw_err As Integer
Const COL_FILE_NAME = 1
Const COL_FOLDER_NAME = 2
Const COL_VSS_PATH = 3
Const COL_SHARED = 4
Const COL_LINKS = 5
Const COL_ERR_FILE_NAME = 1
Const COL_ERR_FOLDER_NAME = 2
Const COL_ERR_VSS_PATH = 3
Const COL_ERR_LINKED_PATH = 4
Const COL_ERR_DESC = 5
Sub get_sub_items(root_item As VSSItem)
Dim ProjectItem As VSSItem
Dim strLinkList As String = ""
Dim sShared As Boolean
If root_item.Type = VSSItemType.VSSITEM_PROJECT Then
For Each ProjectItem In root_item.Items
Call get_sub_items(ProjectItem)
Next
Else
If root_item.Type = VSSItemType.VSSITEM_FILE Then
Dim objVSSLinkItem As VSSItem
Dim LinkCount As Integer
strLinkList = ""
LinkCount = 0
sShared = False
If _chk_linked_files = True Then
For Each objVSSLinkItem In root_item.Links
LinkCount = LinkCount + 1
If LinkCount = 2 Then sShared = True
On Error Resume Next
strLinkList = strLinkList + objVSSLinkItem.Parent.Spec + vbCrLf
If Err.Number = -2147166577 Then
owb.Sheets(2).Cells(_i_xl_rw_err, COL_ERR_FILE_NAME) = root_item.Name
owb.Sheets(2).Cells(_i_xl_rw_err, COL_ERR_FOLDER_NAME) = root_item.Parent.Name
owb.Sheets(2).Cells(_i_xl_rw_err, COL_ERR_VSS_PATH) = root_item.Spec
owb.Sheets(2).Cells(_i_xl_rw_err, COL_ERR_LINKED_PATH) = objVSSLinkItem.Spec
owb.Sheets(2).Cells(_i_xl_rw_err, COL_ERR_DESC) = Err.Description
_i_xl_rw_err = _i_xl_rw_err + 1
End If
Next
End If
End If
On Error Resume Next
ows.Cells(_i_xl_rw, COL_FILE_NAME).Value = root_item.Name
ows.Cells(_i_xl_rw, COL_FOLDER_NAME).Value = root_item.Parent.Spec
ows.Cells(_i_xl_rw, COL_VSS_PATH).Value = root_item.Spec
If sShared = True Then
ows.Cells(_i_xl_rw, COL_SHARED).Value = "SHARED"
ows.Cells(_i_xl_rw, COL_LINKS).Value = strLinkList
End If
_i_xl_rw = _i_xl_rw + 1
End If
End Sub
End Class
Conclusion
This paper is intended to provide a basic automation call for VSS objects to get shared references. Through these automation calls, developers can save time and increase productivity.