From ad7fb7807ceaee96521d779993a5e1b28650723f Mon Sep 17 00:00:00 2001 From: Nicolas Vigier Date: Tue, 11 Jan 2011 00:35:59 +0000 Subject: rename repsys to mgarepo, RepSys to MgaRepo, and update docs and examples for Mageia --- MgaRepo/commands/__init__.py | 0 MgaRepo/commands/authoremail.py | 37 +++++++ MgaRepo/commands/changed.py | 41 ++++++++ MgaRepo/commands/ci.py | 35 +++++++ MgaRepo/commands/co.py | 67 +++++++++++++ MgaRepo/commands/create.py | 34 +++++++ MgaRepo/commands/del.py | 30 ++++++ MgaRepo/commands/editlog.py | 39 ++++++++ MgaRepo/commands/getspec.py | 38 ++++++++ MgaRepo/commands/getsrpm.py | 100 +++++++++++++++++++ MgaRepo/commands/log.py | 62 ++++++++++++ MgaRepo/commands/markrelease.py | 103 ++++++++++++++++++++ MgaRepo/commands/patchspec.py | 38 ++++++++ MgaRepo/commands/putsrpm.py | 59 +++++++++++ MgaRepo/commands/rpmlog.py | 68 +++++++++++++ MgaRepo/commands/submit.py | 211 ++++++++++++++++++++++++++++++++++++++++ MgaRepo/commands/switch.py | 33 +++++++ MgaRepo/commands/sync.py | 38 ++++++++ MgaRepo/commands/up.py | 22 +++++ MgaRepo/commands/upload.py | 28 ++++++ 20 files changed, 1083 insertions(+) create mode 100644 MgaRepo/commands/__init__.py create mode 100644 MgaRepo/commands/authoremail.py create mode 100644 MgaRepo/commands/changed.py create mode 100644 MgaRepo/commands/ci.py create mode 100644 MgaRepo/commands/co.py create mode 100644 MgaRepo/commands/create.py create mode 100644 MgaRepo/commands/del.py create mode 100644 MgaRepo/commands/editlog.py create mode 100644 MgaRepo/commands/getspec.py create mode 100644 MgaRepo/commands/getsrpm.py create mode 100644 MgaRepo/commands/log.py create mode 100644 MgaRepo/commands/markrelease.py create mode 100644 MgaRepo/commands/patchspec.py create mode 100644 MgaRepo/commands/putsrpm.py create mode 100644 MgaRepo/commands/rpmlog.py create mode 100644 MgaRepo/commands/submit.py create mode 100644 MgaRepo/commands/switch.py create mode 100644 MgaRepo/commands/sync.py create mode 100644 MgaRepo/commands/up.py create mode 100644 MgaRepo/commands/upload.py (limited to 'MgaRepo/commands') diff --git a/MgaRepo/commands/__init__.py b/MgaRepo/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/MgaRepo/commands/authoremail.py b/MgaRepo/commands/authoremail.py new file mode 100644 index 0000000..edfe332 --- /dev/null +++ b/MgaRepo/commands/authoremail.py @@ -0,0 +1,37 @@ +#!/usr/bin/python +from MgaRepo import Error, config +from MgaRepo.command import * +import sys +import getopt + +HELP = """\ +Usage: mgarepo authoremail [OPTIONS] AUTHOR + +Shows the e-mail of an SVN author. It is just a simple interface to access +the [authors] section of mgarepo.conf. + +Options: + -h Show this message + +Examples: + mgarepo authoremail john +""" + +def parse_options(): + parser = OptionParser(help=HELP) + opts, args = parser.parse_args() + if len(args) != 1: + raise Error, "invalid arguments" + opts.author = args[0] + return opts + +def print_author_email(author): + email = config.get("users", author) + if not email: + raise Error, "author not found" + print email + +def main(): + do_command(parse_options, print_author_email) + +# vim:et:ts=4:sw=4 diff --git a/MgaRepo/commands/changed.py b/MgaRepo/commands/changed.py new file mode 100644 index 0000000..a17226b --- /dev/null +++ b/MgaRepo/commands/changed.py @@ -0,0 +1,41 @@ +#!/usr/bin/python +from MgaRepo import Error, disable_mirror +from MgaRepo.command import * +from MgaRepo.layout import package_url +from MgaRepo.rpmutil import check_changed +import getopt +import sys + +HELP = """\ +Usage: mgarepo changed [OPTIONS] URL + +Shows if there are pending changes since the last package release. + +Options: + -a Check all packages in given URL + -s Show differences + -M Do not use the mirror (use the main repository) + -h Show this message + +Examples: + mgarepo changed http://repos/svn/cnc/snapshot/foo + mgarepo changed -a http://repos/svn/cnc/snapshot +""" + +def parse_options(): + parser = OptionParser(help=HELP) + parser.add_option("-a", dest="all", action="store_true") + parser.add_option("-s", dest="show", action="store_true") + parser.add_option("-M", "--no-mirror", action="callback", + callback=disable_mirror) + opts, args = parser.parse_args() + if len(args) != 1: + raise Error, "invalid arguments" + opts.pkgdirurl = package_url(args[0]) + opts.verbose = 1 # Unconfigurable + return opts + +def main(): + do_command(parse_options, check_changed) + +# vim:et:ts=4:sw=4 diff --git a/MgaRepo/commands/ci.py b/MgaRepo/commands/ci.py new file mode 100644 index 0000000..e64ac4e --- /dev/null +++ b/MgaRepo/commands/ci.py @@ -0,0 +1,35 @@ +#!/usr/bin/python +from MgaRepo.command import * +from MgaRepo.rpmutil import commit + +HELP = """\ +Usage: mgarepo ci [TARGET] + +Will commit recent modifications in the package. + +The difference between an ordinary "svn ci" and "mgarepo ci" is that it +relocates the working copy to the default repository in case the option +"mirror" is set in mgarepo.conf. + +Options: + -h Show this message + -m MSG Use the MSG as the log message + -F FILE Read log message from FILE + +Examples: + mgarepo ci + mgarepo ci SPECS/package.spec SPECS/package-patch.patch +""" + +def parse_options(): + parser = OptionParser(help=HELP) + parser.add_option("-m", dest="message", default=None) + parser.add_option("-F", dest="logfile", type="string", + default=None) + opts, args = parser.parse_args() + if len(args): + opts.target = args[0] + return opts + +def main(): + do_command(parse_options, commit) diff --git a/MgaRepo/commands/co.py b/MgaRepo/commands/co.py new file mode 100644 index 0000000..e7c9aec --- /dev/null +++ b/MgaRepo/commands/co.py @@ -0,0 +1,67 @@ +#!/usr/bin/python +from MgaRepo import Error, disable_mirror +from MgaRepo.command import * +from MgaRepo.rpmutil import checkout +import getopt +import sys + +HELP = """\ +Usage: mgarepo co [OPTIONS] URL [LOCALPATH] + +Checkout the package source from the Mageia repository. + +If the 'mirror' option is enabled, the package is obtained from the mirror +repository. + +You can specify the distro branch to checkout from by using distro/pkgname. + +Options: + -d The distribution branch to checkout from + -b The package branch + -r REV Revision to checkout + -S Do not download sources from the binaries repository + -L Do not make symlinks of the binaries downloaded in SOURCES/ + -s Only checkout the SPECS/ directory + -M Do not use the mirror (use the main repository) + --check Check integrity of files fetched from the binary repository + -h Show this message + +Examples: + mgarepo co pkgname + mgarepo co -d 2009.0 pkgname + mgarepo co 2009.0/pkgame + mgarepo co http://repos/svn/cnc/snapshot/foo + mgarepo co http://repos/svn/cnc/snapshot/foo foo-pkg +""" + +def parse_options(): + parser = OptionParser(help=HELP) + parser.add_option("-r", dest="revision") + parser.add_option("-S", dest="use_binrepo", default=True, + action="store_false") + parser.add_option("--check", dest="binrepo_check", default=False, + action="store_true") + parser.add_option("-L", dest="binrepo_link", default=True, + action="store_false") + parser.add_option("--distribution", "-d", dest="distro", default=None) + parser.add_option("--branch", "-b", dest="branch", default=None) + parser.add_option("-s", "--spec", dest="spec", default=False, + action="store_true") + parser.add_option("-M", "--no-mirror", action="callback", + callback=disable_mirror) + opts, args = parser.parse_args() + if len(args) not in (1, 2): + raise Error, "invalid arguments" + # here we don't use package_url in order to notify the user we are + # using the mirror + opts.pkgdirurl = args[0] + if len(args) == 2: + opts.path = args[1] + else: + opts.path = None + return opts + +def main(): + do_command(parse_options, checkout) + +# vim:et:ts=4:sw=4 diff --git a/MgaRepo/commands/create.py b/MgaRepo/commands/create.py new file mode 100644 index 0000000..da8f16c --- /dev/null +++ b/MgaRepo/commands/create.py @@ -0,0 +1,34 @@ +#!/usr/bin/python +from MgaRepo import Error +from MgaRepo.command import * +from MgaRepo.layout import package_url +from MgaRepo.rpmutil import create_package +import getopt +import sys + +HELP = """\ +Usage: mgarepo create [OPTIONS] URL + +Creates the minimal structure of a package in the repository. + +Options: + -h Show this message + +Examples: + mgarepo create newpkg + mgarepo create svn+ssh://svn.mageia.org/svn/packages/cauldron/newpkg +""" + +def parse_options(): + parser = OptionParser(help=HELP) + opts, args = parser.parse_args() + if len(args) != 1: + raise Error, "invalid arguments" + opts.pkgdirurl = package_url(args[0], mirrored=False) + opts.verbose = 1 # Unconfigurable + return opts + +def main(): + do_command(parse_options, create_package) + +# vim:et:ts=4:sw=4 diff --git a/MgaRepo/commands/del.py b/MgaRepo/commands/del.py new file mode 100644 index 0000000..79d9d3f --- /dev/null +++ b/MgaRepo/commands/del.py @@ -0,0 +1,30 @@ +from MgaRepo import Error +from MgaRepo.command import * +from MgaRepo.rpmutil import binrepo_delete + +HELP = """\ +Usage: mgarepo del [OPTIONS] [PATH] + +Remove a given file from the binary sources repository. + +Changes in the sources file will be left uncommited. + +Options: + -c automatically commit the 'sources' file + -h help + +""" + +def parse_options(): + parser = OptionParser(help=HELP) + parser.add_option("-c", dest="commit", default=False, + action="store_true") + opts, args = parser.parse_args() + if len(args): + opts.paths = args + else: + raise Error, "you need to provide a path" + return opts + +def main(): + do_command(parse_options, binrepo_delete) diff --git a/MgaRepo/commands/editlog.py b/MgaRepo/commands/editlog.py new file mode 100644 index 0000000..c58c16b --- /dev/null +++ b/MgaRepo/commands/editlog.py @@ -0,0 +1,39 @@ +#!/usr/bin/python +from MgaRepo import Error +from MgaRepo.command import * +from MgaRepo.layout import package_url +from MgaRepo.svn import SVN +import re + +HELP = """\ +Usage: mgarepo editlog [OPTIONS] [URL] REVISION + +Options: + -h Show this message + +Examples: + mgarepo editlog 14800 + mgarepo editlog https://repos/svn/cnc/snapshot 14800 +""" + +def parse_options(): + parser = OptionParser(help=HELP) + opts, args = parser.parse_args() + if len(args) == 2: + pkgdirurl, revision = args + elif len(args) == 1: + pkgdirurl, revision = "", args[0] + else: + raise Error, "invalid arguments" + opts.pkgdirurl = package_url(pkgdirurl, mirrored=False) + opts.revision = re.compile(r".*?(\d+).*").sub(r"\1", revision) + return opts + +def editlog(pkgdirurl, revision): + svn = SVN() + svn.propedit("svn:log", pkgdirurl, rev=revision) + +def main(): + do_command(parse_options, editlog) + +# vim:et:ts=4:sw=4 diff --git a/MgaRepo/commands/getspec.py b/MgaRepo/commands/getspec.py new file mode 100644 index 0000000..08407bc --- /dev/null +++ b/MgaRepo/commands/getspec.py @@ -0,0 +1,38 @@ +#!/usr/bin/python +from MgaRepo import Error, disable_mirror +from MgaRepo.command import * +from MgaRepo.layout import package_url +from MgaRepo.rpmutil import get_spec +import getopt +import sys + +HELP = """\ +Usage: mgarepo getspec [OPTIONS] REPPKGURL + +Prints the .spec file of a given package. + +Options: + -t DIR Use DIR as target for spec file (default is ".") + -M Do not use the mirror (use the main repository) + -h Show this message + +Examples: + mgarepo getspec pkgname + mgarepo getspec svn+ssh://svn.mageia.org/svn/packages/cauldron/pkgname +""" + +def parse_options(): + parser = OptionParser(help=HELP) + parser.add_option("-t", dest="targetdir", default=".") + parser.add_option("-M", "--no-mirror", action="callback", + callback=disable_mirror) + opts, args = parser.parse_args() + if len(args) != 1: + raise Error, "invalid arguments" + opts.pkgdirurl = package_url(args[0]) + return opts + +def main(): + do_command(parse_options, get_spec) + +# vim:et:ts=4:sw=4 diff --git a/MgaRepo/commands/getsrpm.py b/MgaRepo/commands/getsrpm.py new file mode 100644 index 0000000..6c238ba --- /dev/null +++ b/MgaRepo/commands/getsrpm.py @@ -0,0 +1,100 @@ +#!/usr/bin/python +# +# This program will extract given version/revision of the named package +# from the Conectiva Linux repository system. +# +from MgaRepo import Error, config, disable_mirror +from MgaRepo.command import * +from MgaRepo.layout import package_url +from MgaRepo.rpmutil import get_srpm +import tempfile +import shutil +import getopt +import glob +import sys +import os + +HELP = """\ +Usage: mgarepo getsrpm [OPTIONS] REPPKGURL + +Generates the source RPM (.srpm) file of a given package. + +Options: + -c Use files in current/ directory (default) + -p Use files in pristine/ directory + -v VER Use files from the version specified by VER (e.g. 2.2.1-2cl) + -r REV Use files from current directory, in revision REV (e.g. 1001) + -t DIR Put SRPM file in directory DIR when done (default is ".") + -P USER Define the RPM packager inforamtion to USER + -s FILE Run script with "FILE TOPDIR SPECFILE" command + -n Rename the package to include the revision number + -l Use subversion log to build rpm %changelog + -T FILE Template to be used to generate the %changelog + -M Do not use the mirror (use the main repository) + -h Show this message + -S Do not download sources from the binary repository + --check Check integrity of files fetched from the binary repository + --strict Check if the given revision contains changes in REPPKGURL + +Examples: + mgarepo getsrpm python + mgarepo getsrpm -l python + mgarepo getsrpm http://foo.bar/svn/cnc/snapshot/python + mgarepo getsrpm -p http://foo.bar/svn/cnc/releases/8cl/python + mgarepo getsrpm -r 1001 file:///svn/cnc/snapshot/python +""" + +def mode_callback(option, opt, val, parser, mode): + opts = parser.values + opts.mode = mode + if mode == "version": + try: + opts.version, opts.release = val.split("-", 1) + except ValueError: + raise Error, "wrong version, use something like 2.2-1mdk" + elif mode == "revision": + opts.revision = val + +def parse_options(): + parser = OptionParser(help=HELP) + parser.defaults["mode"] = "current" + parser.defaults["version"] = None + parser.defaults["release"] = None + parser.defaults["revision"] = None + parser.defaults["submit"] = False + callback_options = dict(action="callback", callback=mode_callback, + type="string", dest="__ignore") + parser.add_option("-c", callback_kwargs={"mode": "current"}, nargs=0, + **callback_options) + parser.add_option("-p", callback_kwargs={"mode": "pristine"}, nargs=0, + **callback_options) + parser.add_option("-r", callback_kwargs={"mode": "revision"}, nargs=1, + **callback_options) + parser.add_option("-v", callback_kwargs={"mode": "version"}, nargs=1, + **callback_options) + parser.add_option("-t", dest="targetdirs", action="append", default=[]) + parser.add_option("-s", dest="scripts", action="append", default=[]) + parser.add_option("-P", dest="packager", default="") + parser.add_option("-n", dest="revname", action="store_true") + parser.add_option("-l", dest="svnlog", action="store_true") + parser.add_option("-T", dest="template", type="string", default=None) + parser.add_option("-S", dest="use_binrepo", default=True, + action="store_false") + parser.add_option("--check", dest="binrepo_check", default=False, + action="store_true") + parser.add_option("-M", "--no-mirror", action="callback", + callback=disable_mirror) + parser.add_option("--strict", dest="strict", default=False, + action="store_true") + opts, args = parser.parse_args() + del opts.__ignore + if len(args) != 1: + raise Error, "invalid arguments" + opts.pkgdirurl = package_url(args[0]) + opts.verbose = 1 + return opts + +def main(): + do_command(parse_options, get_srpm) + +# vim:et:ts=4:sw=4 diff --git a/MgaRepo/commands/log.py b/MgaRepo/commands/log.py new file mode 100644 index 0000000..69058b9 --- /dev/null +++ b/MgaRepo/commands/log.py @@ -0,0 +1,62 @@ +#!/usr/bin/python +from MgaRepo import config, mirror, disable_mirror +from MgaRepo.command import * +from MgaRepo.layout import package_url, checkout_url +from MgaRepo.rpmutil import sync +from MgaRepo.util import execcmd +import sys +import os + +HELP = """\ +Usage: mgarepo log [OPTIONS] [PACKAGE] + +Shows the SVN log for a given package. + +Options: + -h Show this message + -v Show changed paths + -l LIMIT Limit of log entries to show + -r REV Show a specific revision + -M Do not use the mirror (use the main repository) + +Examples: + mgarepo log mutt + mgarepo log 2009.1/mutt +""" + +def parse_options(): + parser = OptionParser(help=HELP) + parser.add_option("-v", dest="verbose", action="store_true", + default=False) + parser.add_option("-l", "--limit", dest="limit", type="int", + default=None) + parser.add_option("-r", dest="revision", type="string", default=None) + parser.add_option("-M", "--no-mirror", action="callback", + callback=disable_mirror) + opts, args = parser.parse_args() + if len(args): + opts.pkgdirurl = package_url(args[0]) + else: + parser.error("log requires a package name") + return opts + +def svn_log(pkgdirurl, verbose=False, limit=None, revision=None): + mirror.info(pkgdirurl) + url = checkout_url(pkgdirurl) + svncmd = config.get("global", "svn-command", "svn") + args = [svncmd, "log", url] + if verbose: + args.append("-v") + if limit: + args.append("-l") + args.append(limit) + if revision: + args.append("-r") + args.append(revision) + if os.isatty(sys.stdin.fileno()): + args.append("| less") + rawcmd = " ".join(args) + execcmd(rawcmd, show=True) + +def main(): + do_command(parse_options, svn_log) diff --git a/MgaRepo/commands/markrelease.py b/MgaRepo/commands/markrelease.py new file mode 100644 index 0000000..857d38d --- /dev/null +++ b/MgaRepo/commands/markrelease.py @@ -0,0 +1,103 @@ +#!/usr/bin/python +# +# This program will append a release to the Conectiva Linux package +# repository system. It's meant to be a startup system to include +# pre-packaged SRPMS in the repository, thus, you should not commit +# packages over an ongoing package structure (with changes in current/ +# directory and etc). Also, notice that packages must be included in +# cronological order. +# +from MgaRepo import Error +from MgaRepo.command import * +from MgaRepo.layout import package_url +from MgaRepo.simplerpm import SRPM +from MgaRepo.rpmutil import mark_release +from MgaRepo.util import get_auth +import getopt +import sys +import os + +HELP = """\ +*** WARNING --- You probably SHOULD NOT use this program! --- WARNING *** + +Usage: mgarepo markrelease [OPTIONS] REPPKGURL + +This subcommand creates a 'tag' for a given revision of a given package. + +The tag will be stored in the directory releases/ inside the package +structure. + +Options: + -f FILE Try to extract information from given file + -r REV Revision which will be used to make the release copy tag + -v VER Version which will be used to make the release copy tag + -n Append package name to provided URL + -h Show this message + +Examples: + mgarepo markrelease -r 68 -v 1.0-1 file://svn/cnc/snapshot/foo + mgarepo markrelease -f @68:foo-1.0-1.src.rpm file://svn/cnc/snapshot/foo + mgarepo markrelease -r 68 -f foo-1.0.src.rpm file://svn/cnc/snapshot/foo +""" + +def version_callback(option, opt, val, parser): + opts = parser.values + try: + opts.version, opts.release = val.split("-", 1) + except ValueError: + raise Error, "wrong version, use something like 1:2.2-1mdk" + +def parse_options(): + parser = OptionParser(help=HELP) + parser.defaults["version"] = None + parser.defaults["release"] = None + parser.add_option("-v", action="callback", callback=version_callback, + nargs=1, type="string", dest="__ignore") + parser.add_option("-r", dest="revision") + parser.add_option("-f", dest="filename") + parser.add_option("-n", dest="appendname", action="store_true") + opts, args = parser.parse_args() + + if len(args) != 1: + raise Error, "invalid arguments" + + opts.pkgdirurl = package_url(args[0], mirrored=False) + + filename = opts.filename + appendname = opts.appendname + del opts.filename, opts.appendname, opts.__ignore + + if filename: + if not os.path.isfile(filename): + raise Error, "file not found: "+filename + if not opts.revision: + basename = os.path.basename(filename) + end = basename.find(":") + if basename[0] != "@" or end == -1: + raise Error, "couldn't guess revision from filename" + opts.revision = basename[1:end] + srpm = None + if not opts.version: + srpm = SRPM(filename) + if srpm.epoch: + opts.version = "%s:%s" % (srpm.epoch, srpm.version) + else: + opts.version = srpm.version + opts.release = srpm.release + if appendname: + if not srpm: + srpm = SRPM(filename) + opts.pkgdirurl = "/".join([opts.pkgdirurl, srpm.name]) + elif appendname: + raise Error, "option -n requires option -f" + elif not opts.revision: + raise Error, "no revision provided" + elif not opts.version: + raise Error, "no version provided" + #get_auth() + return opts + +def main(): + do_command(parse_options, mark_release) + +# vim:et:ts=4:sw=4 diff --git a/MgaRepo/commands/patchspec.py b/MgaRepo/commands/patchspec.py new file mode 100644 index 0000000..9a5811c --- /dev/null +++ b/MgaRepo/commands/patchspec.py @@ -0,0 +1,38 @@ +#!/usr/bin/python +# +# This program will try to patch a spec file from a given package url. +# +from MgaRepo import Error +from MgaRepo.rpmutil import patch_spec +from MgaRepo.command import * +from MgaRepo.layout import package_url +import getopt +import sys + +HELP = """\ +Usage: mgarepo patchspec [OPTIONS] REPPKGURL PATCHFILE + +It will try to patch a spec file from a given package url. + +Options: + -l LOG Use LOG as log message + -h Show this message + +Examples: + mgarepo patchspec http://repos/svn/cnc/snapshot/foo +""" + +def parse_options(): + parser = OptionParser(help=HELP) + parser.add_option("-l", dest="log", default="") + opts, args = parser.parse_args() + if len(args) != 2: + raise Error, "invalid arguments" + opts.pkgdirurl = package_url(args[0], mirrored=False) + opts.patchfile = args[1] + return opts + +def main(): + do_command(parse_options, patch_spec) + +# vim:et:ts=4:sw=4 diff --git a/MgaRepo/commands/putsrpm.py b/MgaRepo/commands/putsrpm.py new file mode 100644 index 0000000..68d87d0 --- /dev/null +++ b/MgaRepo/commands/putsrpm.py @@ -0,0 +1,59 @@ +#!/usr/bin/python +from MgaRepo import Error +from MgaRepo.command import * +from MgaRepo.layout import package_url +from MgaRepo.rpmutil import put_srpm +import getopt +import sys, os + +HELP = """\ +Usage: mgarepo putsrpm [OPTIONS] SOURCERPMS + +Will import source RPMs into the SVN repository. + +If the package was already imported, it will add the new files and remove +those not present in the source RPM. + +Options: + -m LOG Log message used when commiting changes + -t Create version-release tag on releases/ + -b NAME The distribution branch to place it + -d URL The URL of base directory where packages will be placed + -c URL The URL of the base directory where the changelog will be + placed + -s Don't strip the changelog from the spec + (nor import it into misc/) + -n Don't try to rename the spec file + -h Show this message + +Examples: + mgarepo putsrpm pkg/SRPMS/pkg-2.0-1.src.rpm + mgarepo putsrpm -b 2009.1 foo-1.1-1.src.rpm +""" + +def parse_options(): + parser = OptionParser(help=HELP) + parser.add_option("-l", dest="logmsg", default="") + parser.add_option("-t", dest="markrelease", action="store_true", + default=False) + parser.add_option("-s", dest="striplog", action="store_false", + default=True) + parser.add_option("-b", dest="branch", type="string", default=None) + parser.add_option("-d", dest="baseurl", type="string", default=None) + parser.add_option("-c", dest="baseold", type="string", default=None) + parser.add_option("-n", dest="rename", action="store_false", + default=True) + opts, args = parser.parse_args() + opts.srpmfiles = args + return opts + +def put_srpm_cmd(srpmfiles, markrelease=False, striplog=True, branch=None, + baseurl=None, baseold=None, logmsg=None, rename=False): + for path in srpmfiles: + put_srpm(path, markrelease, striplog, branch, baseurl, baseold, + logmsg, rename) + +def main(): + do_command(parse_options, put_srpm_cmd) + +# vim:et:ts=4:sw=4 diff --git a/MgaRepo/commands/rpmlog.py b/MgaRepo/commands/rpmlog.py new file mode 100644 index 0000000..ae8997d --- /dev/null +++ b/MgaRepo/commands/rpmlog.py @@ -0,0 +1,68 @@ +#!/usr/bin/python +# +# This program will convert the output of "svn log" to be suitable +# for usage in an rpm %changelog session. +# +from MgaRepo import Error, layout, disable_mirror +from MgaRepo.command import * +from MgaRepo.svn import SVN +from MgaRepo.log import get_changelog, split_spec_changelog +from cStringIO import StringIO +import getopt +import os +import sys + +HELP = """\ +Usage: mgarepo rpmlog [OPTIONS] REPPKGDIRURL + +Prints the RPM changelog of a given package. + +Options: + -r REV Collect logs from given revision to revision 0 + -n NUM Output only last NUM entries + -T FILE %changelog template file to be used + -o Append old package changelog + -p Append changelog found in .spec file + -s Sort changelog entries, even from the old log + -M Do not use the mirror (use the main repository) + -h Show this message + +Examples: + mgarepo rpmlog python + mgarepo rpmlog http://svn.mandriva.com/svn/packages/cooker/python +""" + +def parse_options(): + parser = OptionParser(help=HELP) + parser.add_option("-r", dest="revision") + parser.add_option("-n", dest="size", type="int") + parser.add_option("-T", "--template", dest="template", type="string") + parser.add_option("-o", dest="oldlog", default=False, + action="store_true") + parser.add_option("-p", dest="usespec", default=False, + action="store_true") + parser.add_option("-s", dest="sort", default=False, + action="store_true") + parser.add_option("-M", "--no-mirror", action="callback", + callback=disable_mirror) + opts, args = parser.parse_args() + if len(args) != 1: + raise Error, "invalid arguments" + opts.pkgdirurl = layout.package_url(args[0]) + return opts + +def rpmlog(pkgdirurl, revision, size, template, oldlog, usespec, sort): + another = None + if usespec: + svn = SVN() + specurl = layout.package_spec_url(pkgdirurl) + rawspec = svn.cat(specurl, rev=revision) + spec, another = split_spec_changelog(StringIO(rawspec)) + newlog = get_changelog(pkgdirurl, another=another, rev=revision, + size=size, sort=sort, template=template, oldlog=oldlog) + sys.stdout.writelines(newlog) + +def main(): + do_command(parse_options, rpmlog) + +# vim:sw=4:ts=4:et diff --git a/MgaRepo/commands/submit.py b/MgaRepo/commands/submit.py new file mode 100644 index 0000000..79afd21 --- /dev/null +++ b/MgaRepo/commands/submit.py @@ -0,0 +1,211 @@ +#!/usr/bin/python +from MgaRepo import Error, config, layout, mirror +from MgaRepo.svn import SVN +from MgaRepo.command import * +from MgaRepo.rpmutil import get_spec, get_submit_info +from MgaRepo.util import get_auth, execcmd, get_helper +import urllib +import getopt +import sys +import re +import subprocess +import uuid + +import xmlrpclib + +HELP = """\ +Usage: mgarepo submit [OPTIONS] [URL[@REVISION] ...] + +Submits the package from URL to the submit host. + +The submit host will try to build the package, and upon successful +completion will 'tag' the package and upload it to the official +repositories. + +The package name can refer to an alias to a group of packages defined in +the section submit-groups of the configuration file. + +The status of the submit can visualized at: + +http://kenobi.mandriva.com/bs/output.php + +If no URL and revision are specified, the latest changed revision in the +package working copy of the current directory will be used. + +Options: + -t TARGET Submit given package URL to given target + -l Just list available targets + -r REV Provides a revision number (when not providing as an + argument) + -s The host in which the package URL will be submitted + (defaults to the host in the URL) + -a Submit all URLs at once (depends on server-side support) + -i SID Use the submit identifier SID + -h Show this message + --distro The distribution branch where the packages come from + --define Defines one variable to be used by the submit scripts + in the submit host + +Examples: + mgarepo submit + mgarepo submit foo + mgarepo submit 1/foo + mgarepo submit foo@14800 bar baz@11001 + mgarepo submit https://repos/svn/mga/cauldron/foo + mgarepo submit -l https://repos + mgarepo submit 1/my-packages@11011 + mgarepo submit --define section=core/testing -t 1 +""" + +DEFAULT_TARGET = "Cooker" + +def parse_options(): + parser = OptionParser(help=HELP) + parser.defaults["revision"] = None + parser.add_option("-t", dest="target", default=None) + parser.add_option("-l", action="callback", callback=list_targets) + parser.add_option("-r", dest="revision", type="string", nargs=1) + parser.add_option("-s", dest="submithost", type="string", nargs=1, + default=None) + parser.add_option("-i", dest="sid", type="string", nargs=1, + default=None) + parser.add_option("-a", dest="atonce", action="store_true", default=False) + parser.add_option("--distro", dest="distro", type="string", + default=None) + parser.add_option("--define", action="append", default=[]) + opts, args = parser.parse_args() + if not args: + name, url, rev = get_submit_info(".") + args = ["%s@%s" % (url, str(rev))] + print "Submitting %s at revision %s" % (name, rev) + print "URL: %s" % url + if opts.revision is not None: + # backwards compatibility with the old -r usage + if len(args) == 1: + args[0] = args[0] + "@" + opts.revision + else: + raise Error, "can't use -r REV with more than one package name" + del opts.revision + if len(args) == 2: + # prevent from using the old syntax + try: + rev = int(args[1]) + except ValueError: + # ok, it is a package name, let it pass + pass + else: + raise Error, "the format is deprecated, "\ + "use @ instead" + # expand group aliases + expanded = [] + for nameurl in args: + expanded.extend(expand_group(nameurl)) + if expanded != args: + print "Submitting: %s" % " ".join(expanded) + args = expanded + # generate URLs for package names: + opts.urls = [mirror.strip_username( + layout.package_url(nameurl, distro=opts.distro, mirrored=False)) + for nameurl in args] + # find the revision if not specified: + newurls = [] + for url in opts.urls: + if not "@" in url: + print "Fetching revision..." + courl = layout.checkout_url(url) + log = SVN().log(courl, limit=1) + if not log: + raise Error, "can't find a revision for %s" % courl + ci = log[0] + print "URL:", url + print "Commit:", + print "%d | %s" % (ci.revision, ci.author), + if ci.lines: + line = " ".join(ci.lines).strip() + if len(line) > 57: + line = line[:57] + "..." + print "| %s" % line, + print + url = url + "@" + str(ci.revision) + newurls.append(url) + opts.urls[:] = newurls + # choose a target if not specified: + if opts.target is None and opts.distro is None: + target = layout.distro_branch(opts.urls[0]) or DEFAULT_TARGET + print "Implicit target: %s" % target + opts.target = target + del opts.distro + return opts + +def expand_group(group): + name, rev = layout.split_url_revision(group) + distro = None + if "/" in name: + distro, name = name.rsplit("/", 1) + found = config.get("submit-groups", name) + packages = [group] + if found: + packages = found.split() + if rev: + packages = [("%s@%s" % (package, rev)) + for package in packages] + if distro: + packages = ["%s/%s" % (distro, package) + for package in packages] + return packages + +def list_targets(option, opt, val, parser): + host = config.get("submit", "host") + if host is None: + raise Error, "no submit host defined in mgarepo.conf" + createsrpm = get_helper("create-srpm") + #TODO make it configurable + command = "ssh %s %s --list" % (host, createsrpm) + execcmd(command, show=True) + sys.exit(0) + +def submit(urls, target, define=[], submithost=None, atonce=False, sid=None): + if submithost is None: + submithost = config.get("submit", "host") + if submithost is None: + # extract the submit host from the svn host + type, rest = urllib.splittype(pkgdirurl) + host, path = urllib.splithost(rest) + user, host = urllib.splituser(host) + submithost, port = urllib.splitport(host) + del type, user, port, path, rest + # runs a create-srpm in the server through ssh, which will make a + # copy of the rpm in the export directory + createsrpm = get_helper("create-srpm") + baseargs = ["ssh", submithost, createsrpm, "-t", target] + if not sid: + sid = uuid.uuid4() + define.append("sid=%s" % sid) + for entry in reversed(define): + baseargs.append("--define") + baseargs.append(entry) + cmdsargs = [] + if len(urls) == 1: + # be compatible with server-side mgarepo versions older than 1.6.90 + url, rev = layout.split_url_revision(urls[0]) + baseargs.append("-r") + baseargs.append(str(rev)) + baseargs.append(url) + cmdsargs.append(baseargs) + elif atonce: + cmdsargs.append(baseargs + urls) + else: + cmdsargs.extend((baseargs + [url]) for url in urls) + for cmdargs in cmdsargs: + command = subprocess.list2cmdline(cmdargs) + status, output = execcmd(command) + if status == 0: + print "Package submitted!" + else: + sys.stderr.write(output) + sys.exit(status) + +def main(): + do_command(parse_options, submit) + +# vim:et:ts=4:sw=4 diff --git a/MgaRepo/commands/switch.py b/MgaRepo/commands/switch.py new file mode 100644 index 0000000..ccca76e --- /dev/null +++ b/MgaRepo/commands/switch.py @@ -0,0 +1,33 @@ +#!/usr/bin/python +from MgaRepo.command import * +from MgaRepo.rpmutil import switch + +HELP = """\ +Usage: mgarepo switch [URL] + +Relocates the working copy to the base location URL. + +If URL is not provided, it will use the option repository from mgarepo.conf +as default, or, if the current working copy is already based in +default_parent, it will use the location from the mirror option from +mgarepo.conf. + +If the current work is based in another URL, it will use default_parent. + +Options: + -h Show this message + +Examples: + mgarepo switch + mgarepo switch https://mirrors.localnetwork/svn/packages/ +""" + +def parse_options(): + parser = OptionParser(help=HELP) + opts, args = parser.parse_args() + if len(args): + opts.mirrorurl = args[0] + return opts + +def main(): + do_command(parse_options, switch) diff --git a/MgaRepo/commands/sync.py b/MgaRepo/commands/sync.py new file mode 100644 index 0000000..1198f3f --- /dev/null +++ b/MgaRepo/commands/sync.py @@ -0,0 +1,38 @@ +#!/usr/bin/python +from MgaRepo.command import * +from MgaRepo.rpmutil import sync + +HELP = """\ +Usage: mgarepo sync + +Will add or remove from the working copy those files added or removed +in the spec file. + +It will not commit the changes. + +Options: + -c Commit the changes, as in ci + --dry-run Print results without changing the working copy + --download -d + Try to download the source files not found + -h Show this message + +Examples: + mgarepo sync +""" + +def parse_options(): + parser = OptionParser(help=HELP) + parser.add_option("--dry-run", dest="dryrun", default=False, + action="store_true") + parser.add_option("-c", dest="ci", default=False, + action="store_true") + parser.add_option("-d", "--download", dest="download", default=False, + action="store_true") + opts, args = parser.parse_args() + if len(args): + opts.target = args[0] + return opts + +def main(): + do_command(parse_options, sync) diff --git a/MgaRepo/commands/up.py b/MgaRepo/commands/up.py new file mode 100644 index 0000000..646a79f --- /dev/null +++ b/MgaRepo/commands/up.py @@ -0,0 +1,22 @@ +from MgaRepo import Error +from MgaRepo.command import * +from MgaRepo.rpmutil import update + +HELP = """\ +Usage: mgarepo up [PATH] + +Update the package working copy and synchronize all binaries. + +Options: + -h help +""" + +def parse_options(): + parser = OptionParser(help=HELP) + opts, args = parser.parse_args() + if args: + opts.target = args[0] + return opts + +def main(): + do_command(parse_options, update) diff --git a/MgaRepo/commands/upload.py b/MgaRepo/commands/upload.py new file mode 100644 index 0000000..dfcae5d --- /dev/null +++ b/MgaRepo/commands/upload.py @@ -0,0 +1,28 @@ +from MgaRepo import Error +from MgaRepo.command import * +from MgaRepo.rpmutil import upload + +HELP = """\ +Usage: mgarepo upload [OPTIONS] [PATH] + +Upload a given file to the binary sources repository. + +It will also update the contents of the 'binrepo.lst' file and leave it +uncommited. + +If the path is a directory, all the contents of the directory will be +uploaded or removed. + +Options: + -h help + +""" + +def parse_options(): + parser = OptionParser(help=HELP) + opts, args = parser.parse_args() + opts.paths = args + return opts + +def main(): + do_command(parse_options, upload) -- cgit v1.2.1