#!/usr/bin/python

import os, sys, re
from geet.gear import Gear
from geet.utils.functions import system, xsystem
from tempfile import mkstemp

def isgear(path):
    if os.path.isdir(os.path.join(path, '.gear')):
        return True
    if os.path.isfile(os.path.join(path, '.gear-rules')):
        return True
    return False

def gear_path():
    path = os.getcwd()
    while True:
        if isgear(path):
            return path
        if path == '/':
            return False
        path = os.path.dirname(path)

def get_version(spec):
    """Try get version from spec-file"""
    version, release, serial = [None]*3
    for line in xsystem('rpm -bE ' + spec.path()):
        if version is None:
            m = re.match('^Version:\s*(.*?)\s*$', line)
            if m:
                version = m.group(1)
        if release is None:
            m = re.match('^Release:\s*(.*?)\s*$', line)
            if m:
                release = m.group(1)
        if serial is None:
            m = re.match('^Serial:\s*(.*?)\s*$', line)
        if re.match('^%prep.*', line) or re.match('^%package.*', line):
            break
        if version and release and serial:
            break
    if serial is None:
        return '%s-%s' % (version, release)
    else:
        return '%s:%s-%s' % (serial, version, release)

def get_packager():
    if '--packager' in sys.argv:
        return sys.argv[sys.argv.index('--packager')]
    return xsystem('rpm --eval %packager')[0][:-1]

path = gear_path()
if path is False:
    sys.stderr.write('Can\'t find gear repository\n')
    exit(1)

gear = Gear(path)
spec = gear.spec()
version = get_version(spec)

(fd, filename) = mkstemp()
try:
    f = os.fdopen(fd, 'w')
    f.write('\n# write changelog records above\n')
    f.write('# quit without save to cancel\n')
    f.close()
    time = os.stat(filename).st_mtime
    if 'EDITOR' in os.environ:
        editor = os.environ['EDITOR']
    else:
        editor = 'vim'
    system('%s %s' % (editor, filename))
    if os.stat(filename).st_mtime == time:
        print 'Canceled'
    else:
        text = ''.join(open(filename).readlines()[:-2])
        spec.add_changelog(get_packager(), version, text)
        spec.write()
finally:
    os.unlink(filename)
