#!/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"