#!/usr/bin/python -u
# vim: set fileencoding=utf-8 :
#
# (C) 2008, 2009, 2010 Guido Guenther <agx@sigxcpu.org>
#    This program is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; either version 2 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program; if not, write to the Free Software
#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
"""Import multiple dsc files in one go"""

import glob
import os
import pipes
import re
import sys
import tempfile
import gbp.command_wrappers as gbpc
from gbp.deb import parse_dsc, DscFile, DpkgCompareVersions
from gbp.errors import GbpError
from gbp.git import GitRepository, GitRepositoryError


class DscCompareVersions(DpkgCompareVersions):
    def __init__(self):
        DpkgCompareVersions.__init__(self)

    def __call__(self, dsc1, dsc2):
        return DpkgCompareVersions.__call__(self, dsc1.version, dsc2.version)


class GitImportDsc(gbpc.Command):
    cmd='/usr/bin/git-import-dsc'
    def __init__(self, args):
        if not os.access(self.cmd, os.X_OK):
            raise GbpError, "%s not found - can't import packages" % self.cmd
        gbpc.Command.__init__(self, self.cmd, args)

    def importdsc(self, dsc):
        gbpc.Command.__call__(self, [dsc.dscfile])


def fetch_snapshots(pkg, downloaddir):
    "Fetch snapshots using debsnap von snapshots.debian.org"
    dscs = None

    print "Downloading snapshots of '%s' to '%s'..." % (pkg, downloaddir)
    gbpc.Command("debsnap", [ '--force', '--destdir=%s' % (downloaddir), pkg])()

    dscs = glob.glob(os.path.join(downloaddir, '*.dsc'))
    if not dscs:
        raise GbpError, 'No package downloaded'

    return [os.path.join(downloaddir, dsc) for dsc in dscs]


def print_help():
    print """Usage:
    git-import-dscs [git-import-dsc options] /path/to/dsc1 [/path/to/dsc2] ...
or
    git-import-dscs --debsnap [git-import-dsc options] package
"""


def main(argv):
    dirs = {'top': os.path.abspath(os.curdir)}
    dscs = []
    ret = 0
    dsc_cmp = DscCompareVersions()
    use_debsnap = False

    try:
        import_args = argv[1:]

        if '--verbose' in import_args:
            gbpc.Command.verbose = True

        # Not using Configparser since we want to pass all unknown options
        # unaltered to git-import-dsc
        if '--debsnap' in import_args:
            use_debsnap = True
            import_args.remove('--debsnap')
            pkg = import_args[-1]
            import_args = import_args[:-1]
        else:
            for arg in argv[::-1]:
                if arg.endswith('.dsc'):
                    dscs.append(parse_dsc(arg))
                    import_args.remove(arg)

        if not use_debsnap and not dscs:
            print_help()
            raise GbpError

        if use_debsnap:
            dirs['tmp'] = os.path.abspath(tempfile.mkdtemp())
            print "Downloading snapshots of '%s' to '%s'..." % (pkg, dirs['tmp'])
            dscs = [ parse_dsc(f) for f in fetch_snapshots(pkg, dirs['tmp']) ]

        dscs.sort(cmp=dsc_cmp)
        importer = GitImportDsc(import_args)

        try:
            repo = GitRepository('.')
            (clean, out) = repo.is_clean()
            if not clean:
                print >>sys.stderr, "Repository has uncommitted changes, commit these first: "
                raise GbpError, out
            else:
                dirs['pkg'] = dirs['top']
        except GitRepositoryError:
            # no git repository there yet
            dirs['pkg'] = os.path.join(dirs['top'], dscs[0].pkg)

        importer.importdsc(dscs[0])
        os.chdir(dirs['pkg'])

        for dsc in dscs[1:]:
            importer.importdsc(dsc)

    except (GbpError, gbpc.CommandExecFailed), err:
        if len(err.__str__()):
            print >>sys.stderr, err
        ret = 1
    finally:
        if dirs.has_key('tmp'):
            gbpc.RemoveTree(dirs['tmp'])()
        os.chdir(dirs['top'])

    if not ret:
        print 'Everything imported under %s' % dirs['pkg']
    return ret

if __name__ == '__main__':
    sys.exit(main(sys.argv))

# vim:et:ts=4:sw=4:et:sts=4:ai:set list listchars=tab\:»·,trail\:·:
