aboutsummaryrefslogtreecommitdiffstats
path: root/create-srpm
blob: bc4ba066c919b1490e4760e8d9f4a5c8c42e27a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#!/usr/bin/python

from RepSys import Error, config, plugins
from RepSys.rpmutil import get_srpm, svn_url_rev, strip_url_rev
from RepSys.cgiutil import get_targets
from RepSys.util import mapurl, execcmd, get_helper
import sys
import os
import pwd
import optparse
import subprocess
import urlparse
import urllib

class CmdError(Error): pass

def strip_username(url):
    parsed = list(urlparse.urlparse(url))
    userpwd, hostport = urllib.splituser(parsed[1])
    parsed[1] = hostport
    newurl = urlparse.urlunparse(parsed)
    return newurl

class CmdIface:
    def author_email(self, author):
        return config.get("users", author)

    def submit_package(self, urls, revision, targetname, dontmapurl_=0,
            define=[]):
        pw = pwd.getpwuid(os.getuid())
        username = pw[0]
        packager = config.get("users", username) or pw[4]
        if not packager:
            raise CmdError, "your email was not found"
        elif not targetname:
            raise CmdError, "no target provided"
        else:
            targetname = targetname.lower()
            for target in get_targets():
                if target.name.lower() == targetname:
                    break
            else:
                raise CmdError, "target not found"
            for url in urls:
                url = strip_username(url)
                for allowed in target.allowed:
                    if url.startswith(allowed):
                        break
                else:
                    raise CmdError, "%s is not allowed for this target" \
                                    % url
            if not dontmapurl_: #FIXME don't use it!
                urls = [mapurl(url) for url in urls]
            uploadsrpms = []
            for url in urls:
                revision = revision or svn_url_rev(url)
                url = strip_url_rev(url)
                targetsrpms = get_srpm(url,
                         revision=revision,
                         targetdirs=target.target,
                         packager=packager,
                         svnlog=1,
                         revname=1,
                         scripts=target.scripts, 
                         macros=target.macros)
                uploadsrpms.extend(targetsrpms)
            uploadcmd = get_helper("upload-srpm")
            if uploadcmd:
                upload_command = [uploadcmd]
                if define:
                    for x in define:
                        upload_command.append("--define")
                        upload_command.append(x)
                upload_command.append(targetname)
                upload_command.extend(uploadsrpms)
                command = subprocess.list2cmdline(upload_command)
                status, output = execcmd(command, noerror=1)
                for srpm in uploadsrpms:
                    if os.path.isfile(srpm):
                        os.unlink(srpm)
                    else:
                        sys.stderr.write("warning: temporary file "\
                                "'%s' removed unexpectedly\n" % srpm)
                if status != 0:
                    raise CmdError, "Failed to upload "\
                        "%s:\n%s" % (" ".join(urls), output)
        return 1

    def submit_targets(self):
        return [x.name for x in get_targets()]


def parse_options():
    usage = "create-srpm <packageurl> -t <target>"
    parser = optparse.OptionParser(usage=usage)
    parser.add_option("-t", "--target", type="string", dest="target",
                      help="target name")
    parser.add_option("-M", "--nomapping", action="store_true",
                      dest="urlmap", default=False, 
                      help="disable url mapping")
    parser.add_option("--define", action="append")
    parser.add_option("--list", dest="list_targets", default=False,
                      action="store_true",
                      help="list submit targets available")
    parser.add_option("-r", help="revision", dest="revision",
            type="int", default=None)
    opts, args = parser.parse_args()
    if not opts.list_targets and not args:
        parser.error("you must supply a package url")
    return opts, args


def main():
    plugins.load()
    iface = CmdIface()
    opts, args = parse_options()
    try:
        if opts.list_targets:
            for target in iface.submit_targets():
                print target
        else:
            iface.submit_package(args, opts.revision, opts.target, opts.urlmap,
                    opts.define)
    except Error, e:
        sys.stderr.write("error: %s\n" % str(e))
        sys.exit(1)
    

if __name__ == "__main__":
    main()

# vim:ts=4:sw=4:et