home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 July / CMCD0704.ISO / Software / Shareware / Comunicatii / jyte / jyte.exe / bulkstamp.py < prev    next >
Text File  |  2003-10-24  |  4KB  |  138 lines

  1. #
  2. # bulkstamp.py:
  3. #    Stamp versions on all files that can be found in a given tree.
  4. #
  5. # USAGE: python bulkstamp.py <version> <root directory> <descriptions>
  6. #
  7. # Example: python bulkstamp.py 103 ..\win32\Build\ desc.txt
  8. #
  9. # <version> corresponds to the build number. It will be concatenated with
  10. # the major and minor version numbers found in the description file.
  11. #
  12. # Description information is pulled from an input text file with lines of
  13. # the form:
  14. #
  15. #    <basename> <white space> <description>
  16. #
  17. # For example:
  18. #
  19. #    PyWinTypes.dll Common types for Python on Win32
  20. #    etc
  21. #
  22. # The product's name, major, and minor versions are specified as:
  23. #
  24. #    name <white space> <value>
  25. #    major <white space> <value>
  26. #    minor <white space> <value>
  27. #
  28. # The tags are case-sensitive.
  29. #
  30. # Any line beginning with "#" will be ignored. Empty lines are okay.
  31. #
  32.  
  33. import sys
  34. import os
  35. import verstamp
  36. import fnmatch
  37. import string
  38. import win32api
  39.  
  40. numStamped = 0
  41.  
  42. g_patterns = [
  43.   '*.dll',
  44.   '*.pyd',
  45.   '*.exe',
  46.   '*.ocx',
  47.   ]
  48.  
  49.  
  50. def walk(arg, dirname, names):
  51.   global numStamped
  52.   vars, debug, descriptions = arg
  53.   for name in names:
  54.     for pat in g_patterns:
  55.       if fnmatch.fnmatch(name, pat):
  56.         # Handle the "_d" thing.
  57.         pathname = os.path.join(dirname, name)
  58.         base, ext = os.path.splitext(name)
  59.         if base[-2:]=='_d':
  60.           name = base[:-2] + ext
  61.         is_dll = ext.lower() != ".exe"
  62.         if descriptions.has_key(os.path.normcase(name)):
  63.           desc = descriptions[os.path.normcase(name)]
  64.           try:
  65.             verstamp.stamp(vars, pathname, desc, is_dll=is_dll)
  66.             numStamped = numStamped + 1
  67.           except win32api.error, (hr, func, desc):
  68.             print "Could not stamp", pathname, "Error", hr, "-", desc
  69.         else:
  70.           print 'WARNING: description not provided for:', name
  71.           # skip branding this - assume already branded or handled elsewhere
  72. #        print "Stamped", pathname
  73.  
  74. def load_descriptions(fname, vars):
  75.   retvars = {}
  76.   descriptions = { }
  77.  
  78.   lines = open(fname, 'r').readlines()
  79.  
  80.   for i in range(len(lines)):
  81.     line = string.strip(lines[i])
  82.     if line != '' and line[0] != '#':
  83.       idx1 = string.find(line, ' ')
  84.       idx2 = string.find(line, '\t')
  85.       if idx1 == -1 or idx2 < idx1:
  86.         idx1 = idx2
  87.       if idx1 == -1:
  88.         print 'ERROR: bad syntax in description file at line %d.' % (i+1)
  89.         sys.exit(1)
  90.  
  91.       key = line[:idx1]
  92.       val = string.strip(line[idx1:])
  93.       if key in vars:
  94.         retvars[key] = val
  95.       else:
  96.         descriptions[key] = val
  97.  
  98.   if not retvars.has_key('product'):
  99.     print 'ERROR: description file is missing the product name.'
  100.     sys.exit(1)
  101.   if not retvars.has_key('major'):
  102.     print 'ERROR: description file is missing the major version number.'
  103.     sys.exit(1)
  104.   if not retvars.has_key('minor'):
  105.     print 'ERROR: description file is missing the minor version number.'
  106.     sys.exit(1)
  107.  
  108.   return retvars, descriptions
  109.  
  110. def scan(build, root, desc, **custom_vars ):
  111.   global numStamped
  112.   numStamped = 0
  113.   try:
  114.     build = string.atoi(build)
  115.   except ValueError:
  116.     print 'ERROR: build number is not a number: %s' % build
  117.     sys.exit(1)
  118.  
  119.   debug = 0    ### maybe fix this one day
  120.  
  121.   varList = ['major', 'minor', 'sub', 'company', 'copyright', 'trademarks', 'product']
  122.  
  123.   vars, descriptions = load_descriptions(desc, varList)
  124.   vars['build'] = build
  125.   vars.update(custom_vars)
  126.  
  127.   arg = vars, debug, descriptions
  128.   os.path.walk(root, walk, arg)
  129.  
  130.   print "Stamped %d files." % (numStamped)
  131.  
  132. if __name__ == '__main__':
  133.   if len(sys.argv) != 4:
  134.     print "ERROR: incorrect invocation. See script's header comments."
  135.     sys.exit(1)
  136.  
  137.   apply(scan, tuple(sys.argv[1:]))
  138.