From 4c168a2428d044df6f701d5fd6a3fbc20a39a2db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Schr=C3=B6ter?= Date: Wed, 26 May 2010 16:46:01 +0200 Subject: [PATCH 01/37] fix typo --- osc/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osc/core.py b/osc/core.py index abe9670d..986c312f 100644 --- a/osc/core.py +++ b/osc/core.py @@ -4977,7 +4977,7 @@ def get_user_projpkgs(apiurl, user, role=None, exclude_projects=[], proj=True, p try: res = search(apiurl, **what) except urllib2.HTTPError, e: - if e.code != 400 or not role_filter: + if e.code != 400 or not role_filter_xpath: raise e # backward compatibility: local role filtering what = dict([[kind, role_filter_xpath] for kind in what.keys()]) From f023578cf227ce54588db1447566e35d4a514b92 Mon Sep 17 00:00:00 2001 From: Marcus Huewe Date: Thu, 27 May 2010 01:54:04 +0200 Subject: [PATCH 02/37] - cleanup the new "meta mode" a bit currently it isn't possible to change from "meta mode" to "normal" mode (except with some dirty hacks..) --- osc/core.py | 35 ++++++++++++----------------------- 1 file changed, 12 insertions(+), 23 deletions(-) diff --git a/osc/core.py b/osc/core.py index 986c312f..e8e68561 100644 --- a/osc/core.py +++ b/osc/core.py @@ -755,12 +755,11 @@ class Project: class Package: """represent a package (its directory) and read/keep/write its metadata""" - def __init__(self, workingdir, progress_obj=None, limit_size=None, meta=None): + def __init__(self, workingdir, progress_obj=None, limit_size=None): self.dir = workingdir self.absdir = os.path.abspath(self.dir) self.storedir = os.path.join(self.absdir, store) self.progress_obj = progress_obj - self.meta = meta self.limit_size = limit_size if limit_size and limit_size == 0: self.limit_size = None @@ -847,16 +846,13 @@ class Package: self.write_conflictlist() def write_meta_mode(self): + # XXX: the "elif" is somehow a contradiction (with current and the old implementation + # it's not possible to "leave" the metamode again) (except if you modify pac.meta + # which is really ugly:) ) if self.meta: - fname = os.path.join(self.storedir, '_meta_mode') - f = open(fname, 'w') - f.write(str("true")) - f.close() - else: - try: - os.unlink(os.path.join(self.storedir, '_meta_mode')) - except: - pass + store_write_string(self.absdir, '_meta_mode', '') + elif self.ismetamode(): + os.unlink(os.path.join(self.storedir, '_meta_mode')) def write_sizelimit(self): if self.size_limit and self.size_limit <= 0: @@ -1142,7 +1138,7 @@ class Package: self.in_conflict = read_inconflict(self.dir) self.linkrepair = os.path.isfile(os.path.join(self.storedir, '_linkrepair')) self.size_limit = read_sizelimit(self.dir) - self.meta = read_meta_mode(self.dir) + self.meta = self.ismetamode() # gather unversioned files, but ignore some stuff self.excluded = [ i for i in os.listdir(self.dir) @@ -1175,6 +1171,10 @@ class Package: """tells us if the link is frozen.""" return os.path.isfile(os.path.join(self.storedir, '_frozenlink')) + def ismetamode(self): + """tells us if the package is in meta mode""" + return os.path.isfile(os.path.join(self.storedir, '_meta_mode')) + def get_pulled_srcmd5(self): pulledrev = None for line in open(os.path.join(self.storedir, '_pulled'), 'r'): @@ -1959,17 +1959,6 @@ def read_tobedeleted(dir): return r -def read_meta_mode(dir): - r = None - fname = os.path.join(dir, store, '_meta_mode') - - if os.path.exists(fname): - r = open(fname).readline() - - if r is None or not r == "true": - return None - return 1 - def read_sizelimit(dir): r = None fname = os.path.join(dir, store, '_size_limit') From 24d3b18e135befe24886f2d461d7622fcf2ebf31 Mon Sep 17 00:00:00 2001 From: Marcus Huewe Date: Thu, 27 May 2010 02:18:00 +0200 Subject: [PATCH 03/37] - cleanups - fixed do_log - use "safe writes" in init_package_dir() --- osc/commandline.py | 7 ++----- osc/core.py | 45 ++++++++++++++++++--------------------------- 2 files changed, 20 insertions(+), 32 deletions(-) diff --git a/osc/commandline.py b/osc/commandline.py index fc1810d0..82afc0f6 100644 --- a/osc/commandline.py +++ b/osc/commandline.py @@ -4160,11 +4160,8 @@ Please submit there instead, or use --nodevelproject to force direct submission. project = args[0] package = args[1] - if opts.meta: - meta = 1 - rev, dummy = parseRevisionOption(opts.revision) - if rev and not checkRevision(project, package, rev, apiurl, meta): + if rev and not checkRevision(project, package, rev, apiurl, opts.meta): print >>sys.stderr, 'Revision \'%s\' does not exist' % rev sys.exit(1) @@ -4174,7 +4171,7 @@ Please submit there instead, or use --nodevelproject to force direct submission. if opts.xml: format = 'xml' - log = '\n'.join(get_commitlog(apiurl, project, package, rev, format, meta)) + log = '\n'.join(get_commitlog(apiurl, project, package, rev, format, opts.meta)) run_pager(log) @cmdln.option('-f', '--failed', action='store_true', diff --git a/osc/core.py b/osc/core.py index e8e68561..fcef8399 100644 --- a/osc/core.py +++ b/osc/core.py @@ -845,6 +845,7 @@ class Package: self.write_conflictlist() + # XXX: this isn't used at all def write_meta_mode(self): # XXX: the "elif" is somehow a contradiction (with current and the old implementation # it's not possible to "leave" the metamode again) (except if you modify pac.meta @@ -2124,7 +2125,7 @@ def init_project_dir(apiurl, dir, project): if conf.config['do_package_tracking']: store_write_initial_packages(dir, project, []) -def init_package_dir(apiurl, project, package, dir, revision=None, files=True, limit_size=None, meta=None): +def init_package_dir(apiurl, project, package, dir, revision=None, files=True, limit_size=None, meta=False): if not os.path.isdir(store): os.mkdir(store) os.chdir(store) @@ -2136,31 +2137,21 @@ def init_package_dir(apiurl, project, package, dir, revision=None, files=True, l f.close() if meta: - f = open('_meta_mode', 'w') - f.write("true") - f.close() + store_write_string(os.pardir, '_meta_mode', '') if limit_size: - f = open('_size_limit', 'w') - f.write(str(limit_size)) - f.close() + store_write_string(os.pardir, '_size_limit', str(limit_size)) if files: - f = open('_files', 'w') - f.write(''.join(show_files_meta(apiurl, project, package, revision=revision, limit_size=limit_size, meta=meta))) - f.close() + fmeta = ''.join(show_files_meta(apiurl, project, package, revision=revision, limit_size=limit_size, meta=meta)) + store_write_string(os.pardir, '_files', fmeta) else: # create dummy ET.ElementTree(element=ET.Element('directory')).write('_files') - f = open('_osclib_version', 'w') - f.write(__store_version__ + '\n') - f.close() - + store_write_string(os.pardir, '_osclib_version', __store_version__ + '\n') store_write_apiurl(os.path.pardir, apiurl) - os.chdir(os.pardir) - return def check_store_version(dir): @@ -2267,7 +2258,7 @@ def show_package_trigger_reason(apiurl, prj, pac, repo, arch): raise -def show_package_meta(apiurl, prj, pac, meta=None): +def show_package_meta(apiurl, prj, pac, meta=False): query = {} if meta: query['meta'] = 1 @@ -2487,7 +2478,7 @@ def edit_meta(metatype, f.sync() -def show_files_meta(apiurl, prj, pac, revision=None, expand=False, linkrev=None, linkrepair=False, limit_size=None, meta=None): +def show_files_meta(apiurl, prj, pac, revision=None, expand=False, linkrev=None, linkrepair=False, limit_size=None, meta=False): query = {} if revision: query['rev'] = revision @@ -2513,12 +2504,12 @@ def show_files_meta(apiurl, prj, pac, revision=None, expand=False, linkrev=None, return ET.tostring(root) -def show_upstream_srcmd5(apiurl, prj, pac, expand=False, revision=None, meta=None): +def show_upstream_srcmd5(apiurl, prj, pac, expand=False, revision=None, meta=False): m = show_files_meta(apiurl, prj, pac, expand=expand, revision=revision, meta=meta) return ET.fromstring(''.join(m)).get('srcmd5') -def show_upstream_xsrcmd5(apiurl, prj, pac, revision=None, linkrev=None, linkrepair=False, meta=None): +def show_upstream_xsrcmd5(apiurl, prj, pac, revision=None, linkrev=None, linkrepair=False, meta=False): m = show_files_meta(apiurl, prj, pac, revision=revision, linkrev=linkrev, linkrepair=linkrepair, meta=meta) try: # only source link packages have a element. @@ -2534,7 +2525,7 @@ def show_upstream_xsrcmd5(apiurl, prj, pac, revision=None, linkrev=None, linkrep return li.xsrcmd5 -def show_upstream_rev(apiurl, prj, pac, meta=None): +def show_upstream_rev(apiurl, prj, pac, meta=False): m = show_files_meta(apiurl, prj, pac, meta=meta) return ET.fromstring(''.join(m)).get('rev') @@ -2917,7 +2908,7 @@ def download(url, filename, progress_obj = None, mtime = None): if mtime: os.utime(filename, (-1, mtime)) -def get_source_file(apiurl, prj, package, filename, targetfilename=None, revision=None, progress_obj=None, mtime=None, meta=None): +def get_source_file(apiurl, prj, package, filename, targetfilename=None, revision=None, progress_obj=None, mtime=None, meta=False): targetfilename = targetfilename or filename query = {} if meta: @@ -3144,7 +3135,7 @@ def make_diff(wc, revision): def server_diff(apiurl, old_project, old_package, old_revision, - new_project, new_package, new_revision, unified=False, missingok=False, meta=None): + new_project, new_package, new_revision, unified=False, missingok=False, meta=False): query = {'cmd': 'diff', 'expand': '1'} if old_project: query['oproject'] = old_project @@ -3211,7 +3202,7 @@ def make_dir(apiurl, project, package, pathname=None, prj_dir=None): def checkout_package(apiurl, project, package, revision=None, pathname=None, prj_obj=None, - expand_link=False, prj_dir=None, service_files=None, progress_obj=None, limit_size=None, meta=None): + expand_link=False, prj_dir=None, service_files=None, progress_obj=None, limit_size=None, meta=False): try: # the project we're in might be deleted. # that'll throw an error then. @@ -4030,7 +4021,7 @@ def print_jobhistory(apiurl, prj, current_package, repository, arch, format = 't print '%s %-50s %-16s %-16s %-16s %-16s' % (endtime, package[0:49], reason[0:15], code[0:15], waitbuild, worker) -def get_commitlog(apiurl, prj, package, revision, format = 'text', meta = None): +def get_commitlog(apiurl, prj, package, revision, format = 'text', meta = False): import time, locale query = {} @@ -4276,7 +4267,7 @@ def parseRevisionOption(string): else: return None, None -def checkRevision(prj, pac, revision, apiurl=None): +def checkRevision(prj, pac, revision, apiurl=None, meta=False): """ check if revision is valid revision, i.e. it is not larger than the upstream revision id @@ -4287,7 +4278,7 @@ def checkRevision(prj, pac, revision, apiurl=None): if not apiurl: apiurl = conf.config['apiurl'] try: - if int(revision) > int(show_upstream_rev(apiurl, prj, pac)) \ + if int(revision) > int(show_upstream_rev(apiurl, prj, pac, meta)) \ or int(revision) <= 0: return False else: From b0b5953b3eb11f5165acde281aaf2a25437e1975 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Schr=C3=B6ter?= Date: Thu, 27 May 2010 07:17:27 +0200 Subject: [PATCH 04/37] support history of projects via "osc log" --- osc/commandline.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/osc/commandline.py b/osc/commandline.py index 82afc0f6..d599c1ca 100644 --- a/osc/commandline.py +++ b/osc/commandline.py @@ -4139,7 +4139,7 @@ Please submit there instead, or use --nodevelproject to force direct submission. Usage: osc log (inside working copy) - osc log remote_project remote_package + osc log remote_project [remote_package] ${cmd_option_list} """ @@ -4150,12 +4150,19 @@ Please submit there instead, or use --nodevelproject to force direct submission. if len(args) == 0: wd = os.curdir - project = store_read_project(wd) - package = store_read_package(wd) - elif len(args) < 2: + if is_project_dir(dir) or is_package_dir(dir): + project = store_read_project(wd) + if is_project_dir(dir): + package = "_project" + else: + package = store_read_package(wd) + elif len(args) < 1: raise oscerr.WrongArgs('Too few arguments (required none or two)') elif len(args) > 2: raise oscerr.WrongArgs('Too many arguments (required none or two)') + elif len(args) == 1: + project = args[0] + package = "_project" else: project = args[0] package = args[1] From e4615a324b7b4e5a776b5af54cb0803dab1b1399 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Schr=C3=B6ter?= Date: Thu, 27 May 2010 07:21:33 +0200 Subject: [PATCH 05/37] add propper error handling in case running "osc log" outside of checked out project/package --- osc/commandline.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/osc/commandline.py b/osc/commandline.py index d599c1ca..1463601d 100644 --- a/osc/commandline.py +++ b/osc/commandline.py @@ -4156,6 +4156,8 @@ Please submit there instead, or use --nodevelproject to force direct submission. package = "_project" else: package = store_read_package(wd) + else: + raise oscerr.WrongArgs('Local directory is not a checked out resource and no remote project/package given.') elif len(args) < 1: raise oscerr.WrongArgs('Too few arguments (required none or two)') elif len(args) > 2: From d6a5c4c6fb7e3ac319a5869493b1457c1f3a94c7 Mon Sep 17 00:00:00 2001 From: Michael Schroeder Date: Thu, 27 May 2010 17:05:40 +0200 Subject: [PATCH 06/37] - fix result query, build package list from all results --- osc/core.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/osc/core.py b/osc/core.py index fcef8399..3178621e 100644 --- a/osc/core.py +++ b/osc/core.py @@ -3732,11 +3732,12 @@ def get_prj_results(apiurl, prj, hide_legend=False, csv=False, status_filter=Non targets = [] # {package: {(repo,arch): status}} status = {} - if not root.find('result'): + if root.find('result') == None: return [] - for node in root.find('result'): - pacs.append(node.get('package')) - pacs.sort() + for results in root.findall('result'): + for node in results: + pacs.append(node.get('package')) + pacs = sorted(list(set(pacs))) for node in root.findall('result'): # filter architecture and repository if arch != None and arch != node.get('arch'): From 513d984c763beb095e9b04ad9281c47208a0e377 Mon Sep 17 00:00:00 2001 From: Marcus Huewe Date: Thu, 27 May 2010 21:44:35 +0200 Subject: [PATCH 07/37] - print name of the missing key --- osc/fetch.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osc/fetch.py b/osc/fetch.py index 1b982d07..b13d9749 100644 --- a/osc/fetch.py +++ b/osc/fetch.py @@ -289,7 +289,7 @@ def verify_pacs_old(pac_list): missing_key = line.split('#')[-1].split(')')[0] print >>sys.stderr, """ -- If the key is missing, install it first. +- If the key (%(name)s) is missing, install it first. For example, do the following: osc signkey PROJECT > file and, as root: From 2ba65c531a69723f824916fbe2a98a72ba7dbefe Mon Sep 17 00:00:00 2001 From: Ludwig Nussel Date: Mon, 7 Jun 2010 09:01:32 +0200 Subject: [PATCH 08/37] fix osc log without arguments --- osc/commandline.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/osc/commandline.py b/osc/commandline.py index 1463601d..38d4abee 100644 --- a/osc/commandline.py +++ b/osc/commandline.py @@ -4150,14 +4150,14 @@ Please submit there instead, or use --nodevelproject to force direct submission. if len(args) == 0: wd = os.curdir - if is_project_dir(dir) or is_package_dir(dir): - project = store_read_project(wd) - if is_project_dir(dir): - package = "_project" - else: - package = store_read_package(wd) + if is_project_dir(wd) or is_package_dir(wd): + project = store_read_project(wd) + if is_project_dir(wd): + package = "_project" + else: + package = store_read_package(wd) else: - raise oscerr.WrongArgs('Local directory is not a checked out resource and no remote project/package given.') + raise oscerr.NoWorkingCopy("Error: \"%s\" is not an osc working copy." % os.path.abspath(wd)) elif len(args) < 1: raise oscerr.WrongArgs('Too few arguments (required none or two)') elif len(args) > 2: From c6d417d6b70c774e603fdb00912423f63181fe00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Schr=C3=B6ter?= Date: Mon, 7 Jun 2010 14:30:36 +0200 Subject: [PATCH 09/37] fix typo, wrong package name recommended. --- osc/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osc/core.py b/osc/core.py index 3178621e..b40cdaf4 100644 --- a/osc/core.py +++ b/osc/core.py @@ -310,7 +310,7 @@ class Serviceinfo: name = call.split(None, 1)[0] if not os.path.exists("/usr/lib/obs/service/"+name): msg = "ERROR: service is not installed!\n" - msg += "Maybe try this: zypper in obs-server-" + name + msg += "Maybe try this: zypper in obs-service-" + name raise oscerr.APIError(msg) c = "/usr/lib/obs/service/" + call + " --outdir " + temp_dir if conf.config['verbose'] > 1: From 01d349d0e8567ca3f38fc38280afd04d017e2e68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Schr=C3=B6ter?= Date: Tue, 8 Jun 2010 11:24:10 +0200 Subject: [PATCH 10/37] make it possible to run local source services on checkout/update --- osc/commandline.py | 29 ++++++++++++++--------------- osc/core.py | 7 +++++-- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/osc/commandline.py b/osc/commandline.py index 38d4abee..af757ea7 100644 --- a/osc/commandline.py +++ b/osc/commandline.py @@ -2477,8 +2477,9 @@ Please submit there instead, or use --nodevelproject to force direct submission. help='place PACKAGE folder in the current directory' \ 'instead of a PROJECT/PACKAGE directory') @cmdln.option('-s', '--source-service-files', action='store_true', - help='server side generated files of source services' \ - 'gets downloaded as well' ) + help='Use server side generated sources instead of local generation.' ) + @cmdln.option('-S', '--server-side-source-service-files', action='store_true', + help='Use server side generated sources instead of local generation.' ) @cmdln.option('-l', '--limit-size', metavar='limit_size', help='Skip all files with a given size') @cmdln.alias('co') @@ -2511,10 +2512,6 @@ Please submit there instead, or use --nodevelproject to force direct submission. expand_link = False else: expand_link = True - if opts.source_service_files: - service_files = True - else: - service_files = False args = slash_split(args) project = package = filename = None @@ -2550,7 +2547,7 @@ Please submit there instead, or use --nodevelproject to force direct submission. if opts.current_dir: project_dir = None checkout_package(apiurl, project, package, rev, expand_link=expand_link, \ - prj_dir=project_dir, service_files=service_files, progress_obj=self.download_progress, limit_size=opts.limit_size, meta=opts.meta) + prj_dir=project_dir, service_files = opts.source_service_files, server_service_files=opts.server_side_source_service_files, progress_obj=self.download_progress, limit_size=opts.limit_size, meta=opts.meta) print_request_list(apiurl, project, package) elif project: @@ -2570,13 +2567,13 @@ Please submit there instead, or use --nodevelproject to force direct submission. for package in meta_get_packagelist(apiurl, project): try: checkout_package(apiurl, project, package, expand_link = expand_link, \ - prj_dir = prj_dir, service_files = service_files, progress_obj=self.download_progress, limit_size=opts.limit_size, meta=opts.meta) + prj_dir = prj_dir, service_files = opts.source_service_files, server_service_files = opts.server_side_source_service_files, progress_obj=self.download_progress, limit_size=opts.limit_size, meta=opts.meta) except oscerr.LinkExpandError, e: print >>sys.stderr, 'Link cannot be expanded:\n', e print >>sys.stderr, 'Use "osc repairlink" for fixing merge conflicts:\n' # check out in unexpanded form at least checkout_package(apiurl, project, package, expand_link = False, \ - prj_dir = prj_dir, service_files = service_files, progress_obj=self.download_progress, limit_size=opts.limit_size, meta=opts.meta) + prj_dir = prj_dir, service_files = opts.source_service_files, server_service_files = opts.server_side_source_service_files, progress_obj=self.download_progress, limit_size=opts.limit_size, meta=opts.meta) print_request_list(apiurl, project) else: @@ -2900,6 +2897,8 @@ Please submit there instead, or use --nodevelproject to force direct submission. help='if a package is a link, update to the expanded sources') @cmdln.option('-s', '--source-service-files', action='store_true', help='Use server side generated sources instead of local generation.' ) + @cmdln.option('-S', '--server-side-source-service-files', action='store_true', + help='Use server side generated sources instead of local generation.' ) @cmdln.option('-l', '--limit-size', metavar='limit_size', help='Skip all files with a given size') @cmdln.alias('up') @@ -2935,9 +2934,6 @@ Please submit there instead, or use --nodevelproject to force direct submission. raise oscerr.WrongOptions('Sorry, the options --expand-link, --unexpand-link and ' '--revision are mutually exclusive.') - if opts.source_service_files: service_files = True - else: service_files = False - args = parseargs(args) arg_list = args[:] @@ -2991,17 +2987,20 @@ Please submit there instead, or use --nodevelproject to force direct submission. rev = p.show_upstream_xsrcmd5(linkrev="base") p.mark_frozen() else: - p.update(rev, service_files, opts.limit_size) + p.update(rev, opts.server_side_source_service_files, opts.limit_size) rev = p.linkinfo.xsrcmd5 print 'Expanding to rev', rev elif opts.unexpand_link and p.islink() and p.isexpanded(): print 'Unexpanding to rev', p.linkinfo.lsrcmd5 - p.update(rev, service_files, opts.limit_size) + p.update(rev, opts.server_side_source_service_files, opts.limit_size) rev = p.linkinfo.lsrcmd5 elif p.islink() and p.isexpanded(): rev = p.latest_rev() - p.update(rev, service_files, opts.limit_size) + p.update(rev, opts.server_side_source_service_files, opts.limit_size) + if opts.source_service_files: + print 'Running local source services' + p.run_source_services() if opts.unexpand_link: p.unmark_frozen() rev = None diff --git a/osc/core.py b/osc/core.py index b40cdaf4..95d4081c 100644 --- a/osc/core.py +++ b/osc/core.py @@ -3202,7 +3202,7 @@ def make_dir(apiurl, project, package, pathname=None, prj_dir=None): def checkout_package(apiurl, project, package, revision=None, pathname=None, prj_obj=None, - expand_link=False, prj_dir=None, service_files=None, progress_obj=None, limit_size=None, meta=False): + expand_link=False, prj_dir=None, server_service_files = None, service_files=None, progress_obj=None, limit_size=None, meta=False): try: # the project we're in might be deleted. # that'll throw an error then. @@ -3248,7 +3248,7 @@ def checkout_package(apiurl, project, package, for filename in p.filenamelist: if filename in p.skipped: continue - if service_files or not filename.startswith('_service:'): + if server_service_files or not filename.startswith('_service:'): p.updatefile(filename, revision) # print 'A ', os.path.join(project, package, filename) print statfrmt('A', os.path.join(pathname, filename)) @@ -3258,6 +3258,9 @@ def checkout_package(apiurl, project, package, prj_obj = Project(os.getcwd()) prj_obj.set_state(p.name, ' ') prj_obj.write_packages() + if service_files: + print "Running local source services" + p.run_source_services() os.chdir(olddir) From 0a5cfa9c0051bcf2dc255d94bc485dff132069b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Schr=C3=B6ter?= Date: Wed, 9 Jun 2010 12:59:36 +0200 Subject: [PATCH 11/37] tag it as 0.127 --- osc/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osc/core.py b/osc/core.py index 95d4081c..f4ae72d4 100644 --- a/osc/core.py +++ b/osc/core.py @@ -3,7 +3,7 @@ # and distributed under the terms of the GNU General Public Licence, # either version 2, or version 3 (at your option). -__version__ = '0.126git' +__version__ = '0.127' # __store_version__ is to be incremented when the format of the working copy # "store" changes in an incompatible way. Please add any needed migration From 163b3e3dfa50f3eeb1b7a2b4697be3f001835eed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Schr=C3=B6ter?= Date: Wed, 9 Jun 2010 13:00:35 +0200 Subject: [PATCH 12/37] and start with 0.128 development --- NEWS | 2 ++ osc/core.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 21be122a..42bc100e 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,5 @@ +0.128 + 0.127 - add size limit mode, files can be ignored on checkout or update given a certain size limit. - --csv/--format options for results command - using format user can explicitly specify what he wants print diff --git a/osc/core.py b/osc/core.py index f4ae72d4..31523807 100644 --- a/osc/core.py +++ b/osc/core.py @@ -3,7 +3,7 @@ # and distributed under the terms of the GNU General Public Licence, # either version 2, or version 3 (at your option). -__version__ = '0.127' +__version__ = '0.127git' # __store_version__ is to be incremented when the format of the working copy # "store" changes in an incompatible way. Please add any needed migration From 42b5f3961db8a3c949662cbf8eadffcc77d411dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 9 Jun 2010 14:20:48 +0200 Subject: [PATCH 13/37] Implement functions to get defaults for editor/pager. These are platform specific, for example on Debian we want to use the ones provided by sensible-utils. --- osc/core.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/osc/core.py b/osc/core.py index 31523807..068b151e 100644 --- a/osc/core.py +++ b/osc/core.py @@ -2585,6 +2585,38 @@ def read_meta_from_spec(specfile, *args): return spec_data +def get_default_editor(): + import platform + system = platform.system() + if system == 'Windows': + return 'notepad' + if system == 'Linux': + try: + # Python 2.6 + dist = platform.linux_distributionx()[0] + except AttributeError: + dist = platform.dist()[0] + if dist == 'debian': + return 'editor' + return 'vim' + return 'vi' + +def get_default_pager(): + import platform + system = platform.system() + if system == 'Windows': + return 'less' + if system == 'Linux': + try: + # Python 2.6 + dist = platform.linux_distributionx()[0] + except AttributeError: + dist = platform.dist()[0] + if dist == 'debian': + return 'pager' + return 'less' + return 'more' + def run_pager(message): import tempfile, sys From 5e817707cfacdda81c2c06c1c64c40b370dbd80e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 9 Jun 2010 14:22:46 +0200 Subject: [PATCH 14/37] Use new functions for getting default pager/editor. --- osc/core.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/osc/core.py b/osc/core.py index 068b151e..b31782c1 100644 --- a/osc/core.py +++ b/osc/core.py @@ -2626,15 +2626,12 @@ def run_pager(message): tmpfile = tempfile.NamedTemporaryFile() tmpfile.write(message) tmpfile.flush() - pager = os.getenv('PAGER', default='less') + pager = os.getenv('PAGER', default=get_default_pager()) subprocess.call('%s %s' % (pager, tmpfile.name), shell=True) tmpfile.close() def run_editor(filename): - if sys.platform[:3] != 'win': - editor = os.getenv('EDITOR', default='vim') - else: - editor = os.getenv('EDITOR', default='notepad') + editor = os.getenv('EDITOR', default=get_default_editor()) return subprocess.call([ editor, filename ]) @@ -4944,7 +4941,7 @@ def request_interactive_review(apiurl, request): request.actions[0].src_project, request.actions[0].src_package, request.actions[0].src_rev, True, False) tmpfile.write(diff) tmpfile.flush() - pager = os.getenv('EDITOR', default='less') + pager = os.getenv('EDITOR', default=get_default_editor()) subprocess.call('%s %s' % (pager, tmpfile.name), shell=True) elif repl == 'c': print >>sys.stderr, 'Aborting' From e9e6da1a3734bab37dd896e658ec14847677929f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 9 Jun 2010 14:25:14 +0200 Subject: [PATCH 15/37] Update news to mention editor selection. --- NEWS | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS b/NEWS index 42bc100e..ff0b8dd2 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,5 @@ 0.128 + - better default commands selection for editor/pager 0.127 - add size limit mode, files can be ignored on checkout or update given a certain size limit. From ca83f1f5d212db29e5f5d4b4ae892bb4204bb075 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 9 Jun 2010 14:28:03 +0200 Subject: [PATCH 16/37] Use standard method for running editor. --- osc/core.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/osc/core.py b/osc/core.py index b31782c1..f64e179f 100644 --- a/osc/core.py +++ b/osc/core.py @@ -4941,8 +4941,7 @@ def request_interactive_review(apiurl, request): request.actions[0].src_project, request.actions[0].src_package, request.actions[0].src_rev, True, False) tmpfile.write(diff) tmpfile.flush() - pager = os.getenv('EDITOR', default=get_default_editor()) - subprocess.call('%s %s' % (pager, tmpfile.name), shell=True) + run_editor(tmpfile.name) elif repl == 'c': print >>sys.stderr, 'Aborting' raise oscerr.UserAbort() From 9f5861a3dd095e9ede5ea584d8d118b7627fcece Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 9 Jun 2010 14:34:04 +0200 Subject: [PATCH 17/37] Whitespace fixup. --- osc/core.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osc/core.py b/osc/core.py index f64e179f..4d28cd93 100644 --- a/osc/core.py +++ b/osc/core.py @@ -3767,8 +3767,8 @@ def get_prj_results(apiurl, prj, hide_legend=False, csv=False, status_filter=Non if root.find('result') == None: return [] for results in root.findall('result'): - for node in results: - pacs.append(node.get('package')) + for node in results: + pacs.append(node.get('package')) pacs = sorted(list(set(pacs))) for node in root.findall('result'): # filter architecture and repository From b2f7b6c5a13df6ede7beea5b43eb88098f1a3b5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Wed, 9 Jun 2010 14:48:11 +0200 Subject: [PATCH 18/37] Fix typo. --- osc/core.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osc/core.py b/osc/core.py index 4d28cd93..e8ea0922 100644 --- a/osc/core.py +++ b/osc/core.py @@ -2593,7 +2593,7 @@ def get_default_editor(): if system == 'Linux': try: # Python 2.6 - dist = platform.linux_distributionx()[0] + dist = platform.linux_distribution()[0] except AttributeError: dist = platform.dist()[0] if dist == 'debian': @@ -2609,7 +2609,7 @@ def get_default_pager(): if system == 'Linux': try: # Python 2.6 - dist = platform.linux_distributionx()[0] + dist = platform.linux_distribution()[0] except AttributeError: dist = platform.dist()[0] if dist == 'debian': From 8d3458196095c89b61de5ab948699974e279d3a1 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 9 Jun 2010 17:58:29 +0200 Subject: [PATCH 19/37] package cache should be in /var/cache not in /var/tmp --- osc/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osc/conf.py b/osc/conf.py index ff2c6990..6b54a465 100644 --- a/osc/conf.py +++ b/osc/conf.py @@ -64,7 +64,7 @@ DEFAULTS = { 'apiurl': 'https://api.opensuse.org', 'user': 'your_username', 'pass': 'your_password', 'passx': '', - 'packagecachedir': '/var/tmp/osbuild-packagecache', + 'packagecachedir': '/var/cache/osbuild-packagecache', 'su-wrapper': 'su -c', # build type settings From e8d60c36a2cee0f75e63b69e48d5a064e1565ccb Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 9 Jun 2010 18:00:16 +0200 Subject: [PATCH 20/37] Revert "package cache should be in /var/cache not in /var/tmp" This reverts commit 8d3458196095c89b61de5ab948699974e279d3a1. /var/cache is not writable for everyone :-/ --- osc/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osc/conf.py b/osc/conf.py index 6b54a465..ff2c6990 100644 --- a/osc/conf.py +++ b/osc/conf.py @@ -64,7 +64,7 @@ DEFAULTS = { 'apiurl': 'https://api.opensuse.org', 'user': 'your_username', 'pass': 'your_password', 'passx': '', - 'packagecachedir': '/var/cache/osbuild-packagecache', + 'packagecachedir': '/var/tmp/osbuild-packagecache', 'su-wrapper': 'su -c', # build type settings From 8380602de6bb2c0f5ccd5d7e0d20ff4ab24f4e60 Mon Sep 17 00:00:00 2001 From: Marcus Huewe Date: Mon, 14 Jun 2010 15:39:05 +0200 Subject: [PATCH 21/37] - ignore tmp files from "vc" (*.changes.*) --- osc/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osc/conf.py b/osc/conf.py index ff2c6990..c935edfa 100644 --- a/osc/conf.py +++ b/osc/conf.py @@ -101,7 +101,7 @@ DEFAULTS = { 'apiurl': 'https://api.opensuse.org', 'checkout_no_colon': '0', # local files to ignore with status, addremove, .... # local files to ignore with status, addremove, .... - 'exclude_glob': '.osc CVS .svn .* _linkerror *~ #*# *.orig *.bak', + 'exclude_glob': '.osc CVS .svn .* _linkerror *~ #*# *.orig *.bak *.changes.*', # keep passwords in plaintext. If you see this comment, your osc # already uses the encrypted password, and only keeps them in plain text # for backwards compatibility. Default will change to 0 in future releases. From 343fd89f4c92a71b98b4316e9ecc9cb9400f5664 Mon Sep 17 00:00:00 2001 From: Danny Kukawka Date: Tue, 15 Jun 2010 16:38:48 +0200 Subject: [PATCH 22/37] fixed whitespaces in osc getbinaries help text --- osc/commandline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osc/commandline.py b/osc/commandline.py index af757ea7..ff17aad3 100644 --- a/osc/commandline.py +++ b/osc/commandline.py @@ -4344,7 +4344,7 @@ Please submit there instead, or use --nodevelproject to force direct submission. others even when they are not "published" yet. usage: - osc getbinaries REPOSITORY # works in checked out package (check out all archs in subdirs) + osc getbinaries REPOSITORY # works in checked out package (check out all archs in subdirs) osc getbinaries REPOSITORY ARCHITECTURE # works in checked out package osc getbinaries PROJECT PACKAGE REPOSITORY ARCHITECTURE ${cmd_option_list} From 1c02a1bd0688f5f281ce25afd803c84a53ca8634 Mon Sep 17 00:00:00 2001 From: Danny Kukawka Date: Tue, 15 Jun 2010 17:07:14 +0200 Subject: [PATCH 23/37] fixed some warnings from pychecker --- osc/commandline.py | 2 +- osc/core.py | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/osc/commandline.py b/osc/commandline.py index ff17aad3..bdeee734 100644 --- a/osc/commandline.py +++ b/osc/commandline.py @@ -948,7 +948,7 @@ Please submit there instead, or use --nodevelproject to force direct submission. print 'created request id', result - def _actionparser(option, opt_str, value, parser): + def _actionparser(self, opt_str, value, parser): value = [] if not hasattr(parser.values, 'actiondata'): setattr(parser.values, 'actiondata', []) diff --git a/osc/core.py b/osc/core.py index e8ea0922..9b79b8e8 100644 --- a/osc/core.py +++ b/osc/core.py @@ -4474,9 +4474,7 @@ def unpack_srcrpm(srpm, dir, *files): print >>sys.stderr, 'error - \'%s\' is not a source rpm.' % srpm sys.exit(1) curdir = os.getcwd() - if not os.path.isdir(dir): - dir = curdir - else: + if os.path.isdir(dir): os.chdir(dir) cmd = 'rpm2cpio %s | cpio -i %s &> /dev/null' % (srpm, ' '.join(files)) ret = subprocess.call(cmd, shell=True) From dc8fa3275a8422d62b2a51e7c5950d9360c59b07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Schr=C3=B6ter?= Date: Fri, 18 Jun 2010 11:43:42 +0200 Subject: [PATCH 24/37] _product packages have _meta files ... --- osc/core.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osc/core.py b/osc/core.py index 9b79b8e8..474989ef 100644 --- a/osc/core.py +++ b/osc/core.py @@ -2263,8 +2263,8 @@ def show_package_meta(apiurl, prj, pac, meta=False): if meta: query['meta'] = 1 - # packages like _project, _pattern and _project do not have a _meta file - if pac.startswith('_'): + # packages like _pattern and _project do not have a _meta file + if pac.startswith('_pattern') or pac.startswith('_project'): return "" url = makeurl(apiurl, ['source', prj, pac, '_meta'], query) From 367258f05041e36becb842e52d3a3f317bda4b2e Mon Sep 17 00:00:00 2001 From: Danny Kukawka Date: Fri, 18 Jun 2010 17:55:06 +0200 Subject: [PATCH 25/37] fixed osc results -r/-a, pass values to get_package_results() Fixes osc results -r/-a. Don't use in get_results() default values to call get_package_results(), this makes no sense since get_results() already defines defaults. --- osc/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osc/core.py b/osc/core.py index 474989ef..98fa8415 100644 --- a/osc/core.py +++ b/osc/core.py @@ -3740,7 +3740,7 @@ def get_results(apiurl, prj, package, lastbuild=None, repository=[], arch=[]): r = [] result_line_templ = '%(rep)-20s %(arch)-10s %(status)s' - for res in get_package_results(apiurl, prj, package, lastbuild=None, repository=[], arch=[]): + for res in get_package_results(apiurl, prj, package, lastbuild, repository, arch): res['status'] = res['code'] if res['details'] != '': res['status'] += ': %s' % (res['details'], ) From a9b05119d6122c0fb27b319f079ea62ab4614d8d Mon Sep 17 00:00:00 2001 From: Danny Kukawka Date: Mon, 21 Jun 2010 17:10:25 +0200 Subject: [PATCH 26/37] another fix for osc results -r/-a in project directories Fixed osc results -r/-a in project directories by fixing filtering of architecture and repository (they are arrays and not strings). --- osc/commandline.py | 6 ++++-- osc/core.py | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/osc/commandline.py b/osc/commandline.py index bdeee734..d135b5fa 100644 --- a/osc/commandline.py +++ b/osc/commandline.py @@ -3217,8 +3217,10 @@ Please submit there instead, or use --nodevelproject to force direct submission. wd = os.curdir if is_project_dir(wd): opts.csv = None - opts.arch = None - opts.repo = None + if opts.arch == []: + opts.arch = None + if opts.repo == []: + opts.repo = None opts.hide_legend = None opts.name_filter = None opts.status_filter = None diff --git a/osc/core.py b/osc/core.py index 98fa8415..354a6d04 100644 --- a/osc/core.py +++ b/osc/core.py @@ -3772,9 +3772,9 @@ def get_prj_results(apiurl, prj, hide_legend=False, csv=False, status_filter=Non pacs = sorted(list(set(pacs))) for node in root.findall('result'): # filter architecture and repository - if arch != None and arch != node.get('arch'): + if arch != None and node.get('arch') not in arch: continue - if repo != None and repo != node.get('repository'): + if repo != None and node.get('repository') not in repo: continue if node.get('dirty') == "true": state = "outdated" From c6f770cf274065f28e8648a7056ff6b0b66b7dee Mon Sep 17 00:00:00 2001 From: Ludwig Nussel Date: Wed, 23 Jun 2010 14:47:32 +0200 Subject: [PATCH 27/37] fix getbinaries --sources --- osc/commandline.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/osc/commandline.py b/osc/commandline.py index d135b5fa..90997998 100644 --- a/osc/commandline.py +++ b/osc/commandline.py @@ -4398,6 +4398,9 @@ Please submit there instead, or use --nodevelproject to force direct submission. os.makedirs(target_dir, 0755) for i in binaries: + # skip source rpms + if not opts.sources and i.name.endswith('.src.rpm'): + continue fname = '%s/%s' % (target_dir, i.name) if os.path.exists(fname): st = os.stat(fname) From da0ccd5d8cb4ecc9cfcfee046e4b89255c3e2eb9 Mon Sep 17 00:00:00 2001 From: Ludwig Nussel Date: Fri, 18 Jun 2010 16:06:01 +0200 Subject: [PATCH 28/37] auto apiurl for osc meta --- osc/commandline.py | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/osc/commandline.py b/osc/commandline.py index 90997998..213be396 100644 --- a/osc/commandline.py +++ b/osc/commandline.py @@ -499,6 +499,8 @@ class Osc(cmdln.Cmdln): cmd = args[0] del args[0] + apiurl = self.get_api_url() + if cmd in ['pkg']: min_args, max_args = 0, 2 elif cmd in ['pattern']: @@ -563,24 +565,24 @@ class Osc(cmdln.Cmdln): # show if not opts.edit and not opts.file and not opts.delete and not opts.create and not opts.set: if cmd == 'prj': - sys.stdout.write(''.join(show_project_meta(conf.config['apiurl'], project))) + sys.stdout.write(''.join(show_project_meta(apiurl, project))) elif cmd == 'pkg': - sys.stdout.write(''.join(show_package_meta(conf.config['apiurl'], project, package))) + sys.stdout.write(''.join(show_package_meta(apiurl, project, package))) elif cmd == 'attribute': - sys.stdout.write(''.join(show_attribute_meta(conf.config['apiurl'], project, package, subpackage, opts.attribute, opts.attribute_defaults, opts.attribute_project))) + sys.stdout.write(''.join(show_attribute_meta(apiurl, project, package, subpackage, opts.attribute, opts.attribute_defaults, opts.attribute_project))) elif cmd == 'prjconf': - sys.stdout.write(''.join(show_project_conf(conf.config['apiurl'], project))) + sys.stdout.write(''.join(show_project_conf(apiurl, project))) elif cmd == 'user': - r = get_user_meta(conf.config['apiurl'], user) + r = get_user_meta(apiurl, user) if r: sys.stdout.write(''.join(r)) elif cmd == 'pattern': if pattern: - r = show_pattern_meta(conf.config['apiurl'], project, pattern) + r = show_pattern_meta(apiurl, project, pattern) if r: sys.stdout.write(''.join(r)) else: - r = show_pattern_metalist(conf.config['apiurl'], project) + r = show_pattern_metalist(apiurl, project) if r: sys.stdout.write('\n'.join(r) + '\n') @@ -590,6 +592,7 @@ class Osc(cmdln.Cmdln): edit_meta(metatype='prj', edit=True, path_args=quote_plus(project), + apiurl=apiurl, template_args=({ 'name': project, 'user': conf.config['user']})) @@ -597,6 +600,7 @@ class Osc(cmdln.Cmdln): edit_meta(metatype='pkg', edit=True, path_args=(quote_plus(project), quote_plus(package)), + apiurl=apiurl, template_args=({ 'name': package, 'user': conf.config['user']})) @@ -604,16 +608,19 @@ class Osc(cmdln.Cmdln): edit_meta(metatype='prjconf', edit=True, path_args=quote_plus(project), + apiurl=apiurl, template_args=None) elif cmd == 'user': edit_meta(metatype='user', edit=True, path_args=(quote_plus(user)), + apiurl=apiurl, template_args=({'user': user})) elif cmd == 'pattern': edit_meta(metatype='pattern', edit=True, path_args=(project, pattern), + apiurl=apiurl, template_args=None) # create attribute entry @@ -627,7 +634,7 @@ class Osc(cmdln.Cmdln): values += '%s' % i aname = opts.attribute.split(":") d = '%s' % (aname[0], aname[1], values) - url = makeurl(conf.config['apiurl'], attributepath) + url = makeurl(apiurl, attributepath) for data in streamfile(url, http_POST, data=d): sys.stdout.write(data) @@ -646,26 +653,31 @@ class Osc(cmdln.Cmdln): edit_meta(metatype='prj', data=f, edit=opts.edit, + apiurl=apiurl, path_args=quote_plus(project)) elif cmd == 'pkg': edit_meta(metatype='pkg', data=f, edit=opts.edit, + apiurl=apiurl, path_args=(quote_plus(project), quote_plus(package))) elif cmd == 'prjconf': edit_meta(metatype='prjconf', data=f, edit=opts.edit, + apiurl=apiurl, path_args=quote_plus(project)) elif cmd == 'user': edit_meta(metatype='user', data=f, edit=opts.edit, + apiurl=apiurl, path_args=(quote_plus(user))) elif cmd == 'pattern': edit_meta(metatype='pattern', data=f, edit=opts.edit, + apiurl=apiurl, path_args=(project, pattern)) @@ -674,13 +686,13 @@ class Osc(cmdln.Cmdln): path = metatypes[cmd]['path'] if cmd == 'pattern': path = path % (project, pattern) - u = makeurl(conf.config['apiurl'], [path]) + u = makeurl(apiurl, [path]) http_DELETE(u) elif cmd == 'attribute': if not opts.attribute: raise oscerr.WrongOptions('no attribute given to create') attributepath.append(opts.attribute) - u = makeurl(conf.config['apiurl'], attributepath) + u = makeurl(apiurl, attributepath) for data in streamfile(u, http_DELETE): sys.stdout.write(data) else: From 4187a18de73798aab47a62d9c9281f5c18a64a3a Mon Sep 17 00:00:00 2001 From: Ludwig Nussel Date: Wed, 23 Jun 2010 13:58:53 +0200 Subject: [PATCH 29/37] compact empty lines --- osc/OscConfigParser.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/osc/OscConfigParser.py b/osc/OscConfigParser.py index fc928f6d..607c9141 100644 --- a/osc/OscConfigParser.py +++ b/osc/OscConfigParser.py @@ -317,15 +317,20 @@ class OscConfigParser(ConfigParser.SafeConfigParser): # XXX: simplify! def __str__(self): ret = [] + first = True for line in self._sections._lines: if line.type == 'section': + if first: + first = False + else: + ret.append('') ret.append('[%s]' % line.name) for sline in line._lines: if sline.name == '__name__': continue if sline.type == 'option': ret.append(sline.frmt % (sline.name, sline.value)) - else: + elif str(sline) != '': ret.append(str(sline)) else: ret.append(str(line)) From 0663410f9c0a45b68d10c1c5bac8e2693a3ee7ba Mon Sep 17 00:00:00 2001 From: Ludwig Nussel Date: Wed, 23 Jun 2010 14:20:56 +0200 Subject: [PATCH 30/37] normalize apiurl --- osc/conf.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/osc/conf.py b/osc/conf.py index c935edfa..8dbfb463 100644 --- a/osc/conf.py +++ b/osc/conf.py @@ -466,8 +466,22 @@ def config_set_option(section, opt, val=None, delete=False, update=True, **kwarg cp = get_configParser(config['conffile']) # don't allow "internal" options general_opts = [i for i in DEFAULTS.keys() if not i in ['user', 'pass', 'passx']] - section = config['apiurl_aliases'].get(section, section) - sections = dict([[i.rstrip('/'), i] for i in cp.sections()]) + if section != 'general': + section = config['apiurl_aliases'].get(section, section) + scheme, host = \ + parse_apisrv_url(config.get('scheme', 'https'), section) + section = urljoin(scheme, host) + + sections = {} + for url in cp.sections(): + if url == 'general': + sections[url] = url + else: + scheme, host = \ + parse_apisrv_url(config.get('scheme', 'https'), url) + apiurl = urljoin(scheme, host) + sections[apiurl] = url + section = sections.get(section.rstrip('/'), section) if not section in cp.sections(): raise oscerr.ConfigError('unknown section \'%s\'' % section, config['conffile']) From c303735ab1c7771774cd68fa0d4de91576962a3d Mon Sep 17 00:00:00 2001 From: Ludwig Nussel Date: Wed, 23 Jun 2010 14:40:55 +0200 Subject: [PATCH 31/37] implement trusted projects --- osc/build.py | 45 +++++++++++++++++++++++++++------------------ osc/conf.py | 2 +- 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/osc/build.py b/osc/build.py index 23129d16..9b69da93 100644 --- a/osc/build.py +++ b/osc/build.py @@ -54,7 +54,6 @@ hostarch = os.uname()[4] if hostarch == 'i686': # FIXME hostarch = 'i586' - class Buildinfo: """represent the contents of a buildinfo file""" @@ -318,6 +317,29 @@ def create_deps(pkgqs): return depfile +trustprompt = """Would you like to ... +0 - quit (default) +1 - trust packages from '%(project)s' always +2 - trust them just this time +? """ +def check_trusted_projects(apiurl, projects): + trusted = config['api_host_options'][apiurl]['trusted_prj'] + tlen = len(trusted) + for prj in projects: + if not prj in trusted: + print "\nThe build root needs packages from project '%s'." % prj + print "Note that malicious packages can compromise the build result or even your system." + r = raw_input(trustprompt % { 'project':prj }) + if r == '1': + trusted.append(prj) + elif r != '2': + print "Well, good good bye then :-)" + raise oscerr.UserAbort() + + if tlen != len(trusted): + config['api_host_options'][apiurl]['trusted_prj'] = trusted + conf.config_set_option(apiurl, 'trusted_prj', ' '.join(trusted)) + def main(opts, argv): repo = argv[0] @@ -619,6 +641,8 @@ def main(opts, argv): enable_cpio = opts.cpio_bulk_download, cookiejar=cookiejar) + check_trusted_projects(apiurl, bi.projects.keys()) + # now update the package cache fetcher.run(bi) @@ -654,27 +678,12 @@ def main(opts, argv): os.symlink(sffn, tffn) if bi.pacsuffix == 'rpm': - if vm_type == "xen" or vm_type == "kvm" or vm_type == "lxc": - print 'Skipping verification of package signatures due to secure VM build' - elif opts.no_verify or opts.noinit or opts.offline: + if opts.no_verify: print 'Skipping verification of package signatures' else: print 'Verifying integrity of cached packages' - t = config['api_host_options'][apiurl]['trusted_prj'] - for prj in bi.prjkeys: - if not prj in t: - print "\nYou are trying to use packages from project '%s'." % prj - print "Note that malicious packages can compromise your system when using chroot build enviroment." - print "Use kvm or xen builds for a safe enviroment." -# saving back to config file is complicated -# r = raw_input("Would you like to trust '%s' (a)lways, (t)emorarily or (N)ever? " % prj) -# if r == 'a': -# config['api_host_options'][apiurl]['trusted_prj'] += prj -# elif r != 't': -# print "Well, good good bye then :-)" -# sys.exit(1) - verify_pacs([ i.fullfilename for i in bi.deps ], bi.keys) + elif bi.pacsuffix == 'deb': if vm_type == "xen" or vm_type == "kvm" or vm_type == "lxc": print 'Skipping verification of package signatures due to secure VM build' diff --git a/osc/conf.py b/osc/conf.py index 8dbfb463..d61d49ce 100644 --- a/osc/conf.py +++ b/osc/conf.py @@ -736,7 +736,7 @@ def get_config(override_conffile = None, api_host_options[apiurl]['sslcertck'] = True if cp.has_option(url, 'trusted_prj'): - api_host_options[apiurl]['trusted_prj'] = cp.get(url, key).split(' ') + api_host_options[apiurl]['trusted_prj'] = cp.get(url, 'trusted_prj').split(' ') else: api_host_options[apiurl]['trusted_prj'] = [] From 377ee28887a6e854efba7202b69b331aa98f1e8b Mon Sep 17 00:00:00 2001 From: Ludwig Nussel Date: Thu, 24 Jun 2010 10:51:38 +0200 Subject: [PATCH 32/37] add support for --oldpackages --- osc/babysitter.py | 4 --- osc/build.py | 81 ++++++++++++++++++++++++++++++++++++++++------ osc/commandline.py | 2 ++ 3 files changed, 74 insertions(+), 13 deletions(-) diff --git a/osc/babysitter.py b/osc/babysitter.py index bf0119bc..ab3b2d62 100644 --- a/osc/babysitter.py +++ b/osc/babysitter.py @@ -165,10 +165,6 @@ def run(prg): print >>sys.stderr, e return 1 - except OSError, e: - print >>sys.stderr, e - return 1 - except CpioError, e: print >>sys.stderr, e return 1 diff --git a/osc/build.py b/osc/build.py index 9b69da93..c0e2ab7e 100644 --- a/osc/build.py +++ b/osc/build.py @@ -8,10 +8,11 @@ import os import re import sys -from tempfile import NamedTemporaryFile +from tempfile import NamedTemporaryFile, mkdtemp from shutil import rmtree from osc.fetch import * from osc.core import get_buildinfo, store_read_apiurl, store_read_project, store_read_package, meta_exists, quote_plus, get_buildconfig, is_package_dir +from osc.core import get_binarylist, get_binary_file from osc.util import rpmquery, debquery import osc.conf import oscerr @@ -347,6 +348,7 @@ def main(opts, argv): build_descr = argv[2] xp = [] build_root = None + build_uid='' vm_type = config['build-type'] build_descr = os.path.abspath(build_descr) @@ -400,7 +402,9 @@ def main(opts, argv): if opts.without: for o in opts.without: buildargs.append('--without %s' % o) - build_uid='' +# FIXME: quoting +# if opts.define: +# buildargs.append('--define "%s"' % opts.define) if config['build-uid']: build_uid = config['build-uid'] if opts.build_uid: @@ -414,9 +418,6 @@ def main(opts, argv): else: print >>sys.stderr, 'Error: build-uid arg must be 2 colon separated numerics: "uid:gid" or "caller"' return 1 -# FIXME: quoting -# if opts.define: -# buildargs.append('--define "%s"' % opts.define) if opts.vm_type: vm_type = opts.vm_type if opts.alternative_project: @@ -590,8 +591,6 @@ def main(opts, argv): if bi.release: buildargs.append('--release %s' % bi.release) - buildargs = ' '.join(buildargs) - # real arch of this machine # vs. # arch we are supposed to build for @@ -646,6 +645,71 @@ def main(opts, argv): # now update the package cache fetcher.run(bi) + old_pkg_dir = None + if opts.oldpackages: + old_pkg_dir = opts.oldpackages + if not old_pkg_dir.startswith('/') and not opts.offline: + data = [ prj, pacname, repo, arch] + if old_pkg_dir == '_link': + p = osc.core.findpacs(os.curdir)[0] + if not p.islink(): + raise oscerr.WrongOptions('package is not a link') + data[0] = p.linkinfo.project + data[1] = p.linkinfo.package + repos = osc.core.get_repositories_of_project(apiurl, data[0]) + # hack for links to e.g. Factory + if not data[2] in repos and 'standard' in repos: + data[2] = 'standard' + elif old_pkg_dir != '' and old_pkg_dir != '_self': + a = old_pkg_dir.split('/') + for i in range(0, len(a)): + data[i] = a[i] + + destdir = os.path.join(config['packagecachedir'], data[0], data[2], data[3]) + old_pkg_dir = None + try: + print "Downloading previous build from %s ..." % '/'.join(data) + binaries = get_binarylist(apiurl, data[0], data[2], data[3], package=data[1], verbose=True) + except Exception, e: + print "Error: failed to get binaries: %s" % str(e) + binaries = [] + + if binaries: + class mytmpdir: + """ temporary directory that removes itself""" + def __init__(self, *args, **kwargs): + self.name = mkdtemp(*args, **kwargs) + def cleanup(self): + rmtree(self.name) + def __del__(self): + self.cleanup() + def __exit__(self): + self.cleanup() + def __str__(self): + return self.name + + old_pkg_dir = mytmpdir(prefix='.build.oldpackages', dir=os.path.abspath(os.curdir)) + if not os.path.exists(destdir): + os.makedirs(destdir) + for i in binaries: + fname = os.path.join(destdir, i.name) + os.symlink(fname, os.path.join(str(old_pkg_dir), i.name)) + if os.path.exists(fname): + st = os.stat(fname) + if st.st_mtime == i.mtime and st.st_size == i.size: + continue + get_binary_file(apiurl, + data[0], + data[2], data[3], + i.name, + package = data[1], + target_filename = fname, + target_mtime = i.mtime, + progress_meter = True) + + if old_pkg_dir != None: + buildargs.append('--oldpackages %s' % old_pkg_dir) + # Make packages from buildinfo available as repos for kiwi if build_type == 'kiwi': if not os.path.exists('repos'): @@ -760,7 +824,7 @@ def main(opts, argv): specialcmdopts, bi.buildarch, vm_options, - buildargs, + ' '.join(buildargs), build_descr) if need_root: @@ -796,7 +860,6 @@ def main(opts, argv): if opts.keep_pkgs: for i in b_built.splitlines() + s_built.splitlines(): - import shutil shutil.copy2(i, os.path.join(opts.keep_pkgs, os.path.basename(i))) if bi_file: diff --git a/osc/commandline.py b/osc/commandline.py index 213be396..2089a203 100644 --- a/osc/commandline.py +++ b/osc/commandline.py @@ -3904,6 +3904,8 @@ Please submit there instead, or use --nodevelproject to force direct submission. help='enable downloading packages as cpio archive from api') @cmdln.option('--download-api-only', action='store_true', help=SUPPRESS_HELP) + @cmdln.option('--oldpackages', metavar='DIR', + help='take previous build from DIR (special values: _self, _link)') def do_build(self, subcmd, opts, *args): """${cmd_name}: Build a package on your local machine From 260cb3ab00610956e590fc4fc3b22f42f68ee816 Mon Sep 17 00:00:00 2001 From: Danny Kukawka Date: Sun, 27 Jun 2010 19:07:46 +0200 Subject: [PATCH 33/37] extended 'osc wipebinaries' to read package/project from dirs Extended 'osc wipebinaries' to read package/project from checked out directories if possible. --- osc/commandline.py | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/osc/commandline.py b/osc/commandline.py index 213be396..7ebd37e7 100644 --- a/osc/commandline.py +++ b/osc/commandline.py @@ -4308,21 +4308,34 @@ Please submit there instead, or use --nodevelproject to force direct submission. otherwise all binary packages in the project will be deleted. usage: + osc wipebinaries OPTS # works in checked out project dir osc wipebinaries OPTS PROJECT [PACKAGE] ${cmd_option_list} """ args = slash_split(args) + package = project = None + apiurl = self.get_api_url() + + # try to get project and package from checked out dirs if len(args) < 1: - raise oscerr.WrongArgs('Missing argument.') + if is_project_dir(os.getcwd()): + project = store_read_project(os.curdir) + if is_package_dir(os.getcwd()): + project = store_read_project(os.curdir) + package = store_read_package(os.curdir) + if project is None: + raise oscerr.WrongArgs('Missing argument.') if len(args) > 2: raise oscerr.WrongArgs('Wrong number of arguments.') + # respect given project and package + if len(args) >= 1: + project = args[0] + if len(args) == 2: - package = args[1] - else: - package = None + package = args[1] codes = [] if opts.build_disabled: @@ -4341,7 +4354,7 @@ Please submit there instead, or use --nodevelproject to force direct submission. # make a new request for each code= parameter for code in codes: - print wipebinaries(conf.config['apiurl'], args[0], package, opts.arch, opts.repo, code) + print wipebinaries(apiurl, project, package, opts.arch, opts.repo, code) @cmdln.option('-q', '--quiet', action='store_true', From 150cdebf6d859c8fb779bebd7d20d9a92c8d8eed Mon Sep 17 00:00:00 2001 From: Jan Engelhardt Date: Sat, 26 Jun 2010 20:54:02 +0200 Subject: [PATCH 34/37] osc/commandline: fix reoccurring typo Signed-off-by: Jan Engelhardt --- osc/commandline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osc/commandline.py b/osc/commandline.py index 01249390..3c156b19 100644 --- a/osc/commandline.py +++ b/osc/commandline.py @@ -848,7 +848,7 @@ class Osc(cmdln.Cmdln): print "Requests created: ", for i in sr_ids: print i, - sys.exit('Successfull finished') + sys.exit('Successfully finished') elif len(args) <= 2: # try using the working copy at hand From 6eea5f188b160bf16e55bb84242ed1d3b66de81e Mon Sep 17 00:00:00 2001 From: Jan Engelhardt Date: Sat, 26 Jun 2010 12:32:58 +0200 Subject: [PATCH 35/37] Add can_also_build definitions for SPARC Signed-off-by: Jan Engelhardt --- osc/build.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/osc/build.py b/osc/build.py index c0e2ab7e..528e4a55 100644 --- a/osc/build.py +++ b/osc/build.py @@ -30,6 +30,8 @@ change_personality = { 'i386': 'linux32', 'ppc': 'powerpc32', 's390': 's390', + 'sparc': 'linux32', + 'sparcv8': 'linux32', } can_also_build = { @@ -48,6 +50,7 @@ can_also_build = { 'i586': [ 'i386', 'ppc', 'ppc64', 'armv4l', 'armv5el', 'armv6el', 'armv7el', 'armv8el', 'sh4', 'mips', 'mips64' ], 'i686': [ 'i586', 'ppc', 'ppc64', 'armv4l', 'armv5el', 'armv6el', 'armv7el', 'armv8el', 'sh4', 'mips', 'mips64' ], 'x86_64': ['i686', 'i586', 'i386', 'ppc', 'ppc64', 'armv4l', 'armv5el', 'armv6el', 'armv7el', 'armv8el', 'sh4', 'mips', 'mips64' ], + 'sparc64': ['sparc64v', 'sparcv9v', 'sparcv9', 'sparcv8', 'sparc'], } # real arch of this machine From 5270e13baf0bf370456326806cf028ade5569494 Mon Sep 17 00:00:00 2001 From: Ludwig Nussel Date: Mon, 28 Jun 2010 10:55:03 +0200 Subject: [PATCH 36/37] implicitly trust the project we are building for --- osc/build.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/osc/build.py b/osc/build.py index 528e4a55..ed44215b 100644 --- a/osc/build.py +++ b/osc/build.py @@ -643,7 +643,8 @@ def main(opts, argv): enable_cpio = opts.cpio_bulk_download, cookiejar=cookiejar) - check_trusted_projects(apiurl, bi.projects.keys()) + # implicitly trust the project we are building for + check_trusted_projects(apiurl, [ i for i in bi.projects.keys() if not i == prj ]) # now update the package cache fetcher.run(bi) From f41d842d3edd9c28eedb76d67abf0609531bb3f0 Mon Sep 17 00:00:00 2001 From: Danny Kukawka Date: Mon, 28 Jun 2010 13:00:34 +0200 Subject: [PATCH 37/37] fixed tempfile leaking in osc diff function The osc diff function leaves tempfiles in /tmp after finished. Call os.unlink() to remove the file if no longer needed. --- osc/core.py | 1 + 1 file changed, 1 insertion(+) diff --git a/osc/core.py b/osc/core.py index 354a6d04..8ae08e2a 100644 --- a/osc/core.py +++ b/osc/core.py @@ -3154,6 +3154,7 @@ def make_diff(wc, revision): diff.append(get_source_file_diff(os.path.dirname(tmpfile), os.path.basename(tmpfile), revision, file, cmp_pac.storedir, file)) + os.unlink(tmpfile) os.chdir(olddir) if cmp_pac != None: delete_dir(cmp_pac.absdir)