From ffc92254e62acdf51f38f52bacc5ba5c611fb632 Mon Sep 17 00:00:00 2001 From: JF Ding Date: Mon, 20 Feb 2012 19:24:50 +0800 Subject: [PATCH] inject osc.core to handle empty server response --- gitbuildsys/buildservice.py | 38 ++++++++++++++++++++++++++++++++++++++ gitbuildsys/obspkg.py | 5 ++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/gitbuildsys/buildservice.py b/gitbuildsys/buildservice.py index c32fb59..e3919ae 100644 --- a/gitbuildsys/buildservice.py +++ b/gitbuildsys/buildservice.py @@ -28,6 +28,44 @@ import urllib2 import xml.etree.cElementTree as ElementTree from osc import conf, core +class ObsError(Exception): + pass + +# Injection code for osc.core to fix the empty XML bug +def solid_get_files_meta(self, revision='latest', skip_service=True): + from time import sleep + import msger + try: + from xml.etree import cElementTree as ET + except ImportError: + import cElementTree as ET + + retry_count = 3 + while retry_count > 0: + fm = core.show_files_meta(self.apiurl, self.prjname, self.name, + revision=revision, meta=self.meta) + try: + root = ET.fromstring(fm) + break + except SyntaxError, err: + msger.warning('corrupted or empty obs server response ,retrying ...') + sleep(1) + retry_count -= 1 + + if not retry_count: + # all the re-try failed, abort + raise ObsError('cannet fetch files meta xml from server') + + # look for "too large" files according to size limit and mark them + for e in root.findall('entry'): + size = e.get('size') + if size and self.size_limit and int(size) > self.size_limit \ + or skip_service and (e.get('name').startswith('_service:') or e.get('name').startswith('_service_')): + e.set('skipped', 'true') + return ET.tostring(root) + +core.Package.get_files_meta = solid_get_files_meta + class _Metafile: """ _Metafile(url, input, change_is_required=False, file_ext='.xml') diff --git a/gitbuildsys/obspkg.py b/gitbuildsys/obspkg.py index 69e18b1..85f8cc6 100644 --- a/gitbuildsys/obspkg.py +++ b/gitbuildsys/obspkg.py @@ -80,7 +80,10 @@ class ObsPackage(object): """ with Workdir(self._bdir): - self._bs.checkout(self._prj, self._pkg) + try: + self._bs.checkout(self._prj, self._pkg) + except buildservice.ObsError, err: + raise errors.ObsError(str(err)) def get_workdir(self): return self._pkgpath -- 2.7.4