home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2004 July
/
CMCD0704.ISO
/
Software
/
Shareware
/
Comunicatii
/
jyte
/
jyte.exe
/
bulkstamp.py
< prev
next >
Wrap
Text File
|
2003-10-24
|
4KB
|
138 lines
#
# bulkstamp.py:
# Stamp versions on all files that can be found in a given tree.
#
# USAGE: python bulkstamp.py <version> <root directory> <descriptions>
#
# Example: python bulkstamp.py 103 ..\win32\Build\ desc.txt
#
# <version> corresponds to the build number. It will be concatenated with
# the major and minor version numbers found in the description file.
#
# Description information is pulled from an input text file with lines of
# the form:
#
# <basename> <white space> <description>
#
# For example:
#
# PyWinTypes.dll Common types for Python on Win32
# etc
#
# The product's name, major, and minor versions are specified as:
#
# name <white space> <value>
# major <white space> <value>
# minor <white space> <value>
#
# The tags are case-sensitive.
#
# Any line beginning with "#" will be ignored. Empty lines are okay.
#
import sys
import os
import verstamp
import fnmatch
import string
import win32api
numStamped = 0
g_patterns = [
'*.dll',
'*.pyd',
'*.exe',
'*.ocx',
]
def walk(arg, dirname, names):
global numStamped
vars, debug, descriptions = arg
for name in names:
for pat in g_patterns:
if fnmatch.fnmatch(name, pat):
# Handle the "_d" thing.
pathname = os.path.join(dirname, name)
base, ext = os.path.splitext(name)
if base[-2:]=='_d':
name = base[:-2] + ext
is_dll = ext.lower() != ".exe"
if descriptions.has_key(os.path.normcase(name)):
desc = descriptions[os.path.normcase(name)]
try:
verstamp.stamp(vars, pathname, desc, is_dll=is_dll)
numStamped = numStamped + 1
except win32api.error, (hr, func, desc):
print "Could not stamp", pathname, "Error", hr, "-", desc
else:
print 'WARNING: description not provided for:', name
# skip branding this - assume already branded or handled elsewhere
# print "Stamped", pathname
def load_descriptions(fname, vars):
retvars = {}
descriptions = { }
lines = open(fname, 'r').readlines()
for i in range(len(lines)):
line = string.strip(lines[i])
if line != '' and line[0] != '#':
idx1 = string.find(line, ' ')
idx2 = string.find(line, '\t')
if idx1 == -1 or idx2 < idx1:
idx1 = idx2
if idx1 == -1:
print 'ERROR: bad syntax in description file at line %d.' % (i+1)
sys.exit(1)
key = line[:idx1]
val = string.strip(line[idx1:])
if key in vars:
retvars[key] = val
else:
descriptions[key] = val
if not retvars.has_key('product'):
print 'ERROR: description file is missing the product name.'
sys.exit(1)
if not retvars.has_key('major'):
print 'ERROR: description file is missing the major version number.'
sys.exit(1)
if not retvars.has_key('minor'):
print 'ERROR: description file is missing the minor version number.'
sys.exit(1)
return retvars, descriptions
def scan(build, root, desc, **custom_vars ):
global numStamped
numStamped = 0
try:
build = string.atoi(build)
except ValueError:
print 'ERROR: build number is not a number: %s' % build
sys.exit(1)
debug = 0 ### maybe fix this one day
varList = ['major', 'minor', 'sub', 'company', 'copyright', 'trademarks', 'product']
vars, descriptions = load_descriptions(desc, varList)
vars['build'] = build
vars.update(custom_vars)
arg = vars, debug, descriptions
os.path.walk(root, walk, arg)
print "Stamped %d files." % (numStamped)
if __name__ == '__main__':
if len(sys.argv) != 4:
print "ERROR: incorrect invocation. See script's header comments."
sys.exit(1)
apply(scan, tuple(sys.argv[1:]))