123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- # 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
|