2009-03-02 15:03:06 +01:00
# Copyright (C) 2006 Novell Inc. All rights reserved.
2006-04-20 16:26:50 +02:00
# This program is free software; it may be used, copied, modified
# and distributed under the terms of the GNU General Public Licence,
2009-08-20 21:28:05 +02:00
# either version 2, or version 3 (at your option).
2006-04-20 16:26:50 +02:00
2013-04-09 12:51:28 +02:00
from __future__ import print_function
2014-01-24 10:51:00 +01:00
__version__ = ' 0.143git '
2009-10-02 14:06:46 +02:00
2008-05-19 16:56:59 +02:00
# __store_version__ is to be incremented when the format of the working copy
# "store" changes in an incompatible way. Please add any needed migration
# functionality to check_store_version().
__store_version__ = ' 1.0 '
2006-04-20 16:26:50 +02:00
2011-10-18 03:03:42 +02:00
import locale
2006-04-20 16:26:50 +02:00
import os
2009-06-19 10:32:56 +02:00
import os . path
2006-04-20 16:26:50 +02:00
import sys
2013-04-09 14:03:17 +02:00
import shutil
import subprocess
import re
import socket
import errno
2013-08-03 17:20:03 +02:00
import shlex
2013-04-09 14:03:17 +02:00
2013-04-09 12:36:42 +02:00
try :
2013-04-09 14:03:17 +02:00
from urllib . parse import urlsplit , urlunsplit , urlparse , quote_plus , urlencode , unquote
from urllib . error import HTTPError
from urllib . request import pathname2url , install_opener , urlopen
from urllib . request import Request as URLRequest
2013-04-09 12:36:42 +02:00
from io import StringIO
except ImportError :
#python 2.x
from urlparse import urlsplit , urlunsplit , urlparse
2013-04-09 14:03:17 +02:00
from urllib import pathname2url , quote_plus , urlencode , unquote
from urllib2 import HTTPError , install_opener , urlopen
from urllib2 import Request as URLRequest
2013-04-09 12:36:42 +02:00
from cStringIO import StringIO
2013-04-09 14:03:17 +02:00
2013-04-09 13:27:24 +02:00
2007-03-13 00:17:34 +01:00
try :
from xml . etree import cElementTree as ET
except ImportError :
import cElementTree as ET
2013-04-09 12:36:42 +02:00
from . import oscerr
from . import conf
2013-04-09 13:27:24 +02:00
try :
2013-04-10 11:34:59 +02:00
# python 2.6 and python 2.7
2013-04-09 13:27:24 +02:00
unicode
2013-04-10 11:34:59 +02:00
ET_ENCODING = " utf-8 "
# python 2.6 does not have bytes and python 2.7 reimplements it as alias to
# str, but in incompatible way as it does not accept the same arguments
bytes = lambda x , * args : x
2013-04-09 13:27:24 +02:00
except :
#python3 does not have unicode, so lets reimplement it
#as void function as it already gets unicode strings
unicode = lambda x , * args : x
2013-04-10 11:34:59 +02:00
ET_ENCODING = " unicode "
2013-04-09 13:27:24 +02:00
2009-08-26 16:58:53 +02:00
DISTURL_RE = re . compile ( r " ^(?P<bs>.*)://(?P<apiurl>.*?)/(?P<project>.*?)/(?P<repository>.*?)/(?P<revision>.*)-(?P<source>.*)$ " )
2010-01-28 20:00:34 +01:00
BUILDLOGURL_RE = re . compile ( r " ^(?P<apiurl>https?://.*?)/build/(?P<project>.*?)/(?P<repository>.*?)/(?P<arch>.*?)/(?P<package>.*?)/_log$ " )
2006-04-20 16:26:50 +02:00
BUFSIZE = 1024 * 1024
store = ' .osc '
2006-05-23 17:27:43 +02:00
new_project_templ = """ \
2008-03-07 10:13:30 +01:00
< project name = " %(name)s " >
2006-06-23 12:35:20 +02:00
2010-01-22 08:57:47 +01:00
< title > < / title > < ! - - Short title of NewProject - - >
2011-07-20 19:34:46 +02:00
< description > < / description >
2010-01-22 08:57:47 +01:00
< ! - - This is for a longer description of the purpose of the project - - >
2006-06-23 12:35:20 +02:00
2008-03-07 10:13:30 +01:00
< person role = " maintainer " userid = " %(user)s " / >
< person role = " bugowner " userid = " %(user)s " / >
2007-07-04 14:59:18 +02:00
< ! - - remove this block to publish your packages on the mirrors - - >
< publish >
< disable / >
< / publish >
< build >
< enable / >
< / build >
< debuginfo >
< disable / >
< / debuginfo >
2006-06-23 12:35:20 +02:00
< ! - - remove this comment to enable one or more build targets
2007-07-04 19:48:50 +02:00
< repository name = " openSUSE_Factory " >
2012-02-20 13:51:33 +01:00
< path project = " openSUSE:Factory " repository = " snapshot " / >
2006-06-23 12:35:20 +02:00
< arch > x86_64 < / arch >
< arch > i586 < / arch >
< / repository >
2009-10-16 17:55:29 +02:00
< repository name = " openSUSE_11.2 " >
< path project = " openSUSE:11.2 " repository = " standard " / >
< arch > x86_64 < / arch >
< arch > i586 < / arch >
< / repository >
2009-02-18 17:34:30 +01:00
< repository name = " openSUSE_11.1 " >
< path project = " openSUSE:11.1 " repository = " standard " / >
2007-07-04 14:59:18 +02:00
< arch > x86_64 < / arch >
< arch > i586 < / arch >
< / repository >
2010-05-22 08:22:12 +02:00
< repository name = " Fedora_12 " >
< path project = " Fedora:12 " repository = " standard " / >
2009-04-09 10:21:12 +02:00
< arch > x86_64 < / arch >
< arch > i586 < / arch >
< / repository >
< repository name = " SLE_11 " >
< path project = " SUSE:SLE-11 " repository = " standard " / >
2006-06-23 12:35:20 +02:00
< arch > x86_64 < / arch >
< arch > i586 < / arch >
< / repository >
- - >
2009-10-20 16:30:15 +02:00
2006-05-23 17:27:43 +02:00
< / project >
2007-06-26 15:17:38 +02:00
"""
2006-05-23 17:27:43 +02:00
new_package_templ = """ \
2008-03-07 10:13:30 +01:00
< package name = " %(name)s " >
2006-06-23 12:35:20 +02:00
2010-01-22 08:57:47 +01:00
< title > < / title > < ! - - Title of package - - >
2006-06-23 12:35:20 +02:00
2011-07-20 19:34:46 +02:00
< description > < / description > < ! - - for long description - - >
2006-06-23 12:35:20 +02:00
2011-03-29 12:16:56 +02:00
< ! - - following roles are inherited from the parent project
2008-03-07 10:13:30 +01:00
< person role = " maintainer " userid = " %(user)s " / >
< person role = " bugowner " userid = " %(user)s " / >
2011-03-29 12:16:56 +02:00
- - >
2010-01-22 08:57:47 +01:00
< ! - -
2008-08-15 19:38:08 +02:00
< url > PUT_UPSTREAM_URL_HERE < / url >
2010-01-22 08:57:47 +01:00
- - >
2006-06-23 12:35:20 +02:00
2009-10-20 16:30:15 +02:00
< ! - -
use one of the examples below to disable building of this package
on a certain architecture , in a certain repository ,
2006-06-23 12:35:20 +02:00
or a combination thereof :
2009-10-20 16:30:15 +02:00
2006-06-23 12:35:20 +02:00
< disable arch = " x86_64 " / >
2006-12-12 02:59:44 +01:00
< disable repository = " SUSE_SLE-10 " / >
< disable repository = " SUSE_SLE-10 " arch = " x86_64 " / >
2006-06-23 12:35:20 +02:00
2008-08-15 19:38:08 +02:00
Possible sections where you can use the tags above :
< build >
< / build >
< debuginfo >
< / debuginfo >
< publish >
< / publish >
< useforbuild >
< / useforbuild >
2009-10-20 16:30:15 +02:00
Please have a look at :
2010-07-27 15:20:35 +02:00
http : / / en . opensuse . org / Restricted_formats
2009-10-20 16:30:15 +02:00
Packages containing formats listed there are NOT allowed to
2008-08-15 19:38:08 +02:00
be packaged in the openSUSE Buildservice and will be deleted !
2006-06-23 12:35:20 +02:00
- - >
2006-05-23 17:27:43 +02:00
< / package >
"""
2009-10-30 10:40:46 +01:00
new_attribute_templ = """ \
< attributes >
< attribute namespace = " " name = " " >
< value > < value >
< / attribute >
< / attributes >
"""
2006-10-12 15:22:56 +02:00
new_user_template = """ \
< person >
2008-03-07 10:13:30 +01:00
< login > % ( user ) s < / login >
2006-10-12 15:22:56 +02:00
< email > PUT_EMAIL_ADDRESS_HERE < / email >
< realname > PUT_REAL_NAME_HERE < / realname >
< watchlist >
2008-03-07 10:13:30 +01:00
< project name = " home: %(user)s " / >
2006-10-12 15:22:56 +02:00
< / watchlist >
< / person >
"""
2006-05-23 17:27:43 +02:00
2007-05-04 23:51:54 +02:00
info_templ = """ \
2008-05-21 15:44:49 +02:00
Project name : % s
Package name : % s
2007-05-04 23:51:54 +02:00
Path : % s
API URL : % s
2008-05-21 15:44:49 +02:00
Source URL : % s
2008-03-22 18:37:17 +01:00
srcmd5 : % s
2007-05-04 23:51:54 +02:00
Revision : % s
2008-03-22 18:37:17 +01:00
Link info : % s
2007-05-04 23:51:54 +02:00
"""
2007-07-19 12:08:42 +02:00
new_pattern_template = """ \
2012-04-02 10:51:57 +02:00
< ! - - See https : / / github . com / openSUSE / libzypp / tree / master / zypp / parser / yum / schema / patterns . rng - - >
2007-07-19 12:08:42 +02:00
2012-04-02 10:51:57 +02:00
< ! - -
< pattern xmlns = " http://novell.com/package/metadata/suse/pattern "
xmlns : rpm = " http://linux.duke.edu/metadata/rpm " >
< name > < / name >
< summary > < / summary >
< description > < / description >
< uservisible / >
< category lang = " en " > < / category >
2012-04-02 10:55:18 +02:00
< rpm : requires >
< rpm : entry name = " must-have-package " / >
< / rpm : requires >
2012-04-02 10:51:57 +02:00
< rpm : recommends >
< rpm : entry name = " package " / >
< / rpm : recommends >
< rpm : suggests >
< rpm : entry name = " anotherpackage " / >
< / rpm : suggests >
2007-07-19 12:08:42 +02:00
< / pattern >
2012-04-02 10:51:57 +02:00
- - >
2007-07-19 12:08:42 +02:00
"""
2006-09-25 17:11:03 +02:00
buildstatus_symbols = { ' succeeded ' : ' . ' ,
' disabled ' : ' ' ,
2010-05-22 08:22:12 +02:00
' expansion error ' : ' U ' , # obsolete with OBS 2.0
2010-04-23 14:38:00 +02:00
' unresolvable ' : ' U ' ,
2006-09-25 17:11:03 +02:00
' failed ' : ' F ' ,
' broken ' : ' B ' ,
' blocked ' : ' b ' ,
' building ' : ' % ' ,
2008-05-15 20:09:24 +02:00
' finished ' : ' f ' ,
2006-09-25 17:11:03 +02:00
' scheduled ' : ' s ' ,
2011-11-11 20:16:57 +01:00
' locked ' : ' L ' ,
2009-07-20 11:43:01 +02:00
' excluded ' : ' x ' ,
' dispatching ' : ' d ' ,
2010-08-08 21:09:18 +02:00
' signing ' : ' S ' ,
2006-09-25 17:11:03 +02:00
}
2010-05-14 16:44:42 +02:00
2009-05-20 18:32:45 +02:00
# os.path.samefile is available only under Unix
def os_path_samefile ( path1 , path2 ) :
2009-10-20 16:30:15 +02:00
try :
return os . path . samefile ( path1 , path2 )
except :
return os . path . realpath ( path1 ) == os . path . realpath ( path2 )
2006-09-25 17:11:03 +02:00
2006-05-19 22:13:29 +02:00
class File :
""" represent a file, including its metadata """
2010-08-23 11:29:57 +02:00
def __init__ ( self , name , md5 , size , mtime , skipped = False ) :
2006-05-19 22:13:29 +02:00
self . name = name
self . md5 = md5
self . size = size
self . mtime = mtime
2010-08-23 11:29:57 +02:00
self . skipped = skipped
2010-08-19 18:10:32 +02:00
def __repr__ ( self ) :
return self . name
2006-05-19 22:13:29 +02:00
def __str__ ( self ) :
return self . name
2009-09-03 16:56:48 +02:00
class Serviceinfo :
""" Source service content
"""
def __init__ ( self ) :
""" creates an empty serviceinfo instance """
2011-01-26 16:16:27 +01:00
self . services = None
2011-08-23 16:03:58 +02:00
self . project = None
self . package = None
2009-09-03 16:56:48 +02:00
2011-01-26 17:22:03 +01:00
def read ( self , serviceinfo_node , append = False ) :
2009-09-03 16:56:48 +02:00
""" read in the source services <services> element passed as
elementtree node .
"""
if serviceinfo_node == None :
return
2011-03-21 09:46:46 +01:00
if not append or self . services == None :
2011-01-26 17:22:03 +01:00
self . services = [ ]
2009-09-03 16:56:48 +02:00
services = serviceinfo_node . findall ( ' service ' )
for service in services :
name = service . get ( ' name ' )
2011-01-26 16:16:27 +01:00
mode = service . get ( ' mode ' , None )
data = { ' name ' : name , ' mode ' : ' ' }
if mode :
data [ ' mode ' ] = mode
2009-09-03 16:56:48 +02:00
try :
for param in service . findall ( ' param ' ) :
2009-10-20 16:30:15 +02:00
option = param . get ( ' name ' , None )
2011-08-29 17:06:12 +02:00
value = " "
if param . text :
2013-05-27 14:26:58 +02:00
value = param . text
2009-10-20 16:30:15 +02:00
name + = " -- " + option + " ' " + value + " ' "
2011-01-26 16:16:27 +01:00
data [ ' command ' ] = name
self . services . append ( data )
2009-09-03 16:56:48 +02:00
except :
2013-04-10 11:34:59 +02:00
msg = ' invalid service format: \n %s ' % ET . tostring ( serviceinfo_node , encoding = ET_ENCODING )
2009-09-03 16:56:48 +02:00
raise oscerr . APIError ( msg )
2011-02-15 18:39:06 +01:00
def getProjectGlobalServices ( self , apiurl , project , package ) :
# get all project wide services in one file, we don't store it yet
u = makeurl ( apiurl , [ ' source ' , project , package ] , query = ' cmd=getprojectservices ' )
2011-01-26 17:42:17 +01:00
try :
2011-02-15 18:39:06 +01:00
f = http_POST ( u )
2011-01-26 17:42:17 +01:00
root = ET . parse ( f ) . getroot ( )
2011-01-26 18:07:42 +01:00
self . read ( root , True )
2011-08-23 16:03:58 +02:00
self . project = project
self . package = package
2013-04-09 14:03:17 +02:00
except HTTPError as e :
2011-08-23 16:03:58 +02:00
if e . code != 403 and e . code != 400 :
2011-01-26 17:42:17 +01:00
raise e
2011-01-26 17:22:03 +01:00
2010-05-17 19:24:00 +02:00
def addVerifyFile ( self , serviceinfo_node , filename ) :
import hashlib
f = open ( filename , ' r ' )
digest = hashlib . sha256 ( f . read ( ) ) . hexdigest ( )
f . close ( )
r = serviceinfo_node
s = ET . Element ( " service " , name = " verify_file " )
ET . SubElement ( s , " param " , name = " file " ) . text = filename
ET . SubElement ( s , " param " , name = " verifier " ) . text = " sha256 "
2010-05-18 16:33:11 +02:00
ET . SubElement ( s , " param " , name = " checksum " ) . text = digest
2010-05-17 19:24:00 +02:00
r . append ( s )
return r
2010-05-14 16:44:42 +02:00
def addDownloadUrl ( self , serviceinfo_node , url_string ) :
url = urlparse ( url_string )
protocol = url . scheme
host = url . netloc
path = url . path
r = serviceinfo_node
s = ET . Element ( " service " , name = " download_url " )
ET . SubElement ( s , " param " , name = " protocol " ) . text = protocol
ET . SubElement ( s , " param " , name = " host " ) . text = host
ET . SubElement ( s , " param " , name = " path " ) . text = path
r . append ( s )
return r
2010-09-20 11:09:43 +02:00
def addGitUrl ( self , serviceinfo_node , url_string ) :
r = serviceinfo_node
2011-01-26 17:29:43 +01:00
s = ET . Element ( " service " , name = " tar_scm " )
2010-09-20 11:09:43 +02:00
ET . SubElement ( s , " param " , name = " url " ) . text = url_string
2011-01-26 17:29:43 +01:00
ET . SubElement ( s , " param " , name = " scm " ) . text = " git "
r . append ( s )
return r
def addRecompressTar ( self , serviceinfo_node ) :
r = serviceinfo_node
s = ET . Element ( " service " , name = " recompress " )
ET . SubElement ( s , " param " , name = " file " ) . text = " *.tar "
ET . SubElement ( s , " param " , name = " compression " ) . text = " bz2 "
2010-09-20 11:09:43 +02:00
r . append ( s )
return r
2010-05-14 16:44:42 +02:00
2011-05-25 13:34:32 +02:00
def execute ( self , dir , callmode = None , singleservice = None , verbose = None ) :
2009-09-03 16:56:48 +02:00
import tempfile
2011-01-06 15:03:18 +01:00
# cleanup existing generated files
for filename in os . listdir ( dir ) :
if filename . startswith ( ' _service: ' ) or filename . startswith ( ' _service_ ' ) :
2014-01-09 10:24:48 +01:00
ent = os . path . join ( dir , filename )
if os . path . isdir ( ent ) :
shutil . rmtree ( ent )
else :
os . unlink ( ent )
2011-01-06 15:03:18 +01:00
2011-02-15 09:41:03 +01:00
allservices = self . services or [ ]
if singleservice and not singleservice in allservices :
# set array to the manual specified singleservice, if it is not part of _service file
data = { ' name ' : singleservice , ' command ' : singleservice , ' mode ' : ' ' }
allservices = [ data ]
2011-08-23 16:03:58 +02:00
# set environment when using OBS 2.3 or later
if self . project != None :
os . putenv ( " OBS_SERVICE_PROJECT " , self . project )
os . putenv ( " OBS_SERVICE_PACKAGE " , self . package )
2011-08-18 11:32:19 +02:00
2011-01-06 15:03:18 +01:00
# recreate files
2011-05-24 10:49:08 +02:00
ret = 0
2011-02-15 09:41:03 +01:00
for service in allservices :
if singleservice and service [ ' name ' ] != singleservice :
continue
2011-11-22 14:47:11 +01:00
if service [ ' mode ' ] == " serveronly " and callmode != " disabled " :
continue
2011-01-26 16:30:57 +01:00
if service [ ' mode ' ] == " disabled " and callmode != " disabled " :
continue
if service [ ' mode ' ] != " disabled " and callmode == " disabled " :
continue
2011-05-25 13:34:32 +02:00
if service [ ' mode ' ] != " trylocal " and service [ ' mode ' ] != " localonly " and callmode == " trylocal " :
continue
2011-01-26 16:16:27 +01:00
call = service [ ' command ' ]
2013-04-26 20:43:53 +02:00
temp_dir = None
try :
temp_dir = tempfile . mkdtemp ( )
name = call . split ( None , 1 ) [ 0 ]
if not os . path . exists ( " /usr/lib/obs/service/ " + name ) :
raise oscerr . PackageNotInstalled ( " obs-service- " + name )
cmd = " /usr/lib/obs/service/ " + call + " --outdir " + temp_dir
if conf . config [ ' verbose ' ] > 1 or verbose :
print ( " Run source service: " , cmd )
r = run_external ( cmd , shell = True )
if r != 0 :
print ( " Aborting: service call failed: " + cmd )
# FIXME: addDownloadUrlService calls si.execute after
# updating _services.
return r
if service [ ' mode ' ] == " disabled " or service [ ' mode ' ] == " trylocal " or service [ ' mode ' ] == " localonly " or callmode == " local " or callmode == " trylocal " :
for filename in os . listdir ( temp_dir ) :
shutil . move ( os . path . join ( temp_dir , filename ) , os . path . join ( dir , filename ) )
else :
for filename in os . listdir ( temp_dir ) :
shutil . move ( os . path . join ( temp_dir , filename ) , os . path . join ( dir , " _service: " + name + " : " + filename ) )
finally :
if temp_dir is not None :
shutil . rmtree ( temp_dir )
2009-09-03 16:56:48 +02:00
2011-12-12 10:04:21 +01:00
return 0
2011-05-24 10:49:08 +02:00
2008-03-22 14:37:59 +01:00
class Linkinfo :
2008-03-22 18:37:17 +01:00
""" linkinfo metadata (which is part of the xml representing a directory
2008-03-22 14:37:59 +01:00
"""
def __init__ ( self ) :
""" creates an empty linkinfo instance """
self . project = None
self . package = None
self . xsrcmd5 = None
2008-03-22 18:37:17 +01:00
self . lsrcmd5 = None
self . srcmd5 = None
2008-07-16 17:14:57 +02:00
self . error = None
2009-03-09 14:44:14 +01:00
self . rev = None
2010-01-11 17:00:24 +01:00
self . baserev = None
2008-03-22 14:37:59 +01:00
def read ( self , linkinfo_node ) :
""" read in the linkinfo metadata from the <linkinfo> element passed as
elementtree node .
If the passed element is None , the method does nothing .
"""
if linkinfo_node == None :
return
self . project = linkinfo_node . get ( ' project ' )
self . package = linkinfo_node . get ( ' package ' )
self . xsrcmd5 = linkinfo_node . get ( ' xsrcmd5 ' )
2008-03-22 18:37:17 +01:00
self . lsrcmd5 = linkinfo_node . get ( ' lsrcmd5 ' )
self . srcmd5 = linkinfo_node . get ( ' srcmd5 ' )
2008-07-16 17:14:57 +02:00
self . error = linkinfo_node . get ( ' error ' )
2009-03-09 14:44:14 +01:00
self . rev = linkinfo_node . get ( ' rev ' )
2010-01-11 17:00:24 +01:00
self . baserev = linkinfo_node . get ( ' baserev ' )
2008-03-22 14:37:59 +01:00
def islink ( self ) :
""" returns True if the linkinfo is not empty, otherwise False """
2008-03-22 18:37:17 +01:00
if self . xsrcmd5 or self . lsrcmd5 :
2008-03-22 14:37:59 +01:00
return True
2008-03-22 18:37:17 +01:00
return False
def isexpanded ( self ) :
""" returns True if the package is an expanded link """
if self . lsrcmd5 and not self . xsrcmd5 :
return True
return False
2008-03-22 14:37:59 +01:00
2008-07-16 17:14:57 +02:00
def haserror ( self ) :
""" returns True if the link is in error state (could not be applied) """
if self . error :
return True
return False
2008-03-22 14:37:59 +01:00
def __str__ ( self ) :
""" return an informatory string representation """
2008-03-22 18:37:17 +01:00
if self . islink ( ) and not self . isexpanded ( ) :
2009-03-09 14:44:14 +01:00
return ' project %s , package %s , xsrcmd5 %s , rev %s ' \
% ( self . project , self . package , self . xsrcmd5 , self . rev )
2008-03-22 18:37:17 +01:00
elif self . islink ( ) and self . isexpanded ( ) :
2008-07-16 17:14:57 +02:00
if self . haserror ( ) :
return ' broken link to project %s , package %s , srcmd5 %s , lsrcmd5 %s : %s ' \
% ( self . project , self . package , self . srcmd5 , self . lsrcmd5 , self . error )
else :
return ' expanded link to project %s , package %s , srcmd5 %s , lsrcmd5 %s ' \
% ( self . project , self . package , self . srcmd5 , self . lsrcmd5 )
2008-03-22 14:37:59 +01:00
else :
return ' None '
2010-08-04 11:46:30 +02:00
# http://effbot.org/zone/element-lib.htm#prettyprint
def xmlindent ( elem , level = 0 ) :
i = " \n " + level * " "
if len ( elem ) :
if not elem . text or not elem . text . strip ( ) :
elem . text = i + " "
for e in elem :
xmlindent ( e , level + 1 )
if not e . tail or not e . tail . strip ( ) :
e . tail = i + " "
if not e . tail or not e . tail . strip ( ) :
e . tail = i
else :
if level and ( not elem . tail or not elem . tail . strip ( ) ) :
elem . tail = i
2006-05-22 12:50:37 +02:00
class Project :
2013-01-15 18:57:40 +01:00
"""
Represent a checked out project directory , holding packages .
: Attributes :
` ` dir ` `
The directory path containing the project .
` ` name ` `
The name of the project .
` ` apiurl ` `
The endpoint URL of the API server .
` ` pacs_available ` `
List of names of packages available server - side .
This is only populated if ` ` getPackageList ` ` is set
to ` ` True ` ` in the constructor .
` ` pacs_have ` `
2013-01-16 14:48:15 +01:00
List of names of packages which exist server - side
and exist in the local project working copy ( if
' do_package_tracking ' is disabled ) .
If ' do_package_tracking ' is enabled it represents the
list names of packages which are tracked in the project
working copy ( that is it might contain packages which
exist on the server as well as packages which do not
exist on the server ( for instance if the local package
was added or if the package was removed on the server - side ) ) .
2013-01-15 18:57:40 +01:00
` ` pacs_excluded ` `
List of names of packages in the local project directory
which are excluded by the ` exclude_glob ` configuration
variable . Only set if ` do_package_tracking ` is enabled .
` ` pacs_unvers ` `
List of names of packages in the local project directory
2013-01-16 14:48:15 +01:00
which are not tracked . Only set if ` do_package_tracking `
is enabled .
2013-01-15 18:57:40 +01:00
` ` pacs_broken ` `
2013-01-16 14:48:15 +01:00
List of names of packages which are tracked but do not
exist in the local project working copy . Only set if
` do_package_tracking ` is enabled .
2013-01-15 18:57:40 +01:00
` ` pacs_missing ` `
List of names of packages which exist server - side but
are not expected to exist in the local project directory .
"""
2010-10-10 21:40:31 +02:00
REQ_STOREFILES = ( ' _project ' , ' _apiurl ' )
if conf . config [ ' do_package_tracking ' ] :
REQ_STOREFILES + = ( ' _packages ' , )
2013-01-15 18:57:40 +01:00
2010-10-10 21:40:31 +02:00
def __init__ ( self , dir , getPackageList = True , progress_obj = None , wc_check = True ) :
2013-01-15 18:57:40 +01:00
"""
Constructor .
: Parameters :
` dir ` : str
The directory path containing the checked out project .
` getPackageList ` : bool
Set to ` False ` if you want to skip retrieval from the
server of the list of packages in the project .
` wc_check ` : bool
"""
2008-03-31 16:42:11 +02:00
import fnmatch
2006-05-22 12:50:37 +02:00
self . dir = dir
2006-06-06 12:50:40 +02:00
self . absdir = os . path . abspath ( dir )
2010-02-09 20:57:10 +01:00
self . progress_obj = progress_obj
2006-05-22 12:50:37 +02:00
self . name = store_read_project ( self . dir )
2010-10-10 21:40:31 +02:00
self . apiurl = store_read_apiurl ( self . dir , defaulturl = not wc_check )
dirty_files = [ ]
if wc_check :
dirty_files = self . wc_check ( )
if dirty_files :
msg = ' Your working copy \' %s \' is in an inconsistent state. \n ' \
' Please run \' osc repairwc %s \' and check the state \n ' \
' of the working copy afterwards (via \' osc status %s \' ) ' % ( self . dir , self . dir , self . dir )
2010-12-23 02:17:19 +01:00
raise oscerr . WorkingCopyInconsistent ( self . name , None , dirty_files , msg )
2006-05-22 12:50:37 +02:00
2008-03-10 19:04:23 +01:00
if getPackageList :
self . pacs_available = meta_get_packagelist ( self . apiurl , self . name )
else :
self . pacs_available = [ ]
2009-10-20 16:30:15 +02:00
2008-03-10 19:04:23 +01:00
if conf . config [ ' do_package_tracking ' ] :
self . pac_root = self . read_packages ( ) . getroot ( )
self . pacs_have = [ pac . get ( ' name ' ) for pac in self . pac_root . findall ( ' package ' ) ]
2009-08-21 21:39:12 +02:00
self . pacs_excluded = [ i for i in os . listdir ( self . dir )
for j in conf . config [ ' exclude_glob ' ]
2008-03-31 16:42:11 +02:00
if fnmatch . fnmatch ( i , j ) ]
self . pacs_unvers = [ i for i in os . listdir ( self . dir ) if i not in self . pacs_have and i not in self . pacs_excluded ]
2008-03-10 19:04:23 +01:00
# store all broken packages (e.g. packages which where removed by a non-osc cmd)
# in the self.pacs_broken list
self . pacs_broken = [ ]
for p in self . pacs_have :
if not os . path . isdir ( os . path . join ( self . absdir , p ) ) :
# all states will be replaced with the '!'-state
# (except it is already marked as deleted ('D'-state))
self . pacs_broken . append ( p )
else :
self . pacs_have = [ i for i in os . listdir ( self . dir ) if i in self . pacs_available ]
2006-05-22 12:50:37 +02:00
2006-06-26 17:11:22 +02:00
self . pacs_missing = [ i for i in self . pacs_available if i not in self . pacs_have ]
2006-05-22 12:50:37 +02:00
2010-10-10 21:40:31 +02:00
def wc_check ( self ) :
global store
dirty_files = [ ]
for fname in Project . REQ_STOREFILES :
if not os . path . exists ( os . path . join ( self . absdir , store , fname ) ) :
dirty_files . append ( fname )
return dirty_files
def wc_repair ( self , apiurl = None ) :
global store
2010-12-07 20:35:12 +01:00
if not os . path . exists ( os . path . join ( self . dir , store , ' _apiurl ' ) ) or apiurl :
2010-10-10 21:40:31 +02:00
if apiurl is None :
msg = ' cannot repair wc: the \' _apiurl \' file is missing but ' \
' no \' apiurl \' was passed to wc_repair '
# hmm should we raise oscerr.WrongArgs?
raise oscerr . WorkingCopyInconsistent ( self . prjname , self . name , [ ] , msg )
2010-12-09 20:36:06 +01:00
# sanity check
conf . parse_apisrv_url ( None , apiurl )
2010-10-10 21:40:31 +02:00
store_write_apiurl ( self . dir , apiurl )
self . apiurl = store_read_apiurl ( self . dir , defaulturl = False )
2009-08-19 15:07:58 +02:00
def checkout_missing_pacs ( self , expand_link = False ) :
2006-05-22 12:50:37 +02:00
for pac in self . pacs_missing :
2008-03-10 19:04:23 +01:00
if conf . config [ ' do_package_tracking ' ] and pac in self . pacs_unvers :
# pac is not under version control but a local file/dir exists
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
msg = ' can \' t add package \' %s \' : Object already exists ' % pac
raise oscerr . PackageExists ( self . name , pac , msg )
2008-03-10 19:04:23 +01:00
else :
2013-04-09 12:51:28 +02:00
print ( ' checking out new package %s ' % pac )
2008-04-02 17:30:44 +02:00
checkout_package ( self . apiurl , self . name , pac , \
pathname = getTransActPath ( os . path . join ( self . dir , pac ) ) , \
2010-02-09 20:57:10 +01:00
prj_obj = self , prj_dir = self . dir , expand_link = expand_link , progress_obj = self . progress_obj )
2008-03-10 19:04:23 +01:00
2010-12-22 23:17:11 +01:00
def status ( self , pac ) :
exists = os . path . exists ( os . path . join ( self . absdir , pac ) )
st = self . get_state ( pac )
if st is None and exists :
return ' ? '
elif st is None :
raise oscerr . OscIOError ( None , ' osc: \' %s \' is not under version control ' % pac )
elif st in ( ' A ' , ' ' ) and not exists :
return ' ! '
elif st == ' D ' and not exists :
return ' D '
else :
return st
def get_status ( self , * exclude_states ) :
res = [ ]
for pac in self . pacs_have :
st = self . status ( pac )
if not st in exclude_states :
res . append ( ( st , pac ) )
if not ' ? ' in exclude_states :
res . extend ( [ ( ' ? ' , pac ) for pac in self . pacs_unvers ] )
return res
def get_pacobj ( self , pac , * pac_args , * * pac_kwargs ) :
try :
st = self . status ( pac )
if st in ( ' ? ' , ' ! ' ) or st == ' D ' and not os . path . exists ( os . path . join ( self . dir , pac ) ) :
return None
return Package ( os . path . join ( self . dir , pac ) , * pac_args , * * pac_kwargs )
except oscerr . OscIOError :
return None
2008-03-10 19:04:23 +01:00
def set_state ( self , pac , state ) :
node = self . get_package_node ( pac )
if node == None :
self . new_package_entry ( pac , state )
else :
2011-02-22 17:52:12 +01:00
node . set ( ' state ' , state )
2008-03-10 19:04:23 +01:00
def get_package_node ( self , pac ) :
for node in self . pac_root . findall ( ' package ' ) :
if pac == node . get ( ' name ' ) :
return node
return None
def del_package_node ( self , pac ) :
for node in self . pac_root . findall ( ' package ' ) :
if pac == node . get ( ' name ' ) :
self . pac_root . remove ( node )
def get_state ( self , pac ) :
node = self . get_package_node ( pac )
if node != None :
return node . get ( ' state ' )
else :
return None
def new_package_entry ( self , name , state ) :
ET . SubElement ( self . pac_root , ' package ' , name = name , state = state )
def read_packages ( self ) :
2013-01-15 18:57:40 +01:00
"""
Returns an ` ` xml . etree . cElementTree ` ` object representing the
parsed contents of the project ' s ``.osc/_packages`` XML file.
"""
2010-08-31 14:43:43 +02:00
global store
2009-10-30 16:19:57 +01:00
packages_file = os . path . join ( self . absdir , store , ' _packages ' )
if os . path . isfile ( packages_file ) and os . path . getsize ( packages_file ) :
return ET . parse ( packages_file )
2008-03-10 19:04:23 +01:00
else :
# scan project for existing packages and migrate them
cur_pacs = [ ]
for data in os . listdir ( self . dir ) :
pac_dir = os . path . join ( self . absdir , data )
# we cannot use self.pacs_available because we cannot guarantee that the package list
# was fetched from the server
if data in meta_get_packagelist ( self . apiurl , self . name ) and is_package_dir ( pac_dir ) \
and Package ( pac_dir ) . name == data :
cur_pacs . append ( ET . Element ( ' package ' , name = data , state = ' ' ) )
store_write_initial_packages ( self . absdir , self . name , cur_pacs )
return ET . parse ( os . path . join ( self . absdir , store , ' _packages ' ) )
def write_packages ( self ) :
2010-08-04 11:46:30 +02:00
xmlindent ( self . pac_root )
2013-04-10 11:34:59 +02:00
store_write_string ( self . absdir , ' _packages ' , ET . tostring ( self . pac_root , encoding = ET_ENCODING ) )
2008-03-10 19:04:23 +01:00
def addPackage ( self , pac ) :
2008-04-03 12:46:18 +02:00
import fnmatch
2009-08-21 21:39:12 +02:00
for i in conf . config [ ' exclude_glob ' ] :
2008-04-03 12:46:18 +02:00
if fnmatch . fnmatch ( pac , i ) :
2009-12-25 00:08:29 +01:00
msg = ' invalid package name: \' %s \' (see \' exclude_glob \' config option) ' % pac
raise oscerr . OscIOError ( None , msg )
2008-03-10 19:04:23 +01:00
state = self . get_state ( pac )
if state == None or state == ' D ' :
self . new_package_entry ( pac , ' A ' )
self . write_packages ( )
# sometimes the new pac doesn't exist in the list because
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
# it would take too much time to update all data structs regularly
2008-03-10 19:04:23 +01:00
if pac in self . pacs_unvers :
self . pacs_unvers . remove ( pac )
else :
2009-12-25 00:08:29 +01:00
raise oscerr . PackageExists ( self . name , pac , ' package \' %s \' is already under version control ' % pac )
2008-03-10 19:04:23 +01:00
def delPackage ( self , pac , force = False ) :
state = self . get_state ( pac . name )
can_delete = True
if state == ' ' or state == ' D ' :
del_files = [ ]
2010-08-20 14:34:41 +02:00
for filename in pac . filenamelist + pac . filenamelist_unvers :
filestate = pac . status ( filename )
2008-03-10 19:04:23 +01:00
if filestate == ' M ' or filestate == ' C ' or \
filestate == ' A ' or filestate == ' ? ' :
can_delete = False
2009-10-20 16:30:15 +02:00
else :
2010-08-20 14:34:41 +02:00
del_files . append ( filename )
2008-03-10 19:04:23 +01:00
if can_delete or force :
2010-08-20 14:34:41 +02:00
for filename in del_files :
pac . delete_localfile ( filename )
if pac . status ( filename ) != ' ? ' :
2008-03-10 19:04:23 +01:00
# this is not really necessary
2010-08-20 14:34:41 +02:00
pac . put_on_deletelist ( filename )
2013-04-09 12:51:28 +02:00
print ( statfrmt ( ' D ' , getTransActPath ( os . path . join ( pac . dir , filename ) ) ) )
print ( statfrmt ( ' D ' , getTransActPath ( os . path . join ( pac . dir , os . pardir , pac . name ) ) ) )
2008-03-10 19:04:23 +01:00
pac . write_deletelist ( )
self . set_state ( pac . name , ' D ' )
self . write_packages ( )
else :
2013-04-09 12:51:28 +02:00
print ( ' package \' %s \' has local modifications (see osc st for details) ' % pac . name )
2008-03-10 19:04:23 +01:00
elif state == ' A ' :
if force :
delete_dir ( pac . absdir )
self . del_package_node ( pac . name )
self . write_packages ( )
2013-04-09 12:51:28 +02:00
print ( statfrmt ( ' D ' , pac . name ) )
2008-03-10 19:04:23 +01:00
else :
2013-04-09 12:51:28 +02:00
print ( ' package \' %s \' has local modifications (see osc st for details) ' % pac . name )
2008-03-10 19:04:23 +01:00
elif state == None :
2013-04-09 12:51:28 +02:00
print ( ' package is not under version control ' )
2008-03-10 19:04:23 +01:00
else :
2013-04-09 12:51:28 +02:00
print ( ' unsupported state ' )
2008-03-10 19:04:23 +01:00
2009-09-03 16:56:48 +02:00
def update ( self , pacs = ( ) , expand_link = False , unexpand_link = False , service_files = False ) :
2008-03-10 19:04:23 +01:00
if len ( pacs ) :
for pac in pacs :
2011-05-16 14:27:55 +02:00
Package ( os . path . join ( self . dir , pac ) , progress_obj = self . progress_obj ) . update ( )
2008-03-10 19:04:23 +01:00
else :
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
# we need to make sure that the _packages file will be written (even if an exception
# occurs)
try :
# update complete project
# packages which no longer exists upstream
upstream_del = [ pac for pac in self . pacs_have if not pac in self . pacs_available and self . get_state ( pac ) != ' A ' ]
2008-03-10 19:04:23 +01:00
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
for pac in upstream_del :
2013-02-13 18:50:01 +01:00
if self . status ( pac ) != ' ! ' :
2011-08-25 13:43:58 +02:00
p = Package ( os . path . join ( self . dir , pac ) )
self . delPackage ( p , force = True )
delete_storedir ( p . storedir )
try :
os . rmdir ( pac )
except :
pass
2013-02-13 18:50:01 +01:00
self . pac_root . remove ( self . get_package_node ( pac ) )
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
self . pacs_have . remove ( pac )
for pac in self . pacs_have :
state = self . get_state ( pac )
2008-03-10 19:04:23 +01:00
if pac in self . pacs_broken :
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
if self . get_state ( pac ) != ' A ' :
checkout_package ( self . apiurl , self . name , pac ,
2010-02-09 20:57:10 +01:00
pathname = getTransActPath ( os . path . join ( self . dir , pac ) ) , prj_obj = self , \
prj_dir = self . dir , expand_link = not unexpand_link , progress_obj = self . progress_obj )
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
elif state == ' ' :
# do a simple update
2010-02-09 20:57:10 +01:00
p = Package ( os . path . join ( self . dir , pac ) , progress_obj = self . progress_obj )
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
rev = None
if expand_link and p . islink ( ) and not p . isexpanded ( ) :
2010-01-21 14:47:04 +01:00
if p . haslinkerror ( ) :
2010-01-22 14:29:26 +01:00
try :
rev = show_upstream_xsrcmd5 ( p . apiurl , p . prjname , p . name , revision = p . rev )
except :
rev = show_upstream_xsrcmd5 ( p . apiurl , p . prjname , p . name , revision = p . rev , linkrev = " base " )
p . mark_frozen ( )
2010-01-21 14:47:04 +01:00
else :
2010-01-22 14:29:26 +01:00
rev = p . linkinfo . xsrcmd5
2013-04-09 12:51:28 +02:00
print ( ' Expanding to rev ' , rev )
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
elif unexpand_link and p . islink ( ) and p . isexpanded ( ) :
rev = p . linkinfo . lsrcmd5
2013-04-09 12:51:28 +02:00
print ( ' Unexpanding to rev ' , rev )
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
elif p . islink ( ) and p . isexpanded ( ) :
2009-10-20 16:30:15 +02:00
rev = p . latest_rev ( )
2013-04-09 12:51:28 +02:00
print ( ' Updating %s ' % p . name )
2009-09-03 16:56:48 +02:00
p . update ( rev , service_files )
2010-01-21 14:47:04 +01:00
if unexpand_link :
p . unmark_frozen ( )
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
elif state == ' D ' :
# TODO: Package::update has to fixed to behave like svn does
if pac in self . pacs_broken :
checkout_package ( self . apiurl , self . name , pac ,
2010-02-09 20:57:10 +01:00
pathname = getTransActPath ( os . path . join ( self . dir , pac ) ) , prj_obj = self , \
prj_dir = self . dir , expand_link = expand_link , progress_obj = self . progress_obj )
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
else :
2011-02-22 00:22:55 +01:00
Package ( os . path . join ( self . dir , pac ) , progress_obj = self . progress_obj ) . update ( )
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
elif state == ' A ' and pac in self . pacs_available :
# file/dir called pac already exists and is under version control
msg = ' can \' t add package \' %s \' : Object already exists ' % pac
raise oscerr . PackageExists ( self . name , pac , msg )
elif state == ' A ' :
# do nothing
pass
2008-03-10 19:04:23 +01:00
else :
2013-04-09 12:51:28 +02:00
print ( ' unexpected state.. package \' %s \' ' % pac )
2008-03-10 19:04:23 +01:00
2010-01-21 14:47:04 +01:00
self . checkout_missing_pacs ( expand_link = not unexpand_link )
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
finally :
self . write_packages ( )
2008-03-10 19:04:23 +01:00
2011-09-07 13:55:05 +02:00
def commit ( self , pacs = ( ) , msg = ' ' , files = { } , verbose = False , skip_local_service_run = False ) :
2008-03-10 19:04:23 +01:00
if len ( pacs ) :
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
try :
for pac in pacs :
todo = [ ]
2013-04-09 11:33:25 +02:00
if pac in files :
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
todo = files [ pac ]
state = self . get_state ( pac )
if state == ' A ' :
2011-09-07 13:55:05 +02:00
self . commitNewPackage ( pac , msg , todo , verbose = verbose , skip_local_service_run = skip_local_service_run )
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
elif state == ' D ' :
self . commitDelPackage ( pac )
elif state == ' ' :
# display the correct dir when sending the changes
2009-05-20 18:32:45 +02:00
if os_path_samefile ( os . path . join ( self . dir , pac ) , os . getcwd ( ) ) :
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
p = Package ( ' . ' )
else :
p = Package ( os . path . join ( self . dir , pac ) )
p . todo = todo
2011-09-07 13:55:05 +02:00
p . commit ( msg , verbose = verbose , skip_local_service_run = skip_local_service_run )
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
elif pac in self . pacs_unvers and not is_package_dir ( os . path . join ( self . dir , pac ) ) :
2013-04-09 12:51:28 +02:00
print ( ' osc: \' %s \' is not under version control ' % pac )
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
elif pac in self . pacs_broken :
2013-04-09 12:51:28 +02:00
print ( ' osc: \' %s \' package not found ' % pac )
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
elif state == None :
2012-09-17 13:12:50 +02:00
self . commitExtPackage ( pac , msg , todo , verbose = verbose , skip_local_service_run = skip_local_service_run )
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
finally :
self . write_packages ( )
2008-03-10 19:04:23 +01:00
else :
# if we have packages marked as '!' we cannot commit
for pac in self . pacs_broken :
if self . get_state ( pac ) != ' D ' :
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
msg = ' commit failed: package \' %s \' is missing ' % pac
raise oscerr . PackageMissing ( self . name , pac , msg )
try :
for pac in self . pacs_have :
state = self . get_state ( pac )
if state == ' ' :
# do a simple commit
2011-09-07 13:55:05 +02:00
Package ( os . path . join ( self . dir , pac ) ) . commit ( msg , verbose = verbose , skip_local_service_run = skip_local_service_run )
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
elif state == ' D ' :
self . commitDelPackage ( pac )
elif state == ' A ' :
2011-09-07 13:55:05 +02:00
self . commitNewPackage ( pac , msg , verbose = verbose , skip_local_service_run = skip_local_service_run )
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
finally :
self . write_packages ( )
2008-03-10 19:04:23 +01:00
2011-09-07 13:55:05 +02:00
def commitNewPackage ( self , pac , msg = ' ' , files = [ ] , verbose = False , skip_local_service_run = False ) :
2008-03-10 19:04:23 +01:00
""" creates and commits a new package if it does not exist on the server """
if pac in self . pacs_available :
2013-04-09 12:51:28 +02:00
print ( ' package \' %s \' already exists ' % pac )
2008-03-10 19:04:23 +01:00
else :
2008-03-15 23:51:37 +01:00
user = conf . get_apiurl_usr ( self . apiurl )
2008-03-10 19:04:23 +01:00
edit_meta ( metatype = ' pkg ' ,
path_args = ( quote_plus ( self . name ) , quote_plus ( pac ) ) ,
2009-04-21 18:52:26 +02:00
template_args = ( {
' name ' : pac ,
' user ' : user } ) ,
apiurl = self . apiurl )
2008-03-10 19:04:23 +01:00
# display the correct dir when sending the changes
2006-05-22 12:50:37 +02:00
olddir = os . getcwd ( )
2009-05-20 18:32:45 +02:00
if os_path_samefile ( os . path . join ( self . dir , pac ) , os . curdir ) :
2008-03-10 19:04:23 +01:00
os . chdir ( os . pardir )
p = Package ( pac )
else :
p = Package ( os . path . join ( self . dir , pac ) )
p . todo = files
2013-04-09 12:51:28 +02:00
print ( statfrmt ( ' Sending ' , os . path . normpath ( p . dir ) ) )
2011-09-07 13:55:05 +02:00
p . commit ( msg = msg , verbose = verbose , skip_local_service_run = skip_local_service_run )
2008-03-10 19:04:23 +01:00
self . set_state ( pac , ' ' )
2006-05-22 12:50:37 +02:00
os . chdir ( olddir )
2008-03-10 19:04:23 +01:00
def commitDelPackage ( self , pac ) :
""" deletes a package on the server and in the working copy """
try :
# display the correct dir when sending the changes
2009-05-20 18:32:45 +02:00
if os_path_samefile ( os . path . join ( self . dir , pac ) , os . curdir ) :
2008-03-10 19:04:23 +01:00
pac_dir = pac
else :
pac_dir = os . path . join ( self . dir , pac )
p = Package ( os . path . join ( self . dir , pac ) )
#print statfrmt('Deleting', os.path.normpath(os.path.join(p.dir, os.pardir, pac)))
delete_storedir ( p . storedir )
try :
os . rmdir ( p . dir )
except :
pass
except OSError :
pac_dir = os . path . join ( self . dir , pac )
#print statfrmt('Deleting', getTransActPath(os.path.join(self.dir, pac)))
2013-04-09 12:51:28 +02:00
print ( statfrmt ( ' Deleting ' , getTransActPath ( pac_dir ) ) )
2008-03-10 19:04:23 +01:00
delete_package ( self . apiurl , self . name , pac )
self . del_package_node ( pac )
2012-09-17 13:12:50 +02:00
def commitExtPackage ( self , pac , msg , files = [ ] , verbose = False , skip_local_service_run = False ) :
2008-03-10 19:04:23 +01:00
""" commits a package from an external project """
2009-05-20 18:32:45 +02:00
if os_path_samefile ( os . path . join ( self . dir , pac ) , os . getcwd ( ) ) :
2008-03-10 19:04:23 +01:00
pac_path = ' . '
else :
pac_path = os . path . join ( self . dir , pac )
2009-10-20 16:30:15 +02:00
2008-03-10 19:04:23 +01:00
project = store_read_project ( pac_path )
package = store_read_package ( pac_path )
2010-09-19 23:00:19 +02:00
apiurl = store_read_apiurl ( pac_path , defaulturl = False )
2010-09-09 12:49:53 +02:00
if not meta_exists ( metatype = ' pkg ' ,
path_args = ( quote_plus ( project ) , quote_plus ( package ) ) ,
template_args = None , create_new = False , apiurl = apiurl ) :
2008-03-15 23:51:37 +01:00
user = conf . get_apiurl_usr ( self . apiurl )
2008-03-10 19:04:23 +01:00
edit_meta ( metatype = ' pkg ' ,
path_args = ( quote_plus ( project ) , quote_plus ( package ) ) ,
2010-09-09 12:49:53 +02:00
template_args = ( { ' name ' : pac , ' user ' : user } ) , apiurl = apiurl )
p = Package ( pac_path )
p . todo = files
2012-09-17 13:12:50 +02:00
p . commit ( msg = msg , verbose = verbose , skip_local_service_run = skip_local_service_run )
2006-05-22 12:50:37 +02:00
def __str__ ( self ) :
r = [ ]
r . append ( ' ***************************************************** ' )
r . append ( ' Project %s (dir= %s , absdir= %s ) ' % ( self . name , self . dir , self . absdir ) )
r . append ( ' have pacs: \n %s ' % ' , ' . join ( self . pacs_have ) )
r . append ( ' missing pacs: \n %s ' % ' , ' . join ( self . pacs_missing ) )
r . append ( ' ***************************************************** ' )
return ' \n ' . join ( r )
2010-10-09 16:26:55 +02:00
@staticmethod
2010-12-23 02:15:58 +01:00
def init_project ( apiurl , dir , project , package_tracking = True , getPackageList = True , progress_obj = None , wc_check = True ) :
2010-10-09 16:26:55 +02:00
global store
if not os . path . exists ( dir ) :
# use makedirs (checkout_no_colon config option might be enabled)
os . makedirs ( dir )
elif not os . path . isdir ( dir ) :
raise oscerr . OscIOError ( None , ' error: \' %s \' is no directory ' % dir )
if os . path . exists ( os . path . join ( dir , store ) ) :
raise oscerr . OscIOError ( None , ' error: \' %s \' is already an initialized osc working copy ' % dir )
else :
os . mkdir ( os . path . join ( dir , store ) )
store_write_project ( dir , project )
store_write_apiurl ( dir , apiurl )
if package_tracking :
store_write_initial_packages ( dir , project , [ ] )
2010-12-23 02:15:58 +01:00
return Project ( dir , getPackageList , progress_obj , wc_check )
2006-05-22 12:50:37 +02:00
2006-05-19 22:13:29 +02:00
class Package :
""" represent a package (its directory) and read/keep/write its metadata """
2010-09-08 18:56:15 +02:00
# should _meta be a required file?
REQ_STOREFILES = ( ' _project ' , ' _package ' , ' _apiurl ' , ' _files ' , ' _osclib_version ' )
OPT_STOREFILES = ( ' _to_be_added ' , ' _to_be_deleted ' , ' _in_conflict ' , ' _in_update ' ,
2010-10-09 14:31:06 +02:00
' _in_commit ' , ' _meta ' , ' _meta_mode ' , ' _frozenlink ' , ' _pulled ' , ' _linkrepair ' ,
' _size_limit ' , ' _commit_msg ' )
2010-09-08 18:56:15 +02:00
def __init__ ( self , workingdir , progress_obj = None , size_limit = None , wc_check = True ) :
2010-08-31 14:43:43 +02:00
global store
2006-05-19 22:13:29 +02:00
self . dir = workingdir
2006-06-06 12:50:40 +02:00
self . absdir = os . path . abspath ( self . dir )
2007-11-26 19:13:51 +01:00
self . storedir = os . path . join ( self . absdir , store )
2010-02-09 20:57:10 +01:00
self . progress_obj = progress_obj
2010-09-03 14:51:20 +02:00
self . size_limit = size_limit
if size_limit and size_limit == 0 :
2010-09-19 23:00:19 +02:00
self . size_limit = None
2006-05-19 22:13:29 +02:00
check_store_version ( self . dir )
2010-04-09 15:47:07 +02:00
self . prjname = store_read_project ( self . dir )
2010-04-09 15:57:12 +02:00
self . name = store_read_package ( self . dir )
2010-09-28 23:07:33 +02:00
self . apiurl = store_read_apiurl ( self . dir , defaulturl = not wc_check )
2006-05-19 22:13:29 +02:00
2007-07-30 13:12:42 +02:00
self . update_datastructs ( )
2010-09-28 23:07:33 +02:00
dirty_files = [ ]
if wc_check :
dirty_files = self . wc_check ( )
if dirty_files :
2010-09-14 13:12:32 +02:00
msg = ' Your working copy \' %s \' is in an inconsistent state. \n ' \
2010-09-14 14:48:10 +02:00
' Please run \' osc repairwc %s \' (Note this might _remove_ \n ' \
2010-09-08 18:56:15 +02:00
' files from the .osc/ dir). Please check the state \n ' \
2010-09-14 14:48:10 +02:00
' of the working copy afterwards (via \' osc status %s \' ) ' % ( self . dir , self . dir , self . dir )
2010-09-28 23:07:33 +02:00
raise oscerr . WorkingCopyInconsistent ( self . prjname , self . name , dirty_files , msg )
2006-05-19 22:13:29 +02:00
self . todo = [ ]
2010-09-08 18:56:15 +02:00
def wc_check ( self ) :
2010-09-28 23:07:33 +02:00
dirty_files = [ ]
2010-09-08 18:56:15 +02:00
for fname in self . filenamelist :
if not os . path . exists ( os . path . join ( self . storedir , fname ) ) and not fname in self . skipped :
2010-09-28 23:07:33 +02:00
dirty_files . append ( fname )
2010-09-08 18:56:15 +02:00
for fname in Package . REQ_STOREFILES :
if not os . path . isfile ( os . path . join ( self . storedir , fname ) ) :
2010-09-28 23:07:33 +02:00
dirty_files . append ( fname )
2010-09-08 18:56:15 +02:00
for fname in os . listdir ( self . storedir ) :
if fname in Package . REQ_STOREFILES or fname in Package . OPT_STOREFILES or \
fname . startswith ( ' _build ' ) :
continue
elif fname in self . filenamelist and fname in self . skipped :
2010-09-28 23:07:33 +02:00
dirty_files . append ( fname )
2010-09-08 18:56:15 +02:00
elif not fname in self . filenamelist :
2010-09-28 23:07:33 +02:00
dirty_files . append ( fname )
2010-09-08 18:56:15 +02:00
for fname in self . to_be_deleted [ : ] :
if not fname in self . filenamelist :
2010-09-28 23:07:33 +02:00
dirty_files . append ( fname )
2010-09-08 18:56:15 +02:00
for fname in self . in_conflict [ : ] :
if not fname in self . filenamelist :
2010-09-28 23:07:33 +02:00
dirty_files . append ( fname )
return dirty_files
def wc_repair ( self , apiurl = None ) :
2010-12-07 20:35:12 +01:00
if not os . path . exists ( os . path . join ( self . storedir , ' _apiurl ' ) ) or apiurl :
2010-09-28 23:07:33 +02:00
if apiurl is None :
msg = ' cannot repair wc: the \' _apiurl \' file is missing but ' \
' no \' apiurl \' was passed to wc_repair '
# hmm should we raise oscerr.WrongArgs?
raise oscerr . WorkingCopyInconsistent ( self . prjname , self . name , [ ] , msg )
2010-12-09 20:36:06 +01:00
# sanity check
conf . parse_apisrv_url ( None , apiurl )
2010-09-28 23:07:33 +02:00
store_write_apiurl ( self . dir , apiurl )
self . apiurl = store_read_apiurl ( self . dir , defaulturl = False )
2010-09-08 18:56:15 +02:00
# all files which are present in the filelist have to exist in the storedir
for f in self . filelist :
# XXX: should we also check the md5?
if not os . path . exists ( os . path . join ( self . storedir , f . name ) ) and not f . name in self . skipped :
# if get_source_file fails we're screwed up...
get_source_file ( self . apiurl , self . prjname , self . name , f . name ,
targetfilename = os . path . join ( self . storedir , f . name ) , revision = self . rev ,
mtime = f . mtime )
for fname in os . listdir ( self . storedir ) :
if fname in Package . REQ_STOREFILES or fname in Package . OPT_STOREFILES or \
fname . startswith ( ' _build ' ) :
continue
elif not fname in self . filenamelist or fname in self . skipped :
# this file does not belong to the storedir so remove it
os . unlink ( os . path . join ( self . storedir , fname ) )
for fname in self . to_be_deleted [ : ] :
if not fname in self . filenamelist :
self . to_be_deleted . remove ( fname )
self . write_deletelist ( )
for fname in self . in_conflict [ : ] :
if not fname in self . filenamelist :
self . in_conflict . remove ( fname )
self . write_conflictlist ( )
2007-05-04 23:51:54 +02:00
def info ( self ) :
2009-10-20 16:30:15 +02:00
source_url = makeurl ( self . apiurl , [ ' source ' , self . prjname , self . name ] )
2008-05-21 15:44:49 +02:00
r = info_templ % ( self . prjname , self . name , self . absdir , self . apiurl , source_url , self . srcmd5 , self . rev , self . linkinfo )
2008-03-22 18:37:17 +01:00
return r
2007-05-04 23:51:54 +02:00
2006-05-19 22:13:29 +02:00
def addfile ( self , n ) :
2010-08-24 18:06:47 +02:00
if not os . path . exists ( os . path . join ( self . absdir , n ) ) :
2010-09-02 10:23:37 +02:00
raise oscerr . OscIOError ( None , ' error: file \' %s \' does not exist ' % n )
2010-08-24 18:06:47 +02:00
if n in self . to_be_deleted :
self . to_be_deleted . remove ( n )
# self.delete_storefile(n)
self . write_deletelist ( )
elif n in self . filenamelist or n in self . to_be_added :
raise oscerr . PackageFileConflict ( self . prjname , self . name , n , ' osc: warning: \' %s \' is already under version control ' % n )
# shutil.copyfile(os.path.join(self.dir, n), os.path.join(self.storedir, n))
if self . dir != ' . ' :
pathname = os . path . join ( self . dir , n )
else :
pathname = n
self . to_be_added . append ( n )
self . write_addlist ( )
2013-04-09 12:51:28 +02:00
print ( statfrmt ( ' A ' , pathname ) )
2009-07-15 23:10:38 +02:00
def delete_file ( self , n , force = False ) :
""" deletes a file if possible and marks the file as deleted """
2010-03-22 11:07:10 +01:00
state = ' ? '
try :
state = self . status ( n )
2013-04-09 11:27:02 +02:00
except IOError as ioe :
2010-03-22 11:07:10 +01:00
if not force :
raise ioe
2010-08-24 18:06:47 +02:00
if state in [ ' ? ' , ' A ' , ' M ' , ' R ' , ' C ' ] and not force :
2009-07-15 23:10:38 +02:00
return ( False , state )
2011-01-17 15:00:21 +01:00
# special handling for skipped files: if file exists, simply delete it
if state == ' S ' :
exists = os . path . exists ( os . path . join ( self . dir , n ) )
self . delete_localfile ( n )
return ( exists , ' S ' )
2009-07-15 23:10:38 +02:00
self . delete_localfile ( n )
2010-09-06 15:28:23 +02:00
was_added = n in self . to_be_added
if state in ( ' A ' , ' R ' ) or state == ' ! ' and was_added :
2010-08-24 18:06:47 +02:00
self . to_be_added . remove ( n )
self . write_addlist ( )
elif state == ' C ' :
# don't remove "merge files" (*.r, *.mine...)
# that's why we don't use clear_from_conflictlist
self . in_conflict . remove ( n )
self . write_conflictlist ( )
2010-09-06 15:28:23 +02:00
if not state in ( ' A ' , ' ? ' ) and not ( state == ' ! ' and was_added ) :
2009-07-15 23:10:38 +02:00
self . put_on_deletelist ( n )
self . write_deletelist ( )
return ( True , state )
2007-03-19 14:30:59 +01:00
def delete_storefile ( self , n ) :
try : os . unlink ( os . path . join ( self . storedir , n ) )
except : pass
2006-05-30 12:07:16 +02:00
def delete_localfile ( self , n ) :
try : os . unlink ( os . path . join ( self . dir , n ) )
except : pass
2006-05-19 22:13:29 +02:00
def put_on_deletelist ( self , n ) :
if n not in self . to_be_deleted :
self . to_be_deleted . append ( n )
2006-05-22 16:12:06 +02:00
def put_on_conflictlist ( self , n ) :
if n not in self . in_conflict :
self . in_conflict . append ( n )
2010-08-24 18:06:47 +02:00
def put_on_addlist ( self , n ) :
if n not in self . to_be_added :
self . to_be_added . append ( n )
2006-05-22 16:12:06 +02:00
def clear_from_conflictlist ( self , n ) :
""" delete an entry from the file, and remove the file if it would be empty """
if n in self . in_conflict :
filename = os . path . join ( self . dir , n )
storefilename = os . path . join ( self . storedir , n )
myfilename = os . path . join ( self . dir , n + ' .mine ' )
2010-01-11 17:00:24 +01:00
if self . islinkrepair ( ) or self . ispulled ( ) :
2009-04-21 18:52:26 +02:00
upfilename = os . path . join ( self . dir , n + ' .new ' )
else :
upfilename = os . path . join ( self . dir , n + ' .r ' + self . rev )
2006-05-22 16:12:06 +02:00
2006-06-08 12:30:29 +02:00
try :
os . unlink ( myfilename )
# the working copy may be updated, so the .r* ending may be obsolete...
# then we don't care
os . unlink ( upfilename )
2010-01-11 17:00:24 +01:00
if self . islinkrepair ( ) or self . ispulled ( ) :
2009-04-22 15:14:17 +02:00
os . unlink ( os . path . join ( self . dir , n + ' .old ' ) )
2009-10-20 16:30:15 +02:00
except :
2006-06-08 12:30:29 +02:00
pass
2006-05-22 16:12:06 +02:00
self . in_conflict . remove ( n )
2006-05-23 15:59:29 +02:00
self . write_conflictlist ( )
2006-05-22 16:12:06 +02:00
2010-05-27 02:18:00 +02:00
# XXX: this isn't used at all
2010-05-22 08:22:12 +02:00
def write_meta_mode ( self ) :
2010-05-27 01:54:04 +02:00
# 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:) )
2010-05-22 08:22:12 +02:00
if self . meta :
2010-05-27 01:54:04 +02:00
store_write_string ( self . absdir , ' _meta_mode ' , ' ' )
elif self . ismetamode ( ) :
os . unlink ( os . path . join ( self . storedir , ' _meta_mode ' ) )
2010-05-22 08:22:12 +02:00
2010-04-22 15:27:54 +02:00
def write_sizelimit ( self ) :
if self . size_limit and self . size_limit < = 0 :
try :
os . unlink ( os . path . join ( self . storedir , ' _size_limit ' ) )
except :
pass
else :
2010-08-30 14:20:12 +02:00
store_write_string ( self . absdir , ' _size_limit ' , str ( self . size_limit ) + ' \n ' )
2010-04-22 15:27:54 +02:00
2010-08-24 18:06:47 +02:00
def write_addlist ( self ) :
self . __write_storelist ( ' _to_be_added ' , self . to_be_added )
2006-05-19 22:13:29 +02:00
def write_deletelist ( self ) :
2010-08-24 10:23:11 +02:00
self . __write_storelist ( ' _to_be_deleted ' , self . to_be_deleted )
2006-05-22 16:12:06 +02:00
2006-05-30 12:07:16 +02:00
def delete_source_file ( self , n ) :
2008-03-10 19:04:23 +01:00
""" delete local a source file """
2006-05-30 12:07:16 +02:00
self . delete_localfile ( n )
2007-03-19 14:30:59 +01:00
self . delete_storefile ( n )
2006-05-30 12:07:16 +02:00
2008-03-10 19:04:23 +01:00
def delete_remote_source_file ( self , n ) :
""" delete a remote source file (e.g. from the server) """
2008-04-21 17:07:34 +02:00
query = ' rev=upload '
u = makeurl ( self . apiurl , [ ' source ' , self . prjname , self . name , pathname2url ( n ) ] , query = query )
2008-03-10 19:04:23 +01:00
http_DELETE ( u )
2009-10-20 16:30:15 +02:00
2014-01-09 13:56:34 +01:00
def put_source_file ( self , n , tdir , copy_only = False ) :
query = ' rev=repository '
tfilename = os . path . join ( tdir , n )
shutil . copyfile ( os . path . join ( self . dir , n ) , tfilename )
# escaping '+' in the URL path (note: not in the URL query string) is
# only a workaround for ruby on rails, which swallows it otherwise
if not copy_only :
u = makeurl ( self . apiurl , [ ' source ' , self . prjname , self . name , pathname2url ( n ) ] , query = query )
http_PUT ( u , file = tfilename )
2010-08-24 18:06:47 +02:00
if n in self . to_be_added :
self . to_be_added . remove ( n )
2006-05-30 12:07:16 +02:00
2014-01-09 13:56:34 +01:00
def __commit_update_store ( self , tdir ) :
""" move files from transaction directory into the store """
for filename in os . listdir ( tdir ) :
os . rename ( os . path . join ( tdir , filename ) , os . path . join ( self . storedir , filename ) )
2010-09-03 17:46:01 +02:00
def __generate_commitlist ( self , todo_send ) :
root = ET . Element ( ' directory ' )
2013-04-09 11:25:19 +02:00
for i in sorted ( todo_send . keys ( ) ) :
2010-09-03 17:46:01 +02:00
ET . SubElement ( root , ' entry ' , name = i , md5 = todo_send [ i ] )
return root
def __send_commitlog ( self , msg , local_filelist ) :
""" send the commitlog and the local filelist to the server """
query = { ' cmd ' : ' commitfilelist ' ,
' user ' : conf . get_apiurl_usr ( self . apiurl ) ,
' comment ' : msg }
if self . islink ( ) and self . isexpanded ( ) :
query [ ' keeplink ' ] = ' 1 '
if conf . config [ ' linkcontrol ' ] or self . isfrozen ( ) :
query [ ' linkrev ' ] = self . linkinfo . srcmd5
if self . ispulled ( ) :
query [ ' repairlink ' ] = ' 1 '
query [ ' linkrev ' ] = self . get_pulled_srcmd5 ( )
if self . islinkrepair ( ) :
query [ ' repairlink ' ] = ' 1 '
u = makeurl ( self . apiurl , [ ' source ' , self . prjname , self . name ] , query = query )
2013-04-10 11:34:59 +02:00
f = http_POST ( u , data = ET . tostring ( local_filelist , encoding = ET_ENCODING ) )
2010-09-03 17:46:01 +02:00
root = ET . parse ( f ) . getroot ( )
return root
def __get_todo_send ( self , server_filelist ) :
""" parse todo from a previous __send_commitlog call """
error = server_filelist . get ( ' error ' )
if error is None :
return [ ]
elif error != ' missing ' :
raise oscerr . PackageInternalError ( self . prjname , self . name ,
' __get_todo_send: unexpected \' error \' attr: \' %s \' ' % error )
todo = [ ]
for n in server_filelist . findall ( ' entry ' ) :
name = n . get ( ' name ' )
if name is None :
2013-04-10 11:34:59 +02:00
raise oscerr . APIError ( ' missing \' name \' attribute: \n %s \n ' % ET . tostring ( server_filelist , encoding = ET_ENCODING ) )
2010-09-03 17:46:01 +02:00
todo . append ( n . get ( ' name ' ) )
return todo
2011-09-07 13:55:05 +02:00
def commit ( self , msg = ' ' , verbose = False , skip_local_service_run = False ) :
2007-07-30 13:12:42 +02:00
# commit only if the upstream revision is the same as the working copy's
2009-10-20 16:30:15 +02:00
upstream_rev = self . latest_rev ( )
2007-07-30 13:12:42 +02:00
if self . rev != upstream_rev :
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
raise oscerr . WorkingCopyOutdated ( ( self . absdir , self . rev , upstream_rev ) )
2007-07-30 13:12:42 +02:00
2011-05-25 13:34:32 +02:00
if not skip_local_service_run :
r = self . run_source_services ( mode = " trylocal " , verbose = verbose )
if r is not 0 :
2013-08-29 15:22:25 +02:00
# FIXME: it is better to raise this in Serviceinfo.execute with more
# information (like which service/command failed)
raise oscerr . ServiceRuntimeError ( ' A service failed with error: %d ' % r )
2011-05-25 13:34:32 +02:00
2007-07-30 13:12:42 +02:00
if not self . todo :
2010-09-03 17:46:01 +02:00
self . todo = [ i for i in self . to_be_added if not i in self . filenamelist ] + self . filenamelist
2009-10-20 16:30:15 +02:00
2008-03-10 19:04:23 +01:00
pathn = getTransActPath ( self . dir )
2007-07-30 13:12:42 +02:00
2010-09-03 17:46:01 +02:00
todo_send = { }
todo_delete = [ ]
real_send = [ ]
for filename in self . filenamelist + [ i for i in self . to_be_added if not i in self . filenamelist ] :
if filename . startswith ( ' _service: ' ) or filename . startswith ( ' _service_ ' ) :
continue
st = self . status ( filename )
if st == ' C ' :
2013-04-09 12:51:28 +02:00
print ( ' Please resolve all conflicts before committing using " osc resolved FILE " ! ' )
2010-09-03 17:46:01 +02:00
return 1
elif filename in self . todo :
if st in ( ' A ' , ' R ' , ' M ' ) :
todo_send [ filename ] = dgst ( os . path . join ( self . absdir , filename ) )
real_send . append ( filename )
2013-04-09 12:51:28 +02:00
print ( statfrmt ( ' Sending ' , os . path . join ( pathn , filename ) ) )
2010-09-03 17:46:01 +02:00
elif st in ( ' ' , ' ! ' , ' S ' ) :
2010-12-17 23:25:50 +01:00
if st == ' ! ' and filename in self . to_be_added :
2013-04-09 12:51:28 +02:00
print ( ' file \' %s \' is marked as \' A \' but does not exist ' % filename )
2010-12-17 23:25:50 +01:00
return 1
2010-09-03 17:46:01 +02:00
f = self . findfilebyname ( filename )
if f is None :
raise oscerr . PackageInternalError ( self . prjname , self . name ,
' error: file \' %s \' with state \' %s \' is not known by meta ' \
% ( filename , st ) )
todo_send [ filename ] = f . md5
2009-10-20 16:30:15 +02:00
elif st == ' D ' :
2010-08-23 15:39:48 +02:00
todo_delete . append ( filename )
2013-04-09 12:51:28 +02:00
print ( statfrmt ( ' Deleting ' , os . path . join ( pathn , filename ) ) )
2010-09-03 17:46:01 +02:00
elif st in ( ' R ' , ' M ' , ' D ' , ' ' , ' ! ' , ' S ' ) :
2010-12-17 23:25:50 +01:00
# ignore missing new file (it's not part of the current commit)
if st == ' ! ' and filename in self . to_be_added :
continue
2010-09-03 17:46:01 +02:00
f = self . findfilebyname ( filename )
if f is None :
raise oscerr . PackageInternalError ( self . prjname , self . name ,
' error: file \' %s \' with state \' %s \' is not known by meta ' \
% ( filename , st ) )
todo_send [ filename ] = f . md5
if not real_send and not todo_delete and not self . islinkrepair ( ) and not self . ispulled ( ) :
2013-04-09 12:51:28 +02:00
print ( ' nothing to do for package %s ' % self . name )
2008-05-08 13:55:32 +02:00
return 1
2007-07-30 13:12:42 +02:00
2013-04-09 12:51:28 +02:00
print ( ' Transmitting file data ' , end = ' ' )
2010-09-03 17:46:01 +02:00
filelist = self . __generate_commitlist ( todo_send )
sfilelist = self . __send_commitlog ( msg , filelist )
send = self . __get_todo_send ( sfilelist )
real_send = [ i for i in real_send if not i in send ]
# abort after 3 tries
tries = 3
2014-01-09 13:56:34 +01:00
tdir = None
try :
tdir = os . path . join ( self . storedir , ' _in_commit ' )
if os . path . isdir ( tdir ) :
shutil . rmtree ( tdir )
os . mkdir ( tdir )
while len ( send ) and tries :
for filename in send [ : ] :
sys . stdout . write ( ' . ' )
sys . stdout . flush ( )
self . put_source_file ( filename , tdir )
send . remove ( filename )
tries - = 1
sfilelist = self . __send_commitlog ( msg , filelist )
send = self . __get_todo_send ( sfilelist )
if len ( send ) :
raise oscerr . PackageInternalError ( self . prjname , self . name ,
' server does not accept filelist: \n %s \n missing: \n %s \n ' \
% ( ET . tostring ( filelist , encoding = ET_ENCODING ) , ET . tostring ( sfilelist , encoding = ET_ENCODING ) ) )
# these files already exist on the server
for filename in real_send :
self . put_source_file ( filename , tdir , copy_only = True )
# update store with the committed files
self . __commit_update_store ( tdir )
finally :
if tdir is not None and os . path . isdir ( tdir ) :
shutil . rmtree ( tdir )
2010-09-03 17:46:01 +02:00
self . rev = sfilelist . get ( ' rev ' )
2013-04-09 12:51:28 +02:00
print ( )
print ( ' Committed revision %s . ' % self . rev )
2007-07-30 13:12:42 +02:00
2009-12-17 20:20:35 +01:00
if self . ispulled ( ) :
os . unlink ( os . path . join ( self . storedir , ' _pulled ' ) )
2009-04-21 18:52:26 +02:00
if self . islinkrepair ( ) :
os . unlink ( os . path . join ( self . storedir , ' _linkrepair ' ) )
self . linkrepair = False
# XXX: mark package as invalid?
2013-04-09 12:51:28 +02:00
print ( ' The source link has been repaired. This directory can now be removed. ' )
2010-09-03 17:46:01 +02:00
2008-04-02 14:37:56 +02:00
if self . islink ( ) and self . isexpanded ( ) :
2010-09-03 17:46:01 +02:00
li = Linkinfo ( )
li . read ( sfilelist . find ( ' linkinfo ' ) )
if li . xsrcmd5 is None :
2013-04-10 11:34:59 +02:00
raise oscerr . APIError ( ' linkinfo has no xsrcmd5 attr: \n %s \n ' % ET . tostring ( sfilelist , encoding = ET_ENCODING ) )
2010-09-03 17:46:01 +02:00
sfilelist = ET . fromstring ( self . get_files_meta ( revision = li . xsrcmd5 ) )
for i in sfilelist . findall ( ' entry ' ) :
if i . get ( ' name ' ) in self . skipped :
i . set ( ' skipped ' , ' true ' )
2013-04-10 11:34:59 +02:00
store_write_string ( self . absdir , ' _files ' , ET . tostring ( sfilelist , encoding = ET_ENCODING ) + ' \n ' )
2010-09-03 17:46:01 +02:00
for filename in todo_delete :
self . to_be_deleted . remove ( filename )
self . delete_storefile ( filename )
2007-07-30 13:12:42 +02:00
self . write_deletelist ( )
2010-08-30 18:29:24 +02:00
self . write_addlist ( )
2009-04-28 22:31:02 +02:00
self . update_datastructs ( )
2006-10-10 16:04:34 +02:00
2009-09-18 03:10:41 +02:00
print_request_list ( self . apiurl , self . prjname , self . name )
2009-07-10 20:10:41 +02:00
2011-10-07 14:13:14 +02:00
# FIXME: add testcases for this codepath
sinfo = sfilelist . find ( ' serviceinfo ' )
if sinfo is not None :
2013-04-09 12:51:28 +02:00
print ( ' Waiting for server side source service run ' )
2011-10-07 14:13:14 +02:00
u = makeurl ( self . apiurl , [ ' source ' , self . prjname , self . name ] )
while sinfo is not None and sinfo . get ( ' code ' ) == ' running ' :
sys . stdout . write ( ' . ' )
sys . stdout . flush ( )
# does it make sense to add some delay?
sfilelist = ET . fromstring ( http_GET ( u ) . read ( ) )
# if sinfo is None another commit might have occured in the "meantime"
sinfo = sfilelist . find ( ' serviceinfo ' )
2013-04-09 12:51:28 +02:00
print ( ' ' )
2013-05-27 14:56:24 +02:00
rev = self . latest_rev ( )
2011-10-07 14:13:14 +02:00
self . update ( rev = rev )
2011-05-03 16:44:20 +02:00
2010-08-24 10:23:11 +02:00
def __write_storelist ( self , name , data ) :
if len ( data ) == 0 :
2009-04-23 10:35:11 +02:00
try :
2010-08-24 10:23:11 +02:00
os . unlink ( os . path . join ( self . storedir , name ) )
2009-04-23 10:35:11 +02:00
except :
pass
2006-05-22 16:12:06 +02:00
else :
2010-08-24 10:23:11 +02:00
store_write_string ( self . absdir , name , ' %s \n ' % ' \n ' . join ( data ) )
def write_conflictlist ( self ) :
self . __write_storelist ( ' _in_conflict ' , self . in_conflict )
2006-05-19 22:13:29 +02:00
2010-08-19 18:10:32 +02:00
def updatefile ( self , n , revision , mtime = None ) :
2006-05-19 22:13:29 +02:00
filename = os . path . join ( self . dir , n )
storefilename = os . path . join ( self . storedir , n )
2010-08-26 10:05:15 +02:00
origfile_tmp = os . path . join ( self . storedir , ' _in_update ' , ' %s .copy ' % n )
2010-08-19 18:10:32 +02:00
origfile = os . path . join ( self . storedir , ' _in_update ' , n )
2010-09-07 10:54:42 +02:00
if os . path . isfile ( filename ) :
2010-08-26 10:05:15 +02:00
shutil . copyfile ( filename , origfile_tmp )
os . rename ( origfile_tmp , origfile )
2010-08-19 18:10:32 +02:00
else :
origfile = None
2006-05-19 22:13:29 +02:00
2010-08-19 18:10:32 +02:00
get_source_file ( self . apiurl , self . prjname , self . name , n , targetfilename = storefilename ,
2010-05-22 08:22:12 +02:00
revision = revision , progress_obj = self . progress_obj , mtime = mtime , meta = self . meta )
2006-05-19 22:13:29 +02:00
2010-08-19 18:10:32 +02:00
shutil . copyfile ( storefilename , filename )
2013-09-23 17:11:52 +02:00
if mtime :
2014-01-09 14:15:30 +01:00
utime ( filename , ( - 1 , mtime ) )
2010-08-19 18:10:32 +02:00
if not origfile is None :
os . unlink ( origfile )
2006-05-19 22:13:29 +02:00
2010-08-19 18:10:32 +02:00
def mergefile ( self , n , revision , mtime = None ) :
2006-05-22 16:12:06 +02:00
filename = os . path . join ( self . dir , n )
storefilename = os . path . join ( self . storedir , n )
myfilename = os . path . join ( self . dir , n + ' .mine ' )
upfilename = os . path . join ( self . dir , n + ' .r ' + self . rev )
2010-08-26 10:05:15 +02:00
origfile_tmp = os . path . join ( self . storedir , ' _in_update ' , ' %s .copy ' % n )
2010-08-19 18:10:32 +02:00
origfile = os . path . join ( self . storedir , ' _in_update ' , n )
2010-08-26 10:05:15 +02:00
shutil . copyfile ( filename , origfile_tmp )
os . rename ( origfile_tmp , origfile )
2006-05-22 16:12:06 +02:00
os . rename ( filename , myfilename )
2009-10-20 16:30:15 +02:00
get_source_file ( self . apiurl , self . prjname , self . name , n ,
2010-08-19 18:10:32 +02:00
revision = revision , targetfilename = upfilename ,
2010-05-22 08:22:12 +02:00
progress_obj = self . progress_obj , mtime = mtime , meta = self . meta )
2006-06-22 14:54:58 +02:00
if binary_file ( myfilename ) or binary_file ( upfilename ) :
2009-10-20 16:30:15 +02:00
# don't try merging
2010-01-30 18:05:25 +01:00
shutil . copyfile ( upfilename , filename )
shutil . copyfile ( upfilename , storefilename )
2010-08-19 18:10:32 +02:00
os . unlink ( origfile )
2009-10-20 16:30:15 +02:00
self . in_conflict . append ( n )
self . write_conflictlist ( )
return ' C '
2006-05-22 16:12:06 +02:00
else :
2006-06-22 14:54:58 +02:00
# try merging
2007-01-23 07:55:43 +01:00
# diff3 OPTIONS... MINE OLDER YOURS
merge_cmd = ' diff3 -m -E %s %s %s > %s ' % ( myfilename , storefilename , upfilename , filename )
2013-03-08 00:56:57 +01:00
ret = run_external ( merge_cmd , shell = True )
2009-10-20 16:30:15 +02:00
2007-01-23 07:55:43 +01:00
# "An exit status of 0 means `diff3' was successful, 1 means some
# conflicts were found, and 2 means trouble."
2006-06-22 14:54:58 +02:00
if ret == 0 :
# merge was successful... clean up
2010-01-30 18:05:25 +01:00
shutil . copyfile ( upfilename , storefilename )
2007-01-23 07:55:43 +01:00
os . unlink ( upfilename )
2006-06-22 14:54:58 +02:00
os . unlink ( myfilename )
2010-08-19 18:10:32 +02:00
os . unlink ( origfile )
2006-06-22 14:54:58 +02:00
return ' G '
2007-01-23 07:55:43 +01:00
elif ret == 1 :
2006-06-22 14:54:58 +02:00
# unsuccessful merge
2010-01-30 18:05:25 +01:00
shutil . copyfile ( upfilename , storefilename )
2010-08-19 18:10:32 +02:00
os . unlink ( origfile )
2006-06-22 14:54:58 +02:00
self . in_conflict . append ( n )
self . write_conflictlist ( )
return ' C '
2007-01-23 07:55:43 +01:00
else :
2010-08-16 16:40:16 +02:00
raise oscerr . ExtRuntimeError ( ' diff3 failed with exit code: %s ' % ret , merge_cmd )
2006-05-22 16:12:06 +02:00
2007-07-16 15:40:58 +02:00
def update_local_filesmeta ( self , revision = None ) :
"""
Update the local _files file in the store .
It is replaced with the version pulled from upstream .
"""
2010-09-03 14:51:20 +02:00
meta = self . get_files_meta ( revision = revision )
2010-08-30 14:20:12 +02:00
store_write_string ( self . absdir , ' _files ' , meta + ' \n ' )
2007-07-30 13:12:42 +02:00
2010-09-03 14:51:20 +02:00
def get_files_meta ( self , revision = ' latest ' , skip_service = True ) :
fm = show_files_meta ( self . apiurl , self . prjname , self . name , revision = revision , meta = self . meta )
# look for "too large" files according to size limit and mark them
root = ET . fromstring ( fm )
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 ' )
2013-04-10 11:34:59 +02:00
return ET . tostring ( root , encoding = ET_ENCODING )
2010-09-03 14:51:20 +02:00
2007-07-30 13:12:42 +02:00
def update_datastructs ( self ) :
"""
Update the internal data structures if the local _files
file has changed ( e . g . update_local_filesmeta ( ) has been
called ) .
"""
import fnmatch
files_tree = read_filemeta ( self . dir )
files_tree_root = files_tree . getroot ( )
self . rev = files_tree_root . get ( ' rev ' )
self . srcmd5 = files_tree_root . get ( ' srcmd5 ' )
2008-03-22 14:37:59 +01:00
self . linkinfo = Linkinfo ( )
self . linkinfo . read ( files_tree_root . find ( ' linkinfo ' ) )
2007-07-30 13:12:42 +02:00
self . filenamelist = [ ]
self . filelist = [ ]
2010-04-22 15:27:54 +02:00
self . skipped = [ ]
2007-07-30 13:12:42 +02:00
for node in files_tree_root . findall ( ' entry ' ) :
2009-10-20 16:30:15 +02:00
try :
f = File ( node . get ( ' name ' ) ,
node . get ( ' md5 ' ) ,
int ( node . get ( ' size ' ) ) ,
2007-07-30 13:12:42 +02:00
int ( node . get ( ' mtime ' ) ) )
2010-04-22 15:27:54 +02:00
if node . get ( ' skipped ' ) :
self . skipped . append ( f . name )
2010-08-23 11:29:57 +02:00
f . skipped = True
2009-10-20 16:30:15 +02:00
except :
# okay, a very old version of _files, which didn't contain any metadata yet...
2007-07-30 13:12:42 +02:00
f = File ( node . get ( ' name ' ) , ' ' , 0 , 0 )
self . filelist . append ( f )
self . filenamelist . append ( f . name )
2010-08-24 18:06:47 +02:00
self . to_be_added = read_tobeadded ( self . absdir )
self . to_be_deleted = read_tobedeleted ( self . absdir )
self . in_conflict = read_inconflict ( self . absdir )
2009-04-21 18:52:26 +02:00
self . linkrepair = os . path . isfile ( os . path . join ( self . storedir , ' _linkrepair ' ) )
2010-04-22 15:27:54 +02:00
self . size_limit = read_sizelimit ( self . dir )
2010-05-27 01:54:04 +02:00
self . meta = self . ismetamode ( )
2007-07-30 13:12:42 +02:00
# gather unversioned files, but ignore some stuff
2010-08-11 18:05:12 +02:00
self . excluded = [ ]
for i in os . listdir ( self . dir ) :
for j in conf . config [ ' exclude_glob ' ] :
if fnmatch . fnmatch ( i , j ) :
self . excluded . append ( i )
break
2007-07-30 13:12:42 +02:00
self . filenamelist_unvers = [ i for i in os . listdir ( self . dir )
if i not in self . excluded
if i not in self . filenamelist ]
2008-03-22 14:37:59 +01:00
def islink ( self ) :
2009-10-20 16:30:15 +02:00
""" tells us if the package is a link (has ' linkinfo ' ).
2008-03-22 14:37:59 +01:00
A package with linkinfo is a package which links to another package .
Returns True if the package is a link , otherwise False . """
return self . linkinfo . islink ( )
2008-03-22 18:37:17 +01:00
def isexpanded ( self ) :
2009-10-20 16:30:15 +02:00
""" tells us if the package is a link which is expanded.
2008-03-22 18:37:17 +01:00
Returns True if the package is expanded , otherwise False . """
return self . linkinfo . isexpanded ( )
2009-04-21 18:52:26 +02:00
def islinkrepair ( self ) :
""" tells us if we are repairing a broken source link. """
return self . linkrepair
2009-12-17 17:16:56 +01:00
def ispulled ( self ) :
""" tells us if we have pulled a link. """
return os . path . isfile ( os . path . join ( self . storedir , ' _pulled ' ) )
2010-01-12 17:22:47 +01:00
def isfrozen ( self ) :
""" tells us if the link is frozen. """
return os . path . isfile ( os . path . join ( self . storedir , ' _frozenlink ' ) )
2010-05-27 01:54:04 +02:00
def ismetamode ( self ) :
""" tells us if the package is in meta mode """
return os . path . isfile ( os . path . join ( self . storedir , ' _meta_mode ' ) )
2010-01-12 17:22:47 +01:00
def get_pulled_srcmd5 ( self ) :
pulledrev = None
for line in open ( os . path . join ( self . storedir , ' _pulled ' ) , ' r ' ) :
pulledrev = line . strip ( )
return pulledrev
2009-04-06 22:08:14 +02:00
def haslinkerror ( self ) :
"""
Returns True if the link is broken otherwise False .
If the package is not a link it returns False .
"""
return self . linkinfo . haserror ( )
def linkerror ( self ) :
"""
Returns an error message if the link is broken otherwise None .
If the package is not a link it returns None .
"""
return self . linkinfo . error
2007-07-16 15:40:58 +02:00
def update_local_pacmeta ( self ) :
"""
Update the local _meta file in the store .
It is replaced with the version pulled from upstream .
"""
2007-05-04 23:51:54 +02:00
meta = ' ' . join ( show_package_meta ( self . apiurl , self . prjname , self . name ) )
2010-08-30 14:20:12 +02:00
store_write_string ( self . absdir , ' _meta ' , meta + ' \n ' )
2006-05-19 22:13:29 +02:00
def findfilebyname ( self , n ) :
for i in self . filelist :
if i . name == n :
return i
2010-12-22 23:17:11 +01:00
def get_status ( self , excluded = False , * exclude_states ) :
global store
todo = self . todo
if not todo :
todo = self . filenamelist + self . to_be_added + \
[ i for i in self . filenamelist_unvers if not os . path . isdir ( os . path . join ( self . absdir , i ) ) ]
if excluded :
todo . extend ( [ i for i in self . excluded if i != store ] )
todo = set ( todo )
res = [ ]
for fname in sorted ( todo ) :
st = self . status ( fname )
if not st in exclude_states :
res . append ( ( st , fname ) )
return res
2006-05-19 22:13:29 +02:00
def status ( self , n ) :
"""
status can be :
file storefile file present STATUS
exists exists in _files
2010-08-24 18:06:47 +02:00
x - - ' A ' and listed in _to_be_added
x x - ' R ' and listed in _to_be_added
2006-05-22 16:12:06 +02:00
x x x ' ' if digest differs : ' M '
and if in conflicts file : ' C '
2006-05-19 22:13:29 +02:00
x - - ' ? '
2010-08-19 18:10:32 +02:00
- x x ' D ' and listed in _to_be_deleted
x x x ' D ' and listed in _to_be_deleted ( e . g . if deleted file was modified )
x x x ' C ' and listed in _in_conflict
2010-08-23 15:30:31 +02:00
x - x ' S ' and listed in self . skipped
- - x ' S ' and listed in self . skipped
2006-05-19 22:13:29 +02:00
- x x ' ! '
- - - NOT DEFINED
"""
known_by_meta = False
exists = False
exists_in_store = False
if n in self . filenamelist :
known_by_meta = True
2007-11-26 19:13:51 +01:00
if os . path . exists ( os . path . join ( self . absdir , n ) ) :
2006-05-19 22:13:29 +02:00
exists = True
if os . path . exists ( os . path . join ( self . storedir , n ) ) :
exists_in_store = True
2010-08-19 18:10:32 +02:00
if n in self . to_be_deleted :
2006-05-19 22:13:29 +02:00
state = ' D '
2006-05-22 16:12:06 +02:00
elif n in self . in_conflict :
state = ' C '
2010-08-23 14:56:50 +02:00
elif n in self . skipped :
2010-08-19 18:10:32 +02:00
state = ' S '
2010-09-02 18:40:18 +02:00
elif n in self . to_be_added and exists and exists_in_store :
2010-08-24 18:06:47 +02:00
state = ' R '
2010-08-26 13:46:10 +02:00
elif n in self . to_be_added and exists :
2010-08-19 18:10:32 +02:00
state = ' A '
2006-05-19 22:13:29 +02:00
elif exists and exists_in_store and known_by_meta :
2007-11-26 19:13:51 +01:00
if dgst ( os . path . join ( self . absdir , n ) ) != self . findfilebyname ( n ) . md5 :
2006-05-19 22:13:29 +02:00
state = ' M '
else :
state = ' '
2010-08-26 13:46:10 +02:00
elif n in self . to_be_added and not exists :
state = ' ! '
2010-08-19 18:10:32 +02:00
elif not exists and exists_in_store and known_by_meta and not n in self . to_be_deleted :
state = ' ! '
2006-05-19 22:13:29 +02:00
elif exists and not exists_in_store and not known_by_meta :
state = ' ? '
2010-08-23 16:28:49 +02:00
elif not exists_in_store and known_by_meta :
2010-08-23 17:39:01 +02:00
# XXX: this codepath shouldn't be reached (we restore the storefile
# in update_datastructs)
2010-08-23 16:28:49 +02:00
raise oscerr . PackageInternalError ( self . prjname , self . name ,
' error: file \' %s \' is known by meta but no storefile exists. \n '
' This might be caused by an old wc format. Please backup your current \n '
' wc and checkout the package again. Afterwards copy all files (except the \n '
2010-09-03 19:59:14 +02:00
' .osc/ dir) into the new package wc. ' % n )
2010-08-19 18:10:32 +02:00
else :
2009-02-12 14:11:32 +01:00
# this case shouldn't happen (except there was a typo in the filename etc.)
2010-09-02 10:23:37 +02:00
raise oscerr . OscIOError ( None , ' osc: \' %s \' is not under version control ' % n )
2009-10-20 16:30:15 +02:00
2006-05-19 22:13:29 +02:00
return state
2010-08-27 16:24:12 +02:00
def get_diff ( self , revision = None , ignoreUnversioned = False ) :
import tempfile
diff_hdr = ' Index: %s \n '
diff_hdr + = ' =================================================================== \n '
kept = [ ]
added = [ ]
deleted = [ ]
def diff_add_delete ( fname , add , revision ) :
diff = [ ]
2010-08-31 11:20:34 +02:00
diff . append ( diff_hdr % fname )
2010-08-27 16:24:12 +02:00
tmpfile = None
2010-08-31 11:20:34 +02:00
origname = fname
2010-08-27 16:24:12 +02:00
if add :
diff . append ( ' --- %s \t (revision 0) \n ' % fname )
rev = ' revision 0 '
if revision and not fname in self . to_be_added :
rev = ' working copy '
diff . append ( ' +++ %s \t ( %s ) \n ' % ( fname , rev ) )
fname = os . path . join ( self . absdir , fname )
else :
diff . append ( ' --- %s \t (revision %s ) \n ' % ( fname , revision or self . rev ) )
diff . append ( ' +++ %s \t (working copy) \n ' % fname )
fname = os . path . join ( self . storedir , fname )
try :
if revision is not None and not add :
( fd , tmpfile ) = tempfile . mkstemp ( prefix = ' osc_diff ' )
2010-08-31 11:20:34 +02:00
get_source_file ( self . apiurl , self . prjname , self . name , origname , tmpfile , revision )
2010-08-27 16:24:12 +02:00
fname = tmpfile
2010-08-31 11:20:34 +02:00
if binary_file ( fname ) :
what = ' added '
if not add :
what = ' deleted '
diff = diff [ : 1 ]
diff . append ( ' Binary file \' %s \' %s . \n ' % ( origname , what ) )
return diff
2010-08-27 16:24:12 +02:00
tmpl = ' + %s '
2010-08-31 17:30:31 +02:00
ltmpl = ' @@ -0,0 +1, %d @@ \n '
2010-08-27 16:24:12 +02:00
if not add :
tmpl = ' - %s '
2010-08-31 17:30:31 +02:00
ltmpl = ' @@ -1, %d +0,0 @@ \n '
2010-08-27 16:24:12 +02:00
lines = [ tmpl % i for i in open ( fname , ' r ' ) . readlines ( ) ]
if len ( lines ) :
diff . append ( ltmpl % len ( lines ) )
if not lines [ - 1 ] . endswith ( ' \n ' ) :
lines . append ( ' \n \\ No newline at end of file \n ' )
diff . extend ( lines )
finally :
if tmpfile is not None :
os . close ( fd )
os . unlink ( tmpfile )
return diff
if revision is None :
2010-09-02 13:41:20 +02:00
todo = self . todo or [ i for i in self . filenamelist if not i in self . to_be_added ] + self . to_be_added
2010-08-27 16:24:12 +02:00
for fname in todo :
if fname in self . to_be_added and self . status ( fname ) == ' A ' :
added . append ( fname )
elif fname in self . to_be_deleted :
deleted . append ( fname )
elif fname in self . filenamelist :
kept . append ( self . findfilebyname ( fname ) )
2010-09-02 13:41:20 +02:00
elif fname in self . to_be_added and self . status ( fname ) == ' ! ' :
raise oscerr . OscIOError ( None , ' file \' %s \' is marked as \' A \' but does not exist \n ' \
' (either add the missing file or revert it) ' % fname )
2010-08-27 16:24:12 +02:00
elif not ignoreUnversioned :
2010-09-02 10:23:37 +02:00
raise oscerr . OscIOError ( None , ' file \' %s \' is not under version control ' % fname )
2010-08-27 16:24:12 +02:00
else :
2010-09-03 14:51:20 +02:00
fm = self . get_files_meta ( revision = revision )
2010-08-27 16:24:12 +02:00
root = ET . fromstring ( fm )
rfiles = self . __get_files ( root )
# swap added and deleted
kept , deleted , added , services = self . __get_rev_changes ( rfiles )
added = [ f . name for f in added ]
added . extend ( [ f for f in self . to_be_added if not f in kept ] )
deleted = [ f . name for f in deleted ]
deleted . extend ( self . to_be_deleted )
for f in added [ : ] :
if f in deleted :
added . remove ( f )
deleted . remove ( f )
# print kept, added, deleted
for f in kept :
state = self . status ( f . name )
if state in ( ' S ' , ' ? ' , ' ! ' ) :
continue
elif state == ' ' and revision is None :
continue
elif revision and self . findfilebyname ( f . name ) . md5 == f . md5 and state != ' M ' :
continue
yield [ diff_hdr % f . name ]
if revision is None :
yield get_source_file_diff ( self . absdir , f . name , self . rev )
else :
tmpfile = None
2010-12-15 12:23:43 +01:00
diff = [ ]
2010-08-27 16:24:12 +02:00
try :
( fd , tmpfile ) = tempfile . mkstemp ( prefix = ' osc_diff ' )
get_source_file ( self . apiurl , self . prjname , self . name , f . name , tmpfile , revision )
2010-12-15 12:23:43 +01:00
diff = get_source_file_diff ( self . absdir , f . name , revision ,
2010-08-27 16:24:12 +02:00
os . path . basename ( tmpfile ) , os . path . dirname ( tmpfile ) , f . name )
finally :
if tmpfile is not None :
os . close ( fd )
os . unlink ( tmpfile )
2010-12-15 12:23:43 +01:00
yield diff
2010-08-27 16:24:12 +02:00
for f in added :
yield diff_add_delete ( f , True , revision )
for f in deleted :
yield diff_add_delete ( f , False , revision )
2006-05-19 22:13:29 +02:00
def merge ( self , otherpac ) :
self . todo + = otherpac . todo
def __str__ ( self ) :
r = """
name : % s
prjname : % s
workingdir : % s
localfilelist : % s
2008-03-22 14:37:59 +01:00
linkinfo : % s
2006-05-19 22:13:29 +02:00
rev : % s
' todo ' files : % s
2009-10-20 16:30:15 +02:00
""" % (self.name,
self . prjname ,
self . dir ,
' \n ' . join ( self . filenamelist ) ,
self . linkinfo ,
self . rev ,
2006-05-19 22:13:29 +02:00
self . todo )
return r
2007-06-30 17:39:47 +02:00
def read_meta_from_spec ( self , spec = None ) :
2007-07-04 15:48:24 +02:00
import glob
2007-06-30 17:39:47 +02:00
if spec :
specfile = spec
else :
2007-07-04 15:48:24 +02:00
# scan for spec files
speclist = glob . glob ( os . path . join ( self . dir , ' *.spec ' ) )
if len ( speclist ) == 1 :
specfile = speclist [ 0 ]
elif len ( speclist ) > 1 :
2013-04-09 12:51:28 +02:00
print ( ' the following specfiles were found: ' )
2010-08-20 14:34:41 +02:00
for filename in speclist :
2013-04-09 12:51:28 +02:00
print ( filename )
print ( ' please specify one with --specfile ' )
2007-07-04 15:48:24 +02:00
sys . exit ( 1 )
else :
2013-04-09 12:51:28 +02:00
print ( ' no specfile was found - please specify one ' \
' with --specfile ' )
2009-10-20 16:30:15 +02:00
sys . exit ( 1 )
2007-07-04 15:48:24 +02:00
2008-08-03 21:36:07 +02:00
data = read_meta_from_spec ( specfile , ' Summary ' , ' Url ' , ' %d escription ' )
2010-07-02 22:28:53 +02:00
self . summary = data . get ( ' Summary ' , ' ' )
self . url = data . get ( ' Url ' , ' ' )
self . descr = data . get ( ' %d escription ' , ' ' )
2006-05-31 14:13:26 +02:00
2009-07-10 16:20:02 +02:00
def update_package_meta ( self , force = False ) :
2007-07-16 15:40:58 +02:00
"""
for the updatepacmetafromspec subcommand
2009-07-10 16:20:02 +02:00
argument force supress the confirm question
2007-07-16 15:40:58 +02:00
"""
2006-05-31 14:13:26 +02:00
2007-07-16 15:40:58 +02:00
m = ' ' . join ( show_package_meta ( self . apiurl , self . prjname , self . name ) )
2006-05-31 14:13:26 +02:00
2009-12-26 14:22:34 +01:00
root = ET . fromstring ( m )
root . find ( ' title ' ) . text = self . summary
root . find ( ' description ' ) . text = ' ' . join ( self . descr )
url = root . find ( ' url ' )
2008-08-21 14:03:42 +02:00
if url == None :
2009-12-26 14:22:34 +01:00
url = ET . SubElement ( root , ' url ' )
2008-08-03 21:36:07 +02:00
url . text = self . url
2009-10-20 16:30:15 +02:00
2009-06-19 10:47:06 +02:00
u = makeurl ( self . apiurl , [ ' source ' , self . prjname , self . name , ' _meta ' ] )
2013-04-10 11:34:59 +02:00
mf = metafile ( u , ET . tostring ( root , encoding = ET_ENCODING ) )
2006-05-31 14:13:26 +02:00
2009-07-10 16:20:02 +02:00
if not force :
2013-04-09 12:51:28 +02:00
print ( ' * ' * 36 , ' old ' , ' * ' * 36 )
print ( m )
print ( ' * ' * 36 , ' new ' , ' * ' * 36 )
2013-04-10 11:34:59 +02:00
print ( ET . tostring ( root , encoding = ET_ENCODING ) )
2013-04-09 12:51:28 +02:00
print ( ' * ' * 72 )
2009-07-10 16:20:02 +02:00
repl = raw_input ( ' Write? (y/N/e) ' )
else :
repl = ' y '
2006-05-31 14:13:26 +02:00
if repl == ' y ' :
2009-06-19 10:32:56 +02:00
mf . sync ( )
2009-06-19 10:59:39 +02:00
elif repl == ' e ' :
mf . edit ( )
2006-05-31 14:13:26 +02:00
2009-06-19 10:32:56 +02:00
mf . discard ( )
2006-05-31 14:13:26 +02:00
2010-01-20 17:55:44 +01:00
def mark_frozen ( self ) :
store_write_string ( self . absdir , ' _frozenlink ' , ' ' )
2013-04-09 12:51:28 +02:00
print ( )
print ( " The link in this package is currently broken. Checking " )
print ( " out the last working version instead; please use ' osc pull ' " )
print ( " to merge the conflicts. " )
print ( )
2010-01-20 17:55:44 +01:00
def unmark_frozen ( self ) :
if os . path . exists ( os . path . join ( self . storedir , ' _frozenlink ' ) ) :
os . unlink ( os . path . join ( self . storedir , ' _frozenlink ' ) )
2012-03-28 23:14:28 +02:00
def latest_rev ( self , include_service_files = False , expand = False ) :
# if expand is True the xsrcmd5 will be returned (even if the wc is unexpanded)
2009-04-21 18:52:26 +02:00
if self . islinkrepair ( ) :
2011-05-23 15:26:13 +02:00
upstream_rev = show_upstream_xsrcmd5 ( self . apiurl , self . prjname , self . name , linkrepair = 1 , meta = self . meta , include_service_files = include_service_files )
2012-03-28 23:14:28 +02:00
elif self . islink ( ) and ( self . isexpanded ( ) or expand ) :
2010-01-12 17:22:47 +01:00
if self . isfrozen ( ) or self . ispulled ( ) :
2011-05-23 15:26:13 +02:00
upstream_rev = show_upstream_xsrcmd5 ( self . apiurl , self . prjname , self . name , linkrev = self . linkinfo . srcmd5 , meta = self . meta , include_service_files = include_service_files )
2009-12-17 20:20:35 +01:00
else :
2010-01-12 17:22:47 +01:00
try :
2011-05-23 15:26:13 +02:00
upstream_rev = show_upstream_xsrcmd5 ( self . apiurl , self . prjname , self . name , meta = self . meta , include_service_files = include_service_files )
2010-01-12 17:22:47 +01:00
except :
2010-01-20 17:55:44 +01:00
try :
2011-05-23 15:26:13 +02:00
upstream_rev = show_upstream_xsrcmd5 ( self . apiurl , self . prjname , self . name , linkrev = self . linkinfo . srcmd5 , meta = self . meta , include_service_files = include_service_files )
2010-01-20 17:55:44 +01:00
except :
2011-05-23 15:26:13 +02:00
upstream_rev = show_upstream_xsrcmd5 ( self . apiurl , self . prjname , self . name , linkrev = " base " , meta = self . meta , include_service_files = include_service_files )
2010-07-23 16:17:39 +02:00
self . mark_frozen ( )
2009-04-21 18:52:26 +02:00
else :
2011-05-23 15:26:13 +02:00
upstream_rev = show_upstream_rev ( self . apiurl , self . prjname , self . name , meta = self . meta , include_service_files = include_service_files )
2009-04-21 18:52:26 +02:00
return upstream_rev
2010-08-23 11:48:33 +02:00
def __get_files ( self , fmeta_root ) :
2010-08-19 18:10:32 +02:00
f = [ ]
2010-09-06 17:57:30 +02:00
if fmeta_root . get ( ' rev ' ) is None and len ( fmeta_root . findall ( ' entry ' ) ) > 0 :
2013-04-10 11:34:59 +02:00
raise oscerr . APIError ( ' missing rev attribute in _files: \n %s ' % ' ' . join ( ET . tostring ( fmeta_root , encoding = ET_ENCODING ) ) )
2010-08-23 11:48:33 +02:00
for i in fmeta_root . findall ( ' entry ' ) :
2010-08-23 11:29:57 +02:00
skipped = i . get ( ' skipped ' ) is not None
2010-08-19 18:10:32 +02:00
f . append ( File ( i . get ( ' name ' ) , i . get ( ' md5 ' ) ,
2010-08-23 11:29:57 +02:00
int ( i . get ( ' size ' ) ) , int ( i . get ( ' mtime ' ) ) , skipped ) )
2010-08-19 18:10:32 +02:00
return f
def __get_rev_changes ( self , revfiles ) :
kept = [ ]
added = [ ]
deleted = [ ]
2010-08-23 14:56:50 +02:00
services = [ ]
2010-08-19 18:10:32 +02:00
revfilenames = [ ]
for f in revfiles :
revfilenames . append ( f . name )
2010-08-23 11:29:57 +02:00
# treat skipped like deleted files
if f . skipped :
2010-08-23 14:56:50 +02:00
if f . name . startswith ( ' _service: ' ) :
services . append ( f )
else :
deleted . append ( f )
2010-08-23 11:29:57 +02:00
continue
# treat skipped like added files
# problem: this overwrites existing files during the update
# (because skipped files aren't in self.filenamelist_unvers)
if f . name in self . filenamelist and not f . name in self . skipped :
2010-08-19 18:10:32 +02:00
kept . append ( f )
else :
added . append ( f )
for f in self . filelist :
if not f . name in revfilenames :
deleted . append ( f )
2008-03-10 19:04:23 +01:00
2010-08-23 14:56:50 +02:00
return kept , added , deleted , services
2008-03-10 19:04:23 +01:00
2010-09-03 14:51:20 +02:00
def update ( self , rev = None , service_files = False , size_limit = None ) :
2010-08-19 18:10:32 +02:00
import tempfile
rfiles = [ ]
2010-09-03 14:51:20 +02:00
# size_limit is only temporary for this update
old_size_limit = self . size_limit
if not size_limit is None :
2010-09-03 16:09:56 +02:00
self . size_limit = int ( size_limit )
2010-08-19 18:10:32 +02:00
if os . path . isfile ( os . path . join ( self . storedir , ' _in_update ' , ' _files ' ) ) :
2013-04-09 12:51:28 +02:00
print ( ' resuming broken update... ' )
2010-08-19 18:10:32 +02:00
root = ET . parse ( os . path . join ( self . storedir , ' _in_update ' , ' _files ' ) ) . getroot ( )
2010-08-23 11:48:33 +02:00
rfiles = self . __get_files ( root )
2010-08-23 14:56:50 +02:00
kept , added , deleted , services = self . __get_rev_changes ( rfiles )
2010-08-19 18:10:32 +02:00
# check if we aborted in the middle of a file update
broken_file = os . listdir ( os . path . join ( self . storedir , ' _in_update ' ) )
broken_file . remove ( ' _files ' )
if len ( broken_file ) == 1 :
origfile = os . path . join ( self . storedir , ' _in_update ' , broken_file [ 0 ] )
wcfile = os . path . join ( self . absdir , broken_file [ 0 ] )
origfile_md5 = dgst ( origfile )
origfile_meta = self . findfilebyname ( broken_file [ 0 ] )
2010-08-26 10:05:15 +02:00
if origfile . endswith ( ' .copy ' ) :
# ok it seems we aborted at some point during the copy process
# (copy process == copy wcfile to the _in_update dir). remove file+continue
os . unlink ( origfile )
elif self . findfilebyname ( broken_file [ 0 ] ) is None :
2010-08-19 18:10:32 +02:00
# should we remove this file from _in_update? if we don't
# the user has no chance to continue without removing the file manually
raise oscerr . PackageInternalError ( self . prjname , self . name ,
' \' %s \' is not known by meta but exists in \' _in_update \' dir ' )
elif os . path . isfile ( wcfile ) and dgst ( wcfile ) != origfile_md5 :
( fd , tmpfile ) = tempfile . mkstemp ( dir = self . absdir , prefix = broken_file [ 0 ] + ' . ' )
os . close ( fd )
os . rename ( wcfile , tmpfile )
os . rename ( origfile , wcfile )
2013-04-09 12:51:28 +02:00
print ( ' warning: it seems you modified \' %s \' after the broken ' \
2010-08-19 18:10:32 +02:00
' update. Restored original file and saved modified version ' \
2013-04-09 12:51:28 +02:00
' to \' %s \' . ' % ( wcfile , tmpfile ) )
2010-08-19 18:10:32 +02:00
elif not os . path . isfile ( wcfile ) :
# this is strange... because it existed before the update. restore it
os . rename ( origfile , wcfile )
else :
# everything seems to be ok
os . unlink ( origfile )
elif len ( broken_file ) > 1 :
raise oscerr . PackageInternalError ( self . prjname , self . name , ' too many files in \' _in_update \' dir ' )
tmp = rfiles [ : ]
for f in tmp :
if os . path . exists ( os . path . join ( self . storedir , f . name ) ) :
2010-08-26 10:05:15 +02:00
if dgst ( os . path . join ( self . storedir , f . name ) ) == f . md5 :
2010-08-19 18:10:32 +02:00
if f in kept :
kept . remove ( f )
elif f in added :
added . remove ( f )
# this can't happen
elif f in deleted :
deleted . remove ( f )
2010-08-23 14:56:50 +02:00
if not service_files :
services = [ ]
2013-04-10 11:34:59 +02:00
self . __update ( kept , added , deleted , services , ET . tostring ( root , encoding = ET_ENCODING ) , root . get ( ' rev ' ) )
2010-08-19 18:10:32 +02:00
os . unlink ( os . path . join ( self . storedir , ' _in_update ' , ' _files ' ) )
os . rmdir ( os . path . join ( self . storedir , ' _in_update ' ) )
# ok everything is ok (hopefully)...
2010-09-03 14:51:20 +02:00
fm = self . get_files_meta ( revision = rev )
2010-08-23 11:48:33 +02:00
root = ET . fromstring ( fm )
rfiles = self . __get_files ( root )
2010-08-30 14:20:12 +02:00
store_write_string ( self . absdir , ' _files ' , fm + ' \n ' , subdir = ' _in_update ' )
2010-08-23 14:56:50 +02:00
kept , added , deleted , services = self . __get_rev_changes ( rfiles )
if not service_files :
services = [ ]
self . __update ( kept , added , deleted , services , fm , root . get ( ' rev ' ) )
2010-08-19 18:10:32 +02:00
os . unlink ( os . path . join ( self . storedir , ' _in_update ' , ' _files ' ) )
if os . path . isdir ( os . path . join ( self . storedir , ' _in_update ' ) ) :
os . rmdir ( os . path . join ( self . storedir , ' _in_update ' ) )
2010-09-03 14:51:20 +02:00
self . size_limit = old_size_limit
2010-08-19 18:10:32 +02:00
2010-08-23 14:56:50 +02:00
def __update ( self , kept , added , deleted , services , fm , rev ) :
2008-03-10 19:04:23 +01:00
pathn = getTransActPath ( self . dir )
2010-08-19 18:10:32 +02:00
# check for conflicts with existing files
for f in added :
if f . name in self . filenamelist_unvers :
raise oscerr . PackageFileConflict ( self . prjname , self . name , f . name ,
' failed to add file \' %s \' file/dir with the same name already exists ' % f . name )
# ok, the update can't fail due to existing files
for f in added :
self . updatefile ( f . name , rev , f . mtime )
2013-04-09 12:51:28 +02:00
print ( statfrmt ( ' A ' , os . path . join ( pathn , f . name ) ) )
2010-08-19 18:10:32 +02:00
for f in deleted :
# if the storefile doesn't exist we're resuming an aborted update:
# the file was already deleted but we cannot know this
2010-08-23 14:56:50 +02:00
# OR we're processing a _service: file (simply keep the file)
2010-08-19 18:10:32 +02:00
if os . path . isfile ( os . path . join ( self . storedir , f . name ) ) and self . status ( f . name ) != ' M ' :
# if self.status(f.name) != 'M':
self . delete_localfile ( f . name )
self . delete_storefile ( f . name )
2013-04-09 12:51:28 +02:00
print ( statfrmt ( ' D ' , os . path . join ( pathn , f . name ) ) )
2010-08-19 18:10:32 +02:00
if f . name in self . to_be_deleted :
self . to_be_deleted . remove ( f . name )
self . write_deletelist ( )
for f in kept :
state = self . status ( f . name )
# print f.name, state
if state == ' M ' and self . findfilebyname ( f . name ) . md5 == f . md5 :
# remote file didn't change
2009-09-03 16:56:48 +02:00
pass
2008-03-10 19:04:23 +01:00
elif state == ' M ' :
2010-08-19 18:10:32 +02:00
# try to merge changes
merge_status = self . mergefile ( f . name , rev , f . mtime )
2013-04-09 12:51:28 +02:00
print ( statfrmt ( merge_status , os . path . join ( pathn , f . name ) ) )
2008-03-10 19:04:23 +01:00
elif state == ' ! ' :
2010-08-19 18:10:32 +02:00
self . updatefile ( f . name , rev , f . mtime )
2013-04-09 12:51:28 +02:00
print ( ' Restored \' %s \' ' % os . path . join ( pathn , f . name ) )
2010-08-19 18:10:32 +02:00
elif state == ' C ' :
get_source_file ( self . apiurl , self . prjname , self . name , f . name ,
targetfilename = os . path . join ( self . storedir , f . name ) , revision = rev ,
progress_obj = self . progress_obj , mtime = f . mtime , meta = self . meta )
2013-04-09 12:51:28 +02:00
print ( ' skipping \' %s \' (this is due to conflicts) ' % f . name )
2010-08-19 18:10:32 +02:00
elif state == ' D ' and self . findfilebyname ( f . name ) . md5 != f . md5 :
# XXX: in the worst case we might end up with f.name being
# in _to_be_deleted and in _in_conflict... this needs to be checked
if os . path . exists ( os . path . join ( self . absdir , f . name ) ) :
merge_status = self . mergefile ( f . name , rev , f . mtime )
2013-04-09 12:51:28 +02:00
print ( statfrmt ( merge_status , os . path . join ( pathn , f . name ) ) )
2010-08-19 18:10:32 +02:00
if merge_status == ' C ' :
# state changes from delete to conflict
self . to_be_deleted . remove ( f . name )
self . write_deletelist ( )
else :
# XXX: we cannot recover this case because we've no file
# to backup
self . updatefile ( f . name , rev , f . mtime )
2013-04-09 12:51:28 +02:00
print ( statfrmt ( ' U ' , os . path . join ( pathn , f . name ) ) )
2010-08-19 18:10:32 +02:00
elif state == ' ' and self . findfilebyname ( f . name ) . md5 != f . md5 :
self . updatefile ( f . name , rev , f . mtime )
2013-04-09 12:51:28 +02:00
print ( statfrmt ( ' U ' , os . path . join ( pathn , f . name ) ) )
2010-08-23 14:56:50 +02:00
# checkout service files
for f in services :
get_source_file ( self . apiurl , self . prjname , self . name , f . name ,
targetfilename = os . path . join ( self . absdir , f . name ) , revision = rev ,
progress_obj = self . progress_obj , mtime = f . mtime , meta = self . meta )
2013-04-09 12:51:28 +02:00
print ( statfrmt ( ' A ' , os . path . join ( pathn , f . name ) ) )
2010-08-30 14:20:12 +02:00
store_write_string ( self . absdir , ' _files ' , fm + ' \n ' )
2010-08-31 16:54:44 +02:00
if not self . meta :
self . update_local_pacmeta ( )
2010-08-19 18:10:32 +02:00
self . update_datastructs ( )
2008-03-10 19:04:23 +01:00
2013-04-09 12:51:28 +02:00
print ( ' At revision %s . ' % self . rev )
2009-08-03 15:03:24 +02:00
2011-05-25 13:34:32 +02:00
def run_source_services ( self , mode = None , singleservice = None , verbose = None ) :
2011-05-26 15:54:30 +02:00
if self . name . startswith ( " _ " ) :
return 0
2011-02-02 17:11:14 +01:00
curdir = os . getcwd ( )
os . chdir ( self . absdir ) # e.g. /usr/lib/obs/service/verify_file fails if not inside the project dir.
2011-02-15 09:41:03 +01:00
si = Serviceinfo ( )
2011-08-24 12:06:07 +02:00
if os . path . exists ( ' _service ' ) :
if self . filenamelist . count ( ' _service ' ) or self . filenamelist_unvers . count ( ' _service ' ) :
service = ET . parse ( os . path . join ( self . absdir , ' _service ' ) ) . getroot ( )
si . read ( service )
2011-02-15 18:39:06 +01:00
si . getProjectGlobalServices ( self . apiurl , self . prjname , self . name )
2011-05-25 13:34:32 +02:00
r = si . execute ( self . absdir , mode , singleservice , verbose )
2011-02-02 17:11:14 +01:00
os . chdir ( curdir )
2011-05-24 10:49:08 +02:00
return r
2009-09-03 16:56:48 +02:00
2010-08-23 16:15:05 +02:00
def revert ( self , filename ) :
2010-08-24 18:06:47 +02:00
if not filename in self . filenamelist and not filename in self . to_be_added :
2010-09-02 10:23:37 +02:00
raise oscerr . OscIOError ( None , ' file \' %s \' is not under version control ' % filename )
2010-08-25 13:50:49 +02:00
elif filename in self . skipped :
2011-01-17 15:00:21 +01:00
raise oscerr . OscIOError ( None , ' file \' %s \' is marked as skipped and cannot be reverted ' % filename )
2010-08-24 18:06:47 +02:00
if filename in self . filenamelist and not os . path . exists ( os . path . join ( self . storedir , filename ) ) :
2010-08-23 16:15:05 +02:00
raise oscerr . PackageInternalError ( ' file \' %s \' is listed in filenamelist but no storefile exists ' % filename )
state = self . status ( filename )
2010-08-26 13:46:10 +02:00
if not ( state == ' A ' or state == ' ! ' and filename in self . to_be_added ) :
2010-08-24 18:06:47 +02:00
shutil . copyfile ( os . path . join ( self . storedir , filename ) , os . path . join ( self . absdir , filename ) )
2010-08-23 16:15:05 +02:00
if state == ' D ' :
self . to_be_deleted . remove ( filename )
self . write_deletelist ( )
elif state == ' C ' :
self . clear_from_conflictlist ( filename )
2010-08-26 13:46:10 +02:00
elif state in ( ' A ' , ' R ' ) or state == ' ! ' and filename in self . to_be_added :
2010-08-24 18:06:47 +02:00
self . to_be_added . remove ( filename )
self . write_addlist ( )
2010-08-23 16:15:05 +02:00
2010-08-30 13:46:49 +02:00
@staticmethod
2010-09-03 14:51:20 +02:00
def init_package ( apiurl , project , package , dir , size_limit = None , meta = False , progress_obj = None ) :
2010-08-31 14:43:43 +02:00
global store
2010-08-30 13:46:49 +02:00
if not os . path . exists ( dir ) :
os . mkdir ( dir )
elif not os . path . isdir ( dir ) :
2010-09-02 10:23:37 +02:00
raise oscerr . OscIOError ( None , ' error: \' %s \' is no directory ' % dir )
2010-08-30 13:46:49 +02:00
if os . path . exists ( os . path . join ( dir , store ) ) :
2010-09-02 10:23:37 +02:00
raise oscerr . OscIOError ( None , ' error: \' %s \' is already an initialized osc working copy ' % dir )
2010-08-30 13:46:49 +02:00
else :
os . mkdir ( os . path . join ( dir , store ) )
store_write_project ( dir , project )
store_write_string ( dir , ' _package ' , package + ' \n ' )
store_write_apiurl ( dir , apiurl )
if meta :
store_write_string ( dir , ' _meta_mode ' , ' ' )
2010-09-03 14:51:20 +02:00
if size_limit :
store_write_string ( dir , ' _size_limit ' , str ( size_limit ) + ' \n ' )
2010-08-30 13:46:49 +02:00
store_write_string ( dir , ' _files ' , ' <directory /> ' + ' \n ' )
store_write_string ( dir , ' _osclib_version ' , __store_version__ + ' \n ' )
2010-09-03 14:51:20 +02:00
return Package ( dir , progress_obj = progress_obj , size_limit = size_limit )
2010-08-30 13:46:49 +02:00
2010-12-30 02:30:37 +01:00
class AbstractState :
"""
Base class which represents state - like objects ( < review / > , < state / > ) .
"""
def __init__ ( self , tag ) :
self . __tag = tag
def get_node_attrs ( self ) :
""" return attributes for the tag/element """
raise NotImplementedError ( )
def get_node_name ( self ) :
""" return tag/element name """
return self . __tag
def get_comment ( self ) :
""" return data from <comment /> tag """
raise NotImplementedError ( )
def to_xml ( self ) :
""" serialize object to XML """
root = ET . Element ( self . get_node_name ( ) )
for attr in self . get_node_attrs ( ) :
val = getattr ( self , attr )
if not val is None :
root . set ( attr , val )
if self . get_comment ( ) :
ET . SubElement ( root , ' comment ' ) . text = self . get_comment ( )
return root
def to_str ( self ) :
""" return " pretty " XML data """
root = self . to_xml ( )
xmlindent ( root )
2013-04-10 11:34:59 +02:00
return ET . tostring ( root , encoding = ET_ENCODING )
2010-12-30 02:30:37 +01:00
class ReviewState ( AbstractState ) :
""" Represents the review state in a request """
def __init__ ( self , review_node ) :
if not review_node . get ( ' state ' ) :
raise oscerr . APIError ( ' invalid review node (state attr expected): %s ' % \
2013-04-10 11:34:59 +02:00
ET . tostring ( review_node , encoding = ET_ENCODING ) )
2010-12-30 02:30:37 +01:00
AbstractState . __init__ ( self , review_node . tag )
self . state = review_node . get ( ' state ' )
self . by_user = review_node . get ( ' by_user ' )
self . by_group = review_node . get ( ' by_group ' )
2011-01-23 21:21:32 +01:00
self . by_project = review_node . get ( ' by_project ' )
self . by_package = review_node . get ( ' by_package ' )
2010-12-30 02:30:37 +01:00
self . who = review_node . get ( ' who ' )
self . when = review_node . get ( ' when ' )
self . comment = ' '
if not review_node . find ( ' comment ' ) is None and \
review_node . find ( ' comment ' ) . text :
self . comment = review_node . find ( ' comment ' ) . text . strip ( )
def get_node_attrs ( self ) :
2011-01-23 21:21:32 +01:00
return ( ' state ' , ' by_user ' , ' by_group ' , ' by_project ' , ' by_package ' , ' who ' , ' when ' )
2010-12-30 02:30:37 +01:00
def get_comment ( self ) :
return self . comment
class RequestState ( AbstractState ) :
""" Represents the state of a request """
def __init__ ( self , state_node ) :
if not state_node . get ( ' name ' ) :
raise oscerr . APIError ( ' invalid request state node (name attr expected): %s ' % \
2013-04-10 11:34:59 +02:00
ET . tostring ( state_node , encoding = ET_ENCODING ) )
2010-12-30 02:30:37 +01:00
AbstractState . __init__ ( self , state_node . tag )
self . name = state_node . get ( ' name ' )
self . who = state_node . get ( ' who ' )
self . when = state_node . get ( ' when ' )
self . comment = ' '
if not state_node . find ( ' comment ' ) is None and \
state_node . find ( ' comment ' ) . text :
self . comment = state_node . find ( ' comment ' ) . text . strip ( )
def get_node_attrs ( self ) :
return ( ' name ' , ' who ' , ' when ' )
def get_comment ( self ) :
return self . comment
2008-03-06 11:25:45 +01:00
2009-06-02 15:14:46 +02:00
class Action :
2010-12-30 02:30:37 +01:00
"""
Represents a < action / > element of a Request .
This class is quite common so that it can be used for all different
action types . Note : instances only provide attributes for their specific
type .
Examples :
r = Action ( ' set_bugowner ' , tgt_project = ' foo ' , person_name = ' buguser ' )
# available attributes: r.type (== 'set_bugowner'), r.tgt_project (== 'foo'), r.tgt_package (== None)
r . to_str ( ) - >
< action type = " set_bugowner " >
< target project = " foo " / >
< person name = " buguser " / >
< / action >
##
r = Action ( ' delete ' , tgt_project = ' foo ' , tgt_package = ' bar ' )
# available attributes: r.type (== 'delete'), r.tgt_project (== 'foo'), r.tgt_package (=='bar')
r . to_str ( ) - >
< action type = " delete " >
< target package = " bar " project = " foo " / >
< / action >
"""
# allowed types + the corresponding (allowed) attributes
2011-01-12 22:21:32 +01:00
type_args = { ' submit ' : ( ' src_project ' , ' src_package ' , ' src_rev ' , ' tgt_project ' , ' tgt_package ' , ' opt_sourceupdate ' ,
' acceptinfo_rev ' , ' acceptinfo_srcmd5 ' , ' acceptinfo_xsrcmd5 ' , ' acceptinfo_osrcmd5 ' ,
' acceptinfo_oxsrcmd5 ' , ' opt_updatelink ' ) ,
2010-12-30 02:30:37 +01:00
' add_role ' : ( ' tgt_project ' , ' tgt_package ' , ' person_name ' , ' person_role ' , ' group_name ' , ' group_role ' ) ,
2011-03-04 15:50:06 +01:00
' set_bugowner ' : ( ' tgt_project ' , ' tgt_package ' , ' person_name ' ) , # obsoleted by add_role
' maintenance_release ' : ( ' src_project ' , ' src_package ' , ' src_rev ' , ' tgt_project ' , ' tgt_package ' , ' person_name ' ) ,
2012-02-15 17:08:06 +01:00
' maintenance_incident ' : ( ' src_project ' , ' src_package ' , ' src_rev ' , ' tgt_project ' , ' tgt_releaseproject ' , ' person_name ' , ' opt_sourceupdate ' ) ,
2012-11-13 13:20:09 +01:00
' delete ' : ( ' tgt_project ' , ' tgt_package ' , ' tgt_repository ' ) ,
2013-08-16 11:53:21 +02:00
' change_devel ' : ( ' src_project ' , ' src_package ' , ' tgt_project ' , ' tgt_package ' ) ,
2013-08-28 23:00:35 +02:00
' group ' : ( ' grouped_id ' , ) }
2010-12-30 02:30:37 +01:00
# attribute prefix to element name map (only needed for abbreviated attributes)
prefix_to_elm = { ' src ' : ' source ' , ' tgt ' : ' target ' , ' opt ' : ' options ' }
def __init__ ( self , type , * * kwargs ) :
if not type in Action . type_args . keys ( ) :
raise oscerr . WrongArgs ( ' invalid action type: \' %s \' ' % type )
2009-06-02 15:14:46 +02:00
self . type = type
2010-12-30 02:30:37 +01:00
for i in kwargs . keys ( ) :
if not i in Action . type_args [ type ] :
raise oscerr . WrongArgs ( ' invalid argument: \' %s \' ' % i )
# set all type specific attributes
for i in Action . type_args [ type ] :
2013-04-09 11:25:19 +02:00
setattr ( self , i , kwargs . get ( i ) )
2009-06-02 15:14:46 +02:00
2010-12-30 02:30:37 +01:00
def to_xml ( self ) :
"""
Serialize object to XML .
The xml tag names and attributes are constructed from the instance ' s attributes.
Example :
self . group_name - > tag name is " group " , attribute name is " name "
self . src_project - > tag name is " source " ( translated via prefix_to_elm dict ) ,
attribute name is " project "
Attributes prefixed with " opt_ " need a special handling , the resulting xml should
look like this : opt_updatelink - > < options > < updatelink > value < / updatelink > < / options > .
Attributes which are " None " will be skipped .
"""
root = ET . Element ( ' action ' , type = self . type )
for i in Action . type_args [ self . type ] :
prefix , attr = i . split ( ' _ ' , 1 )
2013-08-28 23:00:35 +02:00
vals = getattr ( self , i )
# single, plain elements are _not_ stored in a list
plain = False
if vals is None :
2010-12-30 02:30:37 +01:00
continue
2013-08-28 23:00:35 +02:00
elif not hasattr ( vals , ' append ' ) :
vals = [ vals ]
plain = True
for val in vals :
elm = root . find ( Action . prefix_to_elm . get ( prefix , prefix ) )
if elm is None or not plain :
elm = ET . Element ( Action . prefix_to_elm . get ( prefix , prefix ) )
root . append ( elm )
if prefix == ' opt ' :
ET . SubElement ( elm , attr ) . text = val
else :
elm . set ( attr , val )
2010-12-30 02:30:37 +01:00
return root
2008-03-05 00:41:00 +01:00
2010-12-30 02:30:37 +01:00
def to_str ( self ) :
""" return " pretty " XML data """
root = self . to_xml ( )
xmlindent ( root )
2013-04-10 11:34:59 +02:00
return ET . tostring ( root , encoding = ET_ENCODING )
2008-03-05 00:41:00 +01:00
2010-12-30 02:30:37 +01:00
@staticmethod
def from_xml ( action_node ) :
""" create action from XML """
if action_node is None or \
not action_node . get ( ' type ' ) in Action . type_args . keys ( ) or \
not action_node . tag in ( ' action ' , ' submit ' ) :
raise oscerr . WrongArgs ( ' invalid argument ' )
elm_to_prefix = dict ( [ ( i [ 1 ] , i [ 0 ] ) for i in Action . prefix_to_elm . items ( ) ] )
kwargs = { }
for node in action_node :
prefix = elm_to_prefix . get ( node . tag , node . tag )
if prefix == ' opt ' :
data = [ ( ' opt_ %s ' % opt . tag , opt . text . strip ( ) ) for opt in node if opt . text ]
else :
data = [ ( ' %s _ %s ' % ( prefix , k ) , v ) for k , v in node . items ( ) ]
2013-08-28 23:00:35 +02:00
# it would be easier to store everything in a list but in
# this case we would lose some "structure" (see to_xml)
for k , v in data :
if k in kwargs :
l = kwargs [ k ]
if not hasattr ( l , ' append ' ) :
l = [ l ]
kwargs [ k ] = l
l . append ( v )
else :
kwargs [ k ] = v
2010-12-30 02:30:37 +01:00
return Action ( action_node . get ( ' type ' ) , * * kwargs )
2008-03-05 00:41:00 +01:00
2008-03-06 11:25:45 +01:00
2010-12-30 02:30:37 +01:00
class Request :
""" Represents a request (<request />) """
2008-03-05 00:41:00 +01:00
2010-12-30 02:30:37 +01:00
def __init__ ( self ) :
2011-01-18 19:34:25 +01:00
self . _init_attributes ( )
def _init_attributes ( self ) :
""" initialize attributes with default values """
2010-12-30 02:30:37 +01:00
self . reqid = None
self . title = ' '
self . description = ' '
self . state = None
2013-08-14 18:27:38 +02:00
self . accept_at = None
2010-12-30 02:30:37 +01:00
self . actions = [ ]
self . statehistory = [ ]
self . reviews = [ ]
def read ( self , root ) :
""" read in a request """
2011-01-18 19:34:25 +01:00
self . _init_attributes ( )
2010-12-30 02:30:37 +01:00
if not root . get ( ' id ' ) :
2013-04-10 11:34:59 +02:00
raise oscerr . APIError ( ' invalid request: %s \n ' % ET . tostring ( root , encoding = ET_ENCODING ) )
2010-12-30 02:30:37 +01:00
self . reqid = root . get ( ' id ' )
if root . find ( ' state ' ) is None :
2013-04-10 11:34:59 +02:00
raise oscerr . APIError ( ' invalid request (state expected): %s \n ' % ET . tostring ( root , encoding = ET_ENCODING ) )
2010-12-30 02:30:37 +01:00
self . state = RequestState ( root . find ( ' state ' ) )
action_nodes = root . findall ( ' action ' )
if not action_nodes :
# check for old-style requests
for i in root . findall ( ' submit ' ) :
i . set ( ' type ' , ' submit ' )
action_nodes . append ( i )
for action in action_nodes :
self . actions . append ( Action . from_xml ( action ) )
for review in root . findall ( ' review ' ) :
self . reviews . append ( ReviewState ( review ) )
for hist_state in root . findall ( ' history ' ) :
self . statehistory . append ( RequestState ( hist_state ) )
2013-08-14 18:27:38 +02:00
if not root . find ( ' accept_at ' ) is None and root . find ( ' accept_at ' ) . text :
self . accept_at = root . find ( ' accept_at ' ) . text . strip ( )
2010-12-30 02:30:37 +01:00
if not root . find ( ' title ' ) is None :
self . title = root . find ( ' title ' ) . text . strip ( )
if not root . find ( ' description ' ) is None and root . find ( ' description ' ) . text :
self . description = root . find ( ' description ' ) . text . strip ( )
def add_action ( self , type , * * kwargs ) :
""" add a new action to the request """
self . actions . append ( Action ( type , * * kwargs ) )
2008-03-05 00:41:00 +01:00
2011-01-29 17:44:03 +01:00
def get_actions ( self , * types ) :
"""
get all actions with a specific type
( if types is empty return all actions )
"""
if not types :
return self . actions
return [ i for i in self . actions if i . type in types ]
2010-11-14 18:32:02 +01:00
def get_creator ( self ) :
2010-12-30 02:30:37 +01:00
""" return the creator of the request """
2010-11-14 18:32:02 +01:00
if len ( self . statehistory ) :
2010-12-30 02:30:37 +01:00
return self . statehistory [ 0 ] . who
2010-11-14 18:32:02 +01:00
return self . state . who
2010-12-30 02:30:37 +01:00
def to_xml ( self ) :
""" serialize object to XML """
root = ET . Element ( ' request ' )
if not self . reqid is None :
root . set ( ' id ' , self . reqid )
for action in self . actions :
root . append ( action . to_xml ( ) )
if not self . state is None :
root . append ( self . state . to_xml ( ) )
for review in self . reviews :
root . append ( review . to_xml ( ) )
for hist in self . statehistory :
root . append ( hist . to_xml ( ) )
if self . title :
ET . SubElement ( root , ' title ' ) . text = self . title
if self . description :
ET . SubElement ( root , ' description ' ) . text = self . description
2013-12-05 10:23:53 +01:00
if self . accept_at :
ET . SubElement ( root , ' accept_at ' ) . text = self . accept_at
2010-12-30 02:30:37 +01:00
return root
2008-06-27 18:36:16 +02:00
2010-12-30 02:30:37 +01:00
def to_str ( self ) :
""" return " pretty " XML data """
root = self . to_xml ( )
xmlindent ( root )
2013-04-10 11:34:59 +02:00
return ET . tostring ( root , encoding = ET_ENCODING )
2008-06-27 18:36:16 +02:00
2013-12-05 10:23:53 +01:00
def accept_at_in_hours ( self , hours ) :
""" set auto accept_at time """
import datetime
now = datetime . datetime . utcnow ( )
now = now + datetime . timedelta ( hours = hours )
self . accept_at = now . isoformat ( )
2011-01-30 21:23:40 +01:00
@staticmethod
def format_review ( review , show_srcupdate = False ) :
2011-01-23 21:21:32 +01:00
"""
format a review depending on the reviewer ' s type.
2011-01-30 21:23:40 +01:00
A dict which contains the formatted str ' s is returned.
2011-01-23 21:21:32 +01:00
"""
d = { ' state ' : ' %s : ' % review . state }
if review . by_package :
2013-05-27 14:26:58 +02:00
d [ ' by ' ] = ' %s / %s ' % ( review . by_project , review . by_package )
d [ ' type ' ] = ' Package '
2011-01-23 21:21:32 +01:00
elif review . by_project :
2013-05-27 14:26:58 +02:00
d [ ' by ' ] = ' %s ' % review . by_project
d [ ' type ' ] = ' Project '
2011-01-23 21:21:32 +01:00
elif review . by_group :
2013-05-27 14:26:58 +02:00
d [ ' by ' ] = ' %s ' % review . by_group
d [ ' type ' ] = ' Group '
2011-01-23 21:21:32 +01:00
else :
2013-05-27 14:26:58 +02:00
d [ ' by ' ] = ' %s ' % review . by_user
d [ ' type ' ] = ' User '
2011-01-23 21:21:32 +01:00
if review . who :
2013-05-27 14:26:58 +02:00
d [ ' by ' ] + = ' ( %s ) ' % review . who
2011-01-23 21:21:32 +01:00
return d
2013-08-28 23:00:35 +02:00
def format_action ( self , action , show_srcupdate = False ) :
2010-12-30 02:30:37 +01:00
"""
format an action depending on the action ' s type.
2011-01-30 21:23:40 +01:00
A dict which contains the formatted str ' s is returned.
2010-12-30 02:30:37 +01:00
"""
2012-11-20 15:29:30 +01:00
def prj_pkg_join ( prj , pkg , repository = None ) :
2010-12-30 02:30:37 +01:00
if not pkg :
2012-11-13 13:20:09 +01:00
if not repository :
2013-05-27 14:26:58 +02:00
return prj or ' '
2012-11-13 13:20:09 +01:00
return ' %s ( %s ) ' % ( prj , repository )
2010-12-30 02:30:37 +01:00
return ' %s / %s ' % ( prj , pkg )
d = { ' type ' : ' %s : ' % action . type }
if action . type == ' set_bugowner ' :
d [ ' source ' ] = action . person_name
d [ ' target ' ] = prj_pkg_join ( action . tgt_project , action . tgt_package )
elif action . type == ' change_devel ' :
d [ ' source ' ] = prj_pkg_join ( action . tgt_project , action . tgt_package )
d [ ' target ' ] = ' developed in %s ' % prj_pkg_join ( action . src_project , action . src_package )
2011-03-04 15:50:06 +01:00
elif action . type == ' maintenance_incident ' :
d [ ' source ' ] = ' %s -> ' % action . src_project
2012-02-20 11:21:30 +01:00
if action . src_package :
d [ ' source ' ] = ' %s -> ' % prj_pkg_join ( action . src_project , action . src_package )
2011-03-04 15:50:06 +01:00
d [ ' target ' ] = action . tgt_project
2012-02-29 12:22:35 +01:00
if action . tgt_releaseproject :
d [ ' target ' ] + = " (release in " + action . tgt_releaseproject + " ) "
2011-10-31 11:30:26 +01:00
srcupdate = ' '
if action . opt_sourceupdate and show_srcupdate :
srcupdate = ' ( %s ) ' % action . opt_sourceupdate
2011-03-04 15:50:06 +01:00
elif action . type == ' maintenance_release ' :
d [ ' source ' ] = ' %s -> ' % prj_pkg_join ( action . src_project , action . src_package )
d [ ' target ' ] = prj_pkg_join ( action . tgt_project , action . tgt_package )
2010-12-30 02:30:37 +01:00
elif action . type == ' submit ' :
srcupdate = ' '
if action . opt_sourceupdate and show_srcupdate :
srcupdate = ' ( %s ) ' % action . opt_sourceupdate
d [ ' source ' ] = ' %s %s -> ' % ( prj_pkg_join ( action . src_project , action . src_package ) , srcupdate )
tgt_package = action . tgt_package
if action . src_package == action . tgt_package :
tgt_package = ' '
d [ ' target ' ] = prj_pkg_join ( action . tgt_project , tgt_package )
elif action . type == ' add_role ' :
roles = [ ]
if action . person_name and action . person_role :
roles . append ( ' person: %s as %s ' % ( action . person_name , action . person_role ) )
if action . group_name and action . group_role :
roles . append ( ' group: %s as %s ' % ( action . group_name , action . group_role ) )
d [ ' source ' ] = ' , ' . join ( roles )
d [ ' target ' ] = prj_pkg_join ( action . tgt_project , action . tgt_package )
elif action . type == ' delete ' :
d [ ' source ' ] = ' '
2012-11-13 13:20:09 +01:00
d [ ' target ' ] = prj_pkg_join ( action . tgt_project , action . tgt_package , action . tgt_repository )
2013-08-16 11:53:21 +02:00
elif action . type == ' group ' :
2013-08-28 23:00:35 +02:00
l = action . grouped_id
if l is None :
# there may be no requests in a group action
l = ' '
if not hasattr ( l , ' append ' ) :
l = [ l ]
d [ ' source ' ] = ' , ' . join ( l ) + ' -> '
d [ ' target ' ] = self . reqid
2013-08-16 11:53:21 +02:00
else :
raise oscerr . APIError ( ' Unknown action type %s \n ' % action . type )
2010-12-30 02:30:37 +01:00
return d
def list_view ( self ) :
""" return " list view " format """
2011-02-11 02:43:10 +01:00
import textwrap
2010-12-30 02:30:37 +01:00
lines = [ ' %6s State: %-10s By: %-12s When: %-19s ' % ( self . reqid , self . state . name , self . state . who , self . state . when ) ]
tmpl = ' %(type)-16s %(source)-50s %(target)s '
for action in self . actions :
2013-08-28 23:00:35 +02:00
lines . append ( tmpl % self . format_action ( action ) )
2011-01-23 21:21:32 +01:00
tmpl = ' Review by %(type)-10s is %(state)-10s %(by)-50s '
for review in self . reviews :
2011-01-30 21:23:40 +01:00
lines . append ( tmpl % Request . format_review ( review ) )
2010-12-30 02:30:37 +01:00
history = [ ' %s ( %s ) ' % ( hist . name , hist . who ) for hist in self . statehistory ]
if history :
lines . append ( ' From: %s ' % ' -> ' . join ( history ) )
if self . description :
2011-02-11 02:43:10 +01:00
lines . append ( textwrap . fill ( self . description , width = 80 , initial_indent = ' Descr: ' ,
2010-12-30 02:30:37 +01:00
subsequent_indent = ' ' ) )
2011-07-13 15:47:38 +02:00
lines . append ( textwrap . fill ( self . state . comment , width = 80 , initial_indent = ' Comment: ' ,
subsequent_indent = ' ' ) )
2010-12-30 02:30:37 +01:00
return ' \n ' . join ( lines )
2008-03-05 00:41:00 +01:00
def __str__ ( self ) :
2010-12-30 02:30:37 +01:00
""" return " detailed " format """
lines = [ ' Request: # %s \n ' % self . reqid ]
2013-08-14 18:27:38 +02:00
if self . accept_at and self . state . name in [ ' new ' , ' review ' ] :
lines . append ( ' *** This request will get automatically accepted after ' + self . accept_at + ' ! *** \n ' )
2009-06-23 16:14:07 +02:00
for action in self . actions :
2010-12-30 02:30:37 +01:00
tmpl = ' %(type)-13s %(source)s %(target)s '
if action . type == ' delete ' :
# remove 1 whitespace because source is empty
tmpl = ' %(type)-12s %(source)s %(target)s '
2013-08-28 23:00:35 +02:00
lines . append ( tmpl % self . format_action ( action , show_srcupdate = True ) )
2010-12-30 02:30:37 +01:00
lines . append ( ' \n \n Message: ' )
if self . description :
2011-02-11 02:43:10 +01:00
lines . append ( self . description )
2010-12-30 02:30:37 +01:00
else :
lines . append ( ' <no message> ' )
2011-01-29 23:30:54 +01:00
if self . state :
lines . append ( ' \n State: %-10s %-12s %s ' % ( self . state . name , self . state . when , self . state . who ) )
lines . append ( ' Comment: %s ' % ( self . state . comment or ' <no comment> ' ) )
2010-12-30 02:30:37 +01:00
indent = ' \n '
2011-01-23 21:21:32 +01:00
tmpl = ' %(state)-10s %(by)-50s %(when)-12s %(who)-20s %(comment)s '
2010-12-30 02:30:37 +01:00
reviews = [ ]
for review in reversed ( self . reviews ) :
d = { ' state ' : review . state }
2011-01-23 21:21:32 +01:00
if review . by_user :
2013-05-27 14:26:58 +02:00
d [ ' by ' ] = " User: " + review . by_user
2011-01-23 21:21:32 +01:00
if review . by_group :
2013-05-27 14:26:58 +02:00
d [ ' by ' ] = " Group: " + review . by_group
2011-01-23 21:21:32 +01:00
if review . by_package :
2013-05-27 14:26:58 +02:00
d [ ' by ' ] = " Package: " + review . by_project + " / " + review . by_package
2011-01-23 21:21:32 +01:00
elif review . by_project :
2013-05-27 14:26:58 +02:00
d [ ' by ' ] = " Project: " + review . by_project
2011-01-23 21:21:32 +01:00
d [ ' when ' ] = review . when or ' '
d [ ' who ' ] = review . who or ' '
d [ ' comment ' ] = review . comment or ' '
2010-12-30 02:30:37 +01:00
reviews . append ( tmpl % d )
if reviews :
lines . append ( ' \n Review: %s ' % indent . join ( reviews ) )
tmpl = ' %(name)-10s %(when)-12s %(who)s '
histories = [ ]
for hist in reversed ( self . statehistory ) :
d = { ' name ' : hist . name , ' when ' : hist . when ,
' who ' : hist . who }
histories . append ( tmpl % d )
if histories :
lines . append ( ' \n History: %s ' % indent . join ( histories ) )
return ' \n ' . join ( lines )
2008-03-06 11:25:45 +01:00
2010-12-30 02:30:37 +01:00
def __cmp__ ( self , other ) :
2011-02-09 15:51:26 +01:00
return cmp ( int ( self . reqid ) , int ( other . reqid ) )
2008-03-05 00:41:00 +01:00
2012-03-15 12:44:38 +01:00
def create ( self , apiurl , addrevision = False ) :
2011-01-18 19:34:25 +01:00
""" create a new request """
2012-03-15 12:44:38 +01:00
query = { ' cmd ' : ' create ' }
if addrevision :
query [ ' addrevision ' ] = " 1 "
u = makeurl ( apiurl , [ ' request ' ] , query = query )
2011-01-18 19:34:25 +01:00
f = http_POST ( u , data = self . to_str ( ) )
root = ET . fromstring ( f . read ( ) )
self . read ( root )
2008-03-05 00:41:00 +01:00
2007-06-26 15:17:38 +02:00
def shorttime ( t ) :
""" format time as Apr 02 18:19
or Apr 02 2005
depending on whether it is in the current year
"""
import time
if time . localtime ( ) [ 0 ] == time . localtime ( t ) [ 0 ] :
# same year
2013-05-27 14:56:24 +02:00
return time . strftime ( ' % b %d % H: % M ' , time . localtime ( t ) )
2007-06-26 15:17:38 +02:00
else :
2013-05-27 14:56:24 +02:00
return time . strftime ( ' % b %d % Y ' , time . localtime ( t ) )
2006-05-31 14:13:26 +02:00
2006-05-22 12:50:37 +02:00
def is_project_dir ( d ) :
2010-08-31 14:43:43 +02:00
global store
2007-05-04 23:51:54 +02:00
return os . path . exists ( os . path . join ( d , store , ' _project ' ) ) and not \
os . path . exists ( os . path . join ( d , store , ' _package ' ) )
2006-05-22 12:50:37 +02:00
2009-10-20 16:30:15 +02:00
2006-09-29 15:15:41 +02:00
def is_package_dir ( d ) :
2010-08-31 14:43:43 +02:00
global store
2007-05-04 23:51:54 +02:00
return os . path . exists ( os . path . join ( d , store , ' _project ' ) ) and \
os . path . exists ( os . path . join ( d , store , ' _package ' ) )
2006-09-29 15:15:41 +02:00
2009-08-26 16:58:53 +02:00
def parse_disturl ( disturl ) :
""" Parse a disturl, returns tuple (apiurl, project, source, repository,
revision ) , else raises an oscerr . WrongArgs exception
"""
2010-08-31 14:43:43 +02:00
global DISTURL_RE
2009-08-26 16:58:53 +02:00
m = DISTURL_RE . match ( disturl )
if not m :
2010-01-28 13:22:44 +01:00
raise oscerr . WrongArgs ( " ` %s ' does not look like disturl " % disturl )
2009-08-26 16:58:53 +02:00
apiurl = m . group ( ' apiurl ' )
if apiurl . split ( ' . ' ) [ 0 ] != ' api ' :
apiurl = ' https://api. ' + " . " . join ( apiurl . split ( ' . ' ) [ 1 : ] )
return ( apiurl , m . group ( ' project ' ) , m . group ( ' source ' ) , m . group ( ' repository ' ) , m . group ( ' revision ' ) )
2010-01-28 13:20:11 +01:00
def parse_buildlogurl ( buildlogurl ) :
""" Parse a build log url, returns a tuple (apiurl, project, package,
repository , arch ) , else raises oscerr . WrongArgs exception """
global BUILDLOGURL_RE
m = BUILDLOGURL_RE . match ( buildlogurl )
if not m :
2010-01-28 20:00:34 +01:00
raise oscerr . WrongArgs ( ' \' %s \' does not look like url with a build log ' % buildlogurl )
2010-02-28 02:30:13 +01:00
2010-01-28 13:20:11 +01:00
return ( m . group ( ' apiurl ' ) , m . group ( ' project ' ) , m . group ( ' package ' ) , m . group ( ' repository ' ) , m . group ( ' arch ' ) )
2009-10-20 16:30:15 +02:00
2007-06-26 15:17:38 +02:00
def slash_split ( l ) :
""" Split command line arguments like ' foo/bar ' into ' foo ' ' bar ' .
This is handy to allow copy / paste a project / package combination in this form .
2008-12-12 11:02:41 +01:00
2009-10-20 16:30:15 +02:00
Trailing slashes are removed before the split , because the split would
2008-12-12 11:02:41 +01:00
otherwise give an additional empty string .
2007-06-26 15:17:38 +02:00
"""
r = [ ]
for i in l :
2008-12-12 11:02:41 +01:00
i = i . rstrip ( ' / ' )
2007-06-26 15:17:38 +02:00
r + = i . split ( ' / ' )
return r
2009-09-28 21:50:57 +02:00
def expand_proj_pack ( args , idx = 0 , howmany = 0 ) :
""" looks for occurance of ' . ' at the position idx.
2009-10-20 16:30:15 +02:00
If howmany is 2 , both proj and pack are expanded together
2009-09-28 21:50:57 +02:00
using the current directory , or none of them , if not possible .
If howmany is 0 , proj is expanded if possible , then , if there
2009-10-20 16:30:15 +02:00
is no idx + 1 element in args ( or args [ idx + 1 ] == ' . ' ) , pack is also
2009-09-28 21:50:57 +02:00
expanded , if possible .
If howmany is 1 , only proj is expanded if possible .
If args [ idx ] does not exists , an implicit ' . ' is assumed .
if not enough elements up to idx exist , an error is raised .
2009-10-08 16:40:06 +02:00
See also parseargs ( args ) , slash_split ( args ) , findpacs ( args )
All these need unification , somehow .
2009-09-28 21:50:57 +02:00
"""
# print args,idx,howmany
if len ( args ) < idx :
raise oscerr . WrongArgs ( ' not enough argument, expected at least %d ' % idx )
2009-10-20 16:30:15 +02:00
2009-09-28 21:50:57 +02:00
if len ( args ) == idx :
args + = ' . '
if args [ idx + 0 ] == ' . ' :
if howmany == 0 and len ( args ) > idx + 1 :
if args [ idx + 1 ] == ' . ' :
# we have two dots.
# remove one dot and make sure to expand both proj and pack
args . pop ( idx + 1 )
howmany = 2
else :
howmany = 1
# print args,idx,howmany
args [ idx + 0 ] = store_read_project ( ' . ' )
if howmany == 0 :
try :
package = store_read_package ( ' . ' )
args . insert ( idx + 1 , package )
except :
pass
elif howmany == 2 :
package = store_read_package ( ' . ' )
args . insert ( idx + 1 , package )
return args
2007-06-26 15:17:38 +02:00
2010-02-09 20:57:10 +01:00
def findpacs ( files , progress_obj = None ) :
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
""" collect Package objects belonging to the given files
and make sure each Package is returned only once """
2006-05-19 22:13:29 +02:00
pacs = [ ]
for f in files :
2010-02-09 20:57:10 +01:00
p = filedir_to_pac ( f , progress_obj )
2006-05-19 22:13:29 +02:00
known = None
for i in pacs :
if i . name == p . name :
known = i
break
if known :
i . merge ( p )
else :
pacs . append ( p )
return pacs
2009-10-20 16:30:15 +02:00
2006-05-19 22:13:29 +02:00
2010-04-09 15:47:07 +02:00
def filedir_to_pac ( f , progress_obj = None ) :
""" Takes a working copy path, or a path to a file inside a working copy,
and returns a Package object instance
If the argument was a filename , add it onto the " todo " list of the Package """
if os . path . isdir ( f ) :
wd = f
p = Package ( wd , progress_obj = progress_obj )
else :
wd = os . path . dirname ( f ) or os . curdir
p = Package ( wd , progress_obj = progress_obj )
p . todo = [ os . path . basename ( f ) ]
return p
2006-05-19 22:13:29 +02:00
def read_filemeta ( dir ) :
2010-08-31 14:43:43 +02:00
global store
2011-05-17 16:09:09 +02:00
msg = ' \' %s \' is not a valid working copy. ' % dir
filesmeta = os . path . join ( dir , store , ' _files ' )
2010-08-31 15:37:11 +02:00
if not is_package_dir ( dir ) :
2010-08-31 14:52:46 +02:00
raise oscerr . NoWorkingCopy ( msg )
if not os . path . isfile ( filesmeta ) :
2011-05-17 16:09:09 +02:00
raise oscerr . NoWorkingCopy ( ' %s ( %s does not exist) ' % ( msg , filesmeta ) )
2010-08-31 14:52:46 +02:00
2008-06-10 12:15:49 +02:00
try :
2010-08-31 14:52:46 +02:00
r = ET . parse ( filesmeta )
2013-04-09 11:27:02 +02:00
except SyntaxError as e :
2011-05-17 16:09:09 +02:00
raise oscerr . NoWorkingCopy ( ' %s \n When parsing .osc/_files, the following error was encountered: \n %s ' % ( msg , e ) )
2008-06-10 12:15:49 +02:00
return r
2006-05-19 22:13:29 +02:00
2010-08-24 10:23:11 +02:00
def store_readlist ( dir , name ) :
2010-08-31 14:43:43 +02:00
global store
2006-05-19 22:13:29 +02:00
r = [ ]
2010-08-24 10:23:11 +02:00
if os . path . exists ( os . path . join ( dir , store , name ) ) :
2012-01-05 14:00:10 +01:00
r = [ line . rstrip ( ' \n ' ) for line in open ( os . path . join ( dir , store , name ) , ' r ' ) ]
2006-05-19 22:13:29 +02:00
return r
2010-08-24 18:06:47 +02:00
def read_tobeadded ( dir ) :
return store_readlist ( dir , ' _to_be_added ' )
2010-08-24 10:23:11 +02:00
def read_tobedeleted ( dir ) :
return store_readlist ( dir , ' _to_be_deleted ' )
2006-05-19 22:13:29 +02:00
2010-04-22 15:27:54 +02:00
def read_sizelimit ( dir ) :
2010-08-31 14:43:43 +02:00
global store
2010-04-22 15:27:54 +02:00
r = None
fname = os . path . join ( dir , store , ' _size_limit ' )
if os . path . exists ( fname ) :
2010-09-03 16:09:56 +02:00
r = open ( fname ) . readline ( ) . strip ( )
2010-04-22 15:27:54 +02:00
2010-04-22 20:05:40 +02:00
if r is None or not r . isdigit ( ) :
2010-04-22 15:27:54 +02:00
return None
return int ( r )
2006-05-22 16:12:06 +02:00
def read_inconflict ( dir ) :
2010-08-24 10:23:11 +02:00
return store_readlist ( dir , ' _in_conflict ' )
2006-05-22 16:12:06 +02:00
2006-05-23 15:48:58 +02:00
def parseargs ( list_of_args ) :
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
""" Convenience method osc ' s commandline argument parsing.
2009-10-20 16:30:15 +02:00
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
If called with an empty tuple ( or list ) , return a list containing the current directory .
Otherwise , return a list of the arguments . """
if list_of_args :
return list ( list_of_args )
else :
return [ os . curdir ]
2006-05-11 09:27:50 +02:00
2006-05-19 22:13:29 +02:00
def statfrmt ( statusletter , filename ) :
return ' %s %s ' % ( statusletter , filename )
2006-09-29 15:15:41 +02:00
def pathjoin ( a , * p ) :
""" Join two or more pathname components, inserting ' / ' as needed. Cut leading ./ """
path = os . path . join ( a , * p )
if path . startswith ( ' ./ ' ) :
path = path [ 2 : ]
return path
2007-05-09 11:36:55 +02:00
def makeurl ( baseurl , l , query = [ ] ) :
2008-03-17 22:10:34 +01:00
""" Given a list of path compoments, construct a complete URL.
Optional parameters for a query string can be given as a list , as a
dictionary , or as an already assembled string .
In case of a dictionary , the parameters will be urlencoded by this
function . In case of a list not - - this is to be backwards compatible .
"""
2007-05-04 23:51:54 +02:00
2009-11-10 01:56:52 +01:00
if conf . config [ ' verbose ' ] > 1 :
2013-04-09 12:51:28 +02:00
print ( ' makeurl: ' , baseurl , l , query )
2009-11-10 01:56:52 +01:00
2013-04-09 11:34:46 +02:00
if isinstance ( query , type ( list ( ) ) ) :
2008-03-17 22:10:34 +01:00
query = ' & ' . join ( query )
2013-04-09 11:34:46 +02:00
elif isinstance ( query , type ( dict ( ) ) ) :
2008-03-17 22:10:34 +01:00
query = urlencode ( query )
2007-05-04 23:51:54 +02:00
scheme , netloc = urlsplit ( baseurl ) [ 0 : 2 ]
2009-10-20 16:30:15 +02:00
return urlunsplit ( ( scheme , netloc , ' / ' . join ( l ) , query , ' ' ) )
2006-04-20 16:26:50 +02:00
2013-12-05 18:30:40 +01:00
def http_request ( method , url , headers = { } , data = None , file = None ) :
2007-04-19 10:47:22 +02:00
""" wrapper around urllib2.urlopen for error handling,
and to support additional ( PUT , DELETE ) methods """
2013-04-18 14:19:45 +02:00
def create_memoryview ( obj ) :
if sys . version_info < ( 2 , 7 , 99 ) :
# obj might be a mmap and python 2.7's mmap does not
# behave like a bytearray (a bytearray in turn can be used
# to create the memoryview). For now simply return a buffer
return buffer ( obj )
return memoryview ( obj )
2007-04-19 10:47:22 +02:00
2007-04-19 11:12:39 +02:00
filefd = None
2007-04-25 01:00:12 +02:00
if conf . config [ ' http_debug ' ] :
2013-04-09 12:51:28 +02:00
print ( ' \n \n -- ' , method , url , file = sys . stderr )
2007-04-19 10:47:22 +02:00
if method == ' POST ' and not file and not data :
# adding data to an urllib2 request transforms it into a POST
data = ' '
2009-10-20 16:30:15 +02:00
2013-04-09 14:03:17 +02:00
req = URLRequest ( url )
2010-04-07 03:06:03 +02:00
api_host_options = { }
2010-09-01 15:53:37 +02:00
if conf . is_known_apiurl ( url ) :
# ok no external request
2013-04-09 14:03:17 +02:00
install_opener ( conf . _build_opener ( url ) )
2010-04-07 03:06:03 +02:00
api_host_options = conf . get_apiurl_api_host_options ( url )
for header , value in api_host_options [ ' http_headers ' ] :
req . add_header ( header , value )
2008-08-20 11:45:49 +02:00
2007-04-19 10:47:22 +02:00
req . get_method = lambda : method
2007-06-21 17:14:15 +02:00
# POST requests are application/x-www-form-urlencoded per default
2013-11-27 11:13:08 +01:00
# but sending data requires an octet-stream type
if method == ' PUT ' or ( method == ' POST ' and ( data or file ) ) :
2007-06-21 17:14:15 +02:00
req . add_header ( ' Content-Type ' , ' application/octet-stream ' )
2013-04-09 11:34:46 +02:00
if isinstance ( headers , type ( { } ) ) :
2008-03-16 21:46:16 +01:00
for i in headers . keys ( ) :
2013-04-09 12:51:28 +02:00
print ( headers [ i ] )
2008-03-16 21:46:16 +01:00
req . add_header ( i , headers [ i ] )
2007-04-19 11:12:39 +02:00
if file and not data :
size = os . path . getsize ( file )
if size < 1024 * 512 :
2009-05-22 17:00:31 +02:00
data = open ( file , ' rb ' ) . read ( )
2007-04-19 11:12:39 +02:00
else :
import mmap
2009-05-22 17:00:31 +02:00
filefd = open ( file , ' rb ' )
2008-03-16 20:02:38 +01:00
try :
2009-05-20 18:42:17 +02:00
if sys . platform [ : 3 ] != ' win ' :
data = mmap . mmap ( filefd . fileno ( ) , os . path . getsize ( file ) , mmap . MAP_SHARED , mmap . PROT_READ )
else :
data = mmap . mmap ( filefd . fileno ( ) , os . path . getsize ( file ) )
2013-04-18 14:19:45 +02:00
data = create_memoryview ( data )
2013-04-09 11:27:02 +02:00
except EnvironmentError as e :
2008-03-16 20:02:38 +01:00
if e . errno == 19 :
sys . exit ( ' \n \n %s \n The file \' %s \' could not be memory mapped. It is ' \
' \n on a filesystem which does not support this. ' % ( e , file ) )
2009-05-22 16:43:39 +02:00
elif hasattr ( e , ' winerror ' ) and e . winerror == 5 :
# falling back to the default io
2009-05-22 17:00:31 +02:00
data = open ( file , ' rb ' ) . read ( )
2008-03-16 20:02:38 +01:00
else :
raise
2013-04-09 12:51:28 +02:00
if conf . config [ ' debug ' ] : print ( method , url , file = sys . stderr )
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
2008-04-12 10:04:41 +02:00
try :
2013-04-10 11:34:59 +02:00
if isinstance ( data , str ) :
2013-05-27 14:56:24 +02:00
data = bytes ( data , " utf-8 " )
2013-04-09 14:03:17 +02:00
fd = urlopen ( req , data = data )
2013-04-10 11:34:59 +02:00
2009-02-25 02:29:58 +01:00
finally :
2009-02-28 16:56:32 +01:00
if hasattr ( conf . cookiejar , ' save ' ) :
conf . cookiejar . save ( ignore_discard = True )
2007-04-19 12:40:18 +02:00
2007-04-19 11:12:39 +02:00
if filefd : filefd . close ( )
2008-03-11 17:39:47 +01:00
2007-04-19 10:47:22 +02:00
return fd
def http_GET ( * args , * * kwargs ) : return http_request ( ' GET ' , * args , * * kwargs )
def http_POST ( * args , * * kwargs ) : return http_request ( ' POST ' , * args , * * kwargs )
def http_PUT ( * args , * * kwargs ) : return http_request ( ' PUT ' , * args , * * kwargs )
def http_DELETE ( * args , * * kwargs ) : return http_request ( ' DELETE ' , * args , * * kwargs )
2006-05-19 22:13:29 +02:00
def check_store_version ( dir ) :
2010-08-31 14:43:43 +02:00
global store
2006-05-19 22:13:29 +02:00
versionfile = os . path . join ( dir , store , ' _osclib_version ' )
2006-04-28 17:37:25 +02:00
try :
2006-05-19 22:13:29 +02:00
v = open ( versionfile ) . read ( ) . strip ( )
2006-04-28 17:37:25 +02:00
except :
v = ' '
2006-05-19 22:13:29 +02:00
if v == ' ' :
2010-04-09 15:57:12 +02:00
msg = ' Error: " %s " is not an osc package working copy. ' % os . path . abspath ( dir )
2009-08-20 21:28:05 +02:00
if os . path . exists ( os . path . join ( dir , ' .svn ' ) ) :
msg = msg + ' \n Try svn instead of osc. '
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
raise oscerr . NoWorkingCopy ( msg )
2006-05-19 22:13:29 +02:00
2008-05-19 16:56:59 +02:00
if v != __store_version__ :
if v in [ ' 0.2 ' , ' 0.3 ' , ' 0.4 ' , ' 0.5 ' , ' 0.6 ' , ' 0.7 ' , ' 0.8 ' , ' 0.9 ' , ' 0.95 ' , ' 0.96 ' , ' 0.97 ' , ' 0.98 ' , ' 0.99 ' ] :
2006-05-22 16:23:13 +02:00
# version is fine, no migration needed
2006-05-19 22:13:29 +02:00
f = open ( versionfile , ' w ' )
2008-05-19 16:56:59 +02:00
f . write ( __store_version__ + ' \n ' )
2006-05-19 22:13:29 +02:00
f . close ( )
2009-10-20 16:30:15 +02:00
return
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
msg = ' The osc metadata of your working copy " %s " ' % dir
2008-05-19 16:56:59 +02:00
msg + = ' \n has __store_version__ = %s , but it should be %s ' % ( v , __store_version__ )
msg + = ' \n Please do a fresh checkout or update your client. Sorry about the inconvenience. '
2013-04-09 12:54:54 +02:00
raise oscerr . WorkingCopyWrongVersion ( msg )
2009-10-20 16:30:15 +02:00
2006-04-28 17:37:25 +02:00
2010-05-22 08:22:12 +02:00
def meta_get_packagelist ( apiurl , prj , deleted = None ) :
query = { }
if deleted :
2013-05-27 14:26:58 +02:00
query [ ' deleted ' ] = 1
2006-04-20 16:26:50 +02:00
2010-05-22 08:22:12 +02:00
u = makeurl ( apiurl , [ ' source ' , prj ] , query )
2007-04-19 10:47:22 +02:00
f = http_GET ( u )
2006-10-10 16:04:34 +02:00
root = ET . parse ( f ) . getroot ( )
2006-08-07 12:08:54 +02:00
return [ node . get ( ' name ' ) for node in root . findall ( ' entry ' ) ]
2006-04-20 16:26:50 +02:00
2013-05-17 10:37:51 +02:00
def meta_get_filelist ( apiurl , prj , package , verbose = False , expand = False , revision = None , meta = False , deleted = False ) :
2007-06-26 15:17:38 +02:00
""" return a list of file names,
or a list File ( ) instances if verbose = True """
2006-04-20 16:26:50 +02:00
2009-04-09 13:44:32 +02:00
query = { }
2013-05-17 10:37:51 +02:00
if deleted :
query [ ' deleted ' ] = 1
2009-03-31 00:17:18 +02:00
if expand :
2009-04-09 13:44:32 +02:00
query [ ' expand ' ] = 1
2011-06-08 10:25:15 +02:00
if meta :
query [ ' meta ' ] = 1
2009-04-09 13:44:32 +02:00
if revision :
query [ ' rev ' ] = revision
2009-04-22 15:14:17 +02:00
else :
query [ ' rev ' ] = ' latest '
2009-04-09 10:21:12 +02:00
2009-04-09 13:44:32 +02:00
u = makeurl ( apiurl , [ ' source ' , prj , package ] , query = query )
2007-04-19 10:47:22 +02:00
f = http_GET ( u )
2006-06-26 17:11:22 +02:00
root = ET . parse ( f ) . getroot ( )
2007-06-26 15:17:38 +02:00
if not verbose :
2008-03-13 22:45:24 +01:00
return [ node . get ( ' name ' ) for node in root . findall ( ' entry ' ) ]
2007-06-26 15:17:38 +02:00
else :
l = [ ]
2009-08-20 21:28:05 +02:00
# rev = int(root.get('rev')) # don't force int. also allow srcmd5 here.
rev = root . get ( ' rev ' )
2008-03-13 22:45:24 +01:00
for node in root . findall ( ' entry ' ) :
2009-10-20 16:30:15 +02:00
f = File ( node . get ( ' name ' ) ,
node . get ( ' md5 ' ) ,
int ( node . get ( ' size ' ) ) ,
2007-06-26 15:17:38 +02:00
int ( node . get ( ' mtime ' ) ) )
f . rev = rev
l . append ( f )
return l
2006-04-20 16:26:50 +02:00
2010-05-25 14:53:20 +02:00
def meta_get_project_list ( apiurl , deleted = None ) :
2010-05-22 08:22:12 +02:00
query = { }
if deleted :
query [ ' deleted ' ] = 1
u = makeurl ( apiurl , [ ' source ' ] , query )
2007-04-19 10:47:22 +02:00
f = http_GET ( u )
2006-10-10 16:04:34 +02:00
root = ET . parse ( f ) . getroot ( )
2010-11-10 12:18:17 +01:00
return sorted ( [ node . get ( ' name ' ) for node in root if node . get ( ' name ' ) ] )
2006-04-20 16:26:50 +02:00
2006-05-19 22:13:29 +02:00
2007-05-04 23:51:54 +02:00
def show_project_meta ( apiurl , prj ) :
url = makeurl ( apiurl , [ ' source ' , prj , ' _meta ' ] )
2007-04-19 10:47:22 +02:00
f = http_GET ( url )
2006-04-20 16:26:50 +02:00
return f . readlines ( )
2007-06-26 15:17:38 +02:00
def show_project_conf ( apiurl , prj ) :
url = makeurl ( apiurl , [ ' source ' , prj , ' _config ' ] )
f = http_GET ( url )
return f . readlines ( )
2009-12-09 07:53:33 +01:00
def show_package_trigger_reason ( apiurl , prj , pac , repo , arch ) :
url = makeurl ( apiurl , [ ' build ' , prj , repo , arch , pac , ' _reason ' ] )
try :
f = http_GET ( url )
return f . read ( )
2013-04-09 14:03:17 +02:00
except HTTPError as e :
2009-12-09 07:53:33 +01:00
e . osc_msg = ' Error getting trigger reason for project \' %s \' package \' %s \' ' % ( prj , pac )
raise
2010-05-27 02:18:00 +02:00
def show_package_meta ( apiurl , prj , pac , meta = False ) :
2010-05-25 14:53:20 +02:00
query = { }
if meta :
query [ ' meta ' ] = 1
2013-09-16 17:19:15 +02:00
# The fake packages _project has no _meta file
if pac . startswith ( ' _project ' ) :
2010-05-25 14:53:20 +02:00
return " "
url = makeurl ( apiurl , [ ' source ' , prj , pac , ' _meta ' ] , query )
2006-07-05 14:09:09 +02:00
try :
2007-04-19 10:47:22 +02:00
f = http_GET ( url )
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
return f . readlines ( )
2013-04-09 14:03:17 +02:00
except HTTPError as e :
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
e . osc_msg = ' Error getting meta for project \' %s \' package \' %s \' ' % ( prj , pac )
2008-07-23 22:56:20 +02:00
raise
2006-04-20 16:26:50 +02:00
2007-05-04 23:51:54 +02:00
2009-10-30 11:18:44 +01:00
def show_attribute_meta ( apiurl , prj , pac , subpac , attribute , with_defaults , with_project ) :
2013-05-27 14:56:24 +02:00
path = [ ]
2009-10-30 10:40:46 +01:00
path . append ( ' source ' )
path . append ( prj )
if pac :
2010-02-27 20:11:15 +01:00
path . append ( pac )
2009-10-30 10:40:46 +01:00
if pac and subpac :
2010-02-27 20:11:15 +01:00
path . append ( subpac )
2009-10-30 10:40:46 +01:00
path . append ( ' _attribute ' )
if attribute :
2010-02-27 20:11:15 +01:00
path . append ( attribute )
2013-05-27 14:56:24 +02:00
query = [ ]
2009-10-30 11:18:44 +01:00
if with_defaults :
2010-02-27 20:11:15 +01:00
query . append ( " with_default=1 " )
2009-10-30 11:18:44 +01:00
if with_project :
2010-02-27 20:11:15 +01:00
query . append ( " with_project=1 " )
2009-10-30 11:18:44 +01:00
url = makeurl ( apiurl , path , query )
2009-10-30 10:40:46 +01:00
try :
f = http_GET ( url )
return f . readlines ( )
2013-04-09 14:03:17 +02:00
except HTTPError as e :
2009-10-30 10:40:46 +01:00
e . osc_msg = ' Error getting meta for project \' %s \' package \' %s \' ' % ( prj , pac )
raise
2013-10-07 13:12:58 +02:00
def show_devel_project ( apiurl , prj , pac ) :
2008-06-03 17:01:01 +02:00
m = show_package_meta ( apiurl , prj , pac )
2011-03-08 19:44:29 +01:00
node = ET . fromstring ( ' ' . join ( m ) ) . find ( ' devel ' )
2013-10-07 13:12:58 +02:00
if node is None :
return None , None
else :
return node . get ( ' project ' ) , node . get ( ' package ' , None )
2013-10-18 11:50:07 +02:00
def set_devel_project ( apiurl , prj , pac , devprj = None , devpac = None ) :
2013-10-07 13:12:58 +02:00
meta = show_package_meta ( apiurl , prj , pac )
root = ET . fromstring ( ' ' . join ( meta ) )
node = root . find ( ' devel ' )
if node is None :
2013-10-18 11:50:07 +02:00
if devprj is None :
return
2013-10-07 13:12:58 +02:00
node = ET . Element ( ' devel ' )
root . append ( node )
else :
2013-10-18 11:50:07 +02:00
if devprj is None :
root . remove ( node )
else :
node . clear ( )
if devprj :
node . set ( ' project ' , devprj )
if devpac :
node . set ( ' package ' , devpac )
2013-10-07 13:12:58 +02:00
url = makeurl ( apiurl , [ ' source ' , prj , pac , ' _meta ' ] )
mf = metafile ( url , ET . tostring ( root , encoding = ET_ENCODING ) )
mf . sync ( )
2008-06-03 17:01:01 +02:00
2010-07-12 14:56:08 +02:00
def show_package_disabled_repos ( apiurl , prj , pac ) :
m = show_package_meta ( apiurl , prj , pac )
2010-07-29 17:45:13 +02:00
#FIXME: don't work if all repos of a project are disabled and only some are enabled since <disable/> is empty
2010-07-12 14:56:08 +02:00
try :
root = ET . fromstring ( ' ' . join ( m ) )
elm = root . find ( ' build ' )
r = [ node . get ( ' repository ' ) for node in elm . findall ( ' disable ' ) ]
return r
except :
return None
2007-07-19 12:08:42 +02:00
def show_pattern_metalist ( apiurl , prj ) :
url = makeurl ( apiurl , [ ' source ' , prj , ' _pattern ' ] )
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
try :
f = http_GET ( url )
tree = ET . parse ( f )
2013-04-09 14:03:17 +02:00
except HTTPError as e :
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
e . osc_msg = ' show_pattern_metalist: Error getting pattern list for project \' %s \' ' % prj
raise
2013-04-09 11:34:46 +02:00
r = sorted ( [ node . get ( ' name ' ) for node in tree . getroot ( ) ] )
2007-07-19 12:08:42 +02:00
return r
def show_pattern_meta ( apiurl , prj , pattern ) :
url = makeurl ( apiurl , [ ' source ' , prj , ' _pattern ' , pattern ] )
try :
f = http_GET ( url )
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
return f . readlines ( )
2013-04-09 14:03:17 +02:00
except HTTPError as e :
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
e . osc_msg = ' show_pattern_meta: Error getting pattern \' %s \' for project \' %s \' ' % ( pattern , prj )
raise
2007-07-19 12:08:42 +02:00
2007-01-12 04:52:13 +01:00
class metafile :
""" metafile that can be manipulated and is stored back after manipulation. """
2008-05-20 11:23:57 +02:00
def __init__ ( self , url , input , change_is_required = False , file_ext = ' .xml ' ) :
2007-01-12 04:52:13 +01:00
import tempfile
2006-05-19 22:13:29 +02:00
2007-07-16 18:20:09 +02:00
self . url = url
2007-01-12 04:52:13 +01:00
self . change_is_required = change_is_required
2009-10-24 14:47:21 +02:00
( fd , self . filename ) = tempfile . mkstemp ( prefix = ' osc_metafile. ' , suffix = file_ext )
2007-01-12 04:52:13 +01:00
f = os . fdopen ( fd , ' w ' )
2007-07-16 18:20:09 +02:00
f . write ( ' ' . join ( input ) )
2007-01-12 04:52:13 +01:00
f . close ( )
2007-07-13 18:01:02 +02:00
self . hash_orig = dgst ( self . filename )
2006-05-23 17:27:43 +02:00
2007-01-12 04:52:13 +01:00
def sync ( self ) :
2010-08-20 14:34:41 +02:00
if self . change_is_required and self . hash_orig == dgst ( self . filename ) :
2013-04-09 12:51:28 +02:00
print ( ' File unchanged. Not saving. ' )
2007-01-12 04:52:13 +01:00
os . unlink ( self . filename )
2010-02-22 15:43:02 +01:00
return
2006-05-23 17:27:43 +02:00
2013-04-09 12:51:28 +02:00
print ( ' Sending meta data... ' )
2008-05-20 18:03:08 +02:00
# don't do any exception handling... it's up to the caller what to do in case
# of an exception
http_PUT ( self . url , file = self . filename )
os . unlink ( self . filename )
2013-04-09 12:51:28 +02:00
print ( ' Done. ' )
2009-06-19 10:32:56 +02:00
2009-06-19 10:56:33 +02:00
def edit ( self ) :
2010-02-11 21:22:07 +01:00
try :
2013-04-09 11:34:46 +02:00
while True :
2010-04-28 11:49:31 +02:00
run_editor ( self . filename )
2009-06-19 10:56:33 +02:00
try :
self . sync ( )
2010-02-11 21:22:07 +01:00
break
2013-04-09 14:03:17 +02:00
except HTTPError as e :
2009-06-19 10:56:33 +02:00
error_help = " %d " % e . code
if e . headers . get ( ' X-Opensuse-Errorcode ' ) :
error_help = " %s ( %d ) " % ( e . headers . get ( ' X-Opensuse-Errorcode ' ) , e . code )
2013-04-09 12:51:28 +02:00
print ( ' BuildService API error: ' , error_help , file = sys . stderr )
2009-06-19 10:56:33 +02:00
# examine the error - we can't raise an exception because we might want
# to try again
data = e . read ( )
if ' <summary> ' in data :
2013-04-09 12:51:28 +02:00
print ( data . split ( ' <summary> ' ) [ 1 ] . split ( ' </summary> ' ) [ 0 ] , file = sys . stderr )
2010-08-20 14:34:41 +02:00
ri = raw_input ( ' Try again? ([y/N]): ' )
if ri not in [ ' y ' , ' Y ' ] :
2009-06-19 10:56:33 +02:00
break
2010-02-11 21:22:07 +01:00
finally :
self . discard ( )
2009-06-19 10:56:33 +02:00
2009-06-19 10:32:56 +02:00
def discard ( self ) :
if os . path . exists ( self . filename ) :
2013-04-09 12:51:28 +02:00
print ( ' discarding %s ' % self . filename )
2009-06-19 10:32:56 +02:00
os . unlink ( self . filename )
2009-10-20 16:30:15 +02:00
2007-07-13 18:01:02 +02:00
# different types of metadata
metatypes = { ' prj ' : { ' path ' : ' source/ %s /_meta ' ,
' template ' : new_project_templ ,
2008-05-20 11:23:57 +02:00
' file_ext ' : ' .xml '
2007-07-13 18:01:02 +02:00
} ,
' pkg ' : { ' path ' : ' source/ %s / %s /_meta ' ,
' template ' : new_package_templ ,
2008-05-20 11:23:57 +02:00
' file_ext ' : ' .xml '
2007-07-13 18:01:02 +02:00
} ,
2009-10-30 10:40:46 +01:00
' attribute ' : { ' path ' : ' source/ %s / %s /_meta ' ,
' template ' : new_attribute_templ ,
' file_ext ' : ' .xml '
} ,
2007-07-13 18:01:02 +02:00
' prjconf ' : { ' path ' : ' source/ %s /_config ' ,
' template ' : ' ' ,
2008-05-20 11:23:57 +02:00
' file_ext ' : ' .txt '
2007-07-13 18:01:02 +02:00
} ,
' user ' : { ' path ' : ' person/ %s ' ,
' template ' : new_user_template ,
2008-05-20 11:23:57 +02:00
' file_ext ' : ' .xml '
2007-07-13 18:01:02 +02:00
} ,
2007-07-19 12:08:42 +02:00
' pattern ' : { ' path ' : ' source/ %s /_pattern/ %s ' ,
' template ' : new_pattern_template ,
2008-05-20 11:23:57 +02:00
' file_ext ' : ' .xml '
2007-07-19 12:08:42 +02:00
} ,
2007-07-13 18:01:02 +02:00
}
2007-07-23 18:03:30 +02:00
def meta_exists ( metatype ,
path_args = None ,
template_args = None ,
2008-02-18 14:44:20 +01:00
create_new = True ,
apiurl = None ) :
2007-07-23 18:03:30 +02:00
2010-08-31 14:43:43 +02:00
global metatypes
2008-02-18 14:44:20 +01:00
if not apiurl :
apiurl = conf . config [ ' apiurl ' ]
url = make_meta_url ( metatype , path_args , apiurl )
2007-07-23 18:03:30 +02:00
try :
data = http_GET ( url ) . readlines ( )
2013-04-09 14:03:17 +02:00
except HTTPError as e :
2008-05-20 18:03:08 +02:00
if e . code == 404 and create_new :
data = metatypes [ metatype ] [ ' template ' ]
if template_args :
2009-12-25 14:02:04 +01:00
data = StringIO ( data % template_args ) . readlines ( )
2007-07-23 18:03:30 +02:00
else :
2008-05-20 18:03:08 +02:00
raise e
2011-03-30 14:12:59 +02:00
2007-08-04 23:11:31 +02:00
return data
2007-07-16 18:20:09 +02:00
2012-12-06 14:07:02 +01:00
def make_meta_url ( metatype , path_args = None , apiurl = None , force = False , remove_linking_repositories = False ) :
2010-08-31 14:43:43 +02:00
global metatypes
2008-02-18 14:44:20 +01:00
if not apiurl :
apiurl = conf . config [ ' apiurl ' ]
2007-07-16 18:20:09 +02:00
if metatype not in metatypes . keys ( ) :
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
raise AttributeError ( ' make_meta_url(): Unknown meta type \' %s \' ' % metatype )
2007-07-13 18:01:02 +02:00
path = metatypes [ metatype ] [ ' path ' ]
2007-07-23 18:03:30 +02:00
2007-07-13 18:01:02 +02:00
if path_args :
path = path % path_args
2011-03-16 10:20:38 +01:00
query = { }
if force :
query = { ' force ' : ' 1 ' }
2012-12-06 14:07:02 +01:00
if remove_linking_repositories :
query [ ' remove_linking_repositories ' ] = ' 1 '
2011-03-16 10:20:38 +01:00
return makeurl ( apiurl , [ path ] , query )
2007-07-23 18:03:30 +02:00
2009-10-20 16:30:15 +02:00
def edit_meta ( metatype ,
path_args = None ,
data = None ,
template_args = None ,
2007-07-23 18:03:30 +02:00
edit = False ,
2011-03-16 10:20:38 +01:00
force = False ,
2012-12-06 14:07:02 +01:00
remove_linking_repositories = False ,
2008-03-10 19:04:23 +01:00
change_is_required = False ,
apiurl = None ) :
2006-05-23 17:27:43 +02:00
2010-08-31 14:43:43 +02:00
global metatypes
2008-03-10 19:04:23 +01:00
if not apiurl :
apiurl = conf . config [ ' apiurl ' ]
2007-07-16 18:20:09 +02:00
if not data :
2007-07-23 18:03:30 +02:00
data = meta_exists ( metatype ,
path_args ,
template_args ,
2010-01-07 19:11:02 +01:00
create_new = metatype != ' prjconf ' , # prjconf always exists, 404 => unknown prj
2008-03-10 19:04:23 +01:00
apiurl = apiurl )
2007-07-16 18:20:09 +02:00
if edit :
change_is_required = True
2012-12-06 14:07:02 +01:00
url = make_meta_url ( metatype , path_args , apiurl , force , remove_linking_repositories )
2013-05-27 14:56:24 +02:00
f = metafile ( url , data , change_is_required , metatypes [ metatype ] [ ' file_ext ' ] )
2007-07-16 18:20:09 +02:00
if edit :
2009-06-19 10:56:33 +02:00
f . edit ( )
2007-07-16 18:20:09 +02:00
else :
f . sync ( )
2006-05-23 17:27:43 +02:00
2007-06-26 15:17:38 +02:00
2010-09-03 14:51:20 +02:00
def show_files_meta ( apiurl , prj , pac , revision = None , expand = False , linkrev = None , linkrepair = False , meta = False ) :
2009-04-22 15:14:17 +02:00
query = { }
2007-07-04 14:55:26 +02:00
if revision :
2009-04-22 15:14:17 +02:00
query [ ' rev ' ] = revision
else :
query [ ' rev ' ] = ' latest '
2009-04-21 18:52:26 +02:00
if linkrev :
2009-04-22 15:14:17 +02:00
query [ ' linkrev ' ] = linkrev
2009-12-17 17:16:56 +01:00
elif conf . config [ ' linkcontrol ' ] :
query [ ' linkrev ' ] = ' base '
2010-05-22 08:22:12 +02:00
if meta :
query [ ' meta ' ] = 1
2009-04-21 18:52:26 +02:00
if expand :
2009-04-22 15:14:17 +02:00
query [ ' expand ' ] = 1
2009-04-21 18:52:26 +02:00
if linkrepair :
2009-04-22 15:14:17 +02:00
query [ ' emptylink ' ] = 1
2007-07-04 14:55:26 +02:00
f = http_GET ( makeurl ( apiurl , [ ' source ' , prj , pac ] , query = query ) )
2010-09-03 14:51:20 +02:00
return f . read ( )
2006-05-19 22:13:29 +02:00
2011-05-23 15:26:13 +02:00
def show_upstream_srcmd5 ( apiurl , prj , pac , expand = False , revision = None , meta = False , include_service_files = False ) :
2010-05-25 13:59:46 +02:00
m = show_files_meta ( apiurl , prj , pac , expand = expand , revision = revision , meta = meta )
2011-05-23 15:26:13 +02:00
et = ET . fromstring ( ' ' . join ( m ) )
if include_service_files :
try :
2013-10-18 14:58:18 +02:00
sinfo = et . find ( ' serviceinfo ' )
2014-01-21 18:08:36 +01:00
if sinfo != None and sinfo . get ( ' xsrcmd5 ' ) and not sinfo . get ( ' error ' ) :
2013-10-18 14:58:18 +02:00
return sinfo . get ( ' xsrcmd5 ' )
2011-05-23 15:26:13 +02:00
except :
pass
return et . get ( ' srcmd5 ' )
2008-03-13 00:37:35 +01:00
2011-05-23 15:26:13 +02:00
def show_upstream_xsrcmd5 ( apiurl , prj , pac , revision = None , linkrev = None , linkrepair = False , meta = False , include_service_files = False ) :
m = show_files_meta ( apiurl , prj , pac , revision = revision , linkrev = linkrev , linkrepair = linkrepair , meta = meta , expand = include_service_files )
et = ET . fromstring ( ' ' . join ( m ) )
if include_service_files :
return et . get ( ' srcmd5 ' )
2008-03-24 21:24:49 +01:00
try :
# only source link packages have a <linkinfo> element.
2011-05-23 15:26:13 +02:00
li_node = et . find ( ' linkinfo ' )
2008-03-24 21:24:49 +01:00
except :
return None
2008-07-16 17:14:57 +02:00
li = Linkinfo ( )
li . read ( li_node )
if li . haserror ( ) :
2009-05-15 21:08:14 +02:00
raise oscerr . LinkExpandError ( prj , pac , li . error )
2009-04-21 18:52:26 +02:00
return li . xsrcmd5
2008-07-16 17:14:57 +02:00
2008-03-24 21:24:49 +01:00
2012-03-02 15:44:15 +01:00
def show_upstream_rev_vrev ( apiurl , prj , pac , revision = None , expand = False , linkrev = None , meta = False ) :
m = show_files_meta ( apiurl , prj , pac , revision = revision , expand = expand , linkrev = linkrev , meta = meta )
et = ET . fromstring ( ' ' . join ( m ) )
return et . get ( ' rev ' ) , et . get ( ' vrev ' )
2011-05-23 15:26:13 +02:00
def show_upstream_rev ( apiurl , prj , pac , revision = None , expand = False , linkrev = None , meta = False , include_service_files = False ) :
2011-03-17 18:18:01 +01:00
m = show_files_meta ( apiurl , prj , pac , revision = revision , expand = expand , linkrev = linkrev , meta = meta )
2011-05-23 15:26:13 +02:00
et = ET . fromstring ( ' ' . join ( m ) )
if include_service_files :
try :
2013-10-18 14:58:18 +02:00
sinfo = et . find ( ' serviceinfo ' )
2014-01-21 18:08:36 +01:00
if sinfo != None and sinfo . get ( ' xsrcmd5 ' ) and not sinfo . get ( ' error ' ) :
2013-10-18 14:58:18 +02:00
return sinfo . get ( ' xsrcmd5 ' )
2011-05-23 15:26:13 +02:00
except :
pass
return et . get ( ' rev ' )
2006-06-06 12:50:40 +02:00
2007-07-23 18:03:30 +02:00
def read_meta_from_spec ( specfile , * args ) :
2011-10-18 03:03:42 +02:00
import codecs , re
2007-07-23 18:03:30 +02:00
"""
Read tags and sections from spec file . To read out
2008-08-03 21:36:07 +02:00
a tag the passed argument mustn ' t end with a colon. To
2007-07-23 18:03:30 +02:00
read out a section the passed argument must start with
a ' % ' .
This method returns a dictionary which contains the
requested data .
"""
2006-05-19 22:13:29 +02:00
if not os . path . isfile ( specfile ) :
2010-09-02 10:23:37 +02:00
raise oscerr . OscIOError ( None , ' \' %s \' is not a regular file ' % specfile )
2006-05-19 22:13:29 +02:00
2007-07-11 23:14:58 +02:00
try :
lines = codecs . open ( specfile , ' r ' , locale . getpreferredencoding ( ) ) . readlines ( )
except UnicodeDecodeError :
lines = open ( specfile ) . readlines ( )
2006-06-26 17:11:22 +02:00
2007-07-23 18:03:30 +02:00
tags = [ ]
sections = [ ]
spec_data = { }
for itm in args :
2008-08-03 21:36:07 +02:00
if itm . startswith ( ' % ' ) :
2007-07-23 18:03:30 +02:00
sections . append ( itm )
else :
2008-08-03 21:36:07 +02:00
tags . append ( itm )
2007-07-23 18:03:30 +02:00
2008-08-03 21:36:07 +02:00
tag_pat = ' (?P<tag>^ %s ) \ s*: \ s*(?P<val>.*) '
2007-07-23 18:03:30 +02:00
for tag in tags :
2008-08-03 21:36:07 +02:00
m = re . compile ( tag_pat % tag , re . I | re . M ) . search ( ' ' . join ( lines ) )
if m and m . group ( ' val ' ) :
spec_data [ tag ] = m . group ( ' val ' ) . strip ( )
2007-07-23 18:03:30 +02:00
2009-01-09 12:04:51 +01:00
section_pat = ' ^ %s \ s*?$ '
2007-07-23 18:03:30 +02:00
for section in sections :
2008-08-03 21:36:07 +02:00
m = re . compile ( section_pat % section , re . I | re . M ) . search ( ' ' . join ( lines ) )
if m :
2009-01-09 12:04:51 +01:00
start = lines . index ( m . group ( ) + ' \n ' ) + 1
2007-07-23 18:03:30 +02:00
data = [ ]
for line in lines [ start : ] :
if line . startswith ( ' % ' ) :
break
data . append ( line )
spec_data [ section ] = data
return spec_data
2006-05-19 22:13:29 +02:00
2010-06-09 14:20:48 +02:00
def get_default_editor ( ) :
import platform
system = platform . system ( )
if system == ' Windows ' :
return ' notepad '
if system == ' Linux ' :
try :
# Python 2.6
2010-06-09 14:48:11 +02:00
dist = platform . linux_distribution ( ) [ 0 ]
2010-06-09 14:20:48 +02:00
except AttributeError :
dist = platform . dist ( ) [ 0 ]
if dist == ' debian ' :
return ' editor '
2010-07-14 17:28:48 +02:00
elif dist == ' fedora ' :
2010-07-01 14:48:15 +02:00
return ' vi '
2010-06-09 14:20:48 +02:00
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
2010-06-09 14:48:11 +02:00
dist = platform . linux_distribution ( ) [ 0 ]
2010-06-09 14:20:48 +02:00
except AttributeError :
dist = platform . dist ( ) [ 0 ]
if dist == ' debian ' :
return ' pager '
return ' less '
return ' more '
2011-04-24 00:27:47 +02:00
def run_pager ( message , tmp_suffix = ' ' ) :
2010-05-09 21:47:21 +02:00
import tempfile , sys
2010-05-03 10:05:36 +02:00
2010-09-10 17:28:45 +02:00
if not message :
return
2010-05-09 21:47:21 +02:00
if not sys . stdout . isatty ( ) :
2013-04-09 12:51:28 +02:00
print ( message )
2010-05-09 21:47:21 +02:00
else :
2011-04-24 00:27:47 +02:00
tmpfile = tempfile . NamedTemporaryFile ( suffix = tmp_suffix )
2010-05-09 21:47:21 +02:00
tmpfile . write ( message )
tmpfile . flush ( )
2010-06-09 14:22:46 +02:00
pager = os . getenv ( ' PAGER ' , default = get_default_pager ( ) )
2010-07-08 21:43:39 +02:00
try :
2013-03-08 00:56:57 +01:00
run_external ( pager , tmpfile . name )
2010-07-08 21:43:39 +02:00
finally :
tmpfile . close ( )
2010-05-03 10:05:36 +02:00
2010-04-28 11:49:31 +02:00
def run_editor ( filename ) :
2013-08-03 19:34:47 +02:00
cmd = _editor_command ( )
cmd . append ( filename )
return run_external ( cmd [ 0 ] , * cmd [ 1 : ] )
def _editor_command ( ) :
2010-06-09 14:22:46 +02:00
editor = os . getenv ( ' EDITOR ' , default = get_default_editor ( ) )
2013-08-03 19:23:25 +02:00
try :
cmd = shlex . split ( editor )
except SyntaxError :
cmd = editor . split ( )
2013-08-03 19:34:47 +02:00
return cmd
2006-05-19 22:13:29 +02:00
2013-03-08 17:17:45 +01:00
def _edit_message_open_editor ( filename , data , orig_mtime ) :
# FIXME: import modules globally
import tempfile
2013-08-03 19:34:47 +02:00
editor = _editor_command ( )
2013-03-08 17:17:45 +01:00
mtime = os . stat ( filename ) . st_mtime
if mtime == orig_mtime :
# prepare file for editors
if editor [ 0 ] in ( ' vi ' , ' vim ' ) :
with tempfile . NamedTemporaryFile ( ) as f :
f . write ( data )
f . flush ( )
editor . extend ( [ ' -c ' , ' :r %s ' % f . name , filename ] )
run_external ( editor [ 0 ] , * editor [ 1 : ] )
else :
with open ( filename , ' w ' ) as f :
f . write ( data )
orig_mtime = os . stat ( filename ) . st_mtime
run_editor ( filename )
else :
run_editor ( filename )
return os . stat ( filename ) . st_mtime != orig_mtime
2010-05-09 21:36:51 +02:00
def edit_message ( footer = ' ' , template = ' ' , templatelen = 30 ) :
2008-05-21 15:44:49 +02:00
import tempfile
2013-03-08 17:17:45 +01:00
delim = ' --This line, and those below, will be ignored-- \n '
data = ' '
2009-04-28 09:15:57 +02:00
if template != ' ' :
2010-05-09 21:36:51 +02:00
if not templatelen is None :
lines = template . splitlines ( )
2013-03-08 17:17:45 +01:00
data = ' \n ' . join ( lines [ : templatelen ] )
2010-05-09 21:36:51 +02:00
if lines [ templatelen : ] :
footer = ' %s \n \n %s ' % ( ' \n ' . join ( lines [ templatelen : ] ) , footer )
2013-03-08 17:17:45 +01:00
data + = ' \n ' + delim + ' \n ' + footer
2010-02-11 21:22:07 +01:00
try :
2013-03-08 17:17:45 +01:00
( fd , filename ) = tempfile . mkstemp ( prefix = ' osc-commitmsg ' , suffix = ' .diff ' )
os . close ( fd )
mtime = os . stat ( filename ) . st_mtime
2013-04-09 11:34:46 +02:00
while True :
2013-03-08 17:17:45 +01:00
file_changed = _edit_message_open_editor ( filename , data , mtime )
2010-02-11 21:22:07 +01:00
msg = open ( filename ) . read ( ) . split ( delim ) [ 0 ] . rstrip ( )
2013-03-08 17:17:45 +01:00
if msg and file_changed :
2010-02-11 12:46:20 +01:00
break
2010-02-11 21:22:07 +01:00
else :
2013-02-13 11:42:34 +01:00
reason = ' Log message not specified '
if template and template == msg :
2013-03-06 17:33:32 +01:00
reason = ' Default log message was not changed. Press \' c \' to continue. '
2013-02-13 11:42:34 +01:00
ri = raw_input ( ' %s \n a)bort, c)ontinue, e)dit: ' % reason )
2010-08-20 14:34:41 +02:00
if ri in ' aA ' :
2010-02-11 21:22:07 +01:00
raise oscerr . UserAbort ( )
2010-08-20 14:34:41 +02:00
elif ri in ' cC ' :
2010-02-11 21:22:07 +01:00
break
2010-08-20 14:34:41 +02:00
elif ri in ' eE ' :
2010-02-11 21:22:07 +01:00
pass
finally :
os . unlink ( filename )
2010-02-11 12:46:20 +01:00
return msg
2010-10-26 15:34:32 +02:00
def clone_request ( apiurl , reqid , msg = None ) :
query = { ' cmd ' : ' branch ' , ' request ' : reqid }
url = makeurl ( apiurl , [ ' source ' ] , query )
r = http_POST ( url , data = msg )
2011-01-29 23:14:19 +01:00
root = ET . fromstring ( r . read ( ) )
project = None
for i in root . findall ( ' data ' ) :
if i . get ( ' name ' ) == ' targetproject ' :
project = i . text . strip ( )
if not project :
2013-04-10 11:34:59 +02:00
raise oscerr . APIError ( ' invalid data from clone request: \n %s \n ' % ET . tostring ( root , encoding = ET_ENCODING ) )
2011-01-29 23:14:19 +01:00
return project
2009-06-02 15:14:46 +02:00
2011-03-07 19:45:44 +01:00
# create a maintenance release request
def create_release_request ( apiurl , src_project , message = ' ' ) :
import cgi
r = Request ( )
# api will complete the request
r . add_action ( ' maintenance_release ' , src_project = src_project )
# XXX: clarify why we need the unicode(...) stuff
r . description = cgi . escape ( unicode ( message , ' utf8 ' ) )
r . create ( apiurl )
return r
2011-03-07 11:46:51 +01:00
# create a maintenance incident per request
2012-02-15 17:08:06 +01:00
def create_maintenance_request ( apiurl , src_project , src_packages , tgt_project , tgt_releaseproject , opt_sourceupdate , message = ' ' ) :
2011-03-07 11:46:51 +01:00
import cgi
2011-03-07 13:03:34 +01:00
r = Request ( )
2012-01-19 11:36:57 +01:00
if src_packages :
for p in src_packages :
2013-05-27 14:26:58 +02:00
r . add_action ( ' maintenance_incident ' , src_project = src_project , src_package = p , tgt_project = tgt_project , tgt_releaseproject = tgt_releaseproject , opt_sourceupdate = opt_sourceupdate )
2012-01-19 11:36:57 +01:00
else :
2012-02-15 17:08:06 +01:00
r . add_action ( ' maintenance_incident ' , src_project = src_project , tgt_project = tgt_project , tgt_releaseproject = tgt_releaseproject , opt_sourceupdate = opt_sourceupdate )
2011-03-07 13:03:34 +01:00
# XXX: clarify why we need the unicode(...) stuff
r . description = cgi . escape ( unicode ( message , ' utf8 ' ) )
2012-03-15 12:44:38 +01:00
r . create ( apiurl , addrevision = True )
2011-03-07 13:03:34 +01:00
return r
2011-03-07 11:46:51 +01:00
2009-11-13 09:58:37 +01:00
# This creates an old style submit request for server api 1.0
2009-10-20 16:30:15 +02:00
def create_submit_request ( apiurl ,
2012-01-23 14:12:17 +01:00
src_project , src_package = None ,
2009-11-13 09:58:37 +01:00
dst_project = None , dst_package = None ,
2011-03-04 09:04:18 +01:00
message = " " , orev = None , src_update = None ) :
2008-03-05 00:41:00 +01:00
2008-03-06 11:25:45 +01:00
import cgi
2013-05-27 14:56:24 +02:00
options_block = " "
package = " "
2012-01-24 12:03:34 +01:00
if src_package :
2013-05-27 14:56:24 +02:00
package = """ package= " %s " """ % ( src_package )
2009-09-10 10:48:44 +02:00
if src_update :
2013-05-27 14:56:24 +02:00
options_block = """ <options><sourceupdate> %s </sourceupdate></options> """ % ( src_update )
2009-09-05 15:46:55 +02:00
2009-11-13 09:58:37 +01:00
# Yes, this kind of xml construction is horrible
targetxml = " "
if dst_project :
2010-02-27 20:11:15 +01:00
packagexml = " "
if dst_package :
2013-05-27 14:56:24 +02:00
packagexml = """ package= " %s " """ % ( dst_package )
targetxml = """ <target project= " %s " %s /> """ % ( dst_project , packagexml )
2009-06-02 15:14:46 +02:00
# XXX: keep the old template for now in order to work with old obs instances
2008-03-05 00:41:00 +01:00
xml = """ \
2008-03-20 20:17:40 +01:00
< request type = " submit " >
< submit >
2012-01-23 14:12:17 +01:00
< source project = " %s " % s rev = " %s " / >
2009-11-13 09:58:37 +01:00
% s
2009-09-10 10:48:44 +02:00
% s
2008-03-20 20:17:40 +01:00
< / submit >
2008-03-05 00:41:00 +01:00
< state name = " new " / >
< description > % s < / description >
< / request >
2009-10-20 16:30:15 +02:00
""" % (src_project,
2012-01-23 14:12:17 +01:00
package ,
2009-06-02 15:14:46 +02:00
orev or show_upstream_rev ( apiurl , src_project , src_package ) ,
2009-11-13 09:58:37 +01:00
targetxml ,
2009-09-10 10:48:44 +02:00
options_block ,
2011-03-07 18:16:10 +01:00
cgi . escape ( message ) )
# Don't do cgi.escape(unicode(message, "utf8"))) above.
# Promoting the string to utf8, causes the post to explode with:
# uncaught exception: Fatal error: Start tag expected, '<' not found at :1.
# I guess, my original workaround was not that bad.
2008-03-05 00:41:00 +01:00
2008-04-02 16:07:40 +02:00
u = makeurl ( apiurl , [ ' request ' ] , query = ' cmd=create ' )
2012-02-08 15:56:03 +01:00
r = None
2012-01-23 14:12:17 +01:00
try :
f = http_POST ( u , data = xml )
root = ET . parse ( f ) . getroot ( )
r = root . get ( ' id ' )
2013-04-09 14:03:17 +02:00
except HTTPError as e :
2012-01-23 14:12:17 +01:00
if e . headers . get ( ' X-Opensuse-Errorcode ' ) == " submit_request_rejected " :
2013-04-09 12:51:28 +02:00
print ( " WARNING: " )
print ( " WARNING: Project does not accept submit request, request to open a NEW maintenance incident instead " )
print ( " WARNING: " )
2012-02-21 10:51:34 +01:00
xpath = ' maintenance/maintains/@project = \' %s \' ' % dst_project
res = search ( apiurl , project_id = xpath )
root = res [ ' project_id ' ]
project = root . find ( ' project ' )
if project is None :
2012-03-12 14:49:53 +01:00
raise oscerr . APIError ( " Server did not define a default maintenance project, can ' t submit. " )
2012-02-21 10:51:34 +01:00
tproject = project . get ( ' name ' )
r = create_maintenance_request ( apiurl , src_project , [ src_package ] , tproject , dst_project , src_update , message )
2012-01-24 11:51:22 +01:00
else :
2012-02-21 10:51:34 +01:00
raise
2008-03-05 00:41:00 +01:00
2012-01-23 14:12:17 +01:00
return r
2008-03-05 00:41:00 +01:00
2009-06-02 15:14:46 +02:00
def get_request ( apiurl , reqid ) :
2008-03-05 00:41:00 +01:00
u = makeurl ( apiurl , [ ' request ' , reqid ] )
f = http_GET ( u )
root = ET . parse ( f ) . getroot ( )
2009-06-02 15:14:46 +02:00
r = Request ( )
2008-03-05 00:41:00 +01:00
r . read ( root )
return r
2011-01-23 21:21:32 +01:00
def change_review_state ( apiurl , reqid , newstate , by_user = ' ' , by_group = ' ' , by_project = ' ' , by_package = ' ' , message = ' ' , supersed = None ) :
2011-04-26 17:18:49 +02:00
query = { ' cmd ' : ' changereviewstate ' , ' newstate ' : newstate }
if by_user :
query [ ' by_user ' ] = by_user
2010-12-15 14:31:18 +01:00
if by_group :
query [ ' by_group ' ] = by_group
2011-01-23 21:21:32 +01:00
if by_project :
query [ ' by_project ' ] = by_project
if by_package :
query [ ' by_package ' ] = by_package
2010-12-21 14:17:12 +01:00
if supersed :
query [ ' superseded_by ' ] = supersed
2010-12-15 14:31:18 +01:00
u = makeurl ( apiurl , [ ' request ' , reqid ] , query = query )
2009-11-17 17:59:17 +01:00
f = http_POST ( u , data = message )
2010-02-26 09:55:58 +01:00
root = ET . parse ( f ) . getroot ( )
2011-02-22 17:52:12 +01:00
return root . get ( ' code ' )
2009-11-17 17:59:17 +01:00
2011-02-08 16:16:18 +01:00
def change_request_state ( apiurl , reqid , newstate , message = ' ' , supersed = None , force = False ) :
2013-05-27 14:56:24 +02:00
query = { ' cmd ' : ' changestate ' , ' newstate ' : newstate }
2010-12-21 14:17:12 +01:00
if supersed :
query [ ' superseded_by ' ] = supersed
2011-02-08 16:16:18 +01:00
if force :
query [ ' force ' ] = " 1 "
2009-10-20 16:30:15 +02:00
u = makeurl ( apiurl ,
2010-12-21 14:17:12 +01:00
[ ' request ' , reqid ] , query = query )
2008-03-06 11:25:45 +01:00
f = http_POST ( u , data = message )
2010-08-18 16:17:34 +02:00
r = f . read ( )
if r . startswith ( ' <status code= " ' ) :
r = r . split ( ' <status code= " ' ) [ 1 ]
r = r . split ( ' " /> ' ) [ 0 ]
return r
2008-03-06 11:25:45 +01:00
2010-11-14 18:32:02 +01:00
def change_request_state_template ( req , newstate ) :
if not len ( req . actions ) :
return ' '
action = req . actions [ 0 ]
tmpl_name = ' %s request_ %s _template ' % ( action . type , newstate )
tmpl = conf . config . get ( tmpl_name , ' ' )
tmpl = tmpl . replace ( ' \\ t ' , ' \t ' ) . replace ( ' \\ n ' , ' \n ' )
data = { ' reqid ' : req . reqid , ' type ' : action . type , ' who ' : req . get_creator ( ) }
if req . actions [ 0 ] . type == ' submit ' :
data . update ( { ' src_project ' : action . src_project ,
' src_package ' : action . src_package , ' src_rev ' : action . src_rev ,
2010-12-30 21:02:42 +01:00
' dst_project ' : action . tgt_project , ' dst_package ' : action . tgt_package ,
2010-12-30 20:58:00 +01:00
' tgt_project ' : action . tgt_project , ' tgt_package ' : action . tgt_package } )
2010-11-14 18:32:02 +01:00
try :
return tmpl % data
2013-04-09 11:27:02 +02:00
except KeyError as e :
2013-04-09 12:51:28 +02:00
print ( ' error: cannot interpolate \' %s \' in \' %s \' ' % ( e . args [ 0 ] , tmpl_name ) , file = sys . stderr )
2010-11-14 18:32:02 +01:00
return ' '
2011-01-23 21:21:32 +01:00
def get_review_list ( apiurl , project = ' ' , package = ' ' , byuser = ' ' , bygroup = ' ' , byproject = ' ' , bypackage = ' ' , states = ( ' new ' ) ) :
2012-04-03 19:19:54 +02:00
# this is so ugly...
def build_by ( xpath , val ) :
if ' all ' in states :
return xpath_join ( xpath , ' review/ %s ' % val , op = ' and ' )
elif states :
s_xp = ' '
for state in states :
s_xp = xpath_join ( s_xp , ' @state= \' %s \' ' % state , inner = True )
val = val . strip ( ' [ ' ) . strip ( ' ] ' )
return xpath_join ( xpath , ' review[ %s and ( %s )] ' % ( val , s_xp ) , op = ' and ' )
return ' '
2010-07-29 13:45:44 +02:00
xpath = ' '
xpath = xpath_join ( xpath , ' state/@name= \' review \' ' , inner = True )
if not ' all ' in states :
for state in states :
xpath = xpath_join ( xpath , ' review/@state= \' %s \' ' % state , inner = True )
2012-04-03 19:19:54 +02:00
if byuser or bygroup or bypackage or byproject :
# discard constructed xpath...
2012-04-27 00:27:31 +02:00
xpath = xpath_join ( ' ' , ' state/@name= \' review \' ' , inner = True )
2011-01-23 21:21:32 +01:00
if byuser :
2012-04-03 19:19:54 +02:00
xpath = build_by ( xpath , ' @by_user= \' %s \' ' % byuser )
2011-01-23 21:21:32 +01:00
if bygroup :
2012-04-03 19:19:54 +02:00
xpath = build_by ( xpath , ' @by_group= \' %s \' ' % bygroup )
2011-01-23 21:21:32 +01:00
if bypackage :
2012-04-03 19:19:54 +02:00
xpath = build_by ( xpath , ' @by_project= \' %s \' and @by_package= \' %s \' ' % ( byproject , bypackage ) )
2011-01-23 21:21:32 +01:00
elif byproject :
2012-04-03 19:19:54 +02:00
xpath = build_by ( xpath , ' @by_project= \' %s \' ' % byproject )
2010-07-29 13:45:44 +02:00
# XXX: we cannot use the '|' in the xpath expression because it is not supported
# in the backend
todo = { }
if project :
todo [ ' project ' ] = project
if package :
todo [ ' package ' ] = package
2013-04-09 11:25:19 +02:00
for kind , val in todo . items ( ) :
2011-05-12 23:27:19 +02:00
xpath_base = ' action/target/@ %(kind)s = \' %(val)s \' or ' \
' submit/target/@ %(kind)s = \' %(val)s \' '
if conf . config [ ' include_request_from_project ' ] :
xpath_base = xpath_join ( xpath_base , ' action/source/@ %(kind)s = \' %(val)s \' or ' \
' submit/source/@ %(kind)s = \' %(val)s \' ' , op = ' or ' , inner = True )
xpath = xpath_join ( xpath , xpath_base % { ' kind ' : kind , ' val ' : val } , op = ' and ' , nexpr_parentheses = True )
2010-07-29 13:45:44 +02:00
if conf . config [ ' verbose ' ] > 1 :
2013-04-09 12:51:28 +02:00
print ( ' [ %s ] ' % xpath )
2010-07-29 13:45:44 +02:00
res = search ( apiurl , request = xpath )
collection = res [ ' request ' ]
requests = [ ]
for root in collection . findall ( ' request ' ) :
r = Request ( )
r . read ( root )
requests . append ( r )
return requests
2013-05-27 14:56:24 +02:00
def get_exact_request_list ( apiurl , src_project , dst_project , src_package = None , dst_package = None , req_who = None , req_state = ( ' new ' , ' review ' , ' declined ' ) , req_type = None ) :
2012-01-26 13:26:31 +01:00
xpath = ' '
if not ' all ' in req_state :
for state in req_state :
xpath = xpath_join ( xpath , ' state/@name= \' %s \' ' % state , op = ' or ' , inner = True )
2012-01-30 13:13:28 +01:00
xpath = ' ( %s ) ' % xpath
2012-01-26 13:26:31 +01:00
if req_who :
xpath = xpath_join ( xpath , ' (state/@who= \' %(who)s \' or history/@who= \' %(who)s \' ) ' % { ' who ' : req_who } , op = ' and ' )
xpath + = " and action[source/@project= ' %s ' " % src_project
if src_package :
xpath + = " and source/@package= ' %s ' " % src_package
xpath + = " and target/@project= ' %s ' " % dst_project
if src_project :
xpath + = " and target/@package= ' %s ' " % dst_package
xpath + = " ] "
if req_type :
xpath + = " and action/@type= \' %s \' " % req_type
2012-01-30 13:13:28 +01:00
if conf . config [ ' verbose ' ] > 1 :
2013-04-09 12:51:28 +02:00
print ( ' [ %s ] ' % xpath )
2012-01-26 13:26:31 +01:00
res = search ( apiurl , request = xpath )
collection = res [ ' request ' ]
requests = [ ]
for root in collection . findall ( ' request ' ) :
r = Request ( )
r . read ( root )
requests . append ( r )
return requests
2013-05-27 14:56:24 +02:00
def get_request_list ( apiurl , project = ' ' , package = ' ' , req_who = ' ' , req_state = ( ' new ' , ' review ' , ' declined ' ) , req_type = None , exclude_target_projects = [ ] ) :
2010-03-11 00:24:38 +01:00
xpath = ' '
2010-02-25 22:56:21 +01:00
if not ' all ' in req_state :
2009-10-20 16:30:15 +02:00
for state in req_state :
2010-03-11 00:24:38 +01:00
xpath = xpath_join ( xpath , ' state/@name= \' %s \' ' % state , inner = True )
2009-06-09 11:29:24 +02:00
if req_who :
2010-03-11 00:24:38 +01:00
xpath = xpath_join ( xpath , ' (state/@who= \' %(who)s \' or history/@who= \' %(who)s \' ) ' % { ' who ' : req_who } , op = ' and ' )
2009-06-09 11:29:24 +02:00
2009-06-02 15:14:46 +02:00
# XXX: we cannot use the '|' in the xpath expression because it is not supported
# in the backend
2010-02-25 22:56:21 +01:00
todo = { }
if project :
todo [ ' project ' ] = project
if package :
todo [ ' package ' ] = package
2013-04-09 11:25:19 +02:00
for kind , val in todo . items ( ) :
2011-05-12 23:27:19 +02:00
xpath_base = ' action/target/@ %(kind)s = \' %(val)s \' or ' \
' submit/target/@ %(kind)s = \' %(val)s \' '
if conf . config [ ' include_request_from_project ' ] :
xpath_base = xpath_join ( xpath_base , ' action/source/@ %(kind)s = \' %(val)s \' or ' \
' submit/source/@ %(kind)s = \' %(val)s \' ' , op = ' or ' , inner = True )
xpath = xpath_join ( xpath , xpath_base % { ' kind ' : kind , ' val ' : val } , op = ' and ' , nexpr_parentheses = True )
2010-02-25 22:56:21 +01:00
if req_type :
2010-03-11 00:24:38 +01:00
xpath = xpath_join ( xpath , ' action/@type= \' %s \' ' % req_type , op = ' and ' )
2010-02-25 22:56:21 +01:00
for i in exclude_target_projects :
2010-03-11 00:24:38 +01:00
xpath = xpath_join ( xpath , ' (not(action/target/@project= \' %(prj)s \' or ' \
' submit/target/@project= \' %(prj)s \' )) ' % { ' prj ' : i } , op = ' and ' )
2010-02-25 22:56:21 +01:00
if conf . config [ ' verbose ' ] > 1 :
2013-04-09 12:51:28 +02:00
print ( ' [ %s ] ' % xpath )
2010-03-11 00:24:38 +01:00
res = search ( apiurl , request = xpath )
collection = res [ ' request ' ]
2010-02-25 22:56:21 +01:00
requests = [ ]
for root in collection . findall ( ' request ' ) :
r = Request ( )
r . read ( root )
requests . append ( r )
2008-03-05 00:41:00 +01:00
return requests
2011-01-23 21:21:32 +01:00
# old style search, this is to be removed
2013-05-27 14:56:24 +02:00
def get_user_projpkgs_request_list ( apiurl , user , req_state = ( ' new ' , ' review ' , ) , req_type = None , exclude_projects = [ ] , projpkgs = { } ) :
2011-01-23 21:21:32 +01:00
""" OBSOLETE: user involved request search is supported by OBS 2.2 server side in a better way
Return all running requests for all projects / packages where is user is involved """
2010-03-13 21:06:18 +01:00
if not projpkgs :
res = get_user_projpkgs ( apiurl , user , exclude_projects = exclude_projects )
2011-02-24 14:10:53 +01:00
projects = [ ]
2010-03-20 12:59:32 +01:00
for i in res [ ' project_id ' ] . findall ( ' project ' ) :
2010-03-13 21:06:18 +01:00
projpkgs [ i . get ( ' name ' ) ] = [ ]
2011-02-24 14:10:53 +01:00
projects . append ( i . get ( ' name ' ) )
2010-03-20 12:59:32 +01:00
for i in res [ ' package_id ' ] . findall ( ' package ' ) :
2011-02-24 14:10:53 +01:00
if not i . get ( ' project ' ) in projects :
2010-03-13 21:06:18 +01:00
projpkgs . setdefault ( i . get ( ' project ' ) , [ ] ) . append ( i . get ( ' name ' ) )
xpath = ' '
2013-04-09 11:25:19 +02:00
for prj , pacs in projpkgs . items ( ) :
2010-03-13 21:06:18 +01:00
if not len ( pacs ) :
xpath = xpath_join ( xpath , ' action/target/@project= \' %s \' ' % prj , inner = True )
else :
xp = ' '
for p in pacs :
xp = xpath_join ( xp , ' action/target/@package= \' %s \' ' % p , inner = True )
xp = xpath_join ( xp , ' action/target/@project= \' %s \' ' % prj , op = ' and ' )
xpath = xpath_join ( xpath , xp , inner = True )
if req_type :
xpath = xpath_join ( xpath , ' action/@type= \' %s \' ' % req_type , op = ' and ' )
if not ' all ' in req_state :
xp = ' '
for state in req_state :
2010-03-15 13:15:50 +01:00
xp = xpath_join ( xp , ' state/@name= \' %s \' ' % state , inner = True )
2011-02-24 14:06:15 +01:00
xpath = xpath_join ( xp , xpath , op = ' and ' , nexpr_parentheses = True )
2010-03-13 21:06:18 +01:00
res = search ( apiurl , request = xpath )
result = [ ]
for root in res [ ' request ' ] . findall ( ' request ' ) :
r = Request ( )
r . read ( root )
result . append ( r )
return result
2008-03-05 00:41:00 +01:00
2009-06-02 15:14:46 +02:00
def get_request_log ( apiurl , reqid ) :
2010-07-26 16:46:21 +02:00
r = get_request ( apiurl , reqid )
2008-08-19 16:18:05 +02:00
data = [ ]
frmt = ' - ' * 76 + ' \n %s | %s | %s \n \n %s '
2010-12-30 03:04:10 +01:00
r . statehistory . reverse ( )
2009-06-02 15:14:46 +02:00
# the description of the request is used for the initial log entry
2008-08-19 21:15:29 +02:00
# otherwise its comment attribute would contain None
if len ( r . statehistory ) > = 1 :
2010-12-30 03:04:10 +01:00
r . statehistory [ - 1 ] . comment = r . description
2008-08-19 21:15:29 +02:00
else :
2010-12-30 03:04:10 +01:00
r . state . comment = r . description
2008-08-19 16:18:05 +02:00
for state in [ r . state ] + r . statehistory :
s = frmt % ( state . name , state . who , state . when , str ( state . comment ) )
data . append ( s )
return data
2013-03-08 19:06:04 +01:00
def check_existing_requests ( apiurl , src_project , src_package , dst_project ,
dst_package ) :
reqs = get_exact_request_list ( apiurl , src_project , dst_project ,
src_package , dst_package ,
req_type = ' submit ' ,
req_state = [ ' new ' , ' review ' , ' declined ' ] )
repl = ' '
if reqs :
2013-04-09 12:51:28 +02:00
print ( ' There are already the following submit request: %s . ' % \
' , ' . join ( [ i . reqid for i in reqs ] ) )
2013-03-08 19:06:04 +01:00
repl = raw_input ( ' Supersede the old requests? (y/n/c) ' )
if repl . lower ( ) == ' c ' :
2013-04-09 12:51:28 +02:00
print ( ' Aborting ' , file = sys . stderr )
2013-03-08 19:06:04 +01:00
raise oscerr . UserAbort ( )
return repl == ' y ' , reqs
2008-08-19 16:18:05 +02:00
2011-01-11 20:02:48 +01:00
def get_group ( apiurl , group ) :
u = makeurl ( apiurl , [ ' group ' , quote_plus ( group ) ] )
try :
f = http_GET ( u )
return ' ' . join ( f . readlines ( ) )
2013-04-09 14:03:17 +02:00
except HTTPError :
2013-04-09 12:51:28 +02:00
print ( ' user \' %s \' not found ' % group )
2011-01-11 20:02:48 +01:00
return None
2007-05-04 23:51:54 +02:00
def get_user_meta ( apiurl , user ) :
u = makeurl ( apiurl , [ ' person ' , quote_plus ( user ) ] )
2006-05-22 16:57:11 +02:00
try :
2007-04-19 10:47:22 +02:00
f = http_GET ( u )
2006-05-22 16:57:11 +02:00
return ' ' . join ( f . readlines ( ) )
2013-04-09 14:03:17 +02:00
except HTTPError :
2013-04-09 12:51:28 +02:00
print ( ' user \' %s \' not found ' % user )
2006-05-22 16:57:11 +02:00
return None
2006-04-20 16:26:50 +02:00
2007-09-03 18:18:37 +02:00
def get_user_data ( apiurl , user , * tags ) :
""" get specified tags from the user meta """
meta = get_user_meta ( apiurl , user )
data = [ ]
if meta != None :
root = ET . fromstring ( meta )
for tag in tags :
try :
if root . find ( tag ) . text != None :
data . append ( root . find ( tag ) . text )
else :
# tag is empty
data . append ( ' - ' )
except AttributeError :
# this part is reached if the tags tuple contains an invalid tag
2013-04-09 12:51:28 +02:00
print ( ' The xml file for user \' %s \' seems to be broken ' % user )
2009-12-12 15:02:58 +01:00
return [ ]
return data
2007-09-03 12:17:04 +02:00
2010-05-12 15:55:36 +02:00
def download ( url , filename , progress_obj = None , mtime = None ) :
2010-02-04 20:32:59 +01:00
import tempfile , shutil
2010-08-31 14:43:43 +02:00
global BUFSIZE
2010-02-04 20:32:59 +01:00
o = None
try :
2010-04-30 15:14:00 +02:00
prefix = os . path . basename ( filename )
2010-09-08 17:41:14 +02:00
path = os . path . dirname ( filename )
( fd , tmpfile ) = tempfile . mkstemp ( dir = path , prefix = prefix , suffix = ' .osctmp ' )
2014-01-06 11:12:02 +01:00
os . fchmod ( fd , 0o644 )
2010-02-05 15:17:45 +01:00
try :
o = os . fdopen ( fd , ' wb ' )
2010-02-25 10:42:29 +01:00
for buf in streamfile ( url , http_GET , BUFSIZE , progress_obj = progress_obj ) :
2013-04-10 11:34:59 +02:00
o . write ( bytes ( buf , " utf-8 " ) )
2010-02-05 15:17:45 +01:00
o . close ( )
2010-09-08 17:41:14 +02:00
os . rename ( tmpfile , filename )
2010-02-05 15:17:45 +01:00
except :
os . unlink ( tmpfile )
raise
finally :
2010-02-04 20:32:59 +01:00
if o is not None :
o . close ( )
2006-04-20 16:26:50 +02:00
2010-05-12 15:55:36 +02:00
if mtime :
2014-01-09 14:15:30 +01:00
utime ( filename , ( - 1 , mtime ) )
2010-05-12 15:55:36 +02:00
2010-05-27 02:18:00 +02:00
def get_source_file ( apiurl , prj , package , filename , targetfilename = None , revision = None , progress_obj = None , mtime = None , meta = False ) :
2010-02-25 10:42:29 +01:00
targetfilename = targetfilename or filename
2010-05-22 08:22:12 +02:00
query = { }
if meta :
query [ ' rev ' ] = 1
2010-02-25 10:42:29 +01:00
if revision :
2010-05-22 08:22:12 +02:00
query [ ' rev ' ] = revision
2011-10-18 03:03:42 +02:00
u = makeurl ( apiurl , [ ' source ' , prj , package , pathname2url ( filename . encode ( locale . getpreferredencoding ( ) , ' replace ' ) ) ] , query = query )
2010-05-12 15:55:36 +02:00
download ( u , targetfilename , progress_obj , mtime )
2010-02-25 10:42:29 +01:00
2009-10-20 16:30:15 +02:00
def get_binary_file ( apiurl , prj , repo , arch ,
filename ,
2008-09-30 16:54:08 +02:00
package = None ,
2009-10-20 16:30:15 +02:00
target_filename = None ,
2008-09-30 16:54:08 +02:00
target_mtime = None ,
progress_meter = False ) :
2010-02-25 10:42:29 +01:00
progress_obj = None
if progress_meter :
2013-04-09 11:35:53 +02:00
from . meter import TextMeter
2010-02-25 10:42:29 +01:00
progress_obj = TextMeter ( )
2008-09-30 16:54:08 +02:00
target_filename = target_filename or filename
2007-08-16 20:15:08 +02:00
where = package or ' _repository '
u = makeurl ( apiurl , [ ' build ' , prj , repo , arch , where , filename ] )
2010-05-12 15:55:36 +02:00
download ( u , target_filename , progress_obj , target_mtime )
2007-08-16 20:15:08 +02:00
2009-04-16 15:48:37 +02:00
def dgst_from_string ( str ) :
2009-06-05 13:29:11 +02:00
# Python 2.5 depracates the md5 modules
# Python 2.4 doesn't have hashlib yet
2009-04-16 15:48:37 +02:00
try :
import hashlib
2009-06-05 13:29:11 +02:00
md5_hash = hashlib . md5 ( )
2009-04-16 15:48:37 +02:00
except ImportError :
import md5
2009-06-05 13:29:11 +02:00
md5_hash = md5 . new ( )
md5_hash . update ( str )
return md5_hash . hexdigest ( )
2007-08-16 20:15:08 +02:00
2006-04-20 16:26:50 +02:00
def dgst ( file ) :
2006-05-19 22:13:29 +02:00
#if not os.path.exists(file):
#return None
2006-04-20 16:26:50 +02:00
2010-08-31 14:43:43 +02:00
global BUFSIZE
2008-09-21 16:44:20 +02:00
try :
import hashlib
md5 = hashlib
except ImportError :
import md5
md5 = md5
s = md5 . md5 ( )
2009-05-22 17:00:31 +02:00
f = open ( file , ' rb ' )
2013-04-09 11:34:46 +02:00
while True :
2006-04-20 16:26:50 +02:00
buf = f . read ( BUFSIZE )
if not buf : break
s . update ( buf )
2006-05-19 22:13:29 +02:00
return s . hexdigest ( )
2007-07-13 18:01:02 +02:00
f . close ( )
2006-04-20 16:26:50 +02:00
2006-06-08 12:30:29 +02:00
def binary ( s ) :
""" return true if a string is binary data using diff ' s heuristic """
2013-04-10 11:34:59 +02:00
if s and bytes ( ' \0 ' , " utf-8 " ) in s [ : 4096 ] :
2006-06-08 12:30:29 +02:00
return True
return False
2006-04-20 16:26:50 +02:00
2006-06-22 14:54:58 +02:00
def binary_file ( fn ) :
""" read 4096 bytes from a file named fn, and call binary() on the data """
2009-05-22 17:00:31 +02:00
return binary ( open ( fn , ' rb ' ) . read ( 4096 ) )
2006-06-22 14:54:58 +02:00
2007-07-04 14:55:26 +02:00
def get_source_file_diff ( dir , filename , rev , oldfilename = None , olddir = None , origfilename = None ) :
"""
This methods diffs oldfilename against filename ( so filename will
be shown as the new file ) .
The variable origfilename is used if filename and oldfilename differ
in their names ( for instance if a tempfile is used for filename etc . )
"""
2006-05-19 22:13:29 +02:00
import difflib
2010-08-31 14:43:43 +02:00
global store
2007-07-04 14:55:26 +02:00
if not oldfilename :
oldfilename = filename
if not olddir :
olddir = os . path . join ( dir , store )
if not origfilename :
origfilename = filename
2007-11-26 19:13:51 +01:00
2007-07-04 14:55:26 +02:00
file1 = os . path . join ( olddir , oldfilename ) # old/stored original
2006-05-19 22:28:04 +02:00
file2 = os . path . join ( dir , filename ) # working copy
2010-08-27 16:24:12 +02:00
if binary_file ( file1 ) or binary_file ( file2 ) :
2010-08-31 11:20:34 +02:00
return [ ' Binary file \' %s \' has changed. \n ' % origfilename ]
2006-05-19 22:13:29 +02:00
2010-08-27 16:24:12 +02:00
f1 = f2 = None
try :
2013-04-10 11:34:59 +02:00
f1 = open ( file1 , ' rt ' )
2010-08-27 16:24:12 +02:00
s1 = f1 . readlines ( )
f1 . close ( )
2006-06-08 12:30:29 +02:00
2013-04-10 11:34:59 +02:00
f2 = open ( file2 , ' rt ' )
2010-08-27 16:24:12 +02:00
s2 = f2 . readlines ( )
f2 . close ( )
finally :
if f1 :
f1 . close ( )
if f2 :
f2 . close ( )
d = difflib . unified_diff ( s1 , s2 ,
fromfile = ' %s \t (revision %s ) ' % ( origfilename , rev ) , \
tofile = ' %s \t (working copy) ' % origfilename )
2010-09-08 12:08:00 +02:00
d = list ( d )
# python2.7's difflib slightly changed the format
# adapt old format to the new format
2010-10-29 17:30:56 +02:00
if len ( d ) > 1 :
d [ 0 ] = d [ 0 ] . replace ( ' \n ' , ' \n ' )
d [ 1 ] = d [ 1 ] . replace ( ' \n ' , ' \n ' )
2010-08-27 16:24:12 +02:00
# if file doesn't end with newline, we need to append one in the diff result
for i , line in enumerate ( d ) :
if not line . endswith ( ' \n ' ) :
d [ i ] + = ' \n \\ No newline at end of file '
if i + 1 != len ( d ) :
d [ i ] + = ' \n '
return d
2006-05-19 22:13:29 +02:00
2009-01-16 15:43:45 +01:00
def server_diff ( apiurl ,
2007-11-29 18:22:57 +01:00
old_project , old_package , old_revision ,
2010-12-23 10:33:31 +01:00
new_project , new_package , new_revision ,
2011-11-09 11:51:43 +01:00
unified = False , missingok = False , meta = False , expand = True , full = True ) :
2010-10-19 15:25:25 +02:00
query = { ' cmd ' : ' diff ' }
if expand :
query [ ' expand ' ] = 1
2007-11-29 18:22:57 +01:00
if old_project :
2008-03-17 22:39:27 +01:00
query [ ' oproject ' ] = old_project
2007-11-29 18:22:57 +01:00
if old_package :
2008-03-17 22:39:27 +01:00
query [ ' opackage ' ] = old_package
2007-11-29 18:22:57 +01:00
if old_revision :
2008-03-17 22:39:27 +01:00
query [ ' orev ' ] = old_revision
2007-11-29 18:22:57 +01:00
if new_revision :
2008-03-17 22:39:27 +01:00
query [ ' rev ' ] = new_revision
2009-01-16 15:43:45 +01:00
if unified :
query [ ' unified ' ] = 1
2010-04-10 15:44:15 +02:00
if missingok :
query [ ' missingok ' ] = 1
2010-05-22 08:22:12 +02:00
if meta :
query [ ' meta ' ] = 1
2011-11-09 11:51:43 +01:00
if full :
query [ ' filelimit ' ] = 0
2013-11-10 21:09:32 +01:00
query [ ' tarlimit ' ] = 0
2007-11-29 18:22:57 +01:00
u = makeurl ( apiurl , [ ' source ' , new_project , new_package ] , query = query )
f = http_POST ( u )
return f . read ( )
2010-12-23 10:33:31 +01:00
def server_diff_noex ( apiurl ,
old_project , old_package , old_revision ,
new_project , new_package , new_revision ,
unified = False , missingok = False , meta = False , expand = True ) :
try :
return server_diff ( apiurl ,
old_project , old_package , old_revision ,
new_project , new_package , new_revision ,
unified , missingok , meta , expand )
2013-04-09 14:03:17 +02:00
except HTTPError as e :
2010-12-23 10:33:31 +01:00
msg = None
body = None
try :
body = e . read ( )
if not ' bad link ' in body :
return ' # diff failed: ' + body
except :
return ' # diff failed with unknown error '
if expand :
rdiff = " ## diff on expanded link not possible, showing unexpanded version \n "
2011-02-14 11:30:37 +01:00
try :
2011-05-18 17:54:33 +02:00
rdiff + = server_diff_noex ( apiurl ,
old_project , old_package , old_revision ,
new_project , new_package , new_revision ,
unified , missingok , meta , False )
2011-02-14 11:30:37 +01:00
except :
2011-05-18 17:54:33 +02:00
elm = ET . fromstring ( body ) . find ( ' summary ' )
summary = ' '
if not elm is None :
summary = elm . text
return ' error: diffing failed: %s ' % summary
2010-12-23 10:33:31 +01:00
return rdiff
2007-11-29 18:22:57 +01:00
2010-09-02 10:29:28 +02:00
def request_diff ( apiurl , reqid ) :
u = makeurl ( apiurl , [ ' request ' , reqid ] , query = { ' cmd ' : ' diff ' } )
f = http_POST ( u )
return f . read ( )
2011-01-29 17:24:45 +01:00
def submit_action_diff ( apiurl , action ) :
""" diff a single submit action """
# backward compatiblity: only a recent api/backend supports the missingok parameter
try :
return server_diff ( apiurl , action . tgt_project , action . tgt_package , None ,
action . src_project , action . src_package , action . src_rev , True , True )
2013-04-09 14:03:17 +02:00
except HTTPError as e :
2011-01-29 17:24:45 +01:00
if e . code == 400 :
try :
return server_diff ( apiurl , action . tgt_project , action . tgt_package , None ,
action . src_project , action . src_package , action . src_rev , True , False )
2013-04-09 14:03:17 +02:00
except HTTPError as e :
2011-01-29 17:24:45 +01:00
if e . code != 404 :
raise e
root = ET . fromstring ( e . read ( ) )
return ' error: \' %s \' does not exist ' % root . find ( ' summary ' ) . text
elif e . code == 404 :
root = ET . fromstring ( e . read ( ) )
return ' error: \' %s \' does not exist ' % root . find ( ' summary ' ) . text
raise e
2010-09-02 10:29:28 +02:00
2011-11-02 21:02:26 +01:00
def make_dir ( apiurl , project , package , pathname = None , prj_dir = None , package_tracking = True , pkg_path = None ) :
2008-04-02 17:30:44 +02:00
"""
creates the plain directory structure for a package dir .
The ' apiurl ' parameter is needed for the project dir initialization .
The ' project ' and ' package ' parameters specify the name of the
project and the package . The optional ' pathname ' parameter is used
for printing out the message that a new dir was created ( default : ' prj_dir/package ' ) .
The optional ' prj_dir ' parameter specifies the path to the project dir ( default : ' project ' ) .
2011-11-02 21:02:26 +01:00
If pkg_path is not None store the package ' s content in pkg_path (no project structure is created)
2008-04-02 17:30:44 +02:00
"""
prj_dir = prj_dir or project
2009-08-20 21:28:05 +02:00
# FIXME: carefully test each patch component of prj_dir,
# if we have a .osc/_files entry at that level.
# -> if so, we have a package/project clash,
# and should rename this path component by appending '.proj'
# and give user a warning message, to discourage such clashes
2011-11-02 21:02:26 +01:00
if pkg_path is None :
pathname = pathname or getTransActPath ( os . path . join ( prj_dir , package ) )
pkg_path = os . path . join ( prj_dir , package )
if is_package_dir ( prj_dir ) :
# we want this to become a project directory,
# but it already is a package directory.
raise oscerr . OscIOError ( None , ' checkout_package: package/project clash. Moving myself away not implemented ' )
if not is_project_dir ( prj_dir ) :
# this directory could exist as a parent direory for one of our earlier
# checked out sub-projects. in this case, we still need to initialize it.
2013-04-09 12:51:28 +02:00
print ( statfrmt ( ' A ' , prj_dir ) )
2011-11-02 21:02:26 +01:00
Project . init_project ( apiurl , prj_dir , project , package_tracking )
if is_project_dir ( os . path . join ( prj_dir , package ) ) :
# the thing exists, but is a project directory and not a package directory
# FIXME: this should be a warning message to discourage package/project clashes
raise oscerr . OscIOError ( None , ' checkout_package: package/project clash. Moving project away not implemented ' )
else :
pathname = pkg_path
2011-11-02 19:41:47 +01:00
2011-11-02 21:02:26 +01:00
if not os . path . exists ( pkg_path ) :
2013-04-09 12:51:28 +02:00
print ( statfrmt ( ' A ' , pathname ) )
2011-11-02 21:02:26 +01:00
os . mkdir ( os . path . join ( pkg_path ) )
2010-08-30 13:46:49 +02:00
# os.mkdir(os.path.join(prj_dir, package, store))
2006-04-20 16:26:50 +02:00
2011-11-02 21:02:26 +01:00
return pkg_path
2006-04-20 16:26:50 +02:00
2009-10-20 16:30:15 +02:00
def checkout_package ( apiurl , project , package ,
2008-03-24 21:24:49 +01:00
revision = None , pathname = None , prj_obj = None ,
2011-11-02 21:02:26 +01:00
expand_link = False , prj_dir = None , server_service_files = None , service_files = None , progress_obj = None , size_limit = None , meta = False , outdir = None ) :
2008-07-16 17:04:37 +02:00
try :
# the project we're in might be deleted.
# that'll throw an error then.
olddir = os . getcwd ( )
except :
olddir = os . environ . get ( " PWD " )
if not prj_dir :
prj_dir = olddir
2009-05-15 13:40:50 +02:00
else :
if sys . platform [ : 3 ] == ' win ' :
prj_dir = prj_dir [ : 2 ] + prj_dir [ 2 : ] . replace ( ' : ' , ' ; ' )
2009-08-20 21:28:05 +02:00
else :
if conf . config [ ' checkout_no_colon ' ] :
prj_dir = prj_dir . replace ( ' : ' , ' / ' )
2009-10-20 16:30:15 +02:00
2010-12-27 23:03:17 +01:00
root_dots = ' . '
if conf . config [ ' checkout_rooted ' ] :
if prj_dir [ : 1 ] == ' / ' :
if conf . config [ ' verbose ' ] > 1 :
2013-05-27 14:26:58 +02:00
print ( " checkout_rooted ignored for %s " % prj_dir )
2010-12-27 23:03:17 +01:00
# ?? should we complain if not is_project_dir(prj_dir) ??
else :
# if we are inside a project or package dir, ascend to parent
# directories, so that all projects are checked out relative to
# the same root.
if is_project_dir ( " .. " ) :
# if we are in a package dir, goto parent.
# Hmm, with 'checkout_no_colon' in effect, we have directory levels that
# do not easily reveal the fact, that they are part of a project path.
# At least this test should find that the parent of 'home/username/branches'
# is a project (hack alert). Also goto parent in this case.
root_dots = " ../ "
elif is_project_dir ( " ../.. " ) :
# testing two levels is better than one.
# May happen in case of checkout_no_colon, or
# if project roots were previously inconsistent
root_dots = " ../../ "
if is_project_dir ( root_dots ) :
if conf . config [ ' checkout_no_colon ' ] :
oldproj = store_read_project ( root_dots )
n = len ( oldproj . split ( ' : ' ) )
else :
n = 1
root_dots = root_dots + " ../ " * n
if root_dots != ' . ' :
if conf . config [ ' verbose ' ] :
2013-04-09 12:51:28 +02:00
print ( " found root of %s at %s " % ( oldproj , root_dots ) )
2010-12-27 23:03:17 +01:00
prj_dir = root_dots + prj_dir
2011-11-02 19:41:47 +01:00
if not pathname :
pathname = getTransActPath ( os . path . join ( prj_dir , package ) )
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
# before we create directories and stuff, check if the package actually
# exists
2010-05-25 13:59:46 +02:00
show_package_meta ( apiurl , project , package , meta )
2009-10-20 16:30:15 +02:00
2010-08-30 13:46:49 +02:00
isfrozen = False
2008-03-24 21:24:49 +01:00
if expand_link :
# try to read from the linkinfo
2009-04-21 18:52:26 +02:00
# if it is a link we use the xsrcmd5 as the revision to be
# checked out
2010-01-12 17:22:47 +01:00
try :
2011-05-23 15:26:13 +02:00
x = show_upstream_xsrcmd5 ( apiurl , project , package , revision = revision , meta = meta , include_service_files = server_service_files )
2010-01-12 17:22:47 +01:00
except :
2011-05-23 15:26:13 +02:00
x = show_upstream_xsrcmd5 ( apiurl , project , package , revision = revision , meta = meta , linkrev = ' base ' , include_service_files = server_service_files )
2010-01-12 17:22:47 +01:00
if x :
2010-08-30 13:46:49 +02:00
isfrozen = True
2008-03-24 21:24:49 +01:00
if x :
revision = x
2011-11-02 21:02:26 +01:00
directory = make_dir ( apiurl , project , package , pathname , prj_dir , conf . config [ ' do_package_tracking ' ] , outdir )
2010-09-03 14:51:20 +02:00
p = Package . init_package ( apiurl , project , package , directory , size_limit , meta , progress_obj )
2010-01-12 17:22:47 +01:00
if isfrozen :
2010-01-20 17:55:44 +01:00
p . mark_frozen ( )
2011-11-02 21:02:26 +01:00
# no project structure is wanted when outdir is used
if conf . config [ ' do_package_tracking ' ] and outdir is None :
2008-03-10 19:04:23 +01:00
# check if we can re-use an existing project object
2010-08-30 13:46:49 +02:00
if prj_obj is None :
prj_obj = Project ( prj_dir )
2008-03-10 19:04:23 +01:00
prj_obj . set_state ( p . name , ' ' )
prj_obj . write_packages ( )
2010-09-03 14:51:20 +02:00
p . update ( revision , server_service_files , size_limit )
2010-06-08 11:24:10 +02:00
if service_files :
2013-04-09 12:51:28 +02:00
print ( ' Running all source services local ' )
2010-06-08 11:24:10 +02:00
p . run_source_services ( )
2006-04-20 16:26:50 +02:00
2009-03-11 16:23:23 +01:00
def replace_pkg_meta ( pkgmeta , new_name , new_prj , keep_maintainers = False ,
dst_userid = None , keep_develproject = False ) :
2007-11-09 19:03:19 +01:00
"""
update pkgmeta with new new_name and new_prj and set calling user as the
2009-03-11 16:23:23 +01:00
only maintainer ( unless keep_maintainers is set ) . Additionally remove the
develproject entry ( < devel / > ) unless keep_develproject is true .
2007-11-09 19:03:19 +01:00
"""
root = ET . fromstring ( ' ' . join ( pkgmeta ) )
root . set ( ' name ' , new_name )
root . set ( ' project ' , new_prj )
2008-04-30 14:28:25 +02:00
if not keep_maintainers :
for person in root . findall ( ' person ' ) :
root . remove ( person )
2009-03-11 16:23:23 +01:00
if not keep_develproject :
for dp in root . findall ( ' devel ' ) :
root . remove ( dp )
2013-04-10 11:34:59 +02:00
return ET . tostring ( root , encoding = ET_ENCODING )
2007-11-09 19:03:19 +01:00
2010-01-14 12:24:48 +01:00
def link_to_branch ( apiurl , project , package ) :
2010-01-11 16:36:33 +01:00
"""
convert a package with a _link + project . diff to a branch
"""
2010-02-18 14:14:31 +01:00
if ' _link ' in meta_get_filelist ( apiurl , project , package ) :
2010-01-14 12:24:48 +01:00
u = makeurl ( apiurl , [ ' source ' , project , package ] , ' cmd=linktobranch ' )
2010-01-11 16:36:33 +01:00
http_POST ( u )
else :
2010-01-11 18:59:49 +01:00
raise oscerr . OscIOError ( None , ' no _link file inside project \' %s \' package \' %s \' ' % ( project , package ) )
2010-01-11 16:36:33 +01:00
2012-03-02 15:44:15 +01:00
def link_pac ( src_project , src_package , dst_project , dst_package , force , rev = ' ' , cicount = ' ' , disable_publish = False , missing_target = False , vrev = ' ' ) :
2006-08-07 12:08:54 +02:00
"""
create a linked package
- " src " is the original package
- " dst " is the " link " package that we are creating here
"""
2009-12-21 14:24:33 +01:00
meta_change = False
dst_meta = ' '
2010-07-27 16:06:49 +02:00
apiurl = conf . config [ ' apiurl ' ]
2009-12-21 14:24:33 +01:00
try :
dst_meta = meta_exists ( metatype = ' pkg ' ,
path_args = ( quote_plus ( dst_project ) , quote_plus ( dst_package ) ) ,
template_args = None ,
2010-07-27 16:06:49 +02:00
create_new = False , apiurl = apiurl )
2010-04-29 15:37:47 +02:00
root = ET . fromstring ( ' ' . join ( dst_meta ) )
2011-02-22 17:52:12 +01:00
if root . get ( ' project ' ) != dst_project :
# The source comes from a different project via a project link, we need to create this instance
meta_change = True
2009-07-30 11:42:09 +02:00
except :
2010-04-29 15:37:47 +02:00
meta_change = True
if meta_change :
2011-12-15 15:12:13 +01:00
if missing_target :
dst_meta = ' <package name= " %s " ><title/><description/></package> ' % dst_package
else :
src_meta = show_package_meta ( apiurl , src_project , src_package )
dst_meta = replace_pkg_meta ( src_meta , dst_package , dst_project )
2009-12-21 14:24:33 +01:00
if disable_publish :
meta_change = True
root = ET . fromstring ( ' ' . join ( dst_meta ) )
elm = root . find ( ' publish ' )
if not elm :
elm = ET . SubElement ( root , ' publish ' )
elm . clear ( )
ET . SubElement ( elm , ' disable ' )
2013-04-10 11:34:59 +02:00
dst_meta = ET . tostring ( root , encoding = ET_ENCODING )
2010-04-29 15:37:47 +02:00
2009-12-21 14:24:33 +01:00
if meta_change :
2009-07-30 11:42:09 +02:00
edit_meta ( ' pkg ' ,
2009-10-20 16:30:15 +02:00
path_args = ( dst_project , dst_package ) ,
2009-12-21 14:24:33 +01:00
data = dst_meta )
2006-08-07 12:08:54 +02:00
# create the _link file
# but first, make sure not to overwrite an existing one
2010-07-27 16:06:49 +02:00
if ' _link ' in meta_get_filelist ( apiurl , dst_project , dst_package ) :
2009-06-15 17:19:16 +02:00
if force :
2013-04-09 12:51:28 +02:00
print ( ' forced overwrite of existing _link file ' , file = sys . stderr )
2009-06-15 17:19:16 +02:00
else :
2013-04-09 12:51:28 +02:00
print ( file = sys . stderr )
print ( ' _link file already exists...! Aborting ' , file = sys . stderr )
2009-06-15 17:19:16 +02:00
sys . exit ( 1 )
2009-10-20 16:30:15 +02:00
2008-06-26 12:47:58 +02:00
if rev :
2012-03-02 15:44:15 +01:00
rev = ' rev= " %s " ' % rev
2012-01-25 15:51:11 +01:00
else :
rev = ' '
2009-04-21 18:52:26 +02:00
2012-03-02 15:44:15 +01:00
if vrev :
vrev = ' vrev= " %s " ' % vrev
else :
vrev = ' '
2011-12-15 15:12:13 +01:00
missingok = ' '
if missing_target :
2012-03-02 15:44:15 +01:00
missingok = ' missingok= " true " '
2011-12-15 15:12:13 +01:00
2009-05-13 09:59:01 +02:00
if cicount :
2012-03-02 15:44:15 +01:00
cicount = ' cicount= " %s " ' % cicount
2012-01-25 15:51:11 +01:00
else :
cicount = ' '
2009-05-13 09:59:01 +02:00
2013-04-09 12:51:28 +02:00
print ( ' Creating _link... ' , end = ' ' )
2010-11-04 14:41:40 +01:00
2010-11-25 22:45:51 +01:00
project = ' '
if src_project != dst_project :
project = ' project= " %s " ' % src_project
2010-11-04 14:41:40 +01:00
2006-08-07 12:08:54 +02:00
link_template = """ \
2012-03-02 15:44:15 +01:00
< link % s package = " %s " % s % s % s % s >
2006-08-07 12:08:54 +02:00
< patches >
2012-03-02 15:44:15 +01:00
< ! - - < branch / > for a full copy , default case - - >
2009-03-17 17:13:04 +01:00
< ! - - < apply name = " patch " / > apply a patch on the source directory - - >
< ! - - < topadd > % % define build_with_feature_x 1 < / topadd > add a line on the top ( spec file only ) - - >
2013-05-10 20:57:03 +02:00
< ! - - < add name = " file.patch " / > add a patch to be applied after % % setup ( spec file only ) - - >
< ! - - < delete name = " filename " / > delete a file - - >
2006-08-07 12:08:54 +02:00
< / patches >
< / link >
2012-03-02 15:44:15 +01:00
""" % (project, src_package, missingok, rev, vrev, cicount)
2006-08-07 12:08:54 +02:00
2010-07-27 16:06:49 +02:00
u = makeurl ( apiurl , [ ' source ' , dst_project , dst_package , ' _link ' ] )
2007-04-19 10:47:22 +02:00
http_PUT ( u , data = link_template )
2013-04-09 12:51:28 +02:00
print ( ' Done. ' )
2006-08-07 12:08:54 +02:00
2010-07-20 14:48:27 +02:00
def aggregate_pac ( src_project , src_package , dst_project , dst_package , repo_map = { } , disable_publish = False , nosources = False ) :
2007-10-30 14:45:54 +01:00
"""
aggregate package
- " src " is the original package
- " dst " is the " aggregate " package that we are creating here
2009-07-31 16:31:20 +02:00
- " map " is a dictionary SRC = > TARGET repository mappings
2007-10-30 14:45:54 +01:00
"""
2009-12-21 14:24:33 +01:00
meta_change = False
dst_meta = ' '
2010-07-27 16:06:49 +02:00
apiurl = conf . config [ ' apiurl ' ]
2009-12-21 14:24:33 +01:00
try :
dst_meta = meta_exists ( metatype = ' pkg ' ,
path_args = ( quote_plus ( dst_project ) , quote_plus ( dst_package ) ) ,
template_args = None ,
2010-07-27 16:06:49 +02:00
create_new = False , apiurl = apiurl )
2011-03-30 14:12:59 +02:00
root = ET . fromstring ( ' ' . join ( dst_meta ) )
if root . get ( ' project ' ) != dst_project :
# The source comes from a different project via a project link, we need to create this instance
meta_change = True
2009-12-21 14:24:33 +01:00
except :
2011-03-30 14:12:59 +02:00
meta_change = True
if meta_change :
2010-07-27 16:06:49 +02:00
src_meta = show_package_meta ( apiurl , src_project , src_package )
2009-12-21 14:24:33 +01:00
dst_meta = replace_pkg_meta ( src_meta , dst_package , dst_project )
meta_change = True
if disable_publish :
meta_change = True
root = ET . fromstring ( ' ' . join ( dst_meta ) )
elm = root . find ( ' publish ' )
if not elm :
elm = ET . SubElement ( root , ' publish ' )
elm . clear ( )
ET . SubElement ( elm , ' disable ' )
2013-04-10 11:34:59 +02:00
dst_meta = ET . tostring ( root , encoding = ET_ENCODING )
2009-12-21 14:24:33 +01:00
if meta_change :
edit_meta ( ' pkg ' ,
path_args = ( dst_project , dst_package ) ,
data = dst_meta )
2007-10-30 14:45:54 +01:00
# create the _aggregate file
# but first, make sure not to overwrite an existing one
2010-07-27 16:06:49 +02:00
if ' _aggregate ' in meta_get_filelist ( apiurl , dst_project , dst_package ) :
2013-04-09 12:51:28 +02:00
print ( file = sys . stderr )
print ( ' _aggregate file already exists...! Aborting ' , file = sys . stderr )
2007-10-30 14:45:54 +01:00
sys . exit ( 1 )
2013-04-09 12:51:28 +02:00
print ( ' Creating _aggregate... ' , end = ' ' )
2007-10-30 14:45:54 +01:00
aggregate_template = """ \
< aggregatelist >
< aggregate project = " %s " >
2009-07-31 16:31:20 +02:00
""" % (src_project)
aggregate_template + = """ \
2007-10-30 14:45:54 +01:00
< package > % s < / package >
2010-07-20 14:48:27 +02:00
""" % ( src_package)
2010-12-21 14:09:25 +01:00
2010-07-20 14:48:27 +02:00
if nosources :
aggregate_template + = """ \
< nosources / >
"""
2013-04-09 11:25:19 +02:00
for src , tgt in repo_map . items ( ) :
2010-12-21 14:09:25 +01:00
aggregate_template + = """ \
< repository target = " %s " source = " %s " / >
""" % (tgt, src)
2010-07-20 14:48:27 +02:00
aggregate_template + = """ \
2007-10-30 14:45:54 +01:00
< / aggregate >
< / aggregatelist >
2010-07-20 14:48:27 +02:00
"""
2007-10-30 14:45:54 +01:00
2010-07-27 16:06:49 +02:00
u = makeurl ( apiurl , [ ' source ' , dst_project , dst_package , ' _aggregate ' ] )
2007-10-30 14:45:54 +01:00
http_PUT ( u , data = aggregate_template )
2013-04-09 12:51:28 +02:00
print ( ' Done. ' )
2006-08-07 12:08:54 +02:00
2009-11-02 09:32:15 +01:00
2012-02-09 10:04:44 +01:00
def attribute_branch_pkg ( apiurl , attribute , maintained_update_project_attribute , package , targetproject , return_existing = False , force = False , noaccess = False , add_repositories = False , dryrun = False , nodevelproject = False , maintenance = False ) :
2009-11-02 09:32:15 +01:00
"""
Branch packages defined via attributes ( via API call )
"""
query = { ' cmd ' : ' branch ' }
query [ ' attribute ' ] = attribute
if targetproject :
query [ ' target_project ' ] = targetproject
2012-01-05 16:15:29 +01:00
if dryrun :
query [ ' dryrun ' ] = " 1 "
2010-05-17 20:14:49 +02:00
if force :
query [ ' force ' ] = " 1 "
2011-05-04 12:11:24 +02:00
if noaccess :
query [ ' noaccess ' ] = " 1 "
2012-01-05 16:15:29 +01:00
if nodevelproject :
query [ ' ignoredevel ' ] = ' 1 '
2011-11-25 10:12:16 +01:00
if add_repositories :
query [ ' add_repositories ' ] = " 1 "
2012-02-09 10:04:44 +01:00
if maintenance :
query [ ' maintenance ' ] = " 1 "
2009-11-02 09:32:15 +01:00
if package :
query [ ' package ' ] = package
if maintained_update_project_attribute :
query [ ' update_project_attribute ' ] = maintained_update_project_attribute
u = makeurl ( apiurl , [ ' source ' ] , query = query )
2009-11-10 10:56:34 +01:00
f = None
2009-11-02 09:32:15 +01:00
try :
f = http_POST ( u )
2013-04-09 14:03:17 +02:00
except HTTPError as e :
2009-11-02 09:32:15 +01:00
msg = ' ' . join ( e . readlines ( ) )
msg = msg . split ( ' <summary> ' ) [ 1 ]
msg = msg . split ( ' </summary> ' ) [ 0 ]
2010-04-08 11:24:13 +02:00
raise oscerr . APIError ( msg )
2009-11-02 09:32:15 +01:00
2011-12-12 09:55:14 +01:00
r = None
root = ET . fromstring ( f . read ( ) )
2012-01-05 16:15:29 +01:00
if dryrun :
2011-12-12 09:55:14 +01:00
return root
# TODO: change api here and return parsed XML as class
if conf . config [ ' http_debug ' ] :
2013-04-10 11:34:59 +02:00
print ( ET . tostring ( root , encoding = ET_ENCODING ) , file = sys . stderr )
2011-12-12 09:55:14 +01:00
for node in root . findall ( ' data ' ) :
r = node . get ( ' name ' )
if r and r == ' targetproject ' :
return node . text
2012-01-05 16:15:29 +01:00
2009-11-02 09:32:15 +01:00
return r
2012-02-09 10:04:44 +01:00
def branch_pkg ( apiurl , src_project , src_package , nodevelproject = False , rev = None , target_project = None , target_package = None , return_existing = False , msg = ' ' , force = False , noaccess = False , add_repositories = False , extend_package_names = False , missingok = False , maintenance = False ) :
2008-05-21 17:49:00 +02:00
"""
Branch a package ( via API call )
"""
2008-06-03 15:16:55 +02:00
query = { ' cmd ' : ' branch ' }
if nodevelproject :
2009-02-10 21:22:39 +01:00
query [ ' ignoredevel ' ] = ' 1 '
2010-05-19 10:47:01 +02:00
if force :
query [ ' force ' ] = ' 1 '
2011-05-04 12:11:24 +02:00
if noaccess :
query [ ' noaccess ' ] = ' 1 '
2011-11-28 14:26:30 +01:00
if add_repositories :
query [ ' add_repositories ' ] = " 1 "
2012-02-09 10:04:44 +01:00
if maintenance :
query [ ' maintenance ' ] = " 1 "
2011-12-15 15:12:13 +01:00
if missingok :
query [ ' missingok ' ] = " 1 "
2011-12-01 15:54:50 +01:00
if extend_package_names :
query [ ' extend_package_names ' ] = " 1 "
2009-02-10 16:49:34 +01:00
if rev :
query [ ' rev ' ] = rev
2009-04-17 14:02:02 +02:00
if target_project :
query [ ' target_project ' ] = target_project
if target_package :
query [ ' target_package ' ] = target_package
2010-03-02 01:34:17 +01:00
if msg :
query [ ' comment ' ] = msg
2009-05-08 21:37:06 +02:00
u = makeurl ( apiurl , [ ' source ' , src_project , src_package ] , query = query )
2009-08-20 21:28:05 +02:00
try :
f = http_POST ( u )
2013-04-09 14:03:17 +02:00
except HTTPError as e :
2009-08-20 21:28:05 +02:00
if not return_existing :
raise
2011-02-08 16:56:16 +01:00
root = ET . fromstring ( e . read ( ) )
summary = root . find ( ' summary ' )
if summary is None :
2013-04-10 11:34:59 +02:00
raise oscerr . APIError ( ' unexpected response: \n %s ' % ET . tostring ( root , encoding = ET_ENCODING ) )
2011-02-08 16:56:16 +01:00
m = re . match ( r " branch target package already exists: ( \ S+)/( \ S+) " , summary . text )
2009-08-20 21:28:05 +02:00
if not m :
2011-02-08 16:56:16 +01:00
e . msg + = ' \n ' + summary . text
2009-08-20 21:28:05 +02:00
raise
2010-02-08 19:58:14 +01:00
return ( True , m . group ( 1 ) , m . group ( 2 ) , None , None )
2008-06-03 14:43:52 +02:00
2011-12-12 09:55:14 +01:00
if conf . config [ ' http_debug ' ] :
2013-04-10 11:34:59 +02:00
print ( ET . tostring ( root , encoding = ET_ENCODING ) , file = sys . stderr )
2010-02-08 19:58:14 +01:00
data = { }
for i in ET . fromstring ( f . read ( ) ) . findall ( ' data ' ) :
data [ i . get ( ' name ' ) ] = i . text
return ( False , data . get ( ' targetproject ' , None ) , data . get ( ' targetpackage ' , None ) ,
data . get ( ' sourceproject ' , None ) , data . get ( ' sourcepackage ' , None ) )
2008-05-21 17:49:00 +02:00
2009-10-20 16:30:15 +02:00
def copy_pac ( src_apiurl , src_project , src_package ,
2008-03-17 22:46:42 +01:00
dst_apiurl , dst_project , dst_package ,
2008-04-30 14:28:25 +02:00
client_side_copy = False ,
2009-03-11 16:23:23 +01:00
keep_maintainers = False ,
2009-03-31 00:17:18 +02:00
keep_develproject = False ,
2009-05-14 13:50:53 +02:00
expand = False ,
revision = None ,
2011-11-21 12:33:32 +01:00
comment = None ,
2012-01-09 14:30:52 +01:00
force_meta_update = None ,
2011-11-21 12:33:32 +01:00
keep_link = None ) :
2006-09-21 16:33:24 +02:00
"""
2008-03-17 22:46:42 +01:00
Create a copy of a package .
2006-09-21 16:33:24 +02:00
2008-03-17 22:46:42 +01:00
Copying can be done by downloading the files from one package and commit
them into the other by uploading them ( client - side copy ) - -
or by the server , in a single api call .
"""
2006-09-21 16:33:24 +02:00
2011-02-11 17:11:00 +01:00
if not ( src_apiurl == dst_apiurl and src_project == dst_project \
and src_package == dst_package ) :
src_meta = show_package_meta ( src_apiurl , src_project , src_package )
dst_userid = conf . get_apiurl_usr ( dst_apiurl )
src_meta = replace_pkg_meta ( src_meta , dst_package , dst_project , keep_maintainers ,
dst_userid , keep_develproject )
2012-01-09 14:30:52 +01:00
url = make_meta_url ( ' pkg ' , ( quote_plus ( dst_project ) , ) + ( quote_plus ( dst_package ) , ) , dst_apiurl )
found = None
try :
found = http_GET ( url ) . readlines ( )
2013-04-09 14:03:17 +02:00
except HTTPError as e :
2012-01-09 14:30:52 +01:00
pass
if force_meta_update or not found :
2013-04-09 12:51:28 +02:00
print ( ' Sending meta data... ' )
2012-01-09 14:30:52 +01:00
u = makeurl ( dst_apiurl , [ ' source ' , dst_project , dst_package , ' _meta ' ] )
http_PUT ( u , data = src_meta )
2006-09-21 16:33:24 +02:00
2013-04-09 12:51:28 +02:00
print ( ' Copying files... ' )
2008-04-02 16:36:23 +02:00
if not client_side_copy :
2008-03-17 22:46:42 +01:00
query = { ' cmd ' : ' copy ' , ' oproject ' : src_project , ' opackage ' : src_package }
2011-11-21 12:33:32 +01:00
if expand or keep_link :
2009-03-31 00:17:18 +02:00
query [ ' expand ' ] = ' 1 '
2011-11-21 12:33:32 +01:00
if keep_link :
query [ ' keeplink ' ] = ' 1 '
2009-05-14 13:50:53 +02:00
if revision :
query [ ' orev ' ] = revision
if comment :
query [ ' comment ' ] = comment
2008-03-17 22:46:42 +01:00
u = makeurl ( dst_apiurl , [ ' source ' , dst_project , dst_package ] , query = query )
f = http_POST ( u )
return f . read ( )
else :
# copy one file after the other
import tempfile
2009-07-15 20:53:47 +02:00
query = { ' rev ' : ' upload ' }
2010-08-11 22:42:16 +02:00
revision = show_upstream_srcmd5 ( src_apiurl , src_project , src_package , expand = expand , revision = revision )
for n in meta_get_filelist ( src_apiurl , src_project , src_package , expand = expand , revision = revision ) :
2010-12-18 23:18:15 +01:00
if n . startswith ( ' _service: ' ) or n . startswith ( ' _service_ ' ) :
continue
2013-04-09 12:51:28 +02:00
print ( ' ' , n )
2010-08-11 22:50:10 +02:00
tmpfile = None
try :
( fd , tmpfile ) = tempfile . mkstemp ( prefix = ' osc-copypac ' )
get_source_file ( src_apiurl , src_project , src_package , n , targetfilename = tmpfile , revision = revision )
u = makeurl ( dst_apiurl , [ ' source ' , dst_project , dst_package , pathname2url ( n ) ] , query = query )
2010-08-26 12:51:45 +02:00
http_PUT ( u , file = tmpfile )
2010-08-11 22:50:10 +02:00
finally :
if not tmpfile is None :
os . unlink ( tmpfile )
2009-07-15 20:53:47 +02:00
if comment :
query [ ' comment ' ] = comment
query [ ' cmd ' ] = ' commit '
u = makeurl ( dst_apiurl , [ ' source ' , dst_project , dst_package ] , query = query )
http_POST ( u )
2008-03-17 22:46:42 +01:00
return ' Done. '
2006-09-21 16:33:24 +02:00
2012-03-15 09:54:56 +01:00
def unlock_package ( apiurl , prj , pac , msg ) :
2013-05-27 14:56:24 +02:00
query = { ' cmd ' : ' unlock ' , ' comment ' : msg }
2012-03-15 09:54:56 +01:00
u = makeurl ( apiurl , [ ' source ' , prj , pac ] , query )
http_POST ( u )
def unlock_project ( apiurl , prj , msg = None ) :
2013-05-27 14:56:24 +02:00
query = { ' cmd ' : ' unlock ' , ' comment ' : msg }
2012-03-15 09:54:56 +01:00
u = makeurl ( apiurl , [ ' source ' , prj ] , query )
http_POST ( u )
2011-05-26 10:21:14 +02:00
def undelete_package ( apiurl , prj , pac , msg = None ) :
2013-05-27 14:56:24 +02:00
query = { ' cmd ' : ' undelete ' }
2011-05-26 10:21:14 +02:00
if msg :
query [ ' comment ' ] = msg
else :
query [ ' comment ' ] = ' undeleted via osc '
u = makeurl ( apiurl , [ ' source ' , prj , pac ] , query )
2010-05-21 19:02:42 +02:00
http_POST ( u )
2011-05-26 10:21:14 +02:00
def undelete_project ( apiurl , prj , msg = None ) :
2013-05-27 14:56:24 +02:00
query = { ' cmd ' : ' undelete ' }
2011-05-26 10:21:14 +02:00
if msg :
query [ ' comment ' ] = msg
else :
query [ ' comment ' ] = ' undeleted via osc '
u = makeurl ( apiurl , [ ' source ' , prj ] , query )
2010-05-21 19:02:42 +02:00
http_POST ( u )
2011-05-26 10:21:14 +02:00
def delete_package ( apiurl , prj , pac , force = False , msg = None ) :
2011-05-23 20:42:35 +02:00
query = { }
if force :
query [ ' force ' ] = " 1 "
2012-02-17 09:13:40 +01:00
if msg :
query [ ' comment ' ] = msg
2011-05-23 20:42:35 +02:00
u = makeurl ( apiurl , [ ' source ' , prj , pac ] , query )
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
http_DELETE ( u )
2006-08-11 12:37:29 +02:00
2011-05-26 10:21:14 +02:00
def delete_project ( apiurl , prj , force = False , msg = None ) :
2011-05-23 20:42:35 +02:00
query = { }
if force :
query [ ' force ' ] = " 1 "
2011-05-26 10:21:14 +02:00
if msg :
query [ ' comment ' ] = msg
2011-05-23 20:42:35 +02:00
u = makeurl ( apiurl , [ ' source ' , prj ] , query )
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
http_DELETE ( u )
2006-09-25 17:11:03 +02:00
2009-07-01 13:19:55 +02:00
def delete_files ( apiurl , prj , pac , files ) :
2010-08-20 14:34:41 +02:00
for filename in files :
u = makeurl ( apiurl , [ ' source ' , prj , pac , filename ] , query = { ' comment ' : ' removed %s ' % ( filename , ) } )
2009-07-01 13:19:55 +02:00
http_DELETE ( u )
2006-09-25 17:11:03 +02:00
2010-05-21 19:02:42 +02:00
2009-09-08 10:14:27 +02:00
# old compat lib call
2007-05-04 23:51:54 +02:00
def get_platforms ( apiurl ) :
2009-09-08 10:14:27 +02:00
return get_repositories ( apiurl )
def get_repositories ( apiurl ) :
2007-05-04 23:51:54 +02:00
f = http_GET ( makeurl ( apiurl , [ ' platform ' ] ) )
2006-05-02 10:17:45 +02:00
tree = ET . parse ( f )
2013-04-09 11:34:46 +02:00
r = sorted ( [ node . get ( ' name ' ) for node in tree . getroot ( ) ] )
2006-04-20 16:26:50 +02:00
return r
2006-05-02 10:17:45 +02:00
2010-07-28 16:04:27 +02:00
def get_distibutions ( apiurl , discon = False ) :
r = [ ]
2010-07-29 07:37:54 +02:00
# FIXME: this is just a naming convention on api.opensuse.org, but not a general valid apparoach
2010-07-28 16:04:27 +02:00
if discon :
result_line_templ = ' %(name)-25s %(project)s '
f = http_GET ( makeurl ( apiurl , [ ' build ' ] ) )
root = ET . fromstring ( ' ' . join ( f ) )
for node in root . findall ( ' entry ' ) :
if node . get ( ' name ' ) . startswith ( ' DISCONTINUED: ' ) :
rmap = { }
rmap [ ' name ' ] = node . get ( ' name ' ) . replace ( ' DISCONTINUED: ' , ' ' ) . replace ( ' : ' , ' ' )
rmap [ ' project ' ] = node . get ( ' name ' )
r . append ( result_line_templ % rmap )
r . insert ( 0 , ' distribution project ' )
r . insert ( 1 , ' ------------ ------- ' )
else :
2010-08-13 00:30:05 +02:00
result_line_templ = ' %(name)-25s %(project)-25s %(repository)-25s %(reponame)s '
2010-07-28 16:04:27 +02:00
f = http_GET ( makeurl ( apiurl , [ ' distributions ' ] ) )
root = ET . fromstring ( ' ' . join ( f ) )
for node in root . findall ( ' distribution ' ) :
rmap = { }
for node2 in node . findall ( ' name ' ) :
rmap [ ' name ' ] = node2 . text
for node3 in node . findall ( ' project ' ) :
rmap [ ' project ' ] = node3 . text
2010-07-29 07:37:54 +02:00
for node4 in node . findall ( ' repository ' ) :
rmap [ ' repository ' ] = node4 . text
for node5 in node . findall ( ' reponame ' ) :
rmap [ ' reponame ' ] = node5 . text
2010-07-28 16:04:27 +02:00
r . append ( result_line_templ % rmap )
2010-07-29 07:37:54 +02:00
r . insert ( 0 , ' distribution project repository reponame ' )
r . insert ( 1 , ' ------------ ------- ---------- -------- ' )
2010-07-28 16:04:27 +02:00
return r
2009-09-08 10:14:27 +02:00
# old compat lib call
2007-05-04 23:51:54 +02:00
def get_platforms_of_project ( apiurl , prj ) :
2009-09-08 10:14:27 +02:00
return get_repositories_of_project ( apiurl , prj )
def get_repositories_of_project ( apiurl , prj ) :
2007-05-04 23:51:54 +02:00
f = show_project_meta ( apiurl , prj )
2009-12-26 14:22:34 +01:00
root = ET . fromstring ( ' ' . join ( f ) )
2006-04-20 16:26:50 +02:00
2009-12-26 14:22:34 +01:00
r = [ node . get ( ' name ' ) for node in root . findall ( ' repository ' ) ]
2006-04-20 16:26:50 +02:00
return r
2006-05-02 10:17:45 +02:00
2009-11-17 14:39:46 +01:00
class Repo :
repo_line_templ = ' %-15s %-10s '
def __init__ ( self , name , arch ) :
self . name = name
self . arch = arch
def __str__ ( self ) :
return self . repo_line_templ % ( self . name , self . arch )
2007-05-04 23:51:54 +02:00
def get_repos_of_project ( apiurl , prj ) :
f = show_project_meta ( apiurl , prj )
2009-12-26 14:22:34 +01:00
root = ET . fromstring ( ' ' . join ( f ) )
2006-07-05 12:25:31 +02:00
2009-12-26 14:22:34 +01:00
for node in root . findall ( ' repository ' ) :
2006-07-05 12:25:31 +02:00
for node2 in node . findall ( ' arch ' ) :
2009-11-17 14:39:46 +01:00
yield Repo ( node . get ( ' name ' ) , node2 . text )
2006-07-05 12:25:31 +02:00
2008-09-30 16:54:08 +02:00
def get_binarylist ( apiurl , prj , repo , arch , package = None , verbose = False ) :
2007-08-16 19:12:46 +02:00
what = package or ' _repository '
u = makeurl ( apiurl , [ ' build ' , prj , repo , arch , what ] )
2007-08-16 12:28:32 +02:00
f = http_GET ( u )
2007-08-16 19:12:46 +02:00
tree = ET . parse ( f )
2008-09-30 16:54:08 +02:00
if not verbose :
return [ node . get ( ' filename ' ) for node in tree . findall ( ' binary ' ) ]
else :
l = [ ]
for node in tree . findall ( ' binary ' ) :
2009-10-20 16:30:15 +02:00
f = File ( node . get ( ' filename ' ) ,
None ,
int ( node . get ( ' size ' ) ) ,
2008-09-30 16:54:08 +02:00
int ( node . get ( ' mtime ' ) ) )
l . append ( f )
return l
2007-08-16 12:28:32 +02:00
2007-08-16 19:12:46 +02:00
def get_binarylist_published ( apiurl , prj , repo , arch ) :
u = makeurl ( apiurl , [ ' published ' , prj , repo , arch ] )
f = http_GET ( u )
tree = ET . parse ( f )
r = [ node . get ( ' name ' ) for node in tree . findall ( ' entry ' ) ]
return r
2012-01-23 17:26:53 +01:00
def show_results_meta ( apiurl , prj , package = None , lastbuild = None , repository = [ ] , arch = [ ] , oldstate = None ) :
2009-02-18 11:22:06 +01:00
query = { }
2007-08-11 14:29:38 +02:00
if package :
2009-02-18 11:22:06 +01:00
query [ ' package ' ] = package
2012-01-23 17:26:53 +01:00
if oldstate :
query [ ' oldstate ' ] = oldstate
2009-02-18 10:53:38 +01:00
if lastbuild :
query [ ' lastbuild ' ] = 1
2007-08-11 14:29:38 +02:00
u = makeurl ( apiurl , [ ' build ' , prj , ' _result ' ] , query = query )
2009-05-15 09:16:26 +02:00
for repo in repository :
u = u + ' &repository= %s ' % repo
for a in arch :
u = u + ' &arch= %s ' % a
2007-04-19 10:47:22 +02:00
f = http_GET ( u )
2006-04-20 16:26:50 +02:00
return f . readlines ( )
2006-05-02 10:17:45 +02:00
2007-05-04 23:51:54 +02:00
def show_prj_results_meta ( apiurl , prj ) :
u = makeurl ( apiurl , [ ' build ' , prj , ' _result ' ] )
2007-04-19 10:47:22 +02:00
f = http_GET ( u )
2006-09-25 17:11:03 +02:00
return f . readlines ( )
2012-01-23 17:26:53 +01:00
def get_package_results ( apiurl , prj , package , lastbuild = None , repository = [ ] , arch = [ ] , oldstate = None ) :
2010-04-20 14:18:02 +02:00
""" return a package results as a list of dicts """
2006-04-29 22:44:09 +02:00
r = [ ]
2012-01-23 17:26:53 +01:00
f = show_results_meta ( apiurl , prj , package , lastbuild , repository , arch , oldstate )
2009-12-26 14:22:34 +01:00
root = ET . fromstring ( ' ' . join ( f ) )
2006-05-02 10:17:45 +02:00
2012-01-23 17:26:53 +01:00
r . append ( { ' _oldstate ' : root . get ( ' state ' ) } )
2007-03-13 00:21:34 +01:00
for node in root . findall ( ' result ' ) :
rmap = { }
2010-04-20 14:37:28 +02:00
rmap [ ' project ' ] = rmap [ ' prj ' ] = prj
rmap [ ' pkg ' ] = rmap [ ' package ' ] = rmap [ ' pac ' ] = package
rmap [ ' repository ' ] = rmap [ ' repo ' ] = rmap [ ' rep ' ] = node . get ( ' repository ' )
2006-05-02 10:17:45 +02:00
rmap [ ' arch ' ] = node . get ( ' arch ' )
2010-01-13 13:35:45 +01:00
rmap [ ' state ' ] = node . get ( ' state ' )
rmap [ ' dirty ' ] = node . get ( ' dirty ' )
2013-06-13 16:27:58 +02:00
rmap [ ' repostate ' ] = node . get ( ' code ' )
2006-05-02 10:17:45 +02:00
2010-04-20 14:18:02 +02:00
rmap [ ' details ' ] = ' '
2011-12-05 23:23:49 +01:00
details = None
statusnode = node . find ( ' status ' )
2010-05-03 10:53:12 +02:00
if statusnode != None :
rmap [ ' code ' ] = statusnode . get ( ' code ' , ' ' )
2011-12-05 23:23:49 +01:00
details = statusnode . find ( ' details ' )
2010-05-03 10:53:12 +02:00
else :
rmap [ ' code ' ] = ' '
2006-05-02 10:17:45 +02:00
2011-12-05 23:23:49 +01:00
if details != None :
rmap [ ' details ' ] = details . text
2010-04-20 14:18:02 +02:00
rmap [ ' dirty ' ] = rmap [ ' dirty ' ] == ' true '
r . append ( rmap )
return r
2010-04-20 14:38:14 +02:00
def format_results ( results , format ) :
""" apply selected format on each dict in results and return it as a list of strings """
2010-04-22 20:13:58 +02:00
return [ format % r for r in results ]
2010-04-20 14:38:14 +02:00
2012-01-23 17:26:53 +01:00
def get_results ( apiurl , prj , package , lastbuild = None , repository = [ ] , arch = [ ] , verbose = False , wait = False , printJoin = None ) :
2010-04-20 14:18:02 +02:00
r = [ ]
result_line_templ = ' %(rep)-20s %(arch)-10s %(status)s '
2012-01-23 17:26:53 +01:00
oldstate = None
while True :
2013-05-27 14:26:58 +02:00
waiting = False
results = r = [ ]
try :
results = get_package_results ( apiurl , prj , package , lastbuild , repository , arch , oldstate )
except HTTPError as e :
# check for simple timeout error and fetch again
2013-10-22 17:49:51 +02:00
if e . code == 502 or e . code == 504 :
# re-try result request
continue
raise
2013-05-27 14:26:58 +02:00
for res in results :
if ' _oldstate ' in res :
oldstate = res [ ' _oldstate ' ]
continue
res [ ' status ' ] = res [ ' code ' ]
if verbose and res [ ' details ' ] != ' ' :
if res [ ' code ' ] in ( ' unresolvable ' , ' expansion error ' ) :
lines = res [ ' details ' ] . split ( ' , ' )
res [ ' status ' ] + = ' : ' + ' \n ' . join ( lines )
else :
res [ ' status ' ] + = ' : %s ' % ( res [ ' details ' ] , )
2013-06-13 16:42:25 +02:00
if res [ ' dirty ' ] :
2013-06-13 16:27:58 +02:00
waiting = True
if verbose :
2013-06-13 16:42:25 +02:00
res [ ' status ' ] = ' outdated (was: %s ) ' % res [ ' status ' ]
2013-06-13 16:27:58 +02:00
else :
res [ ' status ' ] + = ' * '
2013-06-13 16:42:25 +02:00
elif res [ ' code ' ] in ( ' succeeded ' ) and res [ ' repostate ' ] != " published " :
2013-05-27 14:56:24 +02:00
waiting = True
2013-05-27 14:26:58 +02:00
if verbose :
2013-06-13 16:42:25 +02:00
res [ ' status ' ] + = ' (unpublished) '
2013-05-27 14:26:58 +02:00
else :
res [ ' status ' ] + = ' * '
if res [ ' code ' ] in ( ' blocked ' , ' scheduled ' , ' dispatching ' , ' building ' , ' signing ' , ' finished ' ) :
2013-05-27 14:56:24 +02:00
waiting = True
2013-05-27 14:26:58 +02:00
r . append ( result_line_templ % res )
if printJoin :
print ( printJoin . join ( r ) )
2013-05-27 14:56:24 +02:00
if wait == False or waiting == False :
2013-05-27 14:26:58 +02:00
break
2010-01-13 13:35:45 +01:00
2006-04-29 22:44:09 +02:00
return r
2010-08-04 17:16:59 +02:00
def get_prj_results ( apiurl , prj , hide_legend = False , csv = False , status_filter = None , name_filter = None , arch = None , repo = None , vertical = None , show_excluded = None ) :
2006-09-25 17:11:03 +02:00
#print '----------------------------------------'
2010-08-31 14:43:43 +02:00
global buildstatus_symbols
2006-09-25 17:11:03 +02:00
r = [ ]
2007-05-04 23:51:54 +02:00
f = show_prj_results_meta ( apiurl , prj )
2009-12-26 14:22:34 +01:00
root = ET . fromstring ( ' ' . join ( f ) )
2006-09-25 17:11:03 +02:00
pacs = [ ]
2008-02-12 13:45:06 +01:00
# sequence of (repo,arch) tuples
targets = [ ]
# {package: {(repo,arch): status}}
status = { }
2010-05-27 17:05:40 +02:00
if root . find ( ' result ' ) == None :
2007-06-26 16:32:49 +02:00
return [ ]
2010-05-27 17:05:40 +02:00
for results in root . findall ( ' result ' ) :
2010-06-09 14:34:04 +02:00
for node in results :
pacs . append ( node . get ( ' package ' ) )
2010-05-27 17:05:40 +02:00
pacs = sorted ( list ( set ( pacs ) ) )
2008-02-12 13:45:06 +01:00
for node in root . findall ( ' result ' ) :
2009-10-15 16:24:12 +02:00
# filter architecture and repository
2010-06-21 17:10:25 +02:00
if arch != None and node . get ( ' arch ' ) not in arch :
2009-10-15 16:24:12 +02:00
continue
2010-06-21 17:10:25 +02:00
if repo != None and node . get ( ' repository ' ) not in repo :
2009-10-15 16:24:12 +02:00
continue
2010-01-13 13:35:45 +01:00
if node . get ( ' dirty ' ) == " true " :
state = " outdated "
else :
state = node . get ( ' state ' )
tg = ( node . get ( ' repository ' ) , node . get ( ' arch ' ) , state )
2008-02-12 13:45:06 +01:00
targets . append ( tg )
for pacnode in node . findall ( ' status ' ) :
pac = pacnode . get ( ' package ' )
if pac not in status :
status [ pac ] = { }
status [ pac ] [ tg ] = pacnode . get ( ' code ' )
targets . sort ( )
2008-05-15 20:09:24 +02:00
# filter option
2010-08-04 17:16:59 +02:00
if status_filter or name_filter or not show_excluded :
2008-05-15 20:09:24 +02:00
pacs_to_show = [ ]
2008-05-16 13:15:41 +02:00
targets_to_show = [ ]
2008-05-15 20:09:24 +02:00
2009-10-20 16:30:15 +02:00
#filtering for Package Status
2008-05-15 20:09:24 +02:00
if status_filter :
if status_filter in buildstatus_symbols . values ( ) :
2013-07-04 21:58:28 +02:00
# a list is needed because if status_filter == "U"
# we have to filter either an "expansion error" (obsolete)
# or an "unresolvable" state
filters = [ ]
2008-05-15 20:09:24 +02:00
for txt , sym in buildstatus_symbols . items ( ) :
if sym == status_filter :
2013-07-04 21:58:28 +02:00
filters . append ( txt )
for filt_txt in filters :
for pkg in status . keys ( ) :
for repo in status [ pkg ] . keys ( ) :
if status [ pkg ] [ repo ] == filt_txt :
if not name_filter :
pacs_to_show . append ( pkg )
targets_to_show . append ( repo )
elif name_filter in pkg :
pacs_to_show . append ( pkg )
2008-05-15 20:09:24 +02:00
2009-10-20 16:30:15 +02:00
#filtering for Package Name
2008-05-15 20:09:24 +02:00
elif name_filter :
for pkg in pacs :
if name_filter in pkg :
pacs_to_show . append ( pkg )
2010-07-28 15:38:01 +02:00
#filter non building states
2010-08-04 17:16:59 +02:00
elif not show_excluded :
2010-08-04 16:44:51 +02:00
enabled = { }
for pkg in status . keys ( ) :
showpkg = False
for repo in status [ pkg ] . keys ( ) :
2010-08-04 17:16:59 +02:00
if status [ pkg ] [ repo ] != " excluded " :
2010-08-04 16:44:51 +02:00
enabled [ repo ] = 1
showpkg = True
if showpkg :
pacs_to_show . append ( pkg )
2010-07-28 15:38:01 +02:00
2010-08-04 16:44:51 +02:00
targets_to_show = enabled . keys ( )
2010-07-28 15:38:01 +02:00
2008-05-15 20:09:24 +02:00
pacs = [ i for i in pacs if i in pacs_to_show ]
2008-05-20 13:36:16 +02:00
if len ( targets_to_show ) :
2008-05-16 13:15:41 +02:00
targets = [ i for i in targets if i in targets_to_show ]
2008-05-15 20:09:24 +02:00
2008-02-12 13:45:06 +01:00
# csv output
if csv :
# TODO: option to disable the table header
row = [ ' _ ' ] + [ ' / ' . join ( tg ) for tg in targets ]
2008-03-13 12:13:22 +01:00
r . append ( ' ; ' . join ( row ) )
2008-02-12 13:45:06 +01:00
for pac in pacs :
Fixed traceback in get_prj_results
The reason of the crash is that not all targets are always defined for
all packages. In our environment it happens when linked project is
created and sources have just been uploaded to one package.
Here is the crash:
Traceback (most recent call last):
File "../tools-testing/build-package", line 313, in <module>
sys.exit(main(sys.argv))
File "../tools-testing/build-package", line 309, in main
return build(apiurl, tproject, package, timeout)
File "../tools-testing/build-package", line 226, in build
hide_legend=True, csv=True)
File "/usr/lib/python2.7/site-packages/osc/core.py", line 5135, in get_prj_results
row = [pac] + [status[pac][tg] for tg in targets]
status[pac]]
KeyError: ('Fedora_18', 'i586', 'outdated')
Please note that this fix fixes only csv mode. For other modes osc still
can crash, but it's hard to reproduce here as we're not using them.
Signed-off-by: Ed Bartosh <bartosh@gmail.com>
2013-12-05 15:46:30 +01:00
row = [ pac ] + [ status [ pac ] [ tg ] for tg in targets if tg in status [ pac ] ]
2008-03-13 12:13:22 +01:00
r . append ( ' ; ' . join ( row ) )
2008-02-12 13:45:06 +01:00
return r
2006-09-29 11:55:27 +02:00
2010-01-11 16:36:21 +01:00
if not vertical :
# human readable output
max_pacs = 40
for startpac in range ( 0 , len ( pacs ) , max_pacs ) :
offset = 0
for pac in pacs [ startpac : startpac + max_pacs ] :
r . append ( ' | ' * offset + ' ' + pac )
offset + = 1
for tg in targets :
line = [ ]
line . append ( ' ' )
for pac in pacs [ startpac : startpac + max_pacs ] :
st = ' '
2013-04-09 11:33:25 +02:00
if pac not in status or tg not in status [ pac ] :
2010-01-11 16:36:21 +01:00
# for newly added packages, status may be missing
st = ' ? '
else :
try :
st = buildstatus_symbols [ status [ pac ] [ tg ] ]
except :
2013-04-09 12:51:28 +02:00
print ( ' osc: warn: unknown status \' %s \' ... ' % status [ pac ] [ tg ] )
print ( ' please edit osc/core.py, and extend the buildstatus_symbols dictionary. ' )
2010-01-11 16:36:21 +01:00
st = ' ? '
buildstatus_symbols [ status [ pac ] [ tg ] ] = ' ? '
line . append ( st )
line . append ( ' ' )
line . append ( ' %s %s ( %s ) ' % tg )
line = ' ' . join ( line )
r . append ( line )
r . append ( ' ' )
else :
2006-09-29 11:55:27 +02:00
offset = 0
2010-01-11 16:36:21 +01:00
for tg in targets :
r . append ( ' | ' * offset + ' %s %s ( %s ) ' % tg )
2006-09-29 11:55:27 +02:00
offset + = 1
2010-01-11 16:36:21 +01:00
for pac in pacs :
2006-09-29 11:55:27 +02:00
line = [ ]
2010-01-11 16:36:21 +01:00
for tg in targets :
2008-02-12 13:45:06 +01:00
st = ' '
2013-04-09 11:33:25 +02:00
if pac not in status or tg not in status [ pac ] :
2008-02-12 13:45:06 +01:00
# for newly added packages, status may be missing
st = ' ? '
2008-05-05 14:27:34 +02:00
else :
try :
st = buildstatus_symbols [ status [ pac ] [ tg ] ]
except :
2013-04-09 12:51:28 +02:00
print ( ' osc: warn: unknown status \' %s \' ... ' % status [ pac ] [ tg ] )
print ( ' please edit osc/core.py, and extend the buildstatus_symbols dictionary. ' )
2008-05-05 14:27:34 +02:00
st = ' ? '
buildstatus_symbols [ status [ pac ] [ tg ] ] = ' ? '
2008-02-12 13:45:06 +01:00
line . append ( st )
2010-01-11 16:36:21 +01:00
line . append ( ' ' + pac )
r . append ( ' ' . join ( line ) )
line = [ ]
for i in range ( 0 , len ( targets ) ) :
line . append ( str ( i % 10 ) )
r . append ( ' ' . join ( line ) )
2010-02-28 02:30:13 +01:00
2006-09-29 11:55:27 +02:00
r . append ( ' ' )
2006-09-25 17:11:03 +02:00
2008-05-20 13:36:16 +02:00
if not hide_legend and len ( pacs ) :
2007-04-25 01:00:12 +02:00
r . append ( ' Legend: ' )
2010-01-11 16:36:21 +01:00
legend = [ ]
2007-04-25 01:00:12 +02:00
for i , j in buildstatus_symbols . items ( ) :
2010-09-02 16:43:34 +02:00
if i == " expansion error " :
continue
2010-01-11 16:36:21 +01:00
legend . append ( ' %3s %-20s ' % ( j , i ) )
2011-09-07 18:33:07 +02:00
legend . append ( ' ? buildstatus not available (only new packages) ' )
2010-01-11 16:36:21 +01:00
if vertical :
for i in range ( 0 , len ( targets ) ) :
s = ' %1d %s %s ( %s ) ' % ( i % 10 , targets [ i ] [ 0 ] , targets [ i ] [ 1 ] , targets [ i ] [ 2 ] )
if i < len ( legend ) :
legend [ i ] + = s
else :
legend . append ( ' ' * 24 + s )
r + = legend
2006-09-25 17:11:03 +02:00
return r
2010-04-07 03:06:03 +02:00
def streamfile ( url , http_meth = http_GET , bufsize = 8192 , data = None , progress_obj = None , text = None ) :
2009-04-09 17:52:59 +02:00
"""
performs http_meth on url and read bufsize bytes from the response
until EOF is reached . After each read bufsize bytes are yielded to the
caller .
"""
2010-12-01 10:22:53 +01:00
cl = ' '
retries = 0
# Repeat requests until we get reasonable Content-Length header
# Server (or iChain) is corrupting data at some point, see bnc#656281
while cl == ' ' :
if retries > = int ( conf . config [ ' http_retries ' ] ) :
raise oscerr . OscIOError ( None , ' Content-Length is empty for %s , protocol violation ' % url )
retries = retries + 1
if retries > 1 and conf . config [ ' http_debug ' ] :
2013-04-09 12:51:28 +02:00
print ( ' \n \n Retry %d -- ' % ( retries - 1 ) , url , file = sys . stderr )
2010-12-01 10:22:53 +01:00
f = http_meth . __call__ ( url , data = data )
cl = f . info ( ) . get ( ' Content-Length ' )
2010-11-30 16:39:14 +01:00
if cl is not None :
2012-01-25 14:58:55 +01:00
# sometimes the proxy adds the same header again
# which yields in value like '3495, 3495'
# use the first of these values (should be all the same)
cl = cl . split ( ' , ' ) [ 0 ]
2010-11-30 16:39:14 +01:00
cl = int ( cl )
2010-02-09 20:57:10 +01:00
if progress_obj :
2013-04-09 12:36:42 +02:00
basename = os . path . basename ( urlsplit ( url ) [ 2 ] )
2010-09-09 15:04:00 +02:00
progress_obj . start ( basename = basename , text = text , size = cl )
2009-04-09 17:52:59 +02:00
data = f . read ( bufsize )
2010-02-09 20:57:10 +01:00
read = len ( data )
2009-04-09 17:52:59 +02:00
while len ( data ) :
2010-02-09 20:57:10 +01:00
if progress_obj :
progress_obj . update ( read )
2009-04-09 17:52:59 +02:00
yield data
data = f . read ( bufsize )
2010-02-09 20:57:10 +01:00
read + = len ( data )
if progress_obj :
progress_obj . end ( read )
2009-04-09 18:14:29 +02:00
f . close ( )
2009-04-09 17:52:59 +02:00
2010-11-30 19:10:06 +01:00
if not cl is None and read != cl :
raise oscerr . OscIOError ( None , ' Content-Length is not matching file size for %s : %i vs %i file size ' % ( url , cl , read ) )
2010-11-30 16:39:14 +01:00
2009-04-09 17:52:59 +02:00
2012-12-15 01:50:24 +01:00
def buildlog_strip_time ( data ) :
""" Strips the leading build time from the log """
time_regex = re . compile ( ' ^ \ [ \ s { 0,5} \ d+s \ ] \ s ' , re . M )
return time_regex . sub ( ' ' , data )
2013-08-13 10:38:43 +02:00
def print_buildlog ( apiurl , prj , package , repository , arch , offset = 0 , strip_time = False , last = False ) :
2008-01-03 23:10:16 +01:00
""" prints out the buildlog on stdout """
2012-03-05 10:44:09 +01:00
# to protect us against control characters
import string
all_bytes = string . maketrans ( ' ' , ' ' )
remove_bytes = all_bytes [ : 10 ] + all_bytes [ 11 : 32 ] # accept newlines
2009-04-09 17:52:59 +02:00
query = { ' nostream ' : ' 1 ' , ' start ' : ' %s ' % offset }
2013-08-13 10:38:43 +02:00
if last :
query [ ' last ' ] = 1
2009-04-24 20:17:12 +02:00
while True :
query [ ' start ' ] = offset
start_offset = offset
2009-09-08 10:14:27 +02:00
u = makeurl ( apiurl , [ ' build ' , prj , repository , arch , package , ' _log ' ] , query = query )
2009-04-24 20:17:12 +02:00
for data in streamfile ( u ) :
offset + = len ( data )
2012-12-15 01:50:24 +01:00
if strip_time :
data = buildlog_strip_time ( data )
2012-03-05 10:44:09 +01:00
sys . stdout . write ( data . translate ( all_bytes , remove_bytes ) )
2009-04-24 20:17:12 +02:00
if start_offset == offset :
break
2006-05-02 10:17:45 +02:00
2009-12-04 16:20:17 +01:00
def get_dependson ( apiurl , project , repository , arch , packages = None , reverse = None ) :
query = [ ]
if packages :
for i in packages :
query . append ( ' package= %s ' % quote_plus ( i ) )
if reverse :
query . append ( ' view=revpkgnames ' )
else :
query . append ( ' view=pkgnames ' )
u = makeurl ( apiurl , [ ' build ' , project , repository , arch , ' _builddepinfo ' ] , query = query )
f = http_GET ( u )
return f . read ( )
2012-12-04 16:44:14 +01:00
def get_buildinfo ( apiurl , prj , package , repository , arch , specfile = None , addlist = None , debug = None ) :
2007-05-09 11:36:55 +02:00
query = [ ]
if addlist :
for i in addlist :
query . append ( ' add= %s ' % quote_plus ( i ) )
2012-12-04 16:44:14 +01:00
if debug :
query . append ( ' debug=1 ' )
2007-05-09 11:36:55 +02:00
2009-09-08 10:14:27 +02:00
u = makeurl ( apiurl , [ ' build ' , prj , repository , arch , package , ' _buildinfo ' ] , query = query )
2007-05-09 11:36:55 +02:00
2007-04-25 01:00:12 +02:00
if specfile :
f = http_POST ( u , data = specfile )
else :
f = http_GET ( u )
2006-07-05 12:25:31 +02:00
return f . read ( )
2010-07-27 13:58:52 +02:00
def get_buildconfig ( apiurl , prj , repository ) :
2009-09-08 10:14:27 +02:00
u = makeurl ( apiurl , [ ' build ' , prj , repository , ' _buildconfig ' ] )
2007-04-19 10:47:22 +02:00
f = http_GET ( u )
2006-07-05 12:25:31 +02:00
return f . read ( )
2010-12-26 21:14:40 +01:00
def get_source_rev ( apiurl , project , package , revision = None ) :
# API supports ?deleted=1&meta=1&rev=4
# but not rev=current,rev=latest,rev=top, or anything like this.
# CAUTION: We have to loop through all rev and find the highest one, if none given.
if revision :
2013-05-27 14:26:58 +02:00
url = makeurl ( apiurl , [ ' source ' , project , package , ' _history ' ] , { ' rev ' : revision } )
2010-12-26 21:14:40 +01:00
else :
2013-05-27 14:26:58 +02:00
url = makeurl ( apiurl , [ ' source ' , project , package , ' _history ' ] )
2010-12-26 21:14:40 +01:00
f = http_GET ( url )
xml = ET . parse ( f )
ent = None
for new in xml . findall ( ' revision ' ) :
# remember the newest one.
if not ent :
ent = new
elif ent . find ( ' time ' ) . text < new . find ( ' time ' ) . text :
ent = new
if not ent :
return { ' version ' : None , ' error ' : ' empty revisionlist: no such package? ' }
e = { }
for k in ent . keys ( ) :
2013-05-27 14:26:58 +02:00
e [ k ] = ent . get ( k )
2010-12-26 21:14:40 +01:00
for k in list ( ent ) :
2013-05-27 14:26:58 +02:00
e [ k . tag ] = k . text
2010-12-26 21:14:40 +01:00
return e
2006-07-05 12:25:31 +02:00
2009-09-08 10:14:27 +02:00
def get_buildhistory ( apiurl , prj , package , repository , arch , format = ' text ' ) :
2006-09-25 17:11:03 +02:00
import time
2009-09-08 10:14:27 +02:00
u = makeurl ( apiurl , [ ' build ' , prj , repository , arch , package , ' _history ' ] )
2007-04-19 10:47:22 +02:00
f = http_GET ( u )
2006-09-25 17:11:03 +02:00
root = ET . parse ( f ) . getroot ( )
r = [ ]
for node in root . findall ( ' entry ' ) :
rev = int ( node . get ( ' rev ' ) )
2009-10-20 16:30:15 +02:00
srcmd5 = node . get ( ' srcmd5 ' )
versrel = node . get ( ' versrel ' )
2006-09-25 17:11:03 +02:00
bcnt = int ( node . get ( ' bcnt ' ) )
2006-10-10 16:04:34 +02:00
t = time . localtime ( int ( node . get ( ' time ' ) ) )
2006-09-25 17:11:03 +02:00
t = time . strftime ( ' % Y- % m- %d % H: % M: % S ' , t )
2009-05-13 11:04:27 +02:00
if format == ' csv ' :
r . append ( ' %s | %s | %d | %s . %d ' % ( t , srcmd5 , rev , versrel , bcnt ) )
else :
r . append ( ' %s %s %6d %s . %d ' % ( t , srcmd5 , rev , versrel , bcnt ) )
2006-09-25 17:11:03 +02:00
2009-05-13 11:04:27 +02:00
if format == ' text ' :
r . insert ( 0 , ' time srcmd5 rev vers-rel.bcnt ' )
2006-09-25 17:11:03 +02:00
return r
2006-05-19 22:13:29 +02:00
2009-11-13 14:31:10 +01:00
def print_jobhistory ( apiurl , prj , current_package , repository , arch , format = ' text ' , limit = 20 ) :
2009-02-20 12:04:45 +01:00
import time
2009-11-23 11:13:12 +01:00
query = { }
2009-02-20 12:56:13 +01:00
if current_package :
2010-01-12 17:22:47 +01:00
query [ ' package ' ] = current_package
2009-11-23 11:13:12 +01:00
if limit != None and int ( limit ) > 0 :
2010-01-12 17:22:47 +01:00
query [ ' limit ' ] = int ( limit )
2009-11-23 11:13:12 +01:00
u = makeurl ( apiurl , [ ' build ' , prj , repository , arch , ' _jobhistory ' ] , query )
2009-02-20 12:04:45 +01:00
f = http_GET ( u )
root = ET . parse ( f ) . getroot ( )
2009-05-13 11:04:27 +02:00
if format == ' text ' :
2013-04-09 12:51:28 +02:00
print ( " time package reason code build time worker " )
2009-02-20 12:04:45 +01:00
for node in root . findall ( ' jobhist ' ) :
package = node . get ( ' package ' )
2009-11-13 14:31:10 +01:00
worker = node . get ( ' workerid ' )
2009-02-20 12:04:45 +01:00
reason = node . get ( ' reason ' )
if not reason :
reason = " unknown "
code = node . get ( ' code ' )
rt = int ( node . get ( ' readytime ' ) )
readyt = time . localtime ( rt )
readyt = time . strftime ( ' % Y- % m- %d % H: % M: % S ' , readyt )
st = int ( node . get ( ' starttime ' ) )
et = int ( node . get ( ' endtime ' ) )
endtime = time . strftime ( ' % Y- % m- %d % H: % M: % S ' , time . localtime ( et ) )
waittm = time . gmtime ( et - st )
2013-05-27 14:56:24 +02:00
if waittm . tm_mday > 1 :
2013-02-11 11:18:27 +01:00
waitbuild = " %1d d %2d h %2d m %2d s " % ( waittm . tm_mday - 1 , waittm . tm_hour , waittm . tm_min , waittm . tm_sec )
elif waittm . tm_hour :
waitbuild = " %2d h %2d m %2d s " % ( waittm . tm_hour , waittm . tm_min , waittm . tm_sec )
2009-02-20 12:04:45 +01:00
else :
2013-02-11 11:18:27 +01:00
waitbuild = " %2d m %2d s " % ( waittm . tm_min , waittm . tm_sec )
2009-10-20 16:30:15 +02:00
2009-05-13 11:04:27 +02:00
if format == ' csv ' :
2013-04-09 12:51:28 +02:00
print ( ' %s | %s | %s | %s | %s | %s ' % ( endtime , package , reason , code , waitbuild , worker ) )
2009-05-13 11:04:27 +02:00
else :
2013-04-09 12:51:28 +02:00
print ( ' %s %-50s %-16s %-16s %-16s %-16s ' % ( endtime , package [ 0 : 49 ] , reason [ 0 : 15 ] , code [ 0 : 15 ] , waitbuild , worker ) )
2009-02-20 12:04:45 +01:00
2006-05-19 22:13:29 +02:00
2011-11-22 20:12:28 +01:00
def get_commitlog ( apiurl , prj , package , revision , format = ' text ' , meta = False , deleted = False , revision_upper = None ) :
2011-10-18 03:03:42 +02:00
import time
2010-05-25 13:59:46 +02:00
query = { }
2011-01-19 20:26:38 +01:00
if deleted :
query [ ' deleted ' ] = 1
2010-05-25 13:59:46 +02:00
if meta :
query [ ' meta ' ] = 1
u = makeurl ( apiurl , [ ' source ' , prj , package , ' _history ' ] , query )
2007-07-12 01:24:26 +02:00
f = http_GET ( u )
root = ET . parse ( f ) . getroot ( )
r = [ ]
2009-05-13 10:53:32 +02:00
if format == ' xml ' :
r . append ( ' <?xml version= " 1.0 " ?> ' )
r . append ( ' <log> ' )
2007-07-12 01:24:26 +02:00
revisions = root . findall ( ' revision ' )
revisions . reverse ( )
for node in revisions :
2009-05-05 16:01:41 +02:00
srcmd5 = node . find ( ' srcmd5 ' ) . text
2007-07-12 02:48:52 +02:00
try :
rev = int ( node . get ( ' rev ' ) )
#vrev = int(node.get('vrev')) # what is the meaning of vrev?
2009-05-05 16:01:41 +02:00
try :
2011-11-22 20:12:28 +01:00
if revision is not None and revision_upper is not None :
if rev > int ( revision_upper ) or rev < int ( revision ) :
continue
elif revision is not None and rev != int ( revision ) :
2009-05-05 16:01:41 +02:00
continue
except ValueError :
if revision != srcmd5 :
continue
2007-07-12 02:48:52 +02:00
except ValueError :
# this part should _never_ be reached but...
return [ ' an unexpected error occured - please file a bug ' ]
2007-07-12 01:24:26 +02:00
version = node . find ( ' version ' ) . text
user = node . find ( ' user ' ) . text
try :
2007-07-13 12:02:35 +02:00
comment = node . find ( ' comment ' ) . text . encode ( locale . getpreferredencoding ( ) , ' replace ' )
2007-07-12 01:24:26 +02:00
except :
comment = ' <no message> '
2009-09-05 15:46:55 +02:00
try :
requestid = node . find ( ' requestid ' ) . text . encode ( locale . getpreferredencoding ( ) , ' replace ' )
except :
requestid = " "
2007-07-12 01:24:26 +02:00
t = time . localtime ( int ( node . find ( ' time ' ) . text ) )
t = time . strftime ( ' % Y- % m- %d % H: % M: % S ' , t )
2009-05-13 10:53:32 +02:00
if format == ' csv ' :
2009-10-20 16:30:15 +02:00
s = ' %s | %s | %s | %s | %s | %s | %s ' % ( rev , user , t , srcmd5 , version ,
2009-09-05 15:46:55 +02:00
comment . replace ( ' \\ ' , ' \\ \\ ' ) . replace ( ' \n ' , ' \\ n ' ) . replace ( ' | ' , ' \\ | ' ) , requestid )
2009-05-13 10:53:32 +02:00
r . append ( s )
elif format == ' xml ' :
r . append ( ' <logentry ' )
2009-05-13 10:57:24 +02:00
r . append ( ' revision= " %s " srcmd5= " %s " > ' % ( rev , srcmd5 ) )
2009-05-13 10:53:32 +02:00
r . append ( ' <author> %s </author> ' % user )
r . append ( ' <date> %s </date> ' % t )
2009-09-05 15:46:55 +02:00
r . append ( ' <requestid> %s </requestid> ' % requestid )
2009-10-20 16:30:15 +02:00
r . append ( ' <msg> %s </msg> ' %
2009-05-13 10:53:32 +02:00
comment . replace ( ' & ' , ' & ' ) . replace ( ' < ' , ' > ' ) . replace ( ' > ' , ' < ' ) )
r . append ( ' </logentry> ' )
else :
2011-05-23 16:59:16 +02:00
if requestid :
2013-05-27 14:56:24 +02:00
requestid = " rq " + requestid
2009-05-13 10:53:32 +02:00
s = ' - ' * 76 + \
2011-05-23 16:59:16 +02:00
' \n r %s | %s | %s | %s | %s | %s \n ' % ( rev , user , t , srcmd5 , version , requestid ) + \
2009-05-13 10:53:32 +02:00
' \n ' + comment
r . append ( s )
if format not in [ ' csv ' , ' xml ' ] :
r . append ( ' - ' * 76 )
if format == ' xml ' :
r . append ( ' </log> ' )
2007-07-12 01:24:26 +02:00
return r
2010-09-01 12:44:47 +02:00
def runservice ( apiurl , prj , package ) :
u = makeurl ( apiurl , [ ' source ' , prj , package ] , query = { ' cmd ' : ' runservice ' } )
try :
f = http_POST ( u )
2013-04-09 14:03:17 +02:00
except HTTPError as e :
2010-09-01 12:44:47 +02:00
e . osc_msg = ' could not trigger service run for project \' %s \' package \' %s \' ' % ( prj , package )
raise
root = ET . parse ( f ) . getroot ( )
return root . get ( ' code ' )
2007-06-14 16:30:36 +02:00
def rebuild ( apiurl , prj , package , repo , arch , code = None ) :
2008-04-02 16:07:40 +02:00
query = { ' cmd ' : ' rebuild ' }
2007-04-25 01:00:12 +02:00
if package :
2008-04-02 16:07:40 +02:00
query [ ' package ' ] = package
2006-09-25 17:11:03 +02:00
if repo :
2008-04-02 16:07:40 +02:00
query [ ' repository ' ] = repo
2006-09-25 17:11:03 +02:00
if arch :
2008-04-02 16:07:40 +02:00
query [ ' arch ' ] = arch
2007-04-25 01:00:12 +02:00
if code :
2008-04-02 16:07:40 +02:00
query [ ' code ' ] = code
2007-04-25 01:00:12 +02:00
2007-05-09 11:36:55 +02:00
u = makeurl ( apiurl , [ ' build ' , prj ] , query = query )
2006-06-26 17:11:22 +02:00
try :
2007-04-19 10:47:22 +02:00
f = http_POST ( u )
2013-04-09 14:03:17 +02:00
except HTTPError as e :
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
e . osc_msg = ' could not trigger rebuild for project \' %s \' package \' %s \' ' % ( prj , package )
raise
2006-06-26 17:11:22 +02:00
root = ET . parse ( f ) . getroot ( )
2007-04-25 01:00:12 +02:00
return root . get ( ' code ' )
2006-06-08 12:30:29 +02:00
2006-04-20 16:26:50 +02:00
def store_read_project ( dir ) :
2010-08-31 14:43:43 +02:00
global store
2007-07-12 02:48:52 +02:00
try :
p = open ( os . path . join ( dir , store , ' _project ' ) ) . readlines ( ) [ 0 ] . strip ( )
except IOError :
2009-08-21 22:43:08 +02:00
msg = ' Error: \' %s \' is not an osc project dir or working copy ' % os . path . abspath ( dir )
2009-08-20 21:28:05 +02:00
if os . path . exists ( os . path . join ( dir , ' .svn ' ) ) :
2009-08-21 22:43:08 +02:00
msg + = ' \n Try svn instead of osc. '
raise oscerr . NoWorkingCopy ( msg )
2006-04-20 16:26:50 +02:00
return p
2006-05-02 10:17:45 +02:00
2006-04-20 16:26:50 +02:00
def store_read_package ( dir ) :
2010-08-31 14:43:43 +02:00
global store
2007-07-12 02:48:52 +02:00
try :
p = open ( os . path . join ( dir , store , ' _package ' ) ) . readlines ( ) [ 0 ] . strip ( )
except IOError :
2009-09-28 21:50:57 +02:00
msg = ' Error: \' %s \' is not an osc package working copy ' % os . path . abspath ( dir )
2009-08-20 21:28:05 +02:00
if os . path . exists ( os . path . join ( dir , ' .svn ' ) ) :
2009-08-21 22:43:08 +02:00
msg + = ' \n Try svn instead of osc. '
raise oscerr . NoWorkingCopy ( msg )
2006-04-20 16:26:50 +02:00
return p
2010-09-19 23:00:19 +02:00
def store_read_apiurl ( dir , defaulturl = True ) :
2010-08-31 14:43:43 +02:00
global store
2007-05-04 23:51:54 +02:00
fname = os . path . join ( dir , store , ' _apiurl ' )
try :
2009-07-16 14:07:14 +02:00
url = open ( fname ) . readlines ( ) [ 0 ] . strip ( )
# this is needed to get a proper apiurl
# (former osc versions may stored an apiurl with a trailing slash etc.)
apiurl = conf . urljoin ( * conf . parse_apisrv_url ( None , url ) )
2007-05-04 23:51:54 +02:00
except :
2010-10-10 21:40:31 +02:00
if not defaulturl :
if is_project_dir ( dir ) :
project = store_read_project ( dir )
package = None
elif is_package_dir ( dir ) :
project = store_read_project ( dir )
package = None
else :
msg = ' Error: \' %s \' is not an osc package working copy ' % os . path . abspath ( dir )
raise oscerr . NoWorkingCopy ( msg )
2010-09-28 23:07:33 +02:00
msg = ' Your working copy \' %s \' is in an inconsistent state. \n ' \
' Please run \' osc repairwc %s \' (Note this might _remove_ \n ' \
' files from the .osc/ dir). Please check the state \n ' \
' of the working copy afterwards (via \' osc status %s \' ) ' % ( dir , dir , dir )
2010-10-10 21:40:31 +02:00
raise oscerr . WorkingCopyInconsistent ( project , package , [ ' _apiurl ' ] , msg )
2009-02-24 00:29:32 +01:00
apiurl = conf . config [ ' apiurl ' ]
2007-05-04 23:51:54 +02:00
return apiurl
2010-08-19 18:10:32 +02:00
def store_write_string ( dir , file , string , subdir = ' ' ) :
2010-08-31 14:43:43 +02:00
global store
2010-08-19 18:10:32 +02:00
if subdir and not os . path . isdir ( os . path . join ( dir , store , subdir ) ) :
os . mkdir ( os . path . join ( dir , store , subdir ) )
fname = os . path . join ( dir , store , subdir , file )
2010-03-04 00:31:46 +01:00
try :
f = open ( fname + ' .new ' , ' w ' )
f . write ( string )
f . close ( )
os . rename ( fname + ' .new ' , fname )
except :
if os . path . exists ( fname + ' .new ' ) :
os . unlink ( fname + ' .new ' )
raise
2009-04-21 18:52:26 +02:00
2007-05-04 23:51:54 +02:00
def store_write_project ( dir , project ) :
2010-03-04 00:31:46 +01:00
store_write_string ( dir , ' _project ' , project + ' \n ' )
2007-05-04 23:51:54 +02:00
def store_write_apiurl ( dir , apiurl ) :
2010-03-04 00:31:46 +01:00
store_write_string ( dir , ' _apiurl ' , apiurl + ' \n ' )
2006-08-11 12:37:29 +02:00
2010-02-11 11:25:56 +01:00
def store_unlink_file ( dir , file ) :
2010-08-31 14:43:43 +02:00
global store
2010-02-11 11:25:56 +01:00
try : os . unlink ( os . path . join ( dir , store , file ) )
except : pass
def store_read_file ( dir , file ) :
2010-08-31 14:43:43 +02:00
global store
2010-02-11 11:25:56 +01:00
try :
content = open ( os . path . join ( dir , store , file ) ) . read ( )
return content
except :
return None
2008-03-10 19:04:23 +01:00
def store_write_initial_packages ( dir , project , subelements ) :
2010-08-31 14:43:43 +02:00
global store
2008-03-10 19:04:23 +01:00
fname = os . path . join ( dir , store , ' _packages ' )
root = ET . Element ( ' project ' , name = project )
for elem in subelements :
root . append ( elem )
ET . ElementTree ( root ) . write ( fname )
2006-05-23 10:43:04 +02:00
def get_osc_version ( ) :
return __version__
2006-04-20 16:26:50 +02:00
2007-06-14 16:30:36 +02:00
def abortbuild ( apiurl , project , package = None , arch = None , repo = None ) :
2013-10-28 18:29:56 +01:00
return cmdbuild ( apiurl , ' abortbuild ' , project , package , arch , repo )
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
2013-10-28 18:29:56 +01:00
def restartbuild ( apiurl , project , package = None , arch = None , repo = None ) :
return cmdbuild ( apiurl , ' restartbuild ' , project , package , arch , repo )
2013-12-01 18:55:23 +01:00
def wipebinaries ( apiurl , project , package = None , arch = None , repo = None , code = None ) :
return cmdbuild ( apiurl , ' wipe ' , project , package , arch , repo , code )
2007-06-14 16:30:36 +02:00
2013-10-28 18:29:56 +01:00
def cmdbuild ( apiurl , cmd , project , package = None , arch = None , repo = None , code = None ) :
query = { ' cmd ' : cmd }
2007-06-14 16:30:36 +02:00
if package :
2008-04-02 16:07:40 +02:00
query [ ' package ' ] = package
2007-06-14 16:30:36 +02:00
if arch :
2008-04-02 16:07:40 +02:00
query [ ' arch ' ] = arch
2007-06-14 16:30:36 +02:00
if repo :
2008-04-02 16:07:40 +02:00
query [ ' repository ' ] = repo
2007-10-27 21:13:24 +02:00
if code :
2008-04-02 16:07:40 +02:00
query [ ' code ' ] = code
2007-06-14 16:30:36 +02:00
u = makeurl ( apiurl , [ ' build ' , project ] , query )
try :
f = http_POST ( u )
2013-04-09 14:03:17 +02:00
except HTTPError as e :
2013-12-01 18:55:23 +01:00
e . osc_msg = ' %s command failed for project %s ' % ( cmd , project )
2007-06-14 16:30:36 +02:00
if package :
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
e . osc_msg + = ' package %s ' % package
2007-06-14 16:30:36 +02:00
if arch :
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
e . osc_msg + = ' arch %s ' % arch
2007-06-14 16:30:36 +02:00
if repo :
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
e . osc_msg + = ' repository %s ' % repo
2007-10-27 21:13:24 +02:00
if code :
Merged revisions 3774-3775,3779,3781-3782,3787,3789-3793,3798,3802,3805,3817-3822,3827,3829-3830,3837-3839,3841-3842,3848-3850 via svnmerge from
https://forgesvn1.novell.com/svn/opensuse/branches/buildservice/osc-exception-handling
........
r3774 | poeml | 2008-04-22 17:39:45 +0200 (Tue, 22 Apr 2008) | 3 lines
A first draft on implement systematic exception handling:
Add errors.py with some exceptions defined, and babysitter.py to handle them
........
r3775 | poeml | 2008-04-22 22:34:12 +0200 (Tue, 22 Apr 2008) | 9 lines
- new global options:
--debugger jump into the debugger before executing anything
--post-mortem jump into the debugger in case of errors
-t, --traceback print call trace in case of errors
- traceback and post_mortem can also be set in .oscrc.
- catch more errors (HTTPError).
- make config accessible from outside of the Osc instance, by making it a class
attribute
........
r3779 | poeml | 2008-04-23 00:55:49 +0200 (Wed, 23 Apr 2008) | 5 lines
- new global option:
-d, --debug print info useful for debugging
- catch some more errors (HTTPError), with OscHTTPError which isn't very
advanced yet.
........
r3781 | Marcus_H | 2008-04-23 01:02:00 +0200 (Wed, 23 Apr 2008) | 2 lines
- added OscConfigError class (just for testing).
- small change in the signature of the OscBaseError constructor (actually we should get rid of the 'args' tuple because it will be deprecated sooner or later
........
r3782 | Marcus_H | 2008-04-23 02:02:13 +0200 (Wed, 23 Apr 2008) | 2 lines
- access the prg.conf.config dict in a save way - this way we avoid AttributeErrors if the prg.conf.config dict doesn't exist
- in case of an configparser error we have to use the prg.options object directly (this was removed in r3781 by accident)
........
r3787 | poeml | 2008-04-23 09:23:56 +0200 (Wed, 23 Apr 2008) | 4 lines
- remove local exception handling from do_req
- for HTTPError, print details (headers and response) when in debug mode
- catch AttributeError
........
r3789 | poeml | 2008-04-23 16:23:14 +0200 (Wed, 23 Apr 2008) | 4 lines
- errors: add two new classes named OscWrongOptionsError and OscWrongArgsError
- commandline: raise instances of the new errors in a number of places
- commandline: add get_cmd_help() to Osc instance which returns the formatted help of a subcommand
........
r3790 | Marcus_H | 2008-04-23 16:48:28 +0200 (Wed, 23 Apr 2008) | 4 lines
- added 2 new exception classes: OscNoConfigfileError and OscIOError
- added new method write_config() to the conf.py module: This method writes osc's configuration file
- minor cleanups in the conf module
........
r3791 | poeml | 2008-04-23 17:11:07 +0200 (Wed, 23 Apr 2008) | 3 lines
small compatibility fix for r3790: try-except-finally isn't supported in
python-2.4.2, thus do the same as try-except inside a try-finally.
........
r3792 | poeml | 2008-04-23 17:37:53 +0200 (Wed, 23 Apr 2008) | 2 lines
fix up the remaining places regarding handling of errors related to commandline parsing
........
r3793 | poeml | 2008-04-23 17:40:34 +0200 (Wed, 23 Apr 2008) | 3 lines
raise a NoWorkingCopyError in osc.core.store_read_project() in case of an
IOError
........
r3798 | Marcus_H | 2008-04-23 23:55:24 +0200 (Wed, 23 Apr 2008) | 1 line
ported -r3797 from trunk
........
r3802 | Marcus_H | 2008-04-24 11:00:55 +0200 (Thu, 24 Apr 2008) | 1 line
ported -r3801 from trunk
........
r3805 | poeml | 2008-04-24 12:52:30 +0200 (Thu, 24 Apr 2008) | 2 lines
raise OscHTTPError in show_pattern_meta(), replacing local error handling
........
r3817 | poeml | 2008-04-24 20:21:32 +0200 (Thu, 24 Apr 2008) | 9 lines
- remove errors.OscHTTPError again.
it seems simpler to use urllib2.HTTPError instead (and just add a specific
error text message where appropriate, and re-raise)
- for 404s, check out _which_ part was not found
it is very ugly, but may be considered Good for pragmatic reasons
- removed local exception handling and workaround for returned 500's from
delete_package() and delete_project(), thereby getting rid of 4 possible exit
points.
........
r3818 | Marcus_H | 2008-04-24 22:36:17 +0200 (Thu, 24 Apr 2008) | 1 line
- this check is superfluous because every HTTPError instance has a code attribute
........
r3819 | poeml | 2008-04-25 00:39:39 +0200 (Fri, 25 Apr 2008) | 1 line
remove a forgotten debug line from core.delete_project()
........
r3820 | poeml | 2008-04-25 10:07:58 +0200 (Fri, 25 Apr 2008) | 2 lines
- ditch local error handling from wipebinaries(), rebuild(), and abortbuild()
........
r3821 | poeml | 2008-04-25 10:56:38 +0200 (Fri, 25 Apr 2008) | 2 lines
It is never needed to import the exception module.
........
r3822 | poeml | 2008-04-25 11:13:39 +0200 (Fri, 25 Apr 2008) | 4 lines
- when going into the debugger with --post-mortem, always print a traceback before
(thus implying -t)
- do not jump into the debugger if not on a TTY, or working in interactive mode
........
r3827 | poeml | 2008-04-25 13:07:46 +0200 (Fri, 25 Apr 2008) | 9 lines
- add errors.OscWorkingCopyOutdated, which takes a tuple with three args:
path to working copy, current rev, expected rev
- add handler for urllib2.URLError errors to the babysitter
- simplify the OscWrongArgsError and OscWrongOptionsError handlers, by removing
the extra line "Sorry, wrong ..." that was printed before the messages given
when the error was raised.
- remove one more errors.OscHTTPError which was still there, and raise
urllib2.HTTPError instead (show_package_meta())
........
r3829 | poeml | 2008-04-25 14:19:10 +0200 (Fri, 25 Apr 2008) | 11 lines
- comment some methods in osc.core which are used by nearly all do_* methods in
osc.commandline
- improve "is not a package/project dir" error messages, by printing the
absolute path tried, instead of '.' for the cwd
- make core.store_read_package() raise a proper NoWorkingCopyError instead of
terminating
- give attribution to things in babysitter.py copied from mercurial
- prefix HTTPError exceptions with 'Server returned an error:'
- remove obsolete local error handling from do_prjresults(), do_importsrcpkg(),
do_repos()
........
r3830 | poeml | 2008-04-25 14:29:35 +0200 (Fri, 25 Apr 2008) | 1 line
catch IOError exceptions in the babysitter
........
r3837 | poeml | 2008-04-25 17:27:36 +0200 (Fri, 25 Apr 2008) | 5 lines
- do_remotebuildlog: raise errors for wrong arguments, remove exits
- raise AttributeError in make_meta_url() instead of exiting
- delete unused method core.delete_server_files()
- replace exit call inside make_meta_url() with an AttributeError
........
r3838 | poeml | 2008-04-25 17:49:18 +0200 (Fri, 25 Apr 2008) | 1 line
simplify the check in do_checkout if a project exists, by using show_project_meta() instead of meta_exists
........
r3839 | poeml | 2008-04-25 18:31:26 +0200 (Fri, 25 Apr 2008) | 6 lines
- commandline do_checkout(): change the order of the two checks, first do the
(cheaper) check for existing directory
- core.core checkout_package(): simplify the check in if the package
exists, by using show_package_meta() instead of meta_exists
Let it throw an exception, instead of using sys.exit().
........
r3841 | Marcus_H | 2008-04-27 15:48:06 +0200 (Sun, 27 Apr 2008) | 5 lines
- added 2 new exception classes: PackageError() and PackageExistsError. The PackageError() class is meant to be the base class for all subsequent package exceptions.
- get rid of 2 sys.exit(1) calls
- make the update() method of the Project() class safer: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- minor fix in delPackage(): use getTransActPath() when printing out the filename
........
r3842 | Marcus_H | 2008-04-27 16:52:55 +0200 (Sun, 27 Apr 2008) | 3 lines
- make the commit() method safe: in any case we have to write the _packages file otherwise the package tracking will be screwed up.
- removed another sys.exit(1): raise an exception if a package is missing when doing a commit. For now we use the PackageExistsError() exception but this might change in the future (updated description of PackageExistsError() according to this change)
........
r3848 | poeml | 2008-04-28 12:46:45 +0200 (Mon, 28 Apr 2008) | 3 lines
rename several error classes, dropping the "Osc" prefix, and "Error" suffix in
cases where they don't really make sense.
........
r3849 | poeml | 2008-04-28 12:57:32 +0200 (Mon, 28 Apr 2008) | 3 lines
- rename osc.errors module to osc.oscerr, to make it easier to import it from
other programs and have a crystal clear namespace
........
r3850 | poeml | 2008-04-28 13:26:12 +0200 (Mon, 28 Apr 2008) | 2 lines
split PackageExists exception class into PackageExists and PackageMissing
........
2008-04-28 18:37:44 +02:00
e . osc_msg + = ' code= %s ' % code
raise
2007-06-14 16:30:36 +02:00
root = ET . parse ( f ) . getroot ( )
return root . get ( ' code ' )
2007-07-04 14:55:26 +02:00
2007-07-12 01:24:26 +02:00
2007-07-04 14:55:26 +02:00
def parseRevisionOption ( string ) :
"""
2007-07-04 15:48:24 +02:00
returns a tuple which contains the revisions
2007-07-04 14:55:26 +02:00
"""
if string :
if ' : ' in string :
splitted_rev = string . split ( ' : ' )
try :
for i in splitted_rev :
int ( i )
return splitted_rev
except ValueError :
2013-04-09 12:51:28 +02:00
print ( ' your revision \' %s \' will be ignored ' % string , file = sys . stderr )
2007-07-04 14:55:26 +02:00
return None , None
else :
if string . isdigit ( ) :
return string , None
2008-03-22 17:35:22 +01:00
elif string . isalnum ( ) and len ( string ) == 32 :
# could be an md5sum
return string , None
2007-07-04 14:55:26 +02:00
else :
2013-04-09 12:51:28 +02:00
print ( ' your revision \' %s \' will be ignored ' % string , file = sys . stderr )
2007-07-04 14:55:26 +02:00
return None , None
else :
return None , None
2007-07-06 13:54:34 +02:00
2010-05-27 02:18:00 +02:00
def checkRevision ( prj , pac , revision , apiurl = None , meta = False ) :
2007-07-06 13:54:34 +02:00
"""
2009-10-20 16:30:15 +02:00
check if revision is valid revision , i . e . it is not
2008-03-22 17:35:22 +01:00
larger than the upstream revision id
2007-07-06 13:54:34 +02:00
"""
2008-03-22 17:35:22 +01:00
if len ( revision ) == 32 :
# there isn't a way to check this kind of revision for validity
return True
2008-02-18 14:44:20 +01:00
if not apiurl :
apiurl = conf . config [ ' apiurl ' ]
2007-07-06 17:54:10 +02:00
try :
2010-05-27 02:18:00 +02:00
if int ( revision ) > int ( show_upstream_rev ( apiurl , prj , pac , meta ) ) \
2007-07-12 02:48:52 +02:00
or int ( revision ) < = 0 :
2007-07-06 17:54:10 +02:00
return False
else :
return True
2007-07-07 19:13:37 +02:00
except ( ValueError , TypeError ) :
2007-07-06 13:54:34 +02:00
return False
2007-07-15 15:49:13 +02:00
2009-05-15 10:32:48 +02:00
def build_table ( col_num , data = [ ] , headline = [ ] , width = 1 , csv = False ) :
2007-07-15 15:49:13 +02:00
"""
This method builds a simple table .
Example1 : build_table ( 2 , [ ' foo ' , ' bar ' , ' suse ' , ' osc ' ] , [ ' col1 ' , ' col2 ' ] , 2 )
col1 col2
foo bar
suse osc
"""
longest_col = [ ]
for i in range ( col_num ) :
longest_col . append ( 0 )
2009-05-15 10:32:48 +02:00
if headline and not csv :
2007-07-15 15:49:13 +02:00
data [ 0 : 0 ] = headline
# find longest entry in each column
i = 0
for itm in data :
if longest_col [ i ] < len ( itm ) :
longest_col [ i ] = len ( itm )
if i == col_num - 1 :
i = 0
else :
i + = 1
# calculate length for each column
for i , row in enumerate ( longest_col ) :
longest_col [ i ] = row + width
2009-10-20 16:30:15 +02:00
# build rows
2007-07-15 15:49:13 +02:00
row = [ ]
table = [ ]
i = 0
for itm in data :
if i % col_num == 0 :
i = 0
2009-05-15 10:32:48 +02:00
row = [ ]
table . append ( row )
# there is no need to justify the entries of the last column
# or when generating csv
if i == col_num - 1 or csv :
row . append ( itm )
2007-07-15 15:49:13 +02:00
else :
2009-05-15 10:32:48 +02:00
row . append ( itm . ljust ( longest_col [ i ] ) )
2007-07-15 15:49:13 +02:00
i + = 1
2009-05-15 10:32:48 +02:00
if csv :
separator = ' | '
else :
separator = ' '
return [ separator . join ( row ) for row in table ]
2007-07-15 15:49:13 +02:00
2011-02-24 14:06:15 +01:00
def xpath_join ( expr , new_expr , op = ' or ' , inner = False , nexpr_parentheses = False ) :
2007-07-15 15:49:13 +02:00
"""
2010-03-10 23:36:09 +01:00
Join two xpath expressions . If inner is False expr will
be surrounded with parentheses ( unless it ' s not already
2011-02-24 14:06:15 +01:00
surrounded ) . If nexpr_parentheses is True new_expr will be
surrounded with parentheses .
2007-07-15 15:49:13 +02:00
"""
2010-03-10 23:36:09 +01:00
if not expr :
return new_expr
2010-03-13 13:55:53 +01:00
elif not new_expr :
return expr
2010-03-10 23:36:09 +01:00
# NOTE: this is NO syntax check etc. (e.g. if a literal contains a '(' or ')'
# the check might fail and expr will be surrounded with parentheses or NOT)
parentheses = not inner
if not inner and expr . startswith ( ' ( ' ) and expr . endswith ( ' ) ' ) :
parentheses = False
braces = [ i for i in expr if i == ' ( ' or i == ' ) ' ]
closed = 0
while len ( braces ) :
if braces . pop ( ) == ' ) ' :
closed + = 1
2009-09-03 21:00:09 +02:00
continue
2010-03-10 23:36:09 +01:00
else :
closed + = - 1
while len ( braces ) :
if braces . pop ( ) == ' ( ' :
closed + = - 1
else :
closed + = 1
if closed != 0 :
parentheses = True
break
if parentheses :
expr = ' ( %s ) ' % expr
2011-02-24 14:06:15 +01:00
if nexpr_parentheses :
new_expr = ' ( %s ) ' % new_expr
2010-03-10 23:36:09 +01:00
return ' %s %s %s ' % ( expr , op , new_expr )
2009-08-21 03:26:37 +02:00
2010-03-10 23:36:09 +01:00
def search ( apiurl , * * kwargs ) :
"""
Perform a search request . The requests are constructed as follows :
kwargs = { ' kind1 ' = > xpath1 , ' kind2 ' = > xpath2 , . . . , ' kindN ' = > xpathN }
GET / search / kind1 ? match = xpath1
. . .
GET / search / kindN ? match = xpathN
"""
res = { }
2013-04-09 11:25:19 +02:00
for urlpath , xpath in kwargs . items ( ) :
2012-11-06 09:16:13 +01:00
path = [ ' search ' ]
path + = urlpath . split ( ' _ ' ) # FIXME: take underscores as path seperators. I see no other way atm to fix OBS api calls and not breaking osc api
u = makeurl ( apiurl , path , [ ' match= %s ' % quote_plus ( xpath ) ] )
2010-03-10 23:36:09 +01:00
f = http_GET ( u )
res [ urlpath ] = ET . parse ( f ) . getroot ( )
return res
2009-04-09 10:21:12 +02:00
2013-02-20 11:41:17 +01:00
def owner ( apiurl , binary , mode = " binary " , attribute = None , project = None , usefilter = None , devel = None , limit = None ) :
2012-11-22 11:37:32 +01:00
"""
Perform a binary package owner search . This is supported since OBS 2.4 .
"""
# find default project, if not specified
2013-02-20 11:41:17 +01:00
query = { mode : binary }
2012-11-22 11:37:32 +01:00
if attribute :
query [ ' attribute ' ] = attribute
if project :
query [ ' project ' ] = project
if devel :
query [ ' devel ' ] = devel
2012-11-23 12:52:05 +01:00
if limit != None :
2012-11-22 11:37:32 +01:00
query [ ' limit ' ] = limit
2013-05-02 10:50:05 +02:00
if usefilter != None :
2012-11-22 11:37:32 +01:00
query [ ' filter ' ] = " , " . join ( usefilter )
u = makeurl ( apiurl , [ ' search ' , ' owner ' ] , query )
res = None
try :
f = http_GET ( u )
res = ET . parse ( f ) . getroot ( )
2013-04-09 14:03:17 +02:00
except HTTPError as e :
2012-11-22 11:37:32 +01:00
# old server not supporting this search
pass
return res
2011-03-21 16:57:22 +01:00
def set_link_rev ( apiurl , project , package , revision = ' ' , expand = False , baserev = False ) :
2011-02-22 17:43:05 +01:00
"""
updates the rev attribute of the _link xml . If revision is set to None
the rev attribute is removed from the _link xml . If revision is set to ' '
the " plain " upstream revision is used ( if xsrcmd5 and baserev aren ' t specified).
"""
2009-04-16 10:13:55 +02:00
url = makeurl ( apiurl , [ ' source ' , project , package , ' _link ' ] )
2009-04-09 10:21:12 +02:00
try :
2009-10-20 16:30:15 +02:00
f = http_GET ( url )
root = ET . parse ( f ) . getroot ( )
2013-04-09 14:03:17 +02:00
except HTTPError as e :
2009-10-20 16:30:15 +02:00
e . osc_msg = ' Unable to get _link file in package \' %s \' for project \' %s \' ' % ( package , project )
raise
2009-04-09 10:21:12 +02:00
2009-06-18 11:18:17 +02:00
# set revision element
2011-02-22 17:43:05 +01:00
src_project = root . get ( ' project ' , project )
2011-03-21 16:57:22 +01:00
src_package = root . get ( ' package ' , package )
2013-05-27 14:56:24 +02:00
linkrev = None
2012-03-02 15:44:15 +01:00
vrev = None
2011-03-17 18:18:01 +01:00
if baserev :
2011-03-21 16:57:22 +01:00
linkrev = ' base '
expand = True
2011-02-22 17:43:05 +01:00
if revision is None :
if ' rev ' in root . keys ( ) :
del root . attrib [ ' rev ' ]
2011-03-23 15:33:52 +01:00
elif revision == ' ' or expand :
2012-03-02 15:44:15 +01:00
revision , vrev = show_upstream_rev_vrev ( apiurl , src_project , src_package , revision = revision , linkrev = linkrev , expand = expand )
2009-04-09 10:21:12 +02:00
2011-02-22 17:43:05 +01:00
if revision :
root . set ( ' rev ' , revision )
2012-03-02 15:44:15 +01:00
# add vrev when revision is a srcmd5
if vrev and revision and len ( revision ) > = 32 :
root . set ( ' vrev ' , vrev )
2010-09-07 12:14:13 +02:00
2013-04-10 11:34:59 +02:00
l = ET . tostring ( root , encoding = ET_ENCODING )
2009-04-09 10:21:12 +02:00
http_PUT ( url , data = l )
2011-11-17 21:33:57 +01:00
return revision
2009-04-09 10:21:12 +02:00
2008-03-10 19:04:23 +01:00
def delete_dir ( dir ) :
2007-07-23 18:03:30 +02:00
# small security checks
2008-03-10 19:04:23 +01:00
if os . path . islink ( dir ) :
2009-10-24 14:47:21 +02:00
raise oscerr . OscIOError ( None , ' cannot remove linked dir ' )
2008-03-10 19:04:23 +01:00
elif os . path . abspath ( dir ) == ' / ' :
2009-10-24 14:47:21 +02:00
raise oscerr . OscIOError ( None , ' cannot remove \' / \' ' )
2007-07-23 18:03:30 +02:00
2008-03-10 19:04:23 +01:00
for dirpath , dirnames , filenames in os . walk ( dir , topdown = False ) :
2010-08-20 14:34:41 +02:00
for filename in filenames :
os . unlink ( os . path . join ( dirpath , filename ) )
2007-07-23 18:03:30 +02:00
for dirname in dirnames :
2009-10-24 14:47:21 +02:00
os . rmdir ( os . path . join ( dirpath , dirname ) )
os . rmdir ( dir )
2007-07-23 18:03:30 +02:00
2008-03-10 19:04:23 +01:00
def delete_storedir ( store_dir ) :
"""
This method deletes a store dir .
"""
head , tail = os . path . split ( store_dir )
if tail == ' .osc ' :
2009-10-24 14:47:21 +02:00
delete_dir ( store_dir )
2008-03-10 19:04:23 +01:00
2007-07-23 18:03:30 +02:00
def unpack_srcrpm ( srpm , dir , * files ) :
"""
This method unpacks the passed srpm into the
passed dir . If arguments are passed to the \' files \' tuple
only this files will be unpacked .
"""
if not is_srcrpm ( srpm ) :
2013-04-09 12:51:28 +02:00
print ( ' error - \' %s \' is not a source rpm. ' % srpm , file = sys . stderr )
2007-07-23 18:03:30 +02:00
sys . exit ( 1 )
curdir = os . getcwd ( )
2010-06-15 17:07:14 +02:00
if os . path . isdir ( dir ) :
2007-07-23 18:03:30 +02:00
os . chdir ( dir )
cmd = ' rpm2cpio %s | cpio -i %s &> /dev/null ' % ( srpm , ' ' . join ( files ) )
2013-03-08 00:56:57 +01:00
ret = run_external ( cmd , shell = True )
2007-07-23 18:03:30 +02:00
if ret != 0 :
2013-04-09 12:51:28 +02:00
print ( ' error \' %s \' - cannot extract \' %s \' ' % ( ret , srpm ) , file = sys . stderr )
2007-07-23 18:03:30 +02:00
sys . exit ( 1 )
os . chdir ( curdir )
def is_rpm ( f ) :
""" check if the named file is an RPM package """
2009-10-20 16:30:15 +02:00
try :
2009-05-22 17:00:31 +02:00
h = open ( f , ' rb ' ) . read ( 4 )
2007-07-23 18:03:30 +02:00
except :
return False
if h == ' \xed \xab \xee \xdb ' :
return True
else :
return False
def is_srcrpm ( f ) :
""" check if the named file is a source RPM """
if not is_rpm ( f ) :
return False
try :
2009-05-22 17:00:31 +02:00
h = open ( f , ' rb ' ) . read ( 8 )
2007-07-23 18:03:30 +02:00
except :
return False
if h [ 7 ] == ' \x01 ' :
return True
else :
2009-10-20 16:30:15 +02:00
return False
2007-07-30 13:12:42 +02:00
2007-09-12 20:01:13 +02:00
def addMaintainer ( apiurl , prj , pac , user ) :
2009-06-19 15:57:27 +02:00
# for backward compatibility only
addPerson ( apiurl , prj , pac , user )
def addPerson ( apiurl , prj , pac , user , role = " maintainer " ) :
""" add a new person to a package or project """
2007-09-12 20:01:13 +02:00
path = quote_plus ( prj ) ,
kind = ' prj '
if pac :
path = path + ( quote_plus ( pac ) , )
kind = ' pkg '
data = meta_exists ( metatype = kind ,
path_args = path ,
template_args = None ,
create_new = False )
2009-10-20 16:30:15 +02:00
2007-09-12 20:01:13 +02:00
if data and get_user_meta ( apiurl , user ) != None :
2009-12-26 14:22:34 +01:00
root = ET . fromstring ( ' ' . join ( data ) )
2007-09-12 20:01:13 +02:00
found = False
2009-12-26 14:22:34 +01:00
for person in root . getiterator ( ' person ' ) :
2009-06-19 15:57:27 +02:00
if person . get ( ' userid ' ) == user and person . get ( ' role ' ) == role :
2007-09-12 20:01:13 +02:00
found = True
2013-04-09 12:51:28 +02:00
print ( " user already exists " )
2007-09-12 20:01:13 +02:00
break
if not found :
# the xml has a fixed structure
2009-12-26 14:22:34 +01:00
root . insert ( 2 , ET . Element ( ' person ' , role = role , userid = user ) )
2013-04-09 12:51:28 +02:00
print ( ' user \' %s \' added to \' %s \' ' % ( user , pac or prj ) )
2007-09-12 20:01:13 +02:00
edit_meta ( metatype = kind ,
path_args = path ,
2013-04-10 11:34:59 +02:00
data = ET . tostring ( root , encoding = ET_ENCODING ) )
2007-09-12 20:01:13 +02:00
else :
2013-04-09 12:51:28 +02:00
print ( " osc: an error occured " )
2007-09-12 20:01:13 +02:00
def delMaintainer ( apiurl , prj , pac , user ) :
2009-08-26 16:22:54 +02:00
# for backward compatibility only
delPerson ( apiurl , prj , pac , user )
def delPerson ( apiurl , prj , pac , user , role = " maintainer " ) :
""" delete a person from a package or project """
2009-10-20 16:30:15 +02:00
path = quote_plus ( prj ) ,
2007-09-12 20:01:13 +02:00
kind = ' prj '
if pac :
path = path + ( quote_plus ( pac ) , )
kind = ' pkg '
data = meta_exists ( metatype = kind ,
path_args = path ,
template_args = None ,
create_new = False )
2010-07-26 16:46:21 +02:00
if data and get_user_meta ( apiurl , user ) != None :
2009-12-26 14:22:34 +01:00
root = ET . fromstring ( ' ' . join ( data ) )
2007-09-12 20:01:13 +02:00
found = False
2009-12-26 14:22:34 +01:00
for person in root . getiterator ( ' person ' ) :
2009-08-26 16:22:54 +02:00
if person . get ( ' userid ' ) == user and person . get ( ' role ' ) == role :
2009-12-26 14:22:34 +01:00
root . remove ( person )
2007-09-12 20:01:13 +02:00
found = True
2013-04-09 12:51:28 +02:00
print ( " user \' %s \' removed " % user )
2007-09-12 20:01:13 +02:00
if found :
edit_meta ( metatype = kind ,
path_args = path ,
2013-04-10 11:34:59 +02:00
data = ET . tostring ( root , encoding = ET_ENCODING ) )
2007-09-12 20:01:13 +02:00
else :
2013-04-09 12:51:28 +02:00
print ( " user \' %s \' not found in \' %s \' " % ( user , pac or prj ) )
2007-09-12 20:01:13 +02:00
else :
2013-04-09 12:51:28 +02:00
print ( " an error occured " )
2008-03-10 19:04:23 +01:00
2012-11-23 12:52:05 +01:00
def setBugowner ( apiurl , prj , pac , user = None , group = None ) :
""" delete all bugowners (user and group entries) and set one new one in a package or project """
path = quote_plus ( prj ) ,
kind = ' prj '
if pac :
path = path + ( quote_plus ( pac ) , )
kind = ' pkg '
data = meta_exists ( metatype = kind ,
path_args = path ,
template_args = None ,
create_new = False )
2014-01-24 17:01:35 +01:00
if user . startswith ( ' group: ' ) :
group = user . replace ( ' group: ' , ' ' )
user = None
2012-11-23 12:52:05 +01:00
if data :
root = ET . fromstring ( ' ' . join ( data ) )
2014-01-24 10:29:00 +01:00
for group_element in root . getiterator ( ' group ' ) :
if group_element . get ( ' role ' ) == " bugowner " :
root . remove ( group_element )
for person_element in root . getiterator ( ' person ' ) :
if person_element . get ( ' role ' ) == " bugowner " :
root . remove ( person_element )
2012-11-23 12:52:05 +01:00
if user :
root . insert ( 2 , ET . Element ( ' person ' , role = ' bugowner ' , userid = user ) )
elif group :
root . insert ( 2 , ET . Element ( ' group ' , role = ' bugowner ' , groupid = group ) )
else :
2013-04-09 12:51:28 +02:00
print ( " Neither user nor group is specified " )
2012-11-23 12:52:05 +01:00
edit_meta ( metatype = kind ,
path_args = path ,
2013-04-10 11:34:59 +02:00
data = ET . tostring ( root , encoding = ET_ENCODING ) )
2012-11-23 12:52:05 +01:00
2009-06-18 18:20:49 +02:00
def setDevelProject ( apiurl , prj , pac , dprj , dpkg = None ) :
""" set the <devel project= " ... " > element to package metadata """
path = ( quote_plus ( prj ) , ) + ( quote_plus ( pac ) , )
data = meta_exists ( metatype = ' pkg ' ,
2008-05-20 10:29:54 +02:00
path_args = path ,
template_args = None ,
create_new = False )
2009-10-20 16:30:15 +02:00
2008-05-20 10:29:54 +02:00
if data and show_project_meta ( apiurl , dprj ) != None :
2009-12-26 14:22:34 +01:00
root = ET . fromstring ( ' ' . join ( data ) )
if not root . find ( ' devel ' ) != None :
ET . SubElement ( root , ' devel ' )
elem = root . find ( ' devel ' )
2009-06-18 18:20:49 +02:00
if dprj :
2011-02-22 17:52:12 +01:00
elem . set ( ' project ' , dprj )
2009-06-18 18:20:49 +02:00
else :
2011-02-22 17:52:12 +01:00
if ' project ' in elem . keys ( ) :
2009-10-20 16:30:15 +02:00
del elem . attrib [ ' project ' ]
2009-06-18 18:20:49 +02:00
if dpkg :
2011-02-22 17:52:12 +01:00
elem . set ( ' package ' , dpkg )
2009-06-18 18:20:49 +02:00
else :
2011-02-22 17:52:12 +01:00
if ' package ' in elem . keys ( ) :
2009-10-20 16:30:15 +02:00
del elem . attrib [ ' package ' ]
2009-06-18 18:20:49 +02:00
edit_meta ( metatype = ' pkg ' ,
2008-05-20 10:29:54 +02:00
path_args = path ,
2013-04-10 11:34:59 +02:00
data = ET . tostring ( root , encoding = ET_ENCODING ) )
2008-05-20 10:29:54 +02:00
else :
2013-04-09 12:51:28 +02:00
print ( " osc: an error occured " )
2008-05-20 10:29:54 +02:00
2008-03-15 23:51:37 +01:00
def createPackageDir ( pathname , prj_obj = None ) :
"""
create and initialize a new package dir in the given project .
prj_obj can be a Project ( ) instance .
"""
prj_dir , pac_dir = getPrjPacPaths ( pathname )
if is_project_dir ( prj_dir ) :
2011-01-25 16:51:48 +01:00
global store
if not os . path . exists ( pac_dir + store ) :
2008-03-15 23:51:37 +01:00
prj = prj_obj or Project ( prj_dir , False )
2010-08-30 13:46:49 +02:00
Package . init_package ( prj . apiurl , prj . name , pac_dir , pac_dir )
2011-01-25 16:51:48 +01:00
prj . addPackage ( pac_dir )
2013-04-09 12:51:28 +02:00
print ( statfrmt ( ' A ' , os . path . normpath ( pathname ) ) )
2008-03-18 00:43:32 +01:00
else :
2009-12-25 00:08:29 +01:00
raise oscerr . OscIOError ( None , ' file or directory \' %s \' already exists ' % pathname )
2008-03-15 23:51:37 +01:00
else :
2009-12-25 00:08:29 +01:00
msg = ' \' %s \' is not a working copy ' % prj_dir
2009-08-20 21:28:05 +02:00
if os . path . exists ( os . path . join ( prj_dir , ' .svn ' ) ) :
2009-12-25 00:08:29 +01:00
msg + = ' \n try svn instead of osc. '
raise oscerr . NoWorkingCopy ( msg )
2008-03-15 23:51:37 +01:00
2010-05-14 16:44:42 +02:00
def stripETxml ( node ) :
node . tail = None
if node . text != None :
node . text = node . text . replace ( " " , " " ) . replace ( " \n " , " " )
for child in node . getchildren ( ) :
stripETxml ( child )
2010-09-20 11:09:43 +02:00
def addGitSource ( url ) :
service_file = os . path . join ( os . getcwd ( ) , ' _service ' )
addfile = False
if os . path . exists ( service_file ) :
services = ET . parse ( os . path . join ( os . getcwd ( ) , ' _service ' ) ) . getroot ( )
else :
services = ET . fromstring ( " <services /> " )
addfile = True
stripETxml ( services )
si = Serviceinfo ( )
s = si . addGitUrl ( services , url )
2011-01-26 17:29:43 +01:00
s = si . addRecompressTar ( services )
2010-09-20 11:09:43 +02:00
si . read ( s )
# for pretty output
2011-01-30 21:56:21 +01:00
xmlindent ( s )
2010-09-20 11:09:43 +02:00
f = open ( service_file , ' wb ' )
2013-04-10 11:34:59 +02:00
f . write ( ET . tostring ( s , encoding = ET_ENCODING ) )
2010-09-20 11:09:43 +02:00
f . close ( )
if addfile :
2013-05-27 14:26:58 +02:00
addFiles ( [ ' _service ' ] )
2010-09-20 11:09:43 +02:00
2010-05-14 16:44:42 +02:00
def addDownloadUrlService ( url ) :
service_file = os . path . join ( os . getcwd ( ) , ' _service ' )
2010-05-14 16:51:18 +02:00
addfile = False
2010-05-14 16:44:42 +02:00
if os . path . exists ( service_file ) :
services = ET . parse ( os . path . join ( os . getcwd ( ) , ' _service ' ) ) . getroot ( )
else :
services = ET . fromstring ( " <services /> " )
2010-05-14 16:51:18 +02:00
addfile = True
2010-05-14 16:44:42 +02:00
stripETxml ( services )
si = Serviceinfo ( )
s = si . addDownloadUrl ( services , url )
si . read ( s )
# for pretty output
2011-01-30 21:56:21 +01:00
xmlindent ( s )
2010-05-14 16:44:42 +02:00
f = open ( service_file , ' wb ' )
2013-04-10 11:34:59 +02:00
f . write ( ET . tostring ( s , encoding = ET_ENCODING ) )
2010-05-14 16:44:42 +02:00
f . close ( )
2010-05-14 16:51:18 +02:00
if addfile :
2013-05-27 14:26:58 +02:00
addFiles ( [ ' _service ' ] )
2010-05-14 16:44:42 +02:00
# download file
2010-05-17 19:24:00 +02:00
path = os . getcwd ( )
files = os . listdir ( path )
si . execute ( path )
newfiles = os . listdir ( path )
# add verify service for new files
2010-08-20 14:34:41 +02:00
for filename in files :
2013-05-27 14:26:58 +02:00
newfiles . remove ( filename )
2010-05-17 19:24:00 +02:00
2010-08-20 14:34:41 +02:00
for filename in newfiles :
2013-05-27 14:26:58 +02:00
if filename . startswith ( ' _service:download_url: ' ) :
s = si . addVerifyFile ( services , filename )
2010-05-17 19:24:00 +02:00
# for pretty output
2011-01-30 21:56:21 +01:00
xmlindent ( s )
2010-05-17 19:24:00 +02:00
f = open ( service_file , ' wb ' )
2013-04-10 11:34:59 +02:00
f . write ( ET . tostring ( s , encoding = ET_ENCODING ) )
2010-05-17 19:24:00 +02:00
f . close ( )
2010-05-14 16:44:42 +02:00
2008-08-20 21:24:55 +02:00
def addFiles ( filenames , prj_obj = None ) :
2008-03-10 19:04:23 +01:00
for filename in filenames :
if not os . path . exists ( filename ) :
2009-12-25 00:08:29 +01:00
raise oscerr . OscIOError ( None , ' file \' %s \' does not exist ' % filename )
2008-03-10 19:04:23 +01:00
# init a package dir if we have a normal dir in the "filenames"-list
# so that it will be find by findpacs() later
2010-02-17 20:45:09 +01:00
pacs = list ( filenames )
2008-03-10 19:04:23 +01:00
for filename in filenames :
prj_dir , pac_dir = getPrjPacPaths ( filename )
if not is_package_dir ( filename ) and os . path . isdir ( filename ) and is_project_dir ( prj_dir ) \
and conf . config [ ' do_package_tracking ' ] :
prj_name = store_read_project ( prj_dir )
2010-09-19 23:00:19 +02:00
prj_apiurl = store_read_apiurl ( prj_dir , defaulturl = False )
2010-09-06 17:50:56 +02:00
Package . init_package ( prj_apiurl , prj_name , pac_dir , filename )
2008-03-10 19:04:23 +01:00
elif is_package_dir ( filename ) and conf . config [ ' do_package_tracking ' ] :
2009-12-25 00:08:29 +01:00
raise oscerr . PackageExists ( store_read_project ( filename ) , store_read_package ( filename ) ,
' osc: warning: \' %s \' is already under version control ' % filename )
2009-03-16 22:29:42 +01:00
elif os . path . isdir ( filename ) and is_project_dir ( prj_dir ) :
2009-12-25 00:08:29 +01:00
raise oscerr . WrongArgs ( ' osc: cannot add a directory to a project unless ' \
' \' do_package_tracking \' is enabled in the configuration file ' )
2010-02-17 20:45:09 +01:00
elif os . path . isdir ( filename ) :
2013-04-09 12:51:28 +02:00
print ( ' skipping directory \' %s \' ' % filename )
2010-02-17 20:45:09 +01:00
pacs . remove ( filename )
pacs = findpacs ( pacs )
2008-03-10 19:04:23 +01:00
for pac in pacs :
if conf . config [ ' do_package_tracking ' ] and not pac . todo :
2009-12-24 21:30:02 +01:00
prj = prj_obj or Project ( os . path . dirname ( pac . absdir ) , False )
2008-03-10 19:04:23 +01:00
if pac . name in prj . pacs_unvers :
2009-12-25 00:08:29 +01:00
prj . addPackage ( pac . name )
2013-04-09 12:51:28 +02:00
print ( statfrmt ( ' A ' , getTransActPath ( os . path . join ( pac . dir , os . pardir , pac . name ) ) ) )
2008-03-10 19:04:23 +01:00
for filename in pac . filenamelist_unvers :
2010-02-17 20:45:09 +01:00
if os . path . isdir ( os . path . join ( pac . dir , filename ) ) :
2013-04-09 12:51:28 +02:00
print ( ' skipping directory \' %s \' ' % os . path . join ( pac . dir , filename ) )
2010-02-17 20:45:09 +01:00
else :
pac . todo . append ( filename )
2008-03-10 19:04:23 +01:00
elif pac . name in prj . pacs_have :
2013-04-09 12:51:28 +02:00
print ( ' osc: warning: \' %s \' is already under version control ' % pac . name )
2008-03-10 19:04:23 +01:00
for filename in pac . todo :
2010-04-22 15:27:54 +02:00
if filename in pac . skipped :
continue
2008-03-10 19:04:23 +01:00
if filename in pac . excluded :
2013-04-09 12:51:28 +02:00
print ( ' osc: warning: \' %s \' is excluded from a working copy ' % filename , file = sys . stderr )
2008-03-10 19:04:23 +01:00
continue
pac . addfile ( filename )
def getPrjPacPaths ( path ) :
"""
returns the path for a project and a package
from path . This is needed if you try to add
or delete packages :
Examples :
osc add pac1 / : prj_dir = CWD ;
pac_dir = pac1
osc add / path / to / pac1 :
prj_dir = path / to ;
pac_dir = pac1
osc add / path / to / pac1 / file
= > this would be an invalid path
the caller has to validate the returned
path !
"""
# make sure we hddave a dir: osc add bar vs. osc add bar/; osc add /path/to/prj_dir/new_pack
# filename = os.path.join(tail, '')
prj_dir , pac_dir = os . path . split ( os . path . normpath ( path ) )
if prj_dir == ' ' :
prj_dir = os . getcwd ( )
return ( prj_dir , pac_dir )
def getTransActPath ( pac_dir ) :
"""
returns the path for the commit and update operations / transactions .
Normally the " dir " attribute of a Package ( ) object will be passed to
this method .
"""
if pac_dir != ' . ' :
pathn = os . path . normpath ( pac_dir )
else :
pathn = ' '
return pathn
2008-04-23 23:51:24 +02:00
2009-04-16 15:48:37 +02:00
def get_commit_message_template ( pac ) :
"""
Read the difference in . changes file ( s ) and put them as a template to commit message .
"""
2010-08-31 16:13:16 +02:00
diff = [ ]
2009-04-16 15:48:37 +02:00
template = [ ]
2011-05-31 11:48:01 +02:00
if pac . todo :
todo = pac . todo
else :
todo = pac . filenamelist + pac . filenamelist_unvers
files = [ i for i in todo if i . endswith ( ' .changes ' ) and pac . status ( i ) in ( ' A ' , ' M ' ) ]
2010-05-09 21:06:00 +02:00
2010-08-20 14:34:41 +02:00
for filename in files :
if pac . status ( filename ) == ' M ' :
diff + = get_source_file_diff ( pac . absdir , filename , pac . rev )
elif pac . status ( filename ) == ' A ' :
2013-10-22 13:49:14 +02:00
f = open ( os . path . join ( pac . absdir , filename ) , ' r ' )
2010-05-09 21:06:00 +02:00
for line in f :
diff + = ' + ' + line
f . close ( )
2009-10-20 16:30:15 +02:00
2009-04-16 15:48:37 +02:00
if diff :
2010-08-31 16:13:16 +02:00
template = parse_diff_for_commit_message ( ' ' . join ( diff ) )
2009-04-16 15:48:37 +02:00
2010-02-02 14:12:22 +01:00
return template
def parse_diff_for_commit_message ( diff , template = [ ] ) :
date_re = re . compile ( r ' \ +(Mon|Tue|Wed|Thu|Fri|Sat|Sun) ([A-Z][a-z] {2} ) ( ?[0-9]|[0-3][0-9]) .* ' )
diff = diff . split ( ' \n ' )
# The first four lines contains a header of diff
for line in diff [ 3 : ] :
# this condition is magical, but it removes all unwanted lines from commit message
if not ( line ) or ( line and line [ 0 ] != ' + ' ) or \
date_re . match ( line ) or \
line == ' + ' or line [ 0 : 3 ] == ' +++ ' :
continue
if line == ' +------------------------------------------------------------------- ' :
template . append ( ' ' )
else :
template . append ( line [ 1 : ] )
2009-10-20 16:30:15 +02:00
2009-04-16 15:48:37 +02:00
return template
2009-08-03 15:03:24 +02:00
2010-12-26 13:33:14 +01:00
def get_commit_msg ( wc_dir , pacs ) :
template = store_read_file ( wc_dir , ' _commit_msg ' )
# open editor for commit message
# but first, produce status and diff to append to the template
footer = [ ]
lines = [ ]
for p in pacs :
states = sorted ( p . get_status ( False , ' ' , ' ? ' ) , lambda x , y : cmp ( x [ 1 ] , y [ 1 ] ) )
changed = [ statfrmt ( st , os . path . normpath ( os . path . join ( p . dir , filename ) ) ) for st , filename in states ]
if changed :
footer + = changed
footer . append ( ' \n Diff for working copy: %s ' % p . dir )
footer . extend ( [ ' ' . join ( i ) for i in p . get_diff ( ignoreUnversioned = True ) ] )
lines . extend ( get_commit_message_template ( p ) )
if template is None :
2011-06-01 09:12:10 +02:00
if lines and lines [ 0 ] == ' ' :
2011-05-31 11:48:10 +02:00
del lines [ 0 ]
2010-12-26 13:33:14 +01:00
template = ' \n ' . join ( lines )
msg = ' '
# if footer is empty, there is nothing to commit, and no edit needed.
if footer :
msg = edit_message ( footer = ' \n ' . join ( footer ) , template = template )
if msg :
store_write_string ( wc_dir , ' _commit_msg ' , msg + ' \n ' )
else :
store_unlink_file ( wc_dir , ' _commit_msg ' )
return msg
2013-05-27 14:56:24 +02:00
def print_request_list ( apiurl , project , package = None , states = ( ' new ' , ' review ' , ) , force = False ) :
2009-09-18 03:10:41 +02:00
"""
prints list of pending requests for the specified project / package if " check_for_request_on_action "
is enabled in the config or if " force " is set to True
"""
if not conf . config [ ' check_for_request_on_action ' ] and not force :
return
requests = get_request_list ( apiurl , project , package , req_state = states )
msg = ' Pending requests for %s : %s ( %s ) '
if package is None and len ( requests ) :
2013-04-09 12:51:28 +02:00
print ( msg % ( ' project ' , project , len ( requests ) ) )
2009-09-18 03:10:41 +02:00
elif len ( requests ) :
2013-04-09 12:51:28 +02:00
print ( msg % ( ' package ' , ' / ' . join ( [ project , package ] ) , len ( requests ) ) )
2009-09-18 03:10:41 +02:00
for r in requests :
2013-04-09 12:51:28 +02:00
print ( r . list_view ( ) , ' \n ' )
2010-02-11 01:47:47 +01:00
2012-10-26 15:19:00 +02:00
def request_interactive_review ( apiurl , request , initial_cmd = ' ' , group = None , ignore_reviews = False ) :
2010-02-11 01:47:47 +01:00
""" review the request interactively """
2010-07-26 16:46:21 +02:00
import tempfile , re
2010-02-11 01:47:47 +01:00
tmpfile = None
2010-06-29 14:32:22 +02:00
2012-10-26 15:19:00 +02:00
def safe_change_request_state ( * args , * * kwargs ) :
try :
change_request_state ( * args , * * kwargs )
return True
2013-04-09 14:03:17 +02:00
except HTTPError as e :
2013-04-09 12:51:28 +02:00
print ( ' Server returned an error: ' , e , file = sys . stderr )
print ( ' Try -f to force the state change ' , file = sys . stderr )
2012-10-26 15:19:00 +02:00
return False
2010-08-31 14:15:04 +02:00
def print_request ( request ) :
2013-04-09 12:51:28 +02:00
print ( request )
2011-02-11 02:43:10 +01:00
2010-08-31 14:15:04 +02:00
print_request ( request )
2010-02-11 01:47:47 +01:00
try :
2011-01-29 18:47:26 +01:00
prompt = ' (a)ccept/(d)ecline/(r)evoke/c(l)one/(s)kip/(c)ancel > '
2013-12-16 10:59:07 +01:00
editable_actions = request . get_actions ( ' submit ' , ' maintenance_incident ' )
2012-04-27 14:45:28 +02:00
# actions which have sources + buildresults
2013-12-16 10:59:07 +01:00
src_actions = editable_actions + request . get_actions ( ' maintenance_release ' )
if editable_actions :
2011-01-29 23:30:54 +01:00
prompt = ' d(i)ff/(a)ccept/(d)ecline/(r)evoke/(b)uildstatus/c(l)one/(e)dit/(s)kip/(c)ancel > '
2012-04-27 14:45:28 +02:00
elif src_actions :
# no edit for maintenance release requests
prompt = ' d(i)ff/(a)ccept/(d)ecline/(r)evoke/(b)uildstatus/c(l)one/(s)kip/(c)ancel > '
2011-01-29 23:30:54 +01:00
editprj = ' '
orequest = None
2010-02-11 01:47:47 +01:00
while True :
2011-01-30 14:24:21 +01:00
if initial_cmd :
repl = initial_cmd
initial_cmd = ' '
else :
repl = raw_input ( prompt ) . strip ( )
2012-04-27 14:45:28 +02:00
if repl == ' i ' and src_actions :
2011-01-29 23:30:54 +01:00
if not orequest is None and tmpfile :
tmpfile . close ( )
tmpfile = None
2010-02-11 01:47:47 +01:00
if tmpfile is None :
2011-04-24 00:27:47 +02:00
tmpfile = tempfile . NamedTemporaryFile ( suffix = ' .diff ' )
2011-08-11 23:09:45 +02:00
try :
diff = request_diff ( apiurl , request . reqid )
2011-01-29 17:24:45 +01:00
tmpfile . write ( diff )
2013-04-09 14:03:17 +02:00
except HTTPError as e :
2011-08-11 23:09:45 +02:00
if e . code != 400 :
raise
# backward compatible diff for old apis
2012-04-27 14:45:28 +02:00
for action in src_actions :
2011-08-11 23:09:45 +02:00
diff = ' old: %s / %s \n new: %s / %s \n ' % ( action . src_project , action . src_package ,
action . tgt_project , action . tgt_package )
diff + = submit_action_diff ( apiurl , action )
diff + = ' \n \n '
tmpfile . write ( diff )
2011-08-15 17:06:04 +02:00
tmpfile . flush ( )
2010-06-09 14:28:03 +02:00
run_editor ( tmpfile . name )
2010-08-31 14:15:04 +02:00
print_request ( request )
2010-09-17 23:03:29 +02:00
elif repl == ' s ' :
2013-04-09 12:51:28 +02:00
print ( ' skipping: # %s ' % request . reqid , file = sys . stderr )
2010-09-17 23:03:29 +02:00
break
2010-02-11 01:47:47 +01:00
elif repl == ' c ' :
2013-04-09 12:51:28 +02:00
print ( ' Aborting ' , file = sys . stderr )
2010-04-20 15:22:03 +02:00
raise oscerr . UserAbort ( )
2012-04-27 14:45:28 +02:00
elif repl == ' b ' and src_actions :
for action in src_actions :
2013-04-09 12:51:28 +02:00
print ( ' %s / %s : ' % ( action . src_project , action . src_package ) )
print ( ' \n ' . join ( get_results ( apiurl , action . src_project , action . src_package ) ) )
2013-12-16 10:59:07 +01:00
elif repl == ' e ' and editable_actions :
# this is only for editable actions
2011-01-29 23:30:54 +01:00
if not editprj :
editprj = clone_request ( apiurl , request . reqid , ' osc editrequest ' )
orequest = request
request = edit_submitrequest ( apiurl , editprj , orequest , request )
2013-12-16 10:59:07 +01:00
src_actions = editable_actions = request . get_actions ( ' submit ' , ' maintenance_incident ' )
2011-01-29 23:30:54 +01:00
print_request ( request )
prompt = ' d(i)ff/(a)ccept/(b)uildstatus/(e)dit/(s)kip/(c)ancel > '
2010-02-11 01:47:47 +01:00
else :
2010-02-19 13:46:29 +01:00
state_map = { ' a ' : ' accepted ' , ' d ' : ' declined ' , ' r ' : ' revoked ' }
2012-10-26 15:19:00 +02:00
mo = re . search ( ' ^([adrl])(?: \ s+(-f)? \ s*-m \ s+(.*))?$ ' , repl )
2011-01-29 23:30:54 +01:00
if mo is None or orequest and mo . group ( 1 ) != ' a ' :
2013-04-09 12:51:28 +02:00
print ( ' invalid choice: \' %s \' ' % repl , file = sys . stderr )
2010-02-25 14:32:24 +01:00
continue
2010-10-26 15:47:07 +02:00
state = state_map . get ( mo . group ( 1 ) )
2012-10-26 15:19:00 +02:00
force = mo . group ( 2 ) is not None
msg = mo . group ( 3 )
2010-10-26 15:47:07 +02:00
footer = ' '
2011-01-29 23:30:54 +01:00
msg_template = ' '
if not ( state is None or request . state is None ) :
2010-10-26 15:47:07 +02:00
footer = ' changing request from state \' %s \' to \' %s \' \n \n ' \
% ( request . state . name , state )
2011-01-29 23:30:54 +01:00
msg_template = change_request_state_template ( request , state )
2010-08-19 11:40:49 +02:00
footer + = str ( request )
2010-02-11 01:47:47 +01:00
if tmpfile is not None :
tmpfile . seek ( 0 )
# the read bytes probably have a moderate size so the str won't be too large
footer + = ' \n \n ' + tmpfile . read ( )
if msg is None :
2012-06-15 00:12:06 +02:00
try :
msg = edit_message ( footer = footer , template = msg_template )
except oscerr . UserAbort :
# do not abort (show prompt again)
continue
2010-02-11 01:47:47 +01:00
else :
msg = msg . strip ( ' \' ' ) . strip ( ' " ' )
2011-01-29 23:30:54 +01:00
if not orequest is None :
request . create ( apiurl )
2012-10-26 15:19:00 +02:00
if not safe_change_request_state ( apiurl , request . reqid , ' accepted ' , msg , force = force ) :
# an error occured
continue
2011-01-29 23:30:54 +01:00
repl = raw_input ( ' Supersede original request? (y|N) ' )
if repl in ( ' y ' , ' Y ' ) :
2012-10-26 15:19:00 +02:00
safe_change_request_state ( apiurl , orequest . reqid , ' superseded ' ,
' superseded by %s ' % request . reqid , request . reqid , force = force )
2011-01-29 23:30:54 +01:00
elif state is None :
2010-12-30 13:28:11 +01:00
clone_request ( apiurl , request . reqid , msg )
2010-10-26 15:47:07 +02:00
else :
2011-09-16 17:32:42 +02:00
reviews = [ r for r in request . reviews if r . state == ' new ' ]
2012-10-26 15:19:00 +02:00
if not reviews or ignore_reviews :
if safe_change_request_state ( apiurl , request . reqid , state , msg , force = force ) :
break
else :
# an error occured
continue
2012-04-27 15:04:06 +02:00
group_reviews = [ r for r in reviews if ( r . by_group is not None
and r . by_group == group ) ]
if len ( group_reviews ) == 1 and conf . config [ ' review_inherit_group ' ] :
review = group_reviews [ 0 ]
else :
2013-04-09 12:51:28 +02:00
print ( ' Please chose one of the following reviews: ' )
2012-04-27 15:04:06 +02:00
for i in range ( len ( reviews ) ) :
fmt = Request . format_review ( reviews [ i ] )
2013-04-09 12:51:28 +02:00
print ( ' ( %i ) ' % i , ' by %(type)-10s %(by)s ' % fmt )
2012-04-27 15:04:06 +02:00
num = raw_input ( ' > ' )
try :
num = int ( num )
except ValueError :
2013-04-09 12:51:28 +02:00
print ( ' \' %s \' is not a number. ' % num )
2012-04-27 15:04:06 +02:00
continue
if num < 0 or num > = len ( reviews ) :
2013-04-09 12:51:28 +02:00
print ( ' number \' %s \' out of range. ' % num )
2012-04-27 15:04:06 +02:00
continue
review = reviews [ num ]
2011-09-16 17:32:42 +02:00
change_review_state ( apiurl , request . reqid , state , by_user = review . by_user ,
by_group = review . by_group , by_project = review . by_project ,
by_package = review . by_package , message = msg )
2010-02-11 02:48:08 +01:00
break
2010-02-11 01:47:47 +01:00
finally :
if tmpfile is not None :
tmpfile . close ( )
2010-02-25 09:52:47 +01:00
2011-01-29 23:30:54 +01:00
def edit_submitrequest ( apiurl , project , orequest , new_request = None ) :
""" edit a submit action from orequest/new_request """
2013-03-08 00:56:57 +01:00
import tempfile , shutil
2011-01-29 23:30:54 +01:00
actions = orequest . get_actions ( ' submit ' )
oactions = actions
2013-08-28 23:03:25 +02:00
if new_request is not None :
2011-01-29 23:30:54 +01:00
actions = new_request . get_actions ( ' submit ' )
num = 0
if len ( actions ) > 1 :
2013-04-09 12:51:28 +02:00
print ( ' Please chose one of the following submit actions: ' )
2011-01-29 23:30:54 +01:00
for i in range ( len ( actions ) ) :
2013-08-28 23:00:35 +02:00
# it is safe to use orequest because currently the formatting
# of a submit action does not need instance specific data
fmt = orequest . format_action ( actions [ i ] )
2013-04-09 12:51:28 +02:00
print ( ' ( %i ) ' % i , ' %(source)s %(target)s ' % fmt )
2011-01-29 23:30:54 +01:00
num = raw_input ( ' > ' )
try :
num = int ( num )
except ValueError :
raise oscerr . WrongArgs ( ' \' %s \' is not a number. ' % num )
if num < 0 or num > = len ( orequest . actions ) :
raise oscerr . WrongArgs ( ' number \' %s \' out of range. ' % num )
# the api replaced ':' with '_' in prj and pkg names (clone request)
package = ' %s . %s ' % ( oactions [ num ] . src_package . replace ( ' : ' , ' _ ' ) ,
oactions [ num ] . src_project . replace ( ' : ' , ' _ ' ) )
tmpdir = None
cleanup = True
try :
tmpdir = tempfile . mkdtemp ( prefix = ' osc_editsr ' )
p = Package . init_package ( apiurl , project , package , tmpdir )
p . update ( )
shell = os . getenv ( ' SHELL ' , default = ' /bin/sh ' )
olddir = os . getcwd ( )
os . chdir ( tmpdir )
2013-04-09 12:51:28 +02:00
print ( ' Checked out package \' %s \' to %s . Started a new shell ( %s ). \n ' \
' Please fix the package and close the shell afterwards. ' % ( package , tmpdir , shell ) )
2013-03-08 00:56:57 +01:00
run_external ( shell )
2011-01-29 23:30:54 +01:00
# the pkg might have uncommitted changes...
cleanup = False
os . chdir ( olddir )
# reread data
p = Package ( tmpdir )
modified = p . get_status ( False , ' ' , ' ? ' , ' S ' )
if modified :
2013-04-09 12:51:28 +02:00
print ( ' Your working copy has the following modifications: ' )
print ( ' \n ' . join ( [ statfrmt ( st , filename ) for st , filename in modified ] ) )
2011-01-29 23:30:54 +01:00
repl = raw_input ( ' Do you want to commit the local changes first? (y|N) ' )
if repl in ( ' y ' , ' Y ' ) :
msg = get_commit_msg ( p . absdir , [ p ] )
p . commit ( msg = msg )
cleanup = True
finally :
if cleanup :
shutil . rmtree ( tmpdir )
else :
2013-04-09 12:51:28 +02:00
print ( ' Please remove the dir \' %s \' manually ' % tmpdir )
2011-01-29 23:30:54 +01:00
r = Request ( )
for action in orequest . get_actions ( ) :
new_action = Action . from_xml ( action . to_xml ( ) )
r . actions . append ( new_action )
if new_action . type == ' submit ' :
new_action . src_package = ' %s . %s ' % ( action . src_package . replace ( ' : ' , ' _ ' ) ,
action . src_project . replace ( ' : ' , ' _ ' ) )
new_action . src_project = project
# do an implicit cleanup
new_action . opt_sourceupdate = ' cleanup '
return r
2010-09-29 19:57:00 +02:00
def get_user_projpkgs ( apiurl , user , role = None , exclude_projects = [ ] , proj = True , pkg = True , maintained = False , metadata = False ) :
2010-03-13 21:06:18 +01:00
""" Return all project/packages where user is involved. """
xpath = ' person/@userid = \' %s \' ' % user
excl_prj = ' '
excl_pkg = ' '
for i in exclude_projects :
excl_prj = xpath_join ( excl_prj , ' not(@name = \' %s \' ) ' % i , op = ' and ' )
excl_pkg = xpath_join ( excl_pkg , ' not(@project = \' %s \' ) ' % i , op = ' and ' )
role_filter_xpath = xpath
if role :
xpath = xpath_join ( xpath , ' person/@role = \' %s \' ' % role , inner = True , op = ' and ' )
xpath_pkg = xpath_join ( xpath , excl_pkg , op = ' and ' )
xpath_prj = xpath_join ( xpath , excl_prj , op = ' and ' )
2010-07-07 16:25:09 +02:00
if maintained :
xpath_pkg = xpath_join ( xpath_pkg , ' (project/attribute/@name= \' %(attr)s \' or attribute/@name= \' %(attr)s \' ) ' % { ' attr ' : conf . config [ ' maintained_attribute ' ] } , op = ' and ' )
2010-03-13 21:06:18 +01:00
what = { }
if pkg :
2010-09-29 19:57:00 +02:00
if metadata :
what [ ' package ' ] = xpath_pkg
else :
what [ ' package_id ' ] = xpath_pkg
2010-03-13 21:06:18 +01:00
if proj :
2010-09-29 19:57:00 +02:00
if metadata :
what [ ' project ' ] = xpath_prj
else :
what [ ' project_id ' ] = xpath_prj
2010-03-13 21:06:18 +01:00
try :
res = search ( apiurl , * * what )
2013-04-09 14:03:17 +02:00
except HTTPError as e :
2010-05-26 16:46:01 +02:00
if e . code != 400 or not role_filter_xpath :
2010-03-13 21:06:18 +01:00
raise e
# backward compatibility: local role filtering
what = dict ( [ [ kind , role_filter_xpath ] for kind in what . keys ( ) ] )
2013-04-09 11:33:25 +02:00
if ' package ' in what :
2010-03-13 21:06:18 +01:00
what [ ' package ' ] = xpath_join ( role_filter_xpath , excl_pkg , op = ' and ' )
2013-04-09 11:33:25 +02:00
if ' project ' in what :
2010-03-13 21:06:18 +01:00
what [ ' project ' ] = xpath_join ( role_filter_xpath , excl_prj , op = ' and ' )
res = search ( apiurl , * * what )
filter_role ( res , user , role )
return res
2010-12-22 00:01:46 +01:00
def raw_input ( * args ) :
try :
2013-04-09 12:36:42 +02:00
import builtins
2013-04-09 13:02:24 +02:00
func = builtins . input
2013-04-09 12:36:42 +02:00
except ImportError :
#python 2.7
2013-04-09 13:02:24 +02:00
import __builtin__
func = __builtin__ . raw_input
2013-04-09 12:36:42 +02:00
try :
2013-04-09 13:02:24 +02:00
return func ( * args )
2010-12-22 00:01:46 +01:00
except EOFError :
# interpret ctrl-d as user abort
raise oscerr . UserAbort ( )
2013-03-08 00:56:57 +01:00
def run_external ( filename , * args , * * kwargs ) :
""" Executes the program filename via subprocess.call.
* args are additional arguments which are passed to the
program filename . * * kwargs specify additional arguments for
the subprocess . call function .
if no args are specified the plain filename is passed
to subprocess . call ( this can be used to execute a shell
command ) . Otherwise [ filename ] + list ( args ) is passed
to the subprocess . call function .
"""
# unless explicitly specified use shell=False
kwargs . setdefault ( ' shell ' , False )
if args :
cmd = [ filename ] + list ( args )
else :
cmd = filename
try :
return subprocess . call ( cmd , * * kwargs )
2013-04-09 11:27:02 +02:00
except OSError as e :
2013-03-08 00:56:57 +01:00
if e . errno != errno . ENOENT :
raise
raise oscerr . ExtRuntimeError ( e . strerror , filename )
2010-03-13 13:55:53 +01:00
# backward compatibility: local role filtering
def filter_role ( meta , user , role ) :
"""
remove all project / package nodes if no person node exists
where @userid = user and @role = role
"""
2013-04-09 11:25:19 +02:00
for kind , root in meta . items ( ) :
2010-03-13 13:55:53 +01:00
delete = [ ]
for node in root . findall ( kind ) :
found = False
for p in node . findall ( ' person ' ) :
if p . get ( ' userid ' ) == user and p . get ( ' role ' ) == role :
found = True
break
if not found :
delete . append ( node )
for node in delete :
root . remove ( node )
2011-03-09 16:10:48 +01:00
def find_default_project ( apiurl = None , package = None ) :
""" "
look though the list of conf . config [ ' getpac_default_project ' ]
and find the first project where the given package exists in the build service .
"""
if not len ( conf . config [ ' getpac_default_project ' ] ) :
return None
candidates = re . split ( ' [, ]+ ' , conf . config [ ' getpac_default_project ' ] )
if package is None or len ( candidates ) == 1 :
return candidates [ 0 ]
# search through the list, where package exists ...
for prj in candidates :
try :
2011-03-09 22:47:02 +01:00
# any fast query will do here.
show_package_meta ( apiurl , prj , package )
return prj
2013-04-09 14:03:17 +02:00
except HTTPError :
2011-03-09 22:47:02 +01:00
pass
2011-03-09 16:10:48 +01:00
return None
2014-01-09 14:15:30 +01:00
def utime ( filename , arg , ignore_einval = True ) :
""" wrapper around os.utime which ignore errno EINVAL by default """
try :
# workaround for bnc#857610): if filename resides on a nfs share
# os.utime might raise EINVAL
os . utime ( filename , arg )
except OSError as e :
if e . errno == errno . EINVAL and ignore_einval :
return
raise
2011-03-09 16:10:48 +01:00
2010-02-25 09:52:47 +01:00
# vim: sw=4 et