home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 July / CMCD0704.ISO / Software / Shareware / Comunicatii / jyte / jyte.exe / vssutil.py < prev    next >
Text File  |  1999-09-02  |  5KB  |  171 lines

  1. import win32con, string, traceback
  2. import win32com.client, win32com.client.gencache
  3. import pythoncom
  4. import time
  5. import os
  6.  
  7. constants = win32com.client.constants
  8.  
  9. win32com.client.gencache.EnsureModule('{783CD4E0-9D54-11CF-B8EE-00608CC9A71F}', 0, 5, 0)
  10.  
  11. error = "vssutil error"
  12.  
  13. def GetSS():
  14.     ss=win32com.client.Dispatch("SourceSafe")
  15.     # SS seems a bit wierd.  It defaults the arguments as empty strings, but
  16.     # then complains when they are used - so we pass "Missing"
  17.     ss.Open(pythoncom.Missing, pythoncom.Missing, pythoncom.Missing)
  18.     return ss
  19.  
  20. def test(projectName):
  21.     ss=GetSS()
  22.     project = ss.VSSItem(projectName)
  23.  
  24.     for item in project.GetVersions(constants.VSSFLAG_RECURSYES):
  25.         print item.VSSItem.Name, item.VersionNumber, item.Action
  26.         
  27.  
  28. #    item=i.Versions[0].VSSItem
  29. #    for h in i.Versions:
  30. #        print `h.Comment`, h.Action, h.VSSItem.Name
  31.     
  32.  
  33. def SubstituteInString(inString, evalEnv):
  34.     substChar = "$"
  35.     fields = string.split(inString, substChar)
  36.     newFields = []
  37.     for i in range(len(fields)):
  38.         didSubst = 0
  39.         strVal = fields[i]
  40.         if i%2!=0:
  41.             try:
  42.                 strVal = eval(strVal,evalEnv[0], evalEnv[1])
  43.                 newFields.append(strVal)
  44.                 didSubst = 1
  45.             except:
  46.                 traceback.print_exc()
  47.                 print "Could not substitute", strVal
  48.         if not didSubst:
  49.             newFields.append(strVal)
  50.     return string.join(map(str, newFields), "")
  51.  
  52. def SubstituteInFile(inName, outName, evalEnv):
  53.     inFile = open(inName, "r")
  54.     try:
  55.         outFile = open(outName, "w")
  56.         try:
  57.             while 1:
  58.                 line = inFile.read()
  59.                 if not line: break
  60.                 outFile.write(SubstituteInString(line, evalEnv))
  61.         finally:
  62.             outFile.close()
  63.     finally:
  64.         inFile.close()
  65.  
  66. def VssLog(project, linePrefix = "", noLabels = 5, maxItems=150):
  67.     lines = []
  68.     num = 0
  69.     labelNum = 0
  70.     for i in project.GetVersions(constants.VSSFLAG_RECURSYES):
  71.         num = num + 1
  72.         if num > maxItems : break
  73.         commentDesc = itemDesc = ""
  74.         if i.Action[:5]=="Added":
  75.             continue
  76.         if len(i.Label):
  77.             labelNum = labelNum + 1
  78.             itemDesc = i.Action
  79.         else:
  80.             itemDesc = i.VSSItem.Name
  81.             if str(itemDesc[-4:])==".dsp":
  82.                 continue
  83.         if i.Comment:
  84.             commentDesc ="\n%s\t%s" % (linePrefix, i.Comment)
  85.         lines.append("%s%s\t%s%s" % (linePrefix, time.asctime(time.localtime(int(i.Date))), itemDesc, commentDesc))
  86.         if labelNum > noLabels:
  87.             break
  88.     return string.join(lines,"\n")
  89.     
  90. def SubstituteVSSInFile(projectName, inName, outName):
  91.     import win32api
  92.     if win32api.GetFullPathName(inName)==win32api.GetFullPathName(outName):
  93.         raise RuntimeError, "The input and output filenames can not be the same"
  94.     sourceSafe=GetSS()
  95.     project = sourceSafe.VSSItem(projectName)
  96.     # Find the last label
  97.     label = None
  98.     for version in project.Versions:
  99.         if version.Label:
  100.             break
  101.     else:
  102.         print "Couldnt find a label in the sourcesafe project!"
  103.         return
  104.     # Setup some local helpers for the conversion strings.
  105.     vss_label = version.Label
  106.     vss_date = time.asctime(time.localtime(int(version.Date)))
  107.     now = time.asctime(time.localtime(time.time()))
  108.     SubstituteInFile(inName, outName, (locals(),globals()))
  109.     
  110.             
  111. def CountCheckouts(item):
  112.     num = 0
  113.     if item.Type==constants.VSSITEM_PROJECT:
  114.         for sub in item.Items:
  115.             num = num + CountCheckouts(sub)
  116.     else:
  117.         if item.IsCheckedOut:
  118.             num = num + 1
  119.     return num
  120.  
  121. def GetLastBuildNo(project):
  122.     i = GetSS().VSSItem(project)
  123.     # Find the last label
  124.     lab = None
  125.     for version in i.Versions:
  126.         lab = str(version.Label)
  127.         if lab: return lab
  128.     return None
  129.  
  130. def MakeNewBuildNo(project, buildDesc = None, auto=0, bRebrand = 0):
  131.     if buildDesc is None: buildDesc = "Created by Python"
  132.     ss = GetSS()
  133.     i = ss.VSSItem(project)
  134.     num = CountCheckouts(i)
  135.     if num > 0:
  136.         msg = "This project has %d items checked out\r\n\r\nDo you still want to continue?" % num
  137.         import win32ui
  138.         if win32ui.MessageBox(msg, project, win32con.MB_YESNO) != win32con.IDYES:
  139.             return
  140.  
  141.  
  142.     oldBuild = buildNo = GetLastBuildNo(project)
  143.     if buildNo is None:
  144.         buildNo = "1"
  145.         oldBuild = "<None>"
  146.     else:
  147.         try:
  148.             buildNo = string.atoi(buildNo)
  149.             if not bRebrand: buildNo = buildNo + 1
  150.             buildNo = str(buildNo)
  151.         except ValueError:
  152.             raise error, "The previous label could not be incremented: %s" % (oldBuild)
  153.  
  154.     if not auto:
  155.         from pywin.mfc import dialog
  156.         buildNo = dialog.GetSimpleInput("Enter new build number", buildNo, "%s - Prev: %s" % (project, oldBuild))
  157.         if buildNo is None: return
  158.     i.Label(buildNo, "Build %s: %s" % (buildNo,buildDesc))
  159.     if auto:
  160.         print "Branded project %s with label %s" % (project, buildNo)
  161.     return buildNo
  162.  
  163. if __name__=='__main__':
  164. #    UpdateWiseExeName("PyWiseTest.wse", "PyWiseTest-10.exe")
  165.  
  166. #    MakeVersion()
  167. #    test(tp)
  168. #    MakeNewBuildNo(tp)
  169.     tp = "\\Python\\Python Win32 Extensions"
  170.     SubstituteVSSInFile(tp, "d:\\src\\pythonex\\win32\\win32.txt", "d:\\temp\\win32.txt")
  171.