# vss.py -- Source Control using Microsoft VSS. # Provides routines for checking files out of VSS. # # Uses an INI file very similar to how VB integrates with VSS - even # as far as using the same name. # The file must be named "Mssccprj.scc", and be in the format of # an INI file. This file may be in a parent directory, in which # case the project name will be built from what is specified in the # ini file, plus the path from the INI file to the file itself. # # The INI file should have a [Python] section, and a # Project=Project Name # and optionally # Database=?? import win32ui, win32api, win32con, os, string, sys import traceback g_iniName = "Mssccprj.scc" # Use the same INI name as VB! g_sourceSafe = None def FindVssProjectInfo(fullfname): """Looks up the file system for an INI file describing the project. Looking up the tree is for ni style packages. Returns (projectName, pathToFileName) where pathToFileName contains the path from the ini file to the actual file. """ path, fnameonly = os.path.split(fullfname) origPath = path project = "" retPaths = [fnameonly] while not project: iniName = os.path.join(path, g_iniName) database = win32api.GetProfileVal("Python","Database", "", iniName) project = win32api.GetProfileVal("Python","Project", "", iniName) if project: break; # No valid INI file in this directory - look up a level. path, addpath = os.path.split(path) if not addpath: # Root? break retPaths.insert(0, addpath) if not project: win32ui.MessageBox("%s\r\n\r\nThis directory is not configured for Python/VSS" % origPath) return return project, "/".join(retPaths), database def CheckoutFile(fileName): global g_sourceSafe import pythoncom ok = 0 # Assumes the fileName has a complete path, # and that the INI file can be found in that path # (or a parent path if a ni style package) try: import win32com.client, win32com.client.gencache mod = win32com.client.gencache.EnsureModule('{783CD4E0-9D54-11CF-B8EE-00608CC9A71F}', 0, 5, 0) if mod is None: win32ui.MessageBox("VSS does not appear to be installed. The TypeInfo can not be created") return ok rc = FindVssProjectInfo(fileName) if rc is None: return project, vssFname, database = rc if g_sourceSafe is None: g_sourceSafe=win32com.client.Dispatch("SourceSafe") # SS seems a bit wierd. It defaults the arguments as empty strings, but # then complains when they are used - so we pass "Missing" if not database: database = pythoncom.Missing g_sourceSafe.Open(database, pythoncom.Missing, pythoncom.Missing) item = g_sourceSafe.VSSItem("$/%s/%s" % (project, vssFname)) item.Checkout(None, fileName) ok = 1 except pythoncom.com_error, exc: win32ui.MessageBox(exc.strerror, "Error checking out file") except: typ, val, tb = sys.exc_info() traceback.print_exc() win32ui.MessageBox("%s - %s" % (str(typ), str(val)),"Error checking out file") tb = None # Cleanup a cycle return ok