diff --git a/NEWS b/NEWS index 67e53883..f15a415d 100644 --- a/NEWS +++ b/NEWS @@ -63,7 +63,7 @@ - search: allow to limit results via existing attibutes - added "osc meta attribute" for basic attribute creation, deletion, showing and value setting - implement "osc mbranch" call to create projects with multiple source package (instances) - - new "osc patchinfo" command: basic patchinfo generation and modification support + - new "osc patchinfo" command: basic patchinfo generation and modification support - add support for _patchinfo package submissions in "osc sr" on project level - support review handling of requests (new "osc review accept/decline $REQUEST_ID" command @@ -98,7 +98,7 @@ - rename old "platform/s" names to "repository/ies" (internal cleanup only) - fixed osc diff -c N, it failed with int and string concatenation - made osc diff and rdiff more similar: added -p, -c to rdiff, removed -u from rdiff. - made -u default for both, renamed --pretty to --plain as it is the opposite of -u + made -u default for both, renamed --pretty to --plain as it is the opposite of -u # # Features which require OBS 1.7 # @@ -167,7 +167,7 @@ 0.119: - Support new request types - "submitreq" command has a new syntax (incompatible !) - - new "deleterequest" command + - new "deleterequest" command - new "changedevelrequest" command - new "request" command for showing/modifing requests - Multiple actions in one request is not yet supported by osc @@ -231,7 +231,7 @@ - fixed support for accessing download repositories (worked only for download.o.o so far) 0.114: -- the .oscrc config handling has been cleaned up: +- the .oscrc config handling has been cleaned up: * use "apiurl" for everything now (== ://) * added aliases support for [apiurl] sections in the ~/.oscrc. Example: @@ -243,14 +243,14 @@ * when writing a new ~/.oscrc, store the apiurl in the conffile (bnc#478054) * fixed bug that made osc ask for credentials when -A was used (bnc#478054) * fixed crash upon password entry (first startup) (bnc#478052) -- osc build: +- osc build: * make product builds work * speed up by using a cookie when fetching the binaries (bnc#477690) * support for VM (kvm or xen) builds * obsolete the need to configure download server, get it from the build service instance instead. * be a bit more verbose if the linked package isn't expanded (bnc#470948) -- osc branch: +- osc branch: * --develproject option fixed (the API calls it 'ignoredevel' instead of 'nodevelproject') * --revision option added - osc jobhistory: new command to see build job history of a project or a package @@ -277,14 +277,14 @@ - don't use a hardcoded path for the rpm binary otherwise it fails on distributions like debian - osc meta: be more verbose in case of failure (bnc#459292) -- osc mkpac: add info how to enable the package tracking feature (bnc#459288) +- osc mkpac: add info how to enable the package tracking feature (bnc#459288) 0.112: important bugfix: - osc deletepac: prevent recursive deletion of a whole project [bnc#458535] - osc build: support more options: --icecream, --ccache, --with, --without - osc build: --keep-pkgs also saves the src.rpm now -- osc build: small fix in debuginfo handling +- osc build: small fix in debuginfo handling - osc build: new armv7el arch for all binaries for up to ARMv7 EABI with VFP @@ -331,7 +331,7 @@ Changes were from Marcus_H, poeml, dmueller, tpatzig. - osc sr show: show the current state's comment - osc sr log: new command to show the history of a given id - osc sr: enable requests for submitting new packages -- osc build: implement --no-checks +- osc build: implement --no-checks - osc build: be less strict on the arguments, and guess what's needed. For instance: * osc build PLATFORM ARCH BUILD_DESCR * osc build PLATFORM (ARCH = hostarch, BUILD_DESCR guessed) @@ -339,7 +339,7 @@ Changes were from Marcus_H, poeml, dmueller, tpatzig. * osc build BUILD_DESCR (PLATFORM = build_platform (config option), ARCH = hostarch) * osc build (PLATFORM = build_platform (config option), ARCH = hostarch, BUILD_DESCR guessed) - osc build: download after the target architecture check -- osc addremove: bugfixes, --recursive option +- osc addremove: bugfixes, --recursive option - osc init: added support to initialize a project dir - osc metafromspec: new alias for 'updatepacmetafromspec' which is hard to remember - osc updatepacmetafromspec: also update URL @@ -356,20 +356,20 @@ Changes were from Marcus_H, poeml, dmueller, tpatzig. - osc build: the --extra-pkgs option is now a configurable setting in .oscrc. Default is "extra-pkgs = vim gdb strace" - .oscrc: make tilde expansion work on the packagecachedir setting -- osc update / checkout: don't check out a working copy, or update an existing +- osc update / checkout: don't check out a working copy, or update an existing one, when a source link cannot be applied [bnc#409373] 0.106: - osc rdiff / osc submitreq show: diff the _expanded_ sources [bnc#408267] -- osc submitreq list: show author's name +- osc submitreq list: show author's name - osc submitreq: shortcut alias 'sr' added 0.105: -- osc submitreq list: +- osc submitreq list: - can now be called without parameters, applying to the working copy then. - calling it in a project directory is also possible now. - output was improved. Newest requests are listed first. @@ -411,7 +411,7 @@ Changes were from Marcus_H, poeml, dmueller, tpatzig. 0.103: -- osc submitreq create: simplify by make osc guess needed parameters, if +- osc submitreq create: simplify by make osc guess needed parameters, if there is a working copy and it is a source link. - osc submitreq create: don't stop on packages that have a devel project defined, if the submit actually comes from that project. @@ -459,7 +459,7 @@ Changes were from Marcus_H, poeml, dmueller, tpatzig. - osc maintainer: new -D/--devel-project switch - BUILD_DIST environment variable will be ignored (bnc#359846) The following environment variables can still be used: - * OSC_SU_WRAPPER overrides the setting of su-wrapper. + * OSC_SU_WRAPPER overrides the setting of su-wrapper. * OSC_BUILD_ROOT overrides the setting of build-root. * OSC_PACKAGECACHEDIR overrides the setting of packagecachedir. @@ -560,7 +560,7 @@ Changes were from Marcus_H, poeml, dmueller, tpatzig. 0.96: - following suggestions by Christian Boltz and Michal Marek, osc now memorizes where a working copy was checked out from, saving the api server url to - .osc/_apiurl. + .osc/_apiurl. - implement 'info' subcommand - use new api routes in all places - buildhistory works again @@ -571,7 +571,7 @@ Changes were from Marcus_H, poeml, dmueller, tpatzig. - applied patch from Michael Marek, fixing all places where error messages were printed to stdout instead of stderr. [#239404] - osc is now easier to work with when using alternative API servers. The - configured server can be overriden with -A on the commandline. + configured server can be overriden with -A on the commandline. "apisrv" in the config takes a URL now, so the variable "scheme" which was needed in addition before becomes obsolete. For backward compatibility, a hostname (and scheme variable) are accepted like before. Likewise, the auth @@ -588,7 +588,7 @@ Changes were from Marcus_H, poeml, dmueller, tpatzig. 5 times in an iChain setup - adding http_GET/POST/PUT/DELETE() functions, which dispatch to http_request(), and use them everywhere - - removing othermethods.py + - removing othermethods.py - keeping urlopen(), in case it is used from externally, but have it print out a "depracated" message - finally, global option -H enables HTTP traffic debugging @@ -598,7 +598,7 @@ Changes were from Marcus_H, poeml, dmueller, tpatzig. - suppress the legend in prjresults by default (show with -l) - --version shows the program version number - fix the commit subcommand's argument handling. The following works correctly - now: osc ci ../test/onlyinwc `pwd` fstab ../test/f2 + now: osc ci ../test/onlyinwc `pwd` fstab ../test/f2 - fix the download progress meter to work with small terminals [#266989] - update: when updating multiple packages, print each package name - make 'results' subcommand many times faster, by making only a single request @@ -643,7 +643,7 @@ Changes were from Marcus_H, poeml, dmueller, tpatzig. 0.8: - build: use configuration from *local* specfile (e.g. BuildRequires) -- build: let envvars OSC_SU_WRAPPER and OSC_BUILD_ROOT override config +- build: let envvars OSC_SU_WRAPPER and OSC_BUILD_ROOT override config - build: allow 'dynamical' build-root setting by using %(repo)s and %(arch)s - add 'createpac/editpac' and 'createprj/editprj' subcommands which are similar to 'editmeta' but should be more logical to find @@ -672,7 +672,7 @@ Changes were from Marcus_H, poeml, dmueller, tpatzig. metadata from a specfile - fix profiling wrapper - set User-agent -- bugfixes: +- bugfixes: - fix handling of filenames with '+' signs - make 'resolved' more robust - fix merge on 'update' if called from another directory @@ -703,7 +703,7 @@ Changes were from Marcus_H, poeml, dmueller, tpatzig. 0.4: - allow 'up' inside a project directory (will automatically pull in all new - packages). (For past checkouts, you may need to put the project name into + packages). (For past checkouts, you may need to put the project name into $prjdir/.osc/_project yourself). - checkout: preserve mtimes - add diff3 merge support. Locally modified files are merged with upstream changes diff --git a/PROJ_PACK.txt b/PROJ_PACK.txt index 81bfd2a7..591676e6 100644 --- a/PROJ_PACK.txt +++ b/PROJ_PACK.txt @@ -1,10 +1,10 @@ - jw, Tue Oct 20 22:09:16 CEST 2009 + jw, Tue Oct 20 22:09:16 CEST 2009 This is a feature suggestion for easier osc commandline handling. Many commands require specifying Project and/or Package names. The current situation is not satisfying for the following reasons: - - inconsistent defaults. Some osc subcommands can take project + - inconsistent defaults. Some osc subcommands can take project and/or package names from the current directory, if run inside a checkout tree. If both project and package can use this default or only one, and if one, which, depends on the command. Users have a hard time memorizing @@ -12,22 +12,22 @@ The current situation is not satisfying for the following reasons: Examples as of osc version 0.123: osc maintainer PRJ [PKG] - does not look in the current directory. - - need at least PRJ. + - need at least PRJ. osc list [PRJ [PKG]] - - Never looks at the current directory. - - lists all projects, if run without parameters. + - Never looks at the current directory. + - lists all projects, if run without parameters. osc checkout [PRJ] PKG osc checkout PRJ - takes project from current directory, if inside a checkout tree - - else operates on an entire project. + - else operates on an entire project. osc checkin [ARG] - - defaults to current project and package, - - if arg is a subdirectory, project is taken from current directory - - if arg is a file, both project and package are taken from current - directory. + - defaults to current project and package, + - if arg is a subdirectory, project is taken from current directory + - if arg is a file, both project and package are taken from current + directory. osc results [PRJ PKG] - takes either both or none from current directory. - - many commands do not look into the current directory, + - many commands do not look into the current directory, they are cumbersome to use. - sometimes PRJ/PKG can be used instead of PRJ PKG @@ -50,25 +50,25 @@ used in parallel. --pkg, --pack, --package are synonyms. osc shall support aliases, to save typing. Some implicit aliases exist, -with well defined magic effects. Aliases substitution is literal. +with well defined magic effects. Aliases substitution is literal. They can replace options including their parameters, or just the option, or just the parameters. - - (a dash) expands to --prj openSUSE:Factory - (or --prj followed by any other project as defined in + - (a dash) expands to --prj openSUSE:Factory + (or --prj followed by any other project as defined in ~/.oscrc:default_project ) - --prj - is synonymous to just -, for consistency. + --prj - is synonymous to just -, for consistency. . (a dot) evaluates the current working directory, searching for - .osc/_apiurl, .osc/_project, and .osc/_package - Implicit --apiurl, --prj, or --pkg options are constructed as far - as available from the current directory and as far as not already - present in the command line. - If a dot is used as parameter to an option, it has a more - deterministic meaning. - --apiurl . Substitute only the current apiurl, - --prj . Substitute the current project name, and provides - a default for --apiurl unless given. - --pkg . Substitures current package name likewise. + .osc/_apiurl, .osc/_project, and .osc/_package + Implicit --apiurl, --prj, or --pkg options are constructed as far + as available from the current directory and as far as not already + present in the command line. + If a dot is used as parameter to an option, it has a more + deterministic meaning. + --apiurl . Substitute only the current apiurl, + --prj . Substitute the current project name, and provides + a default for --apiurl unless given. + --pkg . Substitures current package name likewise. ./. expands to --prj . --pkg . ./PKG expands to --prj . --pkg PKG @@ -83,10 +83,10 @@ printed as debug output. online help of osc commands shall refer to the above syntax like this: - osc CMD ... PROJ/PACK + osc CMD ... PROJ/PACK -An additional help entry +An additional help entry - osc help 'PROJ/PACK' + osc help 'PROJ/PACK' shall explain the relevant details as presented herein. diff --git a/README b/README index 3955f780..bf5f55e5 100644 --- a/README +++ b/README @@ -14,17 +14,18 @@ RPM packages are here (rpm-md repository): http://download.opensuse.org/repositories/openSUSE:/Tools/ To install from svn, do - python setup.py build - python setup.py install - # create a symlink 'osc' in your path pointing to osc.py. - ln -s osc-wrapper.py /usr/bin/osc + + python setup.py build + python setup.py install + # create a symlink 'osc' in your path pointing to osc.py. + ln -s osc-wrapper.py /usr/bin/osc Alternatively, you can directly use osc-wrapper.py from the source dir (which is easier if you develop on osc). The program needs the cElementTree python module installed. On SUSE, the -respective package is called python-elementtree (before 10.2: python-xml). +respective package is called python-elementtree (before 10.2: python-xml). For local building, you will need python-urlgrabber in addition. Those are standard package on SUSE Linux since a while. If your version is too old, you can find python-elementtree and python-urlgrabber here: @@ -132,29 +133,29 @@ USAGE EXAMPLES: (online at http://en.opensuse.org/Build_Service/CLI ) To list existing content on the server - osc ls # list projects - osc ls Apache # list packages in a project - osc ls Apache subversion # list files of package of a project + osc ls # list projects + osc ls Apache # list packages in a project + osc ls Apache subversion # list files of package of a project Check out content - osc co Apache # entire project - osc co Apache subversion # a package - osc co Apache subversion foo # single file + osc co Apache # entire project + osc co Apache subversion # a package + osc co Apache subversion foo # single file Update a working copy osc up - osc up [pac_dir] # update a single package by its path - osc up * # from within a project dir, update all packages - osc up # from within a project dir, update all packages - AND check out all newly added packages + osc up [pac_dir] # update a single package by its path + osc up * # from within a project dir, update all packages + osc up # from within a project dir, update all packages + # AND check out all newly added packages If an update can't be merged automatically, a file is in 'C' (conflict) -state, and conflicts are marked with special <<<<<<< and >>>>>>> lines. +state, and conflicts are marked with special <<<<<<< and >>>>>>> lines. After manually resolving the problem, use osc resolved foo Upload change content - osc ci # current dir + osc ci # current dir osc ci osc ci file1 file2 ... @@ -171,7 +172,7 @@ Adds all new files in local copy and removes all disappeared files. osc addremove Generates a diff, to view the changes - osc diff # current dir + osc diff # current dir osc diff file1 file2 ... Shows the build results of the package diff --git a/TODO b/TODO index 917367db..5832e12c 100644 --- a/TODO +++ b/TODO @@ -10,7 +10,7 @@ CRITICAL: -A apiurl prj/pkg -A apiurl prj:pkg apiurl/source/prj/pkg - The current working directory or its descendants should provide defaults + The current working directory or its descendants should provide defaults for apiurl, prj and/or pkg. MAJOR: @@ -24,13 +24,13 @@ NORMAL: - implement (svn-like) switch command - implement 'mv' command - commit: check if errors during PUT are handled sensibly, so the change is - not committed to localmeta + not committed to localmeta - add switch to commit to change repository options, like to e.g. disable publishing? - implement optional logging to .osc/log, which could be useful for debugging bugs like the one where api.opensuse.org sends empty replies (a hard-to-catch one) -MINOR: +MINOR: - osc checkout should display file download progress (bnc#442115) - adjust zsh completion to work with cmdln.py implementation @@ -42,7 +42,7 @@ MINOR: JW: FIXME: osc co overwrites local changes without warning. FIXME: when branching, the user should be added to bugowner, for the branch project. -FIXME: 'osc rq' shall default to 'osc rq list -M -B -s all', +FIXME: 'osc rq' shall default to 'osc rq list -M -B -s all', where -B shows requests related to packages where I am the bugowner. FIXME: 'osc log openSUSE:Factory PKG' should also point to the bsdevelproject diff --git a/dist/osc.complete b/dist/osc.complete index 0b399d07..0a720334 100644 --- a/dist/osc.complete +++ b/dist/osc.complete @@ -162,7 +162,7 @@ rq|request) show) if ((count == 3)) ; then builtin compgen -W '--diff' -- "${cmdline[3]}" - else + else builtin echo -n 'ID' fi ;; diff --git a/osc/babysitter.py b/osc/babysitter.py index 030bf196..2a0ec41a 100644 --- a/osc/babysitter.py +++ b/osc/babysitter.py @@ -96,8 +96,8 @@ def run(prg): body = e.read() if getattr(prg.options, 'debug', None) or \ getattr(prg.conf, 'config', {}).get('debug', None): - print >>sys.stderr, e.hdrs - print >>sys.stderr, body + print >>sys.stderr, e.hdrs + print >>sys.stderr, body if e.code in [ 400, 403, 404, 500 ]: if '' in body: @@ -119,7 +119,7 @@ def run(prg): print >>sys.stderr, e.msg if getattr(prg.options, 'debug', None) or \ getattr(prg.conf, 'config', {}).get('debug', None): - print >>sys.stderr, e.e + print >>sys.stderr, e.e return 1 except (oscerr.WrongOptions, oscerr.WrongArgs), e: diff --git a/osc/build.py b/osc/build.py index 4d5563d9..67200b05 100644 --- a/osc/build.py +++ b/osc/build.py @@ -231,27 +231,27 @@ def get_built_files(pacdir, pactype): def get_repo(path): """Walks up path looking for any repodata directories. - + @param path path to a directory @return str path to repository directory containing repodata directory """ oldDirectory = None currentDirectory = os.path.abspath(path) repositoryDirectory = None - + # while there are still parent directories while currentDirectory != oldDirectory: children = os.listdir(currentDirectory) - + if "repodata" in children: repositoryDirectory = currentDirectory break - + # ascend oldDirectory = currentDirectory currentDirectory = os.path.abspath(os.path.join(oldDirectory, os.pardir)) - + return repositoryDirectory def get_prefer_pkgs(dirs, wanted_arch, type): @@ -259,11 +259,11 @@ def get_prefer_pkgs(dirs, wanted_arch, type): from util import repodata, packagequery, cpio paths = [] repositories = [] - + suffix = '*.rpm' if type == 'dsc': suffix = '*.deb' - + for dir in dirs: # check for repodata repository = get_repo(dir) @@ -271,15 +271,15 @@ def get_prefer_pkgs(dirs, wanted_arch, type): paths += glob.glob(os.path.join(os.path.abspath(dir), suffix)) else: repositories.append(repository) - + packageQueries = packagequery.PackageQueries(wanted_arch) - + for repository in repositories: repodataPackageQueries = repodata.queries(repository) - + for packageQuery in repodataPackageQueries: packageQueries.add(packageQuery) - + for path in paths: if path.endswith('src.rpm'): continue @@ -287,10 +287,10 @@ def get_prefer_pkgs(dirs, wanted_arch, type): continue packageQuery = packagequery.PackageQuery.query(path) packageQueries.add(packageQuery) - + prefer_pkgs = dict((name, packageQuery.path()) for name, packageQuery in packageQueries.iteritems()) - + depfile = create_deps(packageQueries.values()) cpio = cpio.CpioWrite() cpio.add('deps', '\n'.join(depfile)) @@ -582,7 +582,7 @@ def main(opts, argv): # OBS 1.5 and before has no downloadurl defined in buildinfo if bi.downloadurl: urllist.append(bi.downloadurl + '/%(extproject)s/%(extrepository)s/%(arch)s/%(filename)s') - if not opts.cpio_bulk_download: + if not opts.cpio_bulk_download: urllist.append( '%(apiurl)s/build/%(project)s/%(repository)s/%(repoarch)s/%(repopackage)s/%(repofilename)s' ) fetcher = Fetcher(cachedir = config['packagecachedir'], @@ -623,9 +623,9 @@ def main(opts, argv): os.makedirs(os.path.join(pradir)) if not os.path.exists(tffn): if opts.linksources: - os.link(sffn, tffn) + os.link(sffn, tffn) else: - os.symlink(sffn, tffn) + os.symlink(sffn, tffn) if bi.pacsuffix == 'rpm': if opts.no_verify or opts.noinit: @@ -654,7 +654,7 @@ def main(opts, argv): else: print 'WARNING: deb packages get not verified, they can compromise your system !' else: - print 'WARNING: unknown packages get not verified, they can compromise your system !' + print 'WARNING: unknown packages get not verified, they can compromise your system !' print 'Writing build configuration' diff --git a/osc/checker.py b/osc/checker.py index 3b6b1b62..1c23c1bf 100644 --- a/osc/checker.py +++ b/osc/checker.py @@ -7,96 +7,95 @@ import rpm import base64 class KeyError(Exception): - def __init__(self, key, *args): - Exception.__init__(self) - self.args = args - self.key = key - def __str__(self): - return ''+self.key+' :'+' '.join(self.args) + def __init__(self, key, *args): + Exception.__init__(self) + self.args = args + self.key = key + def __str__(self): + return ''+self.key+' :'+' '.join(self.args) class Checker: - def __init__(self): - self.dbdir = mkdtemp(prefix='oscrpmdb') - self.imported = {} - rpm.addMacro('_dbpath', self.dbdir) - self.ts = rpm.TransactionSet() - self.ts.initDB() - self.ts.openDB() - self.ts.setVSFlags(0) - #self.ts.Debug(1) + def __init__(self): + self.dbdir = mkdtemp(prefix='oscrpmdb') + self.imported = {} + rpm.addMacro('_dbpath', self.dbdir) + self.ts = rpm.TransactionSet() + self.ts.initDB() + self.ts.openDB() + self.ts.setVSFlags(0) + #self.ts.Debug(1) - def readkeys(self, keys=[]): - rpm.addMacro('_dbpath', self.dbdir) - for key in keys: - self.readkey(key) + def readkeys(self, keys=[]): + rpm.addMacro('_dbpath', self.dbdir) + for key in keys: + self.readkey(key) - rpm.delMacro("_dbpath") + rpm.delMacro("_dbpath") # python is an idiot -# def __del__(self): -# self.cleanup() +# def __del__(self): +# self.cleanup() - def cleanup(self): - self.ts.closeDB() - rmtree(self.dbdir) + def cleanup(self): + self.ts.closeDB() + rmtree(self.dbdir) - def readkey(self, file): - if file in self.imported: - return + def readkey(self, file): + if file in self.imported: + return - fd = open(file, "r") - line = fd.readline() - if line and line[0:14] == "-----BEGIN PGP": - line = fd.readline() - while line and line != "\n": - line = fd.readline() - if not line: - raise KeyError(file, "not a pgp public key") - else: - raise KeyError(file, "not a pgp public key") - - key = '' - line = fd.readline() - while line: - if line[0:12] == "-----END PGP": - break - line = line.rstrip() - key += line - line = fd.readline() - fd.close() - if not line or line[0:12] != "-----END PGP": - raise KeyError(file, "not a pgp public key") + fd = open(file, "r") + line = fd.readline() + if line and line[0:14] == "-----BEGIN PGP": + line = fd.readline() + while line and line != "\n": + line = fd.readline() + if not line: + raise KeyError(file, "not a pgp public key") + else: + raise KeyError(file, "not a pgp public key") - bkey = base64.b64decode(key) + key = '' + line = fd.readline() + while line: + if line[0:12] == "-----END PGP": + break + line = line.rstrip() + key += line + line = fd.readline() + fd.close() + if not line or line[0:12] != "-----END PGP": + raise KeyError(file, "not a pgp public key") - r = self.ts.pgpImportPubkey(bkey) - if r != 0: - raise KeyError(file, "failed to import pubkey") - self.imported[file] = 1 + bkey = base64.b64decode(key) - def check(self, pkg): - fd = os.open(pkg, os.O_RDONLY) - hdr = self.ts.hdrFromFdno(fd) - os.close(fd) + r = self.ts.pgpImportPubkey(bkey) + if r != 0: + raise KeyError(file, "failed to import pubkey") + self.imported[file] = 1 + + def check(self, pkg): + fd = os.open(pkg, os.O_RDONLY) + hdr = self.ts.hdrFromFdno(fd) + os.close(fd) if __name__ == "__main__": - import sys - keyfiles = [] - pkgs = [] - for arg in sys.argv[1:]: - if arg[-4:] == '.rpm': - pkgs.append(arg) - else: - keyfiles.append(arg) - - checker = Checker() - try: - checker.readkeys(keyfiles) - for pkg in pkgs: - checker.check(pkg) - except Exception, e: - checker.cleanup() - raise e + import sys + keyfiles = [] + pkgs = [] + for arg in sys.argv[1:]: + if arg[-4:] == '.rpm': + pkgs.append(arg) + else: + keyfiles.append(arg) + checker = Checker() + try: + checker.readkeys(keyfiles) + for pkg in pkgs: + checker.check(pkg) + except Exception, e: + checker.cleanup() + raise e # vim: sw=4 et diff --git a/osc/commandline.py b/osc/commandline.py index 8bcbb2dd..96a1687c 100644 --- a/osc/commandline.py +++ b/osc/commandline.py @@ -28,11 +28,11 @@ MAN_FOOTER = r""" Type 'osc help ' for more detailed help on a specific subcommand. .PP For additional information, see - * http://www.opensuse.org/Build_Service_Tutorial - * http://www.opensuse.org/Build_Service/CLI + * http://en.opensuse.org/Build_Service_Tutorial + * http://en.opensuse.org/Build_Service/CLI .PP You can modify osc commands, or roll you own, via the plugin API: - * http://www.opensuse.org/Build_Service/osc_plugins + * http://en.opensuse.org/Build_Service/osc_plugins .SH AUTHOR osc was written by several authors. This man page is automatically generated. """ @@ -48,11 +48,11 @@ class Osc(cmdln.Cmdln): ${help_list} global ${option_list} For additional information, see - * http://www.opensuse.org/Build_Service_Tutorial - * http://www.opensuse.org/Build_Service/CLI + * http://en.opensuse.org/Build_Service_Tutorial + * http://en.opensuse.org/Build_Service/CLI You can modify osc commands, or roll you own, via the plugin API: - * http://www.opensuse.org/Build_Service/osc_plugins + * http://en.opensuse.org/Build_Service/osc_plugins """ name = 'osc' conf = None @@ -388,12 +388,12 @@ class Osc(cmdln.Cmdln): for p in meta_get_packagelist(apiurl, project): if p.startswith("_patchinfo:"): patchinfo = p - + if opts.force or not patchinfo: print "Creating initial patchinfo..." query='cmd=createpatchinfo' if args and args[0]: - query += "&name=" + args[0] + query += "&name=" + args[0] url = makeurl(apiurl, ['source', project], query=query) f = http_POST(url) for p in meta_get_packagelist(apiurl, project): @@ -777,8 +777,8 @@ class Osc(cmdln.Cmdln): for p in pac: result = create_submit_request(apiurl, project, p) if not result: -# sys.exit(result) - sys.exit("submit request creation failed") +# sys.exit(result) + sys.exit("submit request creation failed") sr_ids.append(result) # create submit requests for all found patchinfos @@ -798,13 +798,13 @@ class Osc(cmdln.Cmdln): (actionxml, cgi.escape(opts.message or "")) u = makeurl(apiurl, ['request'], query='cmd=create') f = http_POST(u, data=xml) - + root = ET.parse(f).getroot() sr_ids.append(root.get('id')) print "Requests created: ", for i in sr_ids: - print i, + print i, sys.exit('Successfull finished') elif len(args) <= 2: @@ -1589,7 +1589,7 @@ Please submit there instead, or use --nodevelproject to force direct submission. package, tproject) if r is None: - print >>sys.stderr, 'ERROR: Attribute branch call came not back with a project.' + print >>sys.stderr, 'ERROR: Attribute branch call came not back with a project.' sys.exit(1) print "Project " + r + " created." @@ -1942,9 +1942,9 @@ Please submit there instead, or use --nodevelproject to force direct submission. args = slash_split(args) args = expand_proj_pack(args) - ## FIXME: + ## FIXME: ## if there is only one argument, and it ends in .ymp - ## then fetch it, Parse XML to get the first + ## then fetch it, Parse XML to get the first ## metapackage.group.repositories.repository.url ## and construct zypper cmd's for all ## metapackage.group.software.item.name @@ -2698,7 +2698,7 @@ Please submit there instead, or use --nodevelproject to force direct submission. opts.name_filter = None opts.status_filter = None opts.vertical = None - self.do_prjresults('prjresults', opts, *args); + self.do_prjresults('prjresults', opts, *args) sys.exit(0) else: project = store_read_project(wd) @@ -2819,21 +2819,21 @@ Please submit there instead, or use --nodevelproject to force direct submission. def print_repos(self): - wd = os.curdir - doprint = False - if is_package_dir(wd): - str = "package" - doprint = True - elif is_project_dir(wd): - str = "project" - doprint = True - - if doprint: - print 'Valid arguments for this %s are:' % str - print - self.do_repos(None, None) - print - raise oscerr.WrongArgs('Missing arguments') + wd = os.curdir + doprint = False + if is_package_dir(wd): + str = "package" + doprint = True + elif is_project_dir(wd): + str = "project" + doprint = True + + if doprint: + print 'Valid arguments for this %s are:' % str + print + self.do_repos(None, None) + print + raise oscerr.WrongArgs('Missing arguments') @cmdln.alias('rbl') @cmdln.alias('rbuildlog') @@ -2864,7 +2864,7 @@ Please submit there instead, or use --nodevelproject to force direct submission. raise oscerr.WrongArgs('Too many arguments.') else: project, package, repository, arch = args - + offset=0 if opts.start: offset = int(opts.start) @@ -2954,15 +2954,15 @@ Please submit there instead, or use --nodevelproject to force direct submission. wd = os.curdir args = slash_split(args) project = package = repository = arch = None - + if len(args) < 2: self.print_repos() if len(args) == 2: # 2 if is_package_dir('.'): - package = store_read_package(wd) + package = store_read_package(wd) else: - raise oscerr.WrongArgs('package is not specified.') + raise oscerr.WrongArgs('package is not specified.') project = store_read_project(wd) apiurl = store_read_apiurl(wd) repository = args[0] @@ -2982,9 +2982,9 @@ Please submit there instead, or use --nodevelproject to force direct submission. reason = root.find('explain').text print reason if reason == "meta change": - print "changed keys:" - for package in root.findall('packagechange'): - print " ", package.get('change'), package.get('key') + print "changed keys:" + for package in root.findall('packagechange'): + print " ", package.get('change'), package.get('key') # FIXME: the new osc syntax should allow to specify multiple packages @@ -2997,9 +2997,9 @@ Please submit there instead, or use --nodevelproject to force direct submission. will be triggered when a certain package changes. This is no guarantee, since the new build might have changed dependencies. - dependson shows the build dependencies inside of a project, valid for a + dependson shows the build dependencies inside of a project, valid for a given repository and architecture. - NOTE: to see all binary packages, which can trigger a build you need to + NOTE: to see all binary packages, which can trigger a build you need to refer the buildinfo, since this command shows only the dependencies inside of a project. @@ -3019,7 +3019,7 @@ Please submit there instead, or use --nodevelproject to force direct submission. wd = os.curdir args = slash_split(args) project = packages = repository = arch = reverse = None - + if len(args) < 2 and (is_package_dir('.') or is_project_dir('.')): self.print_repos() @@ -3028,9 +3028,9 @@ Please submit there instead, or use --nodevelproject to force direct submission. if len(args) < 3: # 2 if is_package_dir('.'): - packages = [store_read_package(wd)] + packages = [store_read_package(wd)] elif not is_project_dir('.'): - raise oscerr.WrongArgs('Project and package is not specified.') + raise oscerr.WrongArgs('Project and package is not specified.') project = store_read_project(wd) apiurl = store_read_apiurl(wd) repository = args[0] @@ -3058,7 +3058,7 @@ Please submit there instead, or use --nodevelproject to force direct submission. for package in root.findall('package'): print package.get('name'), ":" for dep in package.findall('pkgdep'): - print " ", dep.text + print " ", dep.text @cmdln.option('-x', '--extra-pkgs', metavar='PAC', action='append', @@ -3090,7 +3090,7 @@ Please submit there instead, or use --nodevelproject to force direct submission. """ wd = os.curdir args = slash_split(args) - + if len(args) < 2 and is_package_dir('.'): self.print_repos() @@ -3151,7 +3151,7 @@ Please submit there instead, or use --nodevelproject to force direct submission. wd = os.curdir args = slash_split(args) - + if len(args) < 2 and is_package_dir('.'): self.print_repos() @@ -4123,7 +4123,7 @@ Please submit there instead, or use --nodevelproject to force direct submission. extra_limiter='attribute/@name="%s"' % (opts.limit_to_attribute) if not opts.substring: opts.exact = True - + role_filter=None if for_user: @@ -4376,7 +4376,7 @@ Please submit there instead, or use --nodevelproject to force direct submission. def do_bugowner(self, subcmd, opts, *args): """${cmd_name}: Show bugowners of a project/package - osc bugowner PRJ + osc bugowner PRJ osc bugowner PRJ PKG Shortcut for osc maintainer -B [PRJ] PKG @@ -4819,7 +4819,7 @@ Please submit there instead, or use --nodevelproject to force direct submission. dir_oldpatched = { 'apiurl': p.apiurl, 'project': p.prjname, 'package': p.name, 'srcmd5': p.srcmd5 } dir_oldpatched['entries'] = [[f.name, f.md5] for f in p.filelist] - + query = { 'rev': linkinfo.srcmd5 } u = makeurl(p.apiurl, ['source', linkinfo.project, linkinfo.package], query=query) f = http_GET(u) diff --git a/osc/conf.py b/osc/conf.py index 54284f12..0dd59eb6 100644 --- a/osc/conf.py +++ b/osc/conf.py @@ -156,7 +156,7 @@ apiurl = %(apiurl)s # This is convenient when sharing the buildroot with ordinary userids # on the host. # This should not be 0 -# build-uid = +# build-uid = # extra packages to install when building packages locally (osc build) # this corresponds to osc build's -x option and can be overridden with that @@ -325,12 +325,12 @@ def init_basicauth(config): import sys if sys.version_info < (2, 6): - # HTTPS proxy is not supported in old urllib2. It only leads to an error - # or, at best, a warning. - if 'https_proxy' in os.environ: - del os.environ['https_proxy'] - if 'HTTPS_PROXY' in os.environ: - del os.environ['HTTPS_PROXY'] + # HTTPS proxy is not supported in old urllib2. It only leads to an error + # or, at best, a warning. + if 'https_proxy' in os.environ: + del os.environ['https_proxy'] + if 'HTTPS_PROXY' in os.environ: + del os.environ['HTTPS_PROXY'] if config['http_debug']: # brute force diff --git a/osc/core.py b/osc/core.py index 1e9e01d7..4dc36575 100644 --- a/osc/core.py +++ b/osc/core.py @@ -1727,7 +1727,7 @@ def parse_buildlogurl(buildlogurl): m = BUILDLOGURL_RE.match(buildlogurl) if not m: raise oscerr.WrongArgs('\'%s\' does not look like url with a build log' % buildlogurl) - + return (m.group('apiurl'), m.group('project'), m.group('package'), m.group('repository'), m.group('arch')) def slash_split(l): @@ -2139,17 +2139,17 @@ def show_attribute_meta(apiurl, prj, pac, subpac, attribute, with_defaults, with path.append('source') path.append(prj) if pac: - path.append(pac) + path.append(pac) if pac and subpac: - path.append(subpac) + path.append(subpac) path.append('_attribute') if attribute: - path.append(attribute) + path.append(attribute) query=[] if with_defaults: - query.append("with_default=1") + query.append("with_default=1") if with_project: - query.append("with_project=1") + query.append("with_project=1") url = makeurl(apiurl, path, query) try: f = http_GET(url) @@ -2547,10 +2547,10 @@ def create_submit_request(apiurl, # Yes, this kind of xml construction is horrible targetxml = "" if dst_project: - packagexml = "" - if dst_package: - packagexml = """package="%s" """ %( dst_package ) - targetxml = """ """ %( dst_project, packagexml ) + packagexml = "" + if dst_package: + packagexml = """package="%s" """ %( dst_package ) + targetxml = """ """ %( dst_project, packagexml ) # XXX: keep the old template for now in order to work with old obs instances xml = """\ @@ -3496,7 +3496,9 @@ def get_results(apiurl, prj, package, lastbuild=None, repository=[], arch=[]): rmap['status'] = '' if rmap['status'] in ['expansion error', 'broken', 'blocked', 'finished']: - rmap['status'] += ': ' + statusnode.find('details').text + details = statusnode.find('details') + if details != None: + rmap['status'] += ': ' + details.text if rmap['dirty'] == 'true': rmap['status'] = 'state is outdated (was: %s)' % rmap['status'] @@ -3644,7 +3646,7 @@ def get_prj_results(apiurl, prj, hide_legend=False, csv=False, status_filter=Non for i in range(0, len(targets)): line.append(str(i%10)) r.append(' '.join(line)) - + r.append('') if not hide_legend and len(pacs): diff --git a/osc/fetch.py b/osc/fetch.py index 82d96691..3dab4c2f 100644 --- a/osc/fetch.py +++ b/osc/fetch.py @@ -114,9 +114,9 @@ class Fetcher: pkgq = packagequery.PackageQuery.query(tmpfile, extra_rpmtags=(1044, 1051, 1052)) arch = pkgq.arch() # SOURCERPM = 1044 - if pkgq.filename_suffix == 'rpm' and not pkgq.getTag(1044): + if pkgq.filename_suffix == 'rpm' and not pkgq.gettag(1044): # NOSOURCE = 1051, NOPATCH = 1052 - if pkgq.getTag(1051) or pkgq.getTag(1052): + if pkgq.gettag(1051) or pkgq.gettag(1052): arch = "nosrc" else: arch = "src" diff --git a/osc/oscssl.py b/osc/oscssl.py index cd42fb66..bc3a5b96 100644 --- a/osc/oscssl.py +++ b/osc/oscssl.py @@ -176,7 +176,7 @@ class myHTTPSHandler(M2Crypto.m2urllib2.HTTPSHandler): # Our change: Check to see if we're using a proxy. # Then create an appropriate ssl-aware connection. - full_url = req.get_full_url() + full_url = req.get_full_url() target_host = urlparse.urlparse(full_url)[1] if (target_host != host): diff --git a/osc/oscsslexcp.py b/osc/oscsslexcp.py index 2c8e8191..e081e179 100644 --- a/osc/oscsslexcp.py +++ b/osc/oscsslexcp.py @@ -2,6 +2,7 @@ class NoSecureSSLError(Exception): def __init__(self, msg): + Exception.__init__(self) self.msg = msg def __str__(self): return self.msg diff --git a/osc/util/debquery.py b/osc/util/debquery.py index 8e2539bf..1f6e797c 100644 --- a/osc/util/debquery.py +++ b/osc/util/debquery.py @@ -104,7 +104,7 @@ class DebQuery(packagequery.PackageQuery): def requires(self): return self.fields['depends'] - def getTag(self, num): + def gettag(self, num): return self.fields.get(num, None) @staticmethod diff --git a/osc/util/packagequery.py b/osc/util/packagequery.py index d2529caf..7c4184a6 100644 --- a/osc/util/packagequery.py +++ b/osc/util/packagequery.py @@ -9,36 +9,36 @@ class PackageQueries(dict): package query, to a name, the package is evaluated to see if it matches the wanted architecture and if it has a greater version than the current value. """ - + # map debian arches to common obs arches - architectureMap = {'i386': ['i586', 'i686'], 'amd64': ['x86_64']} - - def __init__(self, wantedArchitecture): - self.wantedArchitecture = wantedArchitecture + architectureMap = {'i386': ['i586', 'i686'], 'amd64': ['x86_64']} + + def __init__(self, wanted_architecture): + self.wanted_architecture = wanted_architecture super(PackageQueries, self).__init__() - + def add(self, query): """Adds package query to dict if it is of the correct architecture and is newer (has a greater version) than the currently assigned package. - + @param a PackageQuery """ self.__setitem__(query.name(), query) - + def __setitem__(self, name, query): if name != query.name(): raise ValueError("key '%s' does not match " "package query name '%s'" % (name, query.name())) - + architecture = query.arch() - - if (architecture in [self.wantedArchitecture, 'noarch', 'all'] or - self.wantedArchitecture in self.architectureMap.get(architecture, + + if (architecture in [self.wanted_architecture, 'noarch', 'all'] or + self.wanted_architecture in self.architectureMap.get(architecture, [])): - currentQuery = self.get(name) - + current_query = self.get(name) + # if current query does not exist or is older than this new query - if currentQuery is None or currentQuery.vercmp(query) <= 0: + if current_query is None or current_query.vercmp(query) <= 0: super(PackageQueries, self).__setitem__(name, query) class PackageQuery: @@ -63,20 +63,20 @@ class PackageQuery: def description(self): raise NotImplementedError - + def path(self): raise NotImplementedError - + def provides(self): raise NotImplementedError def requires(self): raise NotImplementedError - def getTag(self): + def gettag(self): raise NotImplementedError - def vercmp(self, pkgq): + def vercmp(self, pkgquery): raise NotImplementedError @staticmethod @@ -85,20 +85,20 @@ class PackageQuery: magic = f.read(7) f.seek(0) extra_tags = () - pkgq = None + pkgquery = None if magic[:4] == '\xed\xab\xee\xdb': import rpmquery - pkgq = rpmquery.RpmQuery(f) + pkgquery = rpmquery.RpmQuery(f) extra_tags = extra_rpmtags elif magic == '!': import debquery - pkgq = debquery.DebQuery(f) + pkgquery = debquery.DebQuery(f) extra_tags = extra_debtags else: raise PackageError('unsupported package type. magic: \'%s\' (%s)' % (magic, filename)) - pkgq.read(all_tags, *extra_tags) + pkgquery.read(all_tags, *extra_tags) f.close() - return pkgq + return pkgquery if __name__ == '__main__': import sys diff --git a/osc/util/repodata.py b/osc/util/repodata.py index 16dd9200..a85839e5 100644 --- a/osc/util/repodata.py +++ b/osc/util/repodata.py @@ -25,7 +25,7 @@ OPERATOR_BY_FLAGS = { def primaryPath(directory): """Returns path to the primary repository data file. - + @param directory repository directory that contains the repodata subdirectory @return str path to primary repository data file @raise IOError if repomd.xml contains no primary location @@ -33,7 +33,7 @@ def primaryPath(directory): metaDataPath = os.path.join(directory, "repodata", "repomd.xml") elementTree = ET.parse(metaDataPath) root = elementTree.getroot() - + for dataElement in root: if dataElement.get("type") == "primary": locationElement = dataElement.find(namespace("repo") + "location") @@ -43,110 +43,110 @@ def primaryPath(directory): break else: raise IOError("'%s' contains no primary location" % metaDataPath) - + return primaryPath def queries(directory): """Returns a list of RepoDataQueries constructed from the repodata under the directory. - + @param directory path to a repository directory (parent directory of repodata directory) @return list of RepoDataQuery instances @raise IOError if repomd.xml contains no primary location """ path = primaryPath(directory) - + gunzippedPrimary = gzip.GzipFile(path) elementTree = ET.parse(gunzippedPrimary) root = elementTree.getroot() - + packageQueries = [] for packageElement in root: packageQuery = RepoDataQuery(directory, packageElement) packageQueries.append(packageQuery) - + return packageQueries class RepoDataQuery(object): """PackageQuery that reads in data from the repodata directory files.""" - + def __init__(self, directory, element): """Creates a RepoDataQuery from the a package Element under a metadata Element in a primary.xml file. - + @param directory repository directory path. Used to convert relative paths to full paths. @param element package Element """ self.__directory = os.path.abspath(directory) self.__element = element - + def __formatElement(self): return self.__element.find(namespace("common") + "format") - + def __parseEntry(self, element): entry = element.get("name") flags = element.get("flags") - + if flags is not None: version = element.get("ver") operator = OPERATOR_BY_FLAGS[flags] entry += " %s %s" % (operator, version) - + release = element.get("rel") if release is not None: entry += "-%s" % release - + return entry - + def __parseEntryCollection(self, collection): formatElement = self.__formatElement() collectionElement = formatElement.find(namespace("rpm") + collection) - + entries = [] if collectionElement is not None: for entryElement in collectionElement.findall(namespace("rpm") + "entry"): entry = self.__parseEntry(entryElement) entries.append(entry) - + return entries - + def __versionElement(self): return self.__element.find(namespace("common") + "version") - + def arch(self): return self.__element.find(namespace("common") + "arch").text - + def description(self): return self.__element.find(namespace("common") + "description").text - + def distribution(self): return None - + def epoch(self): return self.__versionElement().get("epoch") - + def name(self): return self.__element.find(namespace("common") + "name").text - + def path(self): locationElement = self.__element.find(namespace("common") + "location") relativePath = locationElement.get("href") absolutePath = os.path.join(self.__directory, relativePath) - + return absolutePath - + def provides(self): return self.__parseEntryCollection("provides") - + def release(self): return self.__versionElement().get("rel") - + def requires(self): return self.__parseEntryCollection("requires") - + def vercmp(self, other): res = osc.util.rpmquery.RpmQuery.rpmvercmp(str(self.epoch()), str(other.epoch())) if res != 0: @@ -156,6 +156,6 @@ class RepoDataQuery(object): return res res = osc.util.rpmquery.RpmQuery.rpmvercmp(self.release(), other.release()) return res - + def version(self): return self.__versionElement().get("ver") diff --git a/osc/util/rpmquery.py b/osc/util/rpmquery.py index 2b34c75e..2336b318 100644 --- a/osc/util/rpmquery.py +++ b/osc/util/rpmquery.py @@ -20,7 +20,7 @@ class RpmHeader: def append(self, entry): self.entries.append(entry) - def getTag(self, tag): + def gettag(self, tag): for i in self.entries: if i.tag == tag: return i @@ -131,7 +131,7 @@ class RpmQuery(packagequery.PackageQuery): entry.data = entry.data[0] return # get private i18n table - table = self.header.getTag(100) + table = self.header.gettag(100) # just care about the country code lang = lang.split('_', 1)[0] cnt = 0 @@ -147,9 +147,9 @@ class RpmQuery(packagequery.PackageQuery): raise RpmHeaderError('unsupported tag type \'%d\' (tag: \'%s\'' % (entry.type, entry.tag)) def __reqprov(self, tag, flags, version): - pnames = self.header.getTag(tag).data - pflags = self.header.getTag(flags).data - pvers = self.header.getTag(version).data + pnames = self.header.gettag(tag).data + pflags = self.header.gettag(flags).data + pvers = self.header.gettag(version).data if not (pnames and pflags and pvers): raise RpmError('cannot get provides/requires, tags are missing') res = [] @@ -179,46 +179,46 @@ class RpmQuery(packagequery.PackageQuery): # XXX: create dict for the tag => number mapping?! def name(self): - return self.header.getTag(1000).data + return self.header.gettag(1000).data def version(self): - return self.header.getTag(1001).data + return self.header.gettag(1001).data def release(self): - return self.header.getTag(1002).data + return self.header.gettag(1002).data def epoch(self): - epoch = self.header.getTag(1003) + epoch = self.header.gettag(1003) if epoch is None: return 0 return epoch.data[0] def arch(self): - return self.header.getTag(1022).data + return self.header.gettag(1022).data def summary(self): - return self.header.getTag(1004).data + return self.header.gettag(1004).data def description(self): - return self.header.getTag(1005).data + return self.header.gettag(1005).data def url(self): - entry = self.header.getTag(1020) + entry = self.header.gettag(1020) if entry is None: return None return entry.data def path(self): return self.__path - + def provides(self): return self.__reqprov(1047, 1112, 1113) def requires(self): return self.__reqprov(1049, 1048, 1050) - def getTag(self, num): - return self.header.getTag(num) + def gettag(self, num): + return self.header.gettag(num) @staticmethod def query(filename):