#!/usr/bin/python

import getopt
import sys
import os
import re

source = "svn"
svnrep = "svn://svn.sphinxsearch.com/sphinx"
svnbranch="trunk"
hgrep = "ssh://hg@svn.sphinxsearch.com/sphinx"
stemmer = "http://snowball.tartarus.org/dist/libstemmer_c.tgz"
stemmer_file = "libstemmer_c.tgz"
source_dir = "/media/bigstore/work/tarkeeper"
revision=''
version=''
revtag=''
targetdir=''

USAGE = """\
Create source tarball with sphinx from hg or svn revision, and name it according some rules.

Usage:
	./mktarball [OPTIONS]. By default pick up the latest (trunk) svn and make two tarballs - one with clean sources, second with embedded libstemmer sources.

	-s,	--stemmer-reload - load the freshest libstemmer from their site, and use it for current and future tarballs.
	-S,	--url-stemmer=URL - assume -r, loads the stemmer's tgz from given url instead of default.
	-u,	--url - use this url as url to repo. Avoid the branch in url for svn!
		--hg - download sources from mercuril (else by default it will be picked from svn).
	-r,	--rev=REV - target revision; by default the latest one
	-b,	--branch=BRANCH - target branch, as branches/rel201. Meaningful for svn, by default - trunk.


Example: ./mktarball -s -b branches/rel201 - will pick up the latest sources on svn repo, branches/rel201, and make two tarballs - one from clean sources, second with just loaded libstemmer inside.
	./mktarball - simple make all things by default ('trunk' svn repo, libstemmer. If no one present - freshest will be downloaded)
	./mktarball --hg - the same, but the latest mercurial will be picked up instead of svn.
"""

def execute (Command):
	print "Executing "+ Command
	os.system(Command)

def del_file(path):
	if os.path.isfile(path):
		os.unlink(path)

def extractgoodies(path):
	"Extract version line and etc. from dir with sphinx"

	global revision, version, revtag, targetdir
	oldpath = os.getcwd()
	os.chdir(os.path.join(path,'src'))
	execute ( "/bin/sh svnxrev.sh .." )
	fp = open ('sphinxversion.h')
	lines = fp.readlines()
	fp.close()
	for line in lines:
		m = line.split(' ')
		if m[1]=='SPH_SVN_REV':
			revision=m[2][:-1]
		elif m[1]=='SPH_SVN_TAG':
			revtag=m[2][1:-2]
	fp = open ('sphinx.h')
	lines = fp.readlines()
	fp.close()
	for line in lines:
		if re.match ( '^#define SPHINX_VERSION', line ):
			version=line.split()[2][1:-1]
			break;
	os.chdir(oldpath)
	if revtag=='':
		targetdir = '-'.join(('sphinx_'+version,revision))
	else:
		targetdir = '-'.join(('sphinx_'+version,revtag,revision))
	

def main():
	urlstem = stemmer
	stemmer_path = os.path.join(source_dir,stemmer_file)
	try:
		opts, args = getopt.getopt(sys.argv[1:],'sS:r:b:u:',['stemmer-reload','url-stemmer=','svn','hg','rev=','branch=','url='])
	except getopt.GetoptError:
		print (USAGE) # let's make it python-3 compatible
		sys.exit(2)

	
	reloadstemmer = False
	issvn = True
	rev = ''
	branch = ''
	rep = svnrep
	for o, a in opts:
		if o in ('-s','--stemmer-reload'):
			del_file(stemmer_path)
		elif o in ('-u','--url-stemmer'):
			urlstem = a
			del_file(stemmer_path)
		elif o == '--hg':
			issvn = False
			rep = hgrep
		elif o in ('-r','--rev'):
			rev = a
		elif o in ('-b','--branch'):
			branch = a
		elif o in ('-u','--url'):
			rep = a
		
		else:
			print (USAGE)
			sys.exit(2)
	
	if not os.path.isfile (stemmer_path):
		execute ( "wget -c %s -O %s"%(urlstem,stemmer_path) )

	if not issvn and branch!='':
		print ("No branches for hg repo supported, sorry!")
		sys.exit(0)
	if branch=='':
		branch = 'trunk'
	
	target = os.path.join(source_dir,'work')
	if os.path.exists(target):
		execute ('rm -rf %s' % (target) )
	if issvn:
		svnrev = ''
		if rev!='':
			svnrev='-r '+rev
		execute ( 'svn co %s %s %s' % (rep+'/'+branch, svnrev, target) )
		extractgoodies (target)
		execute ( 'svn export "%s" "%s"' % (target, targetdir) )
		execute ( 'cp "%s/src/sphinxversion.h" "%s/src/sphinxversion.h"' % (target, targetdir) )
		execute ( 'rm -rf %s' % (target) )
	else:
		execute ( 'hg clone %s %s' % (rep, target) )
		if rev!='':
			execute ( 'cd target; hg up -r %s' % (rev) )
		extractgoodies (target)
		execute ( 'rm -rf "%s/.hg"' % (target) )
		execute ( 'mv "%s" "%s"' % (target, targetdir) )
	execute ( 'tar -zcf "%s.tar.gz" "%s"' % (targetdir, targetdir) )
	execute ( 'tar -zxf libstemmer_c.tgz -C %s' % (targetdir) )
	execute ( 'mv "%s" "%s-stemmer"' % (targetdir, targetdir) )
	execute ( 'tar -zcf "%s-stemmer.tar.gz" "%s-stemmer"' % (targetdir, targetdir) )
	execute ( 'rm -rf %s-stemmer' % (targetdir) )


if __name__ == '__main__':
	main()
