# BrandProject.py
#
# Brand a VSS project with a "build number", then optionally
# stamp DLL/EXE files with version information.

import win32api, os, string, sys
import vssutil
import bulkstamp


def BrandProject(vssProjectName, descFile, stampPath, filesToSubstitute, buildDesc = None, auto=0, bRebrand = 0):
	# vssProjectName -- The name of the VSS project to brand.
	# descFile -- A test file containing descriptions of the files in the release.
	# stampPath -- The full path to where the files referenced in descFile can be found.
	path=win32api.GetFullPathName(stampPath)
	
	build = vssutil.MakeNewBuildNo(vssProjectName, buildDesc, auto, bRebrand)
	if build is None:
		print "Cancelled"
		return

	bulkstamp.scan( build, stampPath, descFile )
	for infile, outfile in filesToSubstitute:
		SubstituteVSSInFile(vssProjectName, infile, outfile)
	return 1

def usage(msg):
	print msg
	print """\
%s Usage:
%s [options] vssProject descFile stampPath

Automatically brand a VSS project with an automatically incremented
build number, and stamp DLL/EXE files with the build number.

Checks that no files are checked out in the project, and finds the last
build number, and suggests the next number.

Options:
-a     - Auto increment the build number, and brand (otherwise prompt
         for the build number after looking for the previous)
-r     - Restamp the files with the existing build number.
-d     - A description for the VSS Label.
-f infile=outfile - Substitute special VSS labels in the specified text
                    file with the text extracted from VSS.
""" % (os.path.basename(sys.argv[0]), os.path.basename(sys.argv[0]))
	sys.exit(1)

if __name__=='__main__':
	try:
		import getopt
		opts, args = getopt.getopt(sys.argv[1:], "af:d:r")
	except getopts.error, msg:
		usage(msg)
	bAuto = bRebrand = 0
	stampFiles = []
	desc = None
	for opt, val in opts:
		if opt == '-a':
			bAuto = 1
		if opt == '-f':
			infile, outfile = string.split(val, "=", 2)
			stampFiles.append((infile, outfile))
		if opt == '-d':
			desc = val
		if opt == '-r':
			bRebrand = 1
	if len(args)<3:
		usage("You must specify the required arguments")
	vssProjectName = "$\\" + args[0]
	descFile = args[1]
	path = args[2]
	try:
		os.stat(descFile)
	except IOError:
		usage("The description file '%s' can not be found" % (descFile))
	if not os.path.isdir(path):
		usage("The path to the files to stamp '%s' does not exist" % (path))

	BrandProject(vssProjectName, descFile, path, stampFiles, desc, bAuto, bRebrand)

