aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'metagen/metagen.py')
-rwxr-xr-xmetagen/metagen.py185
1 files changed, 185 insertions, 0 deletions
diff --git a/metagen/metagen.py b/metagen/metagen.py
new file mode 100755
index 0000000..37dfbb0
--- /dev/null
+++ b/metagen/metagen.py
@@ -0,0 +1,185 @@
+#!/usr/bin/python
+
+
+"""
+
+NAME - metagen
+
+SYNOPSIS - Adds metadata.xml to current directory
+
+AUTHOR - Rob Cakebread <pythonhead@gentoo.org>
+
+USE - metagen --help
+
+EXAMPLES - man metagen
+
+"""
+
+import sys
+import re
+import os
+from optparse import OptionParser
+from commands import getstatusoutput
+
+from portage.output import red, blue
+
+import metagenerator
+
+
+def parse_echangelog_variable(name, email):
+ """Extract developer name and email from ECHANGELOG_USER variable"""
+ try:
+ e = os.environ["ECHANGELOG_USER"]
+ except KeyError:
+ print red("!!! Environmental variable ECHANGELOG_USER not set.")
+ print red("!!! Set ECHANGELOG_USER or use -e and -n")
+ sys.exit(1)
+ try:
+ my_email = e[e.find("<") +1:e.find(">")]
+ except:
+ print red("!!! ECHANGELOG_USER not set properly")
+ sys.exit(1)
+ try:
+ my_name = e[0:e.find("<")-1]
+ except:
+ print red("!!! ECHANGELOG_USER not set properly")
+ sys.exit(1)
+ if email:
+ email = "%s,%s" % (my_email, email)
+ else:
+ email = my_email
+ if name:
+ name = "%s,%s" % (my_name, name)
+ else:
+ name = my_name
+ return name, email
+
+def generate_xml(options):
+ """Returns metadata.xml text"""
+
+ metadata = metagenerator.MyMetadata()
+
+ if options.herd:
+ herds = options.herd.split(",")
+ else:
+ herds = ["no-herd"]
+ metadata.set_herd(herds)
+
+ if options.echangelog:
+ (options.name, options.email) = \
+ parse_echangelog_variable(options.name, options.email)
+
+ if options.email:
+ names, descs = [], []
+ if options.name:
+ names = options.name.split(",")
+ if options.desc:
+ descs = options.desc.split(",")
+ metadata.set_maintainer(options.email.split(","),
+ names,
+ descs
+ )
+
+ if options.long:
+ metadata.set_longdescription(options.long)
+
+ return "%s" % metadata
+
+def validate_xml(my_xml):
+ """Test for valid XML"""
+ #TODO validate against DTD
+ #This just makes sure its valid XML of some sort.
+ #Probably not necessary since repoma validates against DTD?
+ re_escape_quotes = re.compile('"')
+ s = re_escape_quotes.sub('\\"', my_xml)
+ cmd = "echo \"%s\" | xmllint --valid - 2>&1 > /dev/null" % s
+ return getstatusoutput(cmd)[0]
+
+
+if __name__ == '__main__':
+ optParser = OptionParser()
+ optParser.add_option("-H", action="store", dest="herd", type="string",
+ help="Name of herd. If not specified, " +
+ "'no-herd' will be inserted. " +
+ "This requires either the -e or -m option.")
+
+ optParser.add_option("-e", action="store", dest="email", type="string",
+ help="Maintainer's email address")
+
+ optParser.add_option("-n", action="store", dest="name", type="string",
+ help="Maintainer's name")
+
+ optParser.add_option("-m", action="store_true", dest="echangelog",
+ default=False,
+ help="Use name and email address from ECHANGELOG_USER "+
+ "environmental variable. "+
+ "This is a shortcut for -e <email> -n <name>")
+
+ optParser.add_option("-d", action="store", dest="desc", type="string",
+ help="Description of maintainership")
+
+ optParser.add_option("-l", action="store", dest="long", type="string",
+ help="Long description of package.")
+
+ optParser.add_option("-o", action="store", dest="output", type="string",
+ help="Specify location of output file.")
+
+ optParser.add_option("-f", action="store_true", dest="force", default=False,
+ help="Force overwrite of existing metadata.")
+
+ optParser.add_option("-v", action="store_true", dest="verbose", default=True,
+ help="Verbose. Output of file to stdout. (default)")
+
+ optParser.add_option("-q", action="store_false", dest="verbose",
+ help="Squelch output of file to stdout.")
+
+ optParser.add_option("-Q", action="store_true", dest="no_write",
+ default=False,
+ help="Do not write file to disk.")
+
+ (options, remainingArgs) = optParser.parse_args()
+
+ if len(sys.argv) == 1:
+ optParser.print_help()
+ sys.exit(1)
+
+ if options.desc or options.name:
+ if not options.email and not options.echangelog:
+ print red("!!! No maintainer's email address specified.")
+ print red("!!! Options -d and -n are only valid with -e or -m")
+ sys.exit(1)
+
+ if options.herd == "no-herd" and not options.email and not options.echangelog:
+ print red("!!! You must specify a maintainer if you have no-herd.")
+ sys.exit(1)
+
+ if not options.herd and not options.email and not options.echangelog:
+ print red("!!! You must specify at least a herd (-H) " +
+ "or maintainer's email address (-e)\n")
+ sys.exit(1)
+
+ txt = generate_xml(options)
+
+ error_status = validate_xml(txt)
+ if error_status < 0:
+ print red("!!! Error - Invalid XML")
+ print red("!!! Please report this bug with the options you used and the output:")
+ print error_status
+ print txt
+ sys.exit(1)
+
+ if options.verbose:
+ print "\n%s" % txt
+
+ out_file = "./metadata.xml"
+ if options.output:
+ out_file = options.output
+ if not options.no_write and os.path.exists(out_file):
+ if not options.force:
+ print red("!!! File %s exists." % out_file)
+ print red("!!! Use -f to force overwrite.")
+ sys.exit(1)
+ if not options.no_write:
+ open("%s" % out_file, "w").writelines(txt)
+ print blue("%s written") % out_file
+