#!/usr/bin/env python

import getpass
import os
import os.path
import sys
import time
import traceback
import urllib
import urllib2

USERNAME = 'aegis'
PASSWORD = getpass.getpass('Password for %s@sourceforge: ' % USERNAME)

PROJECTS = (
    ('audiere',     32783),
    ('cal3d',       26281),
    ('corona',      44336),
    ('empyrean',    67252),
    ('glscry',      130358),
    ('gltext',      55024),
    ('isugamedev',  34581),
    ('mikmod',      40531),
    ('naikai',      34340),
    ('pictureshow', 41677),
    ('renaissance', 136692),
    ('sphere',      1551),
    ('tensile',     79846),
    ('wintarball',  37319),
)


# enable cookies
cookies = urllib2.HTTPCookieProcessor()
cookie_opener = urllib2.build_opener(cookies)

# login to SourceForge
data = {'return_to':      '',
        'form_loginname': USERNAME,
        'form_pw':        PASSWORD,
        'stay_in_ssl':    '1',
        'login':          'Login With SSL'}
cookie_opener.open('https://sourceforge.net/account/login.php', urllib.urlencode(data))

RSYNC = 'rsync -a --progress'

def emit(line):
    scriptname = os.path.basename(sys.argv[0])
    print '%s: %s' % (scriptname, line)

def changeDir(path):
    os.chdir(path)

def makeDir(path):
    try:
        os.mkdir(path)
        emit('Created %s' % path)
    except OSError:
        emit('%s already exists' % path)

def runCommand(cmd):
    emit('Running command "%s"' % cmd)
    rv = os.system(cmd)
    if rv != 0:
        emit('*** ERROR (%s) in "%s"' % (rv, cmd))

def backupTracker(url, output_file):
    emit('Exporting tracker data from %s to %s' % (url, output_file))
    try:
        data = cookie_opener.open(url).read()
    except:
        emit('Failed to read tracker data')
        traceback.print_exc()
        return
    file(output_file, 'wb').write(data)
        
root = os.path.dirname(os.path.abspath(sys.argv[0]))
changeDir(root)

today = time.strftime('%Y-%m-%d')

today_root = os.path.join(root, today)
makeDir(today_root)
changeDir(today_root)

emit('Backing up projects to %s' % today_root)

for name, project_id in PROJECTS:
    args = {'name': name,
            'name1': name[:1],
            'name2': name[:2],
            'id': project_id}

    # backup tracker data
    url = 'https://sourceforge.net/export/xml_export.php?group_id=%(id)s' % args
    output_file = '%(name)s-tracker.xml' % args
    backupTracker(url, output_file)

    # backup tracker data2
    url = 'https://sourceforge.net/export/xml_export2.php?group_id=%(id)s' % args
    output_file = '%(name)s-tracker2.xml' % args
    backupTracker(url, output_file)

    # backup SVN
    runCommand(RSYNC + ' %(name)s.svn.sourceforge.net::svn/%(name)s/ ./%(name)s-svn' % args)

    # backup CVS
    runCommand(RSYNC + ' rsync://%(name)s.cvs.sourceforge.net/cvsroot/%(name)s/ ./%(name)s-cvs' % args)

    # backup web space
    runCommand(RSYNC + ' ' + USERNAME + '@shell.sourceforge.net:/home/groups/%(name1)s/%(name2)s/%(name)s/ ./%(name)s-web' % args)

