#!/usr/bin/python

# Script to generate RPM spec file based on template
# (c) 2014 Andrey Cherepanov <cas@altlinux.org>

# This program is free software; you can redistribute it and/or modify it
# under the terms of GNU General Public License (GPL) version 3 or later.
from string import Template
import os
import datetime
import optparse
import subprocess

templates_path = "/usr/share/spectemplates/"
t = os.getenv('GENSPEC_TEMPLATES')
if t != None:
	templates_path = t

# Add epilog show in OptionParser
class MyParser(optparse.OptionParser):
	def format_epilog(self, formatter):
		return self.epilog

# Get configured packager
p = subprocess.Popen(['rpm', '--eval', '%{packager}'], stdout=subprocess.PIPE)
out, err = p.communicate()
maintainer = out.rstrip()

m = os.getenv('GENSPEC_PACKAGER')
if m != None:
	maintainer = m

spec_prefixes = {  'python': 'python-module-',
		   'ruby': 'ruby-',
	        }

class Spec:
	"""RPM Spec class"""
	def __init__(self):
		"""Constructor"""
		self.module  = "" 
		self.package = ""
		self.keys = dict( spec_type = "",
				module  = "",
				version = "",
				summary = "",
				license = "",
				url     = "",
				packager    = "",
				description = "",
				stamp       = "",
				lastchange  = "" )
		self.spec = ""

	def apply(self, spectype):
		"""Apply values to spec template"""
		self.keys['packager'] = maintainer
		
		file = open( templates_path + spectype + ".spec", "r" )
		
		# Generate package name
		if spec_prefixes.has_key( spectype ):
			self.package = spec_prefixes[ spectype ] + self.keys['module']
		else:
			self.package = self.keys['module']

		# Generate changelog entry
		self.keys['stamp'] = '* ' \
		  + datetime.datetime.now().strftime("%a %b %d %Y") \
		  + ' ' + self.keys['packager'] \
		  + ' ' + self.keys['version']
		
		# Fill template
		self.spec = file.read()
		file.close()
		self.spec = Template( self.spec ).safe_substitute( self.keys )
		
	def deploy(self):
		"""Generate directory with spec and gear rules"""
		self.apply( self.keys['spec_type'] )
		
		# Create directory
		if os.path.basename(os.getcwd()) != self.package:
			os.mkdir( self.package )
			os.chdir( self.package )
		
		# Create gear rules
		os.mkdir( '.gear' )
		if self.package != self.keys['module']:
			gear_rules = "tar: . name=" + self.keys['module'] + "-@version@ base=" + self.keys['module'] + "-@version@"
		else:
			gear_rules = "tar: ."
		f = open( '.gear/rules', 'w' )
		f.write( gear_rules )
		f.close()
		
		# Save spec file
		f = open( self.package + '.spec', 'w' )
		f.write( self.spec )
		f.close()
		
# ======================================================================================================
spec = Spec()
		
# Read command-line parameters
opt=MyParser(version='1.0.0', description='Script to generate RPM spec file based on template', epilog=
"""
Supported environment variables:
GENSPEC_TEMPLATES	Path to spec templates (default /usr/share/spectemplates/)
GENSPEC_PACKAGER	Packager name (default from `rpm --eval '%{packager}'`)
""")

opt.add_option('-n', action='store', dest='module', help='Package name')
opt.add_option('-t', action='store', dest='spec_type', help='Package type')
opt.add_option('-v', action='store', dest='version', help='Package version')
opt.add_option('-s', action='store', dest='summary', help='Package summary')
opt.add_option('-l', action='store', dest='license', help='Package license')
opt.add_option('-u', action='store', dest='url', help='Package URL')
opt.add_option('-d', action='store', dest='description', help='Package description')
opt.add_option('-c', action='store', dest='lastchange', help='Package changes')

# Fill values...
options,arguments = opt.parse_args()

spec.keys = options.__dict__

# Prepare place
spec.deploy()
