#!/bin/env ruby
#
# Script to print out "deleted" files in VSS
#
# Uses VSS OLE Automation
# Documentation on VSS Object Model can be found at:
# http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvss/html/msdn_vssole.asp
#
# Written by Robert Cowham (rc@vaccaperna.co.uk)
# Usual disclaimers apply!
if ARGV.size < 1
raise "VSS Path argument required: [vssdir]\ne.g.\n \"\$/Project 1/subdir\"\n"
end
require 'win32ole'
root = ARGV[0]
module VSS_CONST
end
class DeletedFiles
attr_reader :count, :deleted_count, :deleted_dirs_count
def initialize(vssdb)
@vssdb = vssdb
@count = 0
@deleted_count = 0
@deleted_dirs_count = 0
end
# Recurse down the list of VSS directories looking for deleted files
def vss_dir_tree(rt)
begin
root = @vssdb.VSSItem(rt, 1)
@deleted_dirs_count += 1
print "\'#{rt}\'\n"
rescue
root = @vssdb.VSSItem(rt, 0)
end
items = root.Items(1)
items.each{|item|
if (item.Type == VSS_CONST::VSSITEM_PROJECT)
dir = item.Name
vss_dir_tree("#{rt}/#{dir}")
else
check_deleted("#{rt}/#{item.Name}")
end
}
end
def check_deleted(file)
@count += 1
begin
item = @vssdb.VSSItem(file, 1)
rescue
return
end
if item.Deleted
@deleted_count += 1
print "'#{file}'\n"
end
end
end
# Load up VSS Ole Automation
# Win32::OLE->Option(Warn => 0) # No warnings
VSSDB = WIN32OLE.new('SourceSafe')
WIN32OLE.const_load(VSSDB, VSS_CONST)
# Declare the Username, password and SourceSafe path variables
# For now these are hardcoded
username = "tjm"
password = "tjm"
src_safe_ini = "c:\\work\\vsstop4\\wss\\srcsafe.ini"
VSSDB.Open(src_safe_ini, username, password)
# VSSRoot = VSSDB.VSSItem(root, 0)
print "Deleted VSS files in '#{root}':\n"
df = DeletedFiles.new(VSSDB)
df.vss_dir_tree(root)
print "\n#{df.deleted_count} deleted files out of #{df.count} files in total.\n"
print "#{df.deleted_dirs_count} deleted directories.\n"