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
2006-05-23 15:48:58 +02:00
2006-05-10 16:34:59 +02:00
from core import *
2007-04-25 01:00:12 +02:00
import cmdln
2006-10-10 16:04:34 +02:00
import conf
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
import oscerr
2011-01-05 16:31:02 +01:00
import sys
2011-02-11 02:43:10 +01:00
from util import safewriter
2010-01-20 09:15:17 +01:00
from optparse import SUPPRESS_HELP
2006-04-20 16:26:50 +02:00
2009-05-06 15:20:15 +02:00
MAN_HEADER = r """ .TH %(ucname)s " 1 " " %(date)s " " %(name)s %(version)s " " User Commands "
. SH NAME
2009-06-17 20:19:45 +02:00
% ( name ) s \- openSUSE build service command - line tool .
2009-05-06 15:20:15 +02:00
. SH SYNOPSIS
. B % ( name ) s
[ \fIGLOBALOPTS \fR ] \fISUBCOMMAND \fR [ \fIOPTS \fR ] [ \fIARGS \fR . . . ]
. br
. B % ( name ) s
\fIhelp SUBCOMMAND \fR
. SH DESCRIPTION
2009-06-17 20:19:45 +02:00
openSUSE build service command - line tool .
2009-05-06 15:20:15 +02:00
"""
MAN_FOOTER = r """
. SH " SEE ALSO "
Type ' osc help <subcommand> ' for more detailed help on a specific subcommand .
. PP
For additional information , see
2010-07-27 15:20:35 +02:00
* http : / / en . opensuse . org / openSUSE : Build_Service_Tutorial
* http : / / en . opensuse . org / openSUSE : OSC
2009-05-06 15:20:15 +02:00
. PP
You can modify osc commands , or roll you own , via the plugin API :
2010-07-27 15:20:35 +02:00
* http : / / en . opensuse . org / openSUSE : OSC_plugins
2009-05-06 15:20:15 +02:00
. SH AUTHOR
osc was written by several authors . This man page is automatically generated .
"""
2007-04-25 01:00:12 +02:00
class Osc ( cmdln . Cmdln ) :
2009-05-05 16:13:22 +02:00
""" Usage: osc [GLOBALOPTS] SUBCOMMAND [OPTS] [ARGS...]
or : osc help SUBCOMMAND
2009-06-17 20:19:45 +02:00
openSUSE build service command - line tool .
2007-04-25 01:00:12 +02:00
Type ' osc help <subcommand> ' for help on a specific subcommand .
2006-12-12 03:01:39 +01:00
2007-04-25 01:00:12 +02:00
$ { command_list }
$ { help_list }
global $ { option_list }
2009-05-18 16:50:43 +02:00
For additional information , see
2010-07-27 15:20:35 +02:00
* http : / / en . opensuse . org / openSUSE : Build_Service_Tutorial
* http : / / en . opensuse . org / openSUSE : OSC
2008-09-24 14:23:56 +02:00
You can modify osc commands , or roll you own , via the plugin API :
2010-07-27 15:20:35 +02:00
* http : / / en . opensuse . org / openSUSE : OSC_plugins
2007-04-25 01:00:12 +02:00
"""
name = ' 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
conf = None
2006-12-12 03:01:39 +01:00
2009-05-06 15:20:15 +02:00
man_header = MAN_HEADER
man_footer = MAN_FOOTER
2007-05-16 12:55:05 +02:00
2007-04-25 01:00:12 +02:00
def __init__ ( self , * args , * * kwargs ) :
cmdln . Cmdln . __init__ ( self , * args , * * kwargs )
cmdln . Cmdln . do_help . aliases . append ( ' h ' )
2011-02-11 02:43:10 +01:00
sys . stderr = safewriter . SafeWriter ( sys . stderr )
sys . stdout = safewriter . SafeWriter ( sys . stdout )
2006-05-23 15:48:58 +02:00
2009-05-06 15:20:15 +02:00
def get_version ( self ) :
return get_osc_version ( )
2007-05-16 12:55:05 +02:00
def get_optparser ( self ) :
""" this is the parser for " global " options (not specific to subcommand) """
optparser = cmdln . CmdlnOptionParser ( self , version = get_osc_version ( ) )
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
optparser . add_option ( ' --debugger ' , action = ' store_true ' ,
help = ' jump into the debugger before executing anything ' )
optparser . add_option ( ' --post-mortem ' , action = ' store_true ' ,
help = ' jump into the debugger in case of errors ' )
optparser . add_option ( ' -t ' , ' --traceback ' , action = ' store_true ' ,
help = ' print call trace in case of errors ' )
2007-05-16 12:55:05 +02:00
optparser . add_option ( ' -H ' , ' --http-debug ' , action = ' store_true ' ,
2010-09-01 15:38:08 +02:00
help = ' debug HTTP traffic (filters some headers) ' )
optparser . add_option ( ' --http-full-debug ' , action = ' store_true ' ,
help = ' debug HTTP traffic (filters no headers) ' ) ,
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
optparser . add_option ( ' -d ' , ' --debug ' , action = ' store_true ' ,
help = ' print info useful for debugging ' )
2009-02-24 00:29:32 +01:00
optparser . add_option ( ' -A ' , ' --apiurl ' , dest = ' apiurl ' ,
2009-03-31 15:29:16 +02:00
metavar = ' URL/alias ' ,
help = ' specify URL to access API server at or an alias ' )
2007-08-22 12:18:25 +02:00
optparser . add_option ( ' -c ' , ' --config ' , dest = ' conffile ' ,
metavar = ' FILE ' ,
help = ' specify alternate configuration file ' )
2009-09-04 19:48:53 +02:00
optparser . add_option ( ' --no-keyring ' , action = ' store_true ' ,
help = ' disable usage of desktop keyring system ' )
2009-05-11 09:46:01 +02:00
optparser . add_option ( ' --no-gnome-keyring ' , action = ' store_true ' ,
help = ' disable usage of GNOME Keyring ' )
2009-08-20 21:28:05 +02:00
optparser . add_option ( ' -v ' , ' --verbose ' , dest = ' verbose ' , action = ' count ' , default = 0 ,
help = ' increase verbosity ' )
optparser . add_option ( ' -q ' , ' --quiet ' , dest = ' verbose ' , action = ' store_const ' , const = - 1 ,
help = ' be quiet, not verbose ' )
2007-05-16 12:55:05 +02:00
return optparser
2006-05-23 15:48:58 +02:00
2008-08-20 11:40:00 +02:00
def postoptparse ( self , try_again = True ) :
2007-05-16 12:55:05 +02:00
""" merge commandline options into the config """
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 :
conf . get_config ( override_conffile = self . options . conffile ,
2009-02-24 00:29:32 +01:00
override_apiurl = self . options . apiurl ,
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
override_debug = self . options . debug ,
override_http_debug = self . options . http_debug ,
2010-09-01 15:38:08 +02:00
override_http_full_debug = self . options . http_full_debug ,
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
override_traceback = self . options . traceback ,
2009-05-11 09:46:01 +02:00
override_post_mortem = self . options . post_mortem ,
2009-09-04 19:48:53 +02:00
override_no_keyring = self . options . no_keyring ,
2009-08-20 21:28:05 +02:00
override_no_gnome_keyring = self . options . no_gnome_keyring ,
override_verbose = self . options . verbose )
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
except oscerr . NoConfigfile , e :
print >> sys . stderr , e . msg
print >> sys . stderr , ' Creating osc configuration file %s ... ' % e . file
import getpass
config = { }
config [ ' user ' ] = raw_input ( ' Username: ' )
config [ ' pass ' ] = getpass . getpass ( )
2010-02-25 14:13:02 +01:00
if self . options . no_keyring :
config [ ' use_keyring ' ] = ' 0 '
if self . options . no_gnome_keyring :
config [ ' gnome_keyring ' ] = ' 0 '
2009-02-24 00:29:32 +01:00
if self . options . apiurl :
config [ ' apiurl ' ] = self . options . apiurl
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-08-21 20:17:40 +02:00
conf . write_initial_config ( e . file , config )
2008-08-07 18:40:55 +02:00
print >> sys . stderr , ' done '
2008-08-20 11:40:00 +02:00
if try_again : self . postoptparse ( try_again = False )
2008-08-07 19:14:26 +02:00
except oscerr . ConfigMissingApiurl , e :
print >> sys . stderr , e . msg
import getpass
user = raw_input ( ' Username: ' )
passwd = getpass . getpass ( )
2009-05-11 09:46:01 +02:00
conf . add_section ( e . file , e . url , user , passwd )
2008-08-20 11:40:00 +02:00
if try_again : self . postoptparse ( try_again = False )
2008-08-07 19:14:26 +02:00
2009-08-20 21:28:05 +02:00
self . options . verbose = conf . config [ ' verbose ' ]
2010-02-09 20:57:10 +01:00
self . download_progress = None
if conf . config . get ( ' show_download_progress ' , False ) :
2010-02-24 11:27:18 +01:00
from meter import TextMeter
2010-02-25 10:43:05 +01:00
self . download_progress = TextMeter ( hide_finished = True )
2006-05-23 15:48:58 +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
def get_cmd_help ( self , cmdname ) :
doc = self . _get_cmd_handler ( cmdname ) . __doc__
doc = self . _help_reindent ( doc )
doc = self . _help_preprocess ( doc , cmdname )
doc = doc . rstrip ( ) + ' \n ' # trim down trailing space
return self . _str ( doc )
2006-04-20 16:26:50 +02:00
2010-04-30 17:13:21 +02:00
def get_api_url ( self ) :
2011-04-06 15:31:36 +02:00
try :
localdir = os . getcwd ( )
except Exception , e :
## check for Stale NFS file handle: '.'
try : os . stat ( ' . ' )
except Exception , ee : e = ee
print >> sys . stderr , " os.getcwd() failed: " , e
sys . exit ( 1 )
2010-04-30 17:13:21 +02:00
if ( is_package_dir ( localdir ) or is_project_dir ( localdir ) ) and not self . options . apiurl :
return store_read_apiurl ( os . curdir )
else :
return conf . config [ ' apiurl ' ]
2009-08-21 16:55:26 +02:00
# overridden from class Cmdln() to use config variables in help texts
def _help_preprocess ( self , help , cmdname ) :
2010-08-20 14:34:41 +02:00
help_msg = cmdln . Cmdln . _help_preprocess ( self , help , cmdname )
return help_msg % conf . config
2006-04-20 16:26:50 +02:00
2009-08-21 16:55:26 +02:00
2008-08-08 17:19:54 +02:00
def do_init ( self , subcmd , opts , project , package = None ) :
2009-05-18 16:50:43 +02:00
""" $ {cmd_name} : Initialize a directory as working copy
2006-05-23 15:48:58 +02:00
2008-05-21 18:10:20 +02:00
Initialize an existing directory to be a working copy of an
2009-05-18 16:50:43 +02:00
( already existing ) buildservice project / package .
2008-05-21 18:10:20 +02:00
( This is the same as checking out a package and then copying sources
into the directory . It does NOT create a new package . To create a
package , use ' osc meta pkg ... ... ' )
2006-05-23 15:48:58 +02:00
2008-05-21 18:10:20 +02:00
You wouldn ' t normally use this command.
To get a working copy of a package ( e . g . for building it or working on
it , you would normally use the checkout command . Use " osc help
checkout " to get help for it.
2009-05-18 16:50:43 +02:00
usage :
2008-08-01 15:58:49 +02:00
osc init PRJ
2007-06-21 11:40:47 +02:00
osc init PRJ PAC
2007-04-25 01:00:12 +02:00
$ { cmd_option_list }
"""
2009-05-18 16:50:43 +02:00
2010-07-29 17:29:07 +02:00
apiurl = self . get_api_url ( )
2008-08-08 17:19:54 +02:00
if not package :
2010-10-09 16:26:55 +02:00
Project . init_project ( apiurl , os . curdir , project , conf . config [ ' do_package_tracking ' ] )
2008-08-08 17:19:54 +02:00
print ' Initializing %s (Project: %s ) ' % ( os . curdir , project )
2008-08-01 15:58:49 +02:00
else :
2010-08-30 13:46:49 +02:00
Package . init_package ( apiurl , project , package , os . curdir )
2010-08-30 14:20:12 +02:00
store_write_string ( os . curdir , ' _files ' , show_files_meta ( apiurl , project , package ) + ' \n ' )
2008-08-08 17:19:54 +02:00
print ' Initializing %s (Project: %s , Package: %s ) ' % ( os . curdir , project , package )
2007-04-25 01:00:12 +02:00
@cmdln.alias ( ' ls ' )
2009-08-20 21:28:05 +02:00
@cmdln.alias ( ' ll ' )
@cmdln.alias ( ' lL ' )
@cmdln.alias ( ' LL ' )
2007-08-16 20:15:08 +02:00
@cmdln.option ( ' -a ' , ' --arch ' , metavar = ' ARCH ' ,
2010-01-12 13:31:25 +01:00
help = ' specify architecture (only for binaries) ' )
2007-08-16 20:15:08 +02:00
@cmdln.option ( ' -r ' , ' --repo ' , metavar = ' REPO ' ,
2010-01-12 13:31:25 +01:00
help = ' specify repository (only for binaries) ' )
2007-08-16 20:15:08 +02:00
@cmdln.option ( ' -b ' , ' --binaries ' , action = ' store_true ' ,
2010-01-12 13:31:25 +01:00
help = ' list built binaries instead of sources ' )
@cmdln.option ( ' -R ' , ' --revision ' , metavar = ' REVISION ' ,
help = ' specify revision (only for sources) ' )
@cmdln.option ( ' -e ' , ' --expand ' , action = ' store_true ' ,
help = ' expand linked package (only for sources) ' )
2010-03-08 23:52:51 +01:00
@cmdln.option ( ' -u ' , ' --unexpand ' , action = ' store_true ' ,
help = ' always work with unexpanded (source) packages ' )
2007-06-26 15:17:38 +02:00
@cmdln.option ( ' -v ' , ' --verbose ' , action = ' store_true ' ,
help = ' print extra information ' )
2009-08-20 21:28:05 +02:00
@cmdln.option ( ' -l ' , ' --long ' , action = ' store_true ' , dest = ' verbose ' ,
help = ' print extra information ' )
2010-05-22 08:22:12 +02:00
@cmdln.option ( ' -D ' , ' --deleted ' , action = ' store_true ' ,
help = ' show only the former deleted projects or packages ' )
2007-04-25 01:00:12 +02:00
def do_list ( self , subcmd , opts , * args ) :
2010-01-12 13:31:25 +01:00
""" $ {cmd_name} : List sources or binaries on the server
2007-08-16 20:15:08 +02:00
2010-01-12 13:31:25 +01:00
Examples for listing sources :
2010-12-02 23:36:40 +01:00
ls # list all projects (deprecated)
2010-12-02 23:52:38 +01:00
ls / # list all projects
2011-04-11 15:07:56 +02:00
ls . # take PROJECT/PACKAGE from current dir.
2010-01-12 13:31:25 +01:00
ls PROJECT # list packages in a project
ls PROJECT PACKAGE # list source files of package of a project
ls PROJECT PACKAGE < file > # list <file> if this file exists
ls - v PROJECT PACKAGE # verbosely list source files of package
ls - l PROJECT PACKAGE # verbosely list source files of package
ll PROJECT PACKAGE # verbosely list source files of package
LL PROJECT PACKAGE # verbosely list source files of expanded link
2007-06-26 15:17:38 +02:00
With - - verbose , the following fields will be shown for each item :
MD5 hash of file
Revision number of the last commit
Size ( in bytes )
Date and time of the last commit
2007-04-25 01:00:12 +02:00
2010-01-12 13:31:25 +01:00
Examples for listing binaries :
ls - b PROJECT # list all binaries of a project
ls - b PROJECT - a ARCH # list ARCH binaries of a project
ls - b PROJECT - r REPO # list binaries in REPO
ls - b PROJECT PACKAGE REPO ARCH
Usage :
$ { cmd_name } [ PROJECT [ PACKAGE ] ]
$ { cmd_name } - b [ PROJECT [ PACKAGE [ REPO [ ARCH ] ] ] ]
2007-04-25 01:00:12 +02:00
$ { cmd_option_list }
"""
2007-06-26 15:17:38 +02:00
args = slash_split ( args )
2009-08-21 21:39:12 +02:00
if subcmd == ' ll ' :
opts . verbose = True
if subcmd == ' lL ' or subcmd == ' LL ' :
opts . verbose = True
opts . expand = True
2007-06-26 15:17:38 +02:00
2009-11-17 14:39:46 +01:00
project = None
package = None
2010-01-12 13:31:25 +01:00
fname = None
2010-12-02 23:52:38 +01:00
if len ( args ) == 0 :
# For consistency with *all* other commands
2011-04-11 15:07:56 +02:00
# this lists what the server has in the current wd.
2010-12-02 23:52:38 +01:00
# CAUTION: 'osc ls -b' already works like this.
pass
2010-01-12 13:31:25 +01:00
if len ( args ) > 0 :
2007-04-25 01:00:12 +02:00
project = args [ 0 ]
2010-12-02 23:52:38 +01:00
if project == ' / ' : project = None
2011-04-11 15:07:56 +02:00
if project == ' . ' :
cwd = os . getcwd ( )
if is_project_dir ( cwd ) :
project = store_read_project ( cwd )
elif is_package_dir ( cwd ) :
project = store_read_project ( cwd )
package = store_read_package ( cwd )
2010-01-12 13:31:25 +01:00
if len ( args ) > 1 :
2007-04-25 01:00:12 +02:00
package = args [ 1 ]
2010-05-22 08:22:12 +02:00
if opts . deleted :
raise oscerr . WrongArgs ( " Too many arguments when listing deleted packages " )
2010-01-12 13:31:25 +01:00
if len ( args ) > 2 :
2010-05-22 08:22:12 +02:00
if opts . deleted :
raise oscerr . WrongArgs ( " Too many arguments when listing deleted packages " )
2010-01-12 13:31:25 +01:00
if opts . binaries :
if opts . repo :
if opts . repo != args [ 2 ] :
raise oscerr . WrongArgs ( " conflicting repos specified ( ' %s ' vs ' %s ' ) " % ( opts . repo , args [ 2 ] ) )
else :
opts . repo = args [ 2 ]
else :
2008-11-20 13:56:16 +01:00
fname = args [ 2 ]
2010-01-12 13:31:25 +01:00
if len ( args ) > 3 :
if not opts . binaries :
raise oscerr . WrongArgs ( ' Too many arguments ' )
if opts . arch :
if opts . arch != args [ 3 ] :
raise oscerr . WrongArgs ( " conflicting archs specified ( ' %s ' vs ' %s ' ) " % ( opts . arch , args [ 3 ] ) )
else :
opts . arch = args [ 3 ]
2007-08-16 20:15:08 +02:00
2009-03-31 00:28:26 +02:00
if opts . binaries and opts . expand :
raise oscerr . WrongOptions ( ' Sorry, --binaries and --expand are mutual exclusive. ' )
2007-08-16 20:15:08 +02:00
2010-07-29 17:29:07 +02:00
apiurl = self . get_api_url ( )
2007-08-16 20:15:08 +02:00
# list binaries
if opts . binaries :
2009-11-17 14:39:46 +01:00
# ls -b toplevel doesn't make sense, so use info from
# current dir if available
if len ( args ) == 0 :
2010-08-20 14:34:41 +02:00
cwd = os . getcwd ( )
if is_project_dir ( cwd ) :
project = store_read_project ( cwd )
elif is_package_dir ( cwd ) :
project = store_read_project ( cwd )
package = store_read_package ( cwd )
2010-04-30 17:13:21 +02:00
2009-11-17 14:39:46 +01:00
if not project :
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 . WrongArgs ( ' There are no binaries to list above project level. ' )
2009-04-09 10:21:12 +02:00
if opts . revision :
raise oscerr . WrongOptions ( ' Sorry, the --revision option is not supported for binaries. ' )
2007-08-16 20:15:08 +02:00
2009-11-17 14:39:46 +01:00
repos = [ ]
if opts . repo and opts . arch :
repos . append ( Repo ( opts . repo , opts . arch ) )
elif opts . repo and not opts . arch :
2010-04-09 03:37:04 +02:00
repos = [ repo for repo in get_repos_of_project ( apiurl , project ) if repo . name == opts . repo ]
2009-11-17 14:39:46 +01:00
elif opts . arch and not opts . repo :
2010-04-09 03:37:04 +02:00
repos = [ repo for repo in get_repos_of_project ( apiurl , project ) if repo . arch == opts . arch ]
2009-11-17 14:39:46 +01:00
else :
repos = get_repos_of_project ( apiurl , project )
2009-11-04 15:31:20 +01:00
2009-11-17 14:39:46 +01:00
results = [ ]
for repo in repos :
results . append ( ( repo , get_binarylist ( apiurl , project , repo . name , repo . arch , package = package , verbose = opts . verbose ) ) )
2007-08-16 20:15:08 +02:00
2009-11-17 14:39:46 +01:00
for result in results :
indent = ' '
if len ( results ) > 1 :
print ' %s / %s ' % ( result [ 0 ] . name , result [ 0 ] . arch )
indent = ' '
2009-11-04 15:31:20 +01:00
2009-11-17 14:39:46 +01:00
if opts . verbose :
for f in result [ 1 ] :
print " %9d %s %-40s " % ( f . size , shorttime ( f . mtime ) , f . name )
else :
for f in result [ 1 ] :
print indent + f
2007-08-16 20:15:08 +02:00
# list sources
elif not opts . binaries :
if not args :
2011-01-05 10:11:55 +01:00
for prj in meta_get_project_list ( apiurl , opts . deleted ) :
2011-02-11 02:43:10 +01:00
print prj
2007-08-16 20:15:08 +02:00
elif len ( args ) == 1 :
if opts . verbose :
2009-08-20 21:28:05 +02:00
if self . options . verbose :
print >> sys . stderr , ' Sorry, the --verbose option is not implemented for projects. '
2009-03-31 00:28:26 +02:00
if opts . expand :
raise oscerr . WrongOptions ( ' Sorry, the --expand option is not implemented for projects. ' )
2011-01-05 10:11:55 +01:00
for pkg in meta_get_packagelist ( apiurl , project , opts . deleted ) :
2011-02-11 02:43:10 +01:00
print pkg
2007-08-16 20:15:08 +02:00
2008-11-20 13:56:16 +01:00
elif len ( args ) == 2 or len ( args ) == 3 :
2010-03-08 23:52:51 +01:00
link_seen = False
print_not_found = True
2010-04-09 01:22:26 +02:00
rev = opts . revision
2010-03-08 23:52:51 +01:00
for i in [ 1 , 2 ] :
2010-07-29 17:29:07 +02:00
l = meta_get_filelist ( apiurl ,
2009-05-18 16:50:43 +02:00
project ,
2007-08-16 20:15:08 +02:00
package ,
2009-03-31 00:28:26 +02:00
verbose = opts . verbose ,
2009-04-09 10:21:12 +02:00
expand = opts . expand ,
2010-04-09 01:22:26 +02:00
revision = rev )
2010-04-06 10:57:49 +02:00
link_seen = ' _link ' in l
2010-03-08 23:52:51 +01:00
if opts . verbose :
out = [ ' %s %7s %9d %s %s ' % ( i . md5 , i . rev , i . size , shorttime ( i . mtime ) , i . name ) \
2008-11-20 13:56:16 +01:00
for i in l if not fname or fname == i . name ]
2010-03-08 23:52:51 +01:00
if len ( out ) > 0 :
print_not_found = False
print ' \n ' . join ( out )
2010-04-09 03:37:04 +02:00
elif fname :
if fname in l :
print fname
print_not_found = False
2008-11-20 13:56:16 +01:00
else :
2010-04-09 03:37:04 +02:00
print ' \n ' . join ( l )
2010-04-06 11:04:48 +02:00
if opts . expand or opts . unexpand or not link_seen : break
2010-07-29 17:29:07 +02:00
m = show_files_meta ( apiurl , project , package )
2010-04-09 01:22:26 +02:00
li = Linkinfo ( )
li . read ( ET . fromstring ( ' ' . join ( m ) ) . find ( ' linkinfo ' ) )
if li . haserror ( ) :
raise oscerr . LinkExpandError ( project , package , li . error )
project , package , rev = li . project , li . package , li . rev
if rev :
print ' # -> %s %s ( %s ) ' % ( project , package , rev )
else :
print ' # -> %s %s (latest) ' % ( project , package )
2010-03-08 23:52:51 +01:00
opts . expand = True
if fname and print_not_found :
print ' file \' %s \' does not exist ' % fname
2007-04-25 01:00:12 +02:00
2009-11-10 10:56:34 +01:00
@cmdln.option ( ' -f ' , ' --force ' , action = ' store_true ' ,
help = ' force generation of new patchinfo file ' )
2011-03-07 09:51:16 +01:00
@cmdln.option ( ' -n ' , ' --new ' , action = ' store_true ' ,
help = ' Use new, OBS 2.3 style patchinfo format. Will become default on release of OBS 2.3. ' )
2009-11-10 10:56:34 +01:00
@cmdln.option ( ' --force-update ' , action = ' store_true ' ,
help = ' drops away collected packages from an already built patch and let it collect again ' )
def do_patchinfo ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Generate and edit a patchinfo file.
A patchinfo file describes the packages for an update and the kind of
problem it solves .
Examples :
osc patchinfo
osc patchinfo PATCH_NAME
$ { cmd_option_list }
"""
project_dir = localdir = os . getcwd ( )
if is_project_dir ( localdir ) :
2009-12-21 23:47:25 +01:00
project = store_read_project ( localdir )
2010-04-30 17:13:21 +02:00
apiurl = self . get_api_url ( )
2009-11-10 10:56:34 +01:00
else :
sys . exit ( ' This command must be called in a checked out project. ' )
2009-11-13 09:58:37 +01:00
patchinfo = None
2009-11-10 10:56:34 +01:00
for p in meta_get_packagelist ( apiurl , project ) :
2011-03-11 11:07:35 +01:00
if p . startswith ( " _patchinfo " ) or p . startswith ( " patchinfo " ) :
2009-11-10 10:56:34 +01:00
patchinfo = p
2010-02-28 02:30:13 +01:00
2009-11-10 10:56:34 +01:00
if opts . force or not patchinfo :
print " Creating initial patchinfo... "
2011-03-07 09:51:16 +01:00
query = ' cmd=createpatchinfo '
if opts . new :
2011-03-11 11:07:35 +01:00
query + = ' &new_format=1 '
2009-11-13 09:58:37 +01:00
if args and args [ 0 ] :
2010-02-27 20:11:15 +01:00
query + = " &name= " + args [ 0 ]
2009-11-10 10:56:34 +01:00
url = makeurl ( apiurl , [ ' source ' , project ] , query = query )
f = http_POST ( url )
2010-02-24 20:02:52 +01:00
for p in meta_get_packagelist ( apiurl , project ) :
2011-03-11 11:07:35 +01:00
if p . startswith ( " _patchinfo " ) or p . startswith ( " patchinfo " ) :
2010-02-24 20:02:52 +01:00
patchinfo = p
2009-11-10 10:56:34 +01:00
2010-12-27 23:03:17 +01:00
# CAUTION:
# Both conf.config['checkout_no_colon'] and conf.config['checkout_rooted']
# fool this test:
2009-11-10 10:56:34 +01:00
if not os . path . exists ( project_dir + " / " + patchinfo ) :
checkout_package ( apiurl , project , patchinfo , prj_dir = project_dir )
2010-05-05 09:03:51 +02:00
filename = project_dir + " / " + patchinfo + " /_patchinfo "
run_editor ( filename )
2009-11-10 10:56:34 +01:00
2011-03-08 19:23:04 +01:00
@cmdln.alias ( ' bsdevelproject ' )
2011-03-08 19:47:54 +01:00
@cmdln.option ( ' -r ' , ' --raw ' , action = ' store_true ' ,
help = ' print raw xml snippet ' )
2011-03-08 19:23:04 +01:00
def do_develproject ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : print the bsdevelproject of a package
Examples :
osc develproject PRJ PKG
osc develproject
$ { cmd_option_list }
"""
args = slash_split ( args )
apiurl = self . get_api_url ( )
2011-03-08 19:47:54 +01:00
if len ( args ) == 0 :
project = store_read_project ( os . curdir )
package = store_read_package ( os . curdir )
elif len ( args ) == 2 :
project = args [ 0 ]
package = args [ 1 ]
else :
raise oscerr . WrongArgs ( ' need Project and Package ' )
devel = show_develproject ( apiurl , project , package , opts . raw )
if devel is None :
print ' \' %s / %s \' has no devel project ' % ( project , package )
elif opts . raw :
ET . dump ( devel )
2011-03-08 19:23:04 +01:00
else :
2011-03-08 19:47:54 +01:00
print devel
2011-03-08 19:23:04 +01:00
2009-11-10 10:56:34 +01:00
2009-10-30 10:40:46 +01:00
@cmdln.option ( ' -a ' , ' --attribute ' , metavar = ' ATTRIBUTE ' ,
help = ' affect only a given attribute ' )
2009-10-30 11:18:44 +01:00
@cmdln.option ( ' --attribute-defaults ' , action = ' store_true ' ,
help = ' include defined attribute defaults ' )
@cmdln.option ( ' --attribute-project ' , action = ' store_true ' ,
help = ' include project values, if missing in packages ' )
2011-03-16 10:20:38 +01:00
@cmdln.option ( ' -f ' , ' --force ' , action = ' store_true ' ,
help = ' force the save operation, allows to ignores some errors like depending repositories. For prj meta only. ' )
2007-07-13 18:01:02 +02:00
@cmdln.option ( ' -F ' , ' --file ' , metavar = ' FILE ' ,
2007-07-16 12:58:11 +02:00
help = ' read metadata from FILE, instead of opening an editor. '
' \' - \' denotes standard input. ' )
2007-07-16 18:20:09 +02:00
@cmdln.option ( ' -e ' , ' --edit ' , action = ' store_true ' ,
help = ' edit metadata ' )
2009-10-30 10:40:46 +01:00
@cmdln.option ( ' -c ' , ' --create ' , action = ' store_true ' ,
help = ' create attribute without values ' )
@cmdln.option ( ' -s ' , ' --set ' , metavar = ' ATTRIBUTE_VALUES ' ,
help = ' set attribute values ' )
2007-07-19 14:23:42 +02:00
@cmdln.option ( ' --delete ' , action = ' store_true ' ,
2009-10-30 10:40:46 +01:00
help = ' delete a pattern or attribute ' )
2007-04-25 01:00:12 +02:00
def do_meta ( self , subcmd , opts , * args ) :
2007-07-13 18:01:02 +02:00
""" $ {cmd_name} : Show meta information, or edit it
2006-09-15 12:53:44 +02:00
2007-07-19 12:08:42 +02:00
Show or edit build service metadata of type < prj | pkg | prjconf | user | pattern > .
2007-07-16 12:58:11 +02:00
This command displays metadata on buildservice objects like projects ,
packages , or users . The type of metadata is specified by the word after
" meta " , like e . g . " meta prj " .
2007-07-16 15:40:58 +02:00
prj denotes metadata of a buildservice project .
prjconf denotes the ( build ) configuration of a project .
pkg denotes metadata of a buildservice package .
user denotes the metadata of a user .
2007-07-19 12:14:10 +02:00
pattern denotes installation patterns defined for a project .
To list patterns , use ' osc meta pattern PRJ ' . An additional argument
will be the pattern file to view or edit .
2007-07-16 15:40:58 +02:00
2007-07-16 12:58:11 +02:00
With the - - edit switch , the metadata can be edited . Per default , osc
opens the program specified by the environmental variable EDITOR with a
temporary file . Alternatively , content to be saved can be supplied via
2007-07-16 18:20:09 +02:00
the - - file switch . If the argument is ' - ' , input is taken from stdin :
2009-03-02 15:03:06 +01:00
osc meta prjconf home : user | sed . . . | osc meta prjconf home : user - F -
2007-07-16 12:58:11 +02:00
2009-05-27 14:09:50 +02:00
When trying to edit a non - existing resource , it is created implicitly .
2006-09-15 12:53:44 +02:00
2007-08-09 18:15:13 +02:00
Examples :
osc meta prj PRJ
osc meta pkg PRJ PKG
osc meta pkg PRJ PKG - e
2009-10-30 10:40:46 +01:00
osc meta attribute PRJ [ PKG [ SUBPACKAGE ] ] [ - - attribute ATTRIBUTE ] [ - - create | - - delete | - - set [ value_list ] ]
2007-08-09 18:15:13 +02:00
Usage :
2009-10-30 10:40:46 +01:00
osc meta < prj | pkg | prjconf | user | pattern | attribute > ARGS . . .
osc meta < prj | pkg | prjconf | user | pattern | attribute > - e | - - edit ARGS . . .
osc meta < prj | pkg | prjconf | user | pattern | attribute > - F | - - file ARGS . . .
2007-07-19 14:23:42 +02:00
osc meta pattern - - delete PRJ PATTERN
2007-04-25 01:00:12 +02:00
$ { cmd_option_list }
"""
2006-05-23 17:27:43 +02:00
2007-07-13 18:01:02 +02:00
args = slash_split ( args )
2006-05-23 17:27:43 +02:00
2007-07-13 18:01:02 +02:00
if not args or args [ 0 ] 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 oscerr . WrongArgs ( ' Unknown meta type. Choose one of %s . ' \
% ' , ' . join ( metatypes ) )
2006-10-12 15:22:56 +02:00
2007-07-13 18:01:02 +02:00
cmd = args [ 0 ]
del args [ 0 ]
2007-06-26 15:17:38 +02:00
2010-06-18 16:06:01 +02:00
apiurl = self . get_api_url ( )
2007-07-19 12:08:42 +02:00
if cmd in [ ' pkg ' ] :
2010-04-28 10:52:32 +02:00
min_args , max_args = 0 , 2
2007-07-19 12:08:42 +02:00
elif cmd in [ ' pattern ' ] :
min_args , max_args = 1 , 2
2009-10-30 10:40:46 +01:00
elif cmd in [ ' attribute ' ] :
min_args , max_args = 1 , 3
2010-04-28 10:52:32 +02:00
elif cmd in [ ' prj ' , ' prjconf ' ] :
min_args , max_args = 0 , 1
2007-07-13 18:01:02 +02:00
else :
2007-07-19 12:08:42 +02:00
min_args , max_args = 1 , 1
2010-04-28 10:52:32 +02:00
2007-07-19 12:08:42 +02:00
if len ( args ) < min_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
raise oscerr . WrongArgs ( ' Too few arguments. ' )
2007-07-19 12:08:42 +02:00
if len ( args ) > max_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
raise oscerr . WrongArgs ( ' Too many arguments. ' )
2006-10-12 15:22:56 +02:00
2007-07-16 18:20:09 +02:00
# specific arguments
2009-10-30 10:40:46 +01:00
attributepath = [ ]
2010-05-05 09:03:51 +02:00
if cmd in [ ' pkg ' , ' prj ' , ' prjconf ' ] :
if len ( args ) == 0 :
project = store_read_project ( os . curdir )
else :
project = args [ 0 ]
if cmd == ' pkg ' :
if len ( args ) < 2 :
package = store_read_package ( os . curdir )
else :
package = args [ 1 ]
2010-04-28 10:52:32 +02:00
2009-10-30 10:40:46 +01:00
elif cmd == ' attribute ' :
project = args [ 0 ]
if len ( args ) > 1 :
2009-12-30 15:10:11 +01:00
package = args [ 1 ]
2009-10-30 10:40:46 +01:00
else :
2009-12-30 15:10:11 +01:00
package = None
if opts . attribute_project :
raise oscerr . WrongOptions ( ' --attribute-project works only when also a package is given ' )
2009-10-30 10:40:46 +01:00
if len ( args ) > 2 :
2009-12-30 15:10:11 +01:00
subpackage = args [ 2 ]
2009-10-30 10:40:46 +01:00
else :
2009-12-30 15:10:11 +01:00
subpackage = None
2009-10-30 10:40:46 +01:00
attributepath . append ( ' source ' )
attributepath . append ( project )
if package :
2009-12-30 15:10:11 +01:00
attributepath . append ( package )
2009-10-30 10:40:46 +01:00
if subpackage :
2009-12-30 15:10:11 +01:00
attributepath . append ( subpackage )
2009-10-30 10:40:46 +01:00
attributepath . append ( ' _attribute ' )
2007-07-13 18:01:02 +02:00
elif cmd == ' user ' :
2007-04-25 01:00:12 +02:00
user = args [ 0 ]
2007-07-19 12:08:42 +02:00
elif cmd == ' pattern ' :
project = args [ 0 ]
if len ( args ) > 1 :
pattern = args [ 1 ]
else :
pattern = None
2007-07-19 13:54:13 +02:00
# enforce pattern argument if needed
if opts . edit or opts . file :
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 . WrongArgs ( ' A pattern file argument is required. ' )
2007-07-16 18:20:09 +02:00
2009-05-18 16:50:43 +02:00
# show
2009-10-30 10:40:46 +01:00
if not opts . edit and not opts . file and not opts . delete and not opts . create and not opts . set :
2007-07-16 18:20:09 +02:00
if cmd == ' prj ' :
2010-06-18 16:06:01 +02:00
sys . stdout . write ( ' ' . join ( show_project_meta ( apiurl , project ) ) )
2007-07-16 18:20:09 +02:00
elif cmd == ' pkg ' :
2010-06-18 16:06:01 +02:00
sys . stdout . write ( ' ' . join ( show_package_meta ( apiurl , project , package ) ) )
2009-10-30 10:40:46 +01:00
elif cmd == ' attribute ' :
2010-06-18 16:06:01 +02:00
sys . stdout . write ( ' ' . join ( show_attribute_meta ( apiurl , project , package , subpackage , opts . attribute , opts . attribute_defaults , opts . attribute_project ) ) )
2007-07-16 18:20:09 +02:00
elif cmd == ' prjconf ' :
2010-06-18 16:06:01 +02:00
sys . stdout . write ( ' ' . join ( show_project_conf ( apiurl , project ) ) )
2007-07-16 18:20:09 +02:00
elif cmd == ' user ' :
2010-06-18 16:06:01 +02:00
r = get_user_meta ( apiurl , user )
2007-07-13 18:01:02 +02:00
if r :
sys . stdout . write ( ' ' . join ( r ) )
2007-07-19 12:08:42 +02:00
elif cmd == ' pattern ' :
if pattern :
2010-06-18 16:06:01 +02:00
r = show_pattern_meta ( apiurl , project , pattern )
2007-07-19 12:08:42 +02:00
if r :
sys . stdout . write ( ' ' . join ( r ) )
else :
2010-06-18 16:06:01 +02:00
r = show_pattern_metalist ( apiurl , project )
2007-07-19 12:08:42 +02:00
if r :
sys . stdout . write ( ' \n ' . join ( r ) + ' \n ' )
2007-07-16 18:20:09 +02:00
# edit
if opts . edit and not opts . file :
if cmd == ' prj ' :
2009-05-18 16:50:43 +02:00
edit_meta ( metatype = ' prj ' ,
2007-07-16 18:20:09 +02:00
edit = True ,
2011-03-16 10:20:38 +01:00
force = opts . force ,
2007-07-16 18:20:09 +02:00
path_args = quote_plus ( project ) ,
2010-06-18 16:06:01 +02:00
apiurl = apiurl ,
2008-03-07 10:13:30 +01:00
template_args = ( {
' name ' : project ,
2010-08-20 13:25:32 +02:00
' user ' : conf . get_apiurl_usr ( apiurl ) } ) )
2007-07-16 18:20:09 +02:00
elif cmd == ' pkg ' :
2009-05-18 16:50:43 +02:00
edit_meta ( metatype = ' pkg ' ,
2007-07-16 18:20:09 +02:00
edit = True ,
path_args = ( quote_plus ( project ) , quote_plus ( package ) ) ,
2010-06-18 16:06:01 +02:00
apiurl = apiurl ,
2008-03-07 10:13:30 +01:00
template_args = ( {
' name ' : package ,
2010-08-20 13:25:32 +02:00
' user ' : conf . get_apiurl_usr ( apiurl ) } ) )
2007-07-16 18:20:09 +02:00
elif cmd == ' prjconf ' :
2009-05-18 16:50:43 +02:00
edit_meta ( metatype = ' prjconf ' ,
2007-07-16 18:20:09 +02:00
edit = True ,
path_args = quote_plus ( project ) ,
2010-06-18 16:06:01 +02:00
apiurl = apiurl ,
2007-07-16 18:20:09 +02:00
template_args = None )
elif cmd == ' user ' :
2009-05-18 16:50:43 +02:00
edit_meta ( metatype = ' user ' ,
2007-07-16 18:20:09 +02:00
edit = True ,
path_args = ( quote_plus ( user ) ) ,
2010-06-18 16:06:01 +02:00
apiurl = apiurl ,
2008-03-07 10:13:30 +01:00
template_args = ( { ' user ' : user } ) )
2007-07-19 12:08:42 +02:00
elif cmd == ' pattern ' :
2009-05-18 16:50:43 +02:00
edit_meta ( metatype = ' pattern ' ,
2007-07-19 12:08:42 +02:00
edit = True ,
path_args = ( project , pattern ) ,
2010-06-18 16:06:01 +02:00
apiurl = apiurl ,
2007-07-19 12:08:42 +02:00
template_args = None )
2007-07-16 18:20:09 +02:00
2009-10-30 10:40:46 +01:00
# create attribute entry
2009-12-30 15:10:11 +01:00
if ( opts . create or opts . set ) and cmd == ' attribute ' :
if not opts . attribute :
raise oscerr . WrongOptions ( ' no attribute given to create ' )
values = ' '
if opts . set :
opts . set = opts . set . replace ( ' & ' , ' & ' ) . replace ( ' < ' , ' < ' ) . replace ( ' > ' , ' > ' )
for i in opts . set . split ( ' , ' ) :
values + = ' <value> %s </value> ' % i
2010-01-21 10:31:53 +01:00
aname = opts . attribute . split ( " : " )
d = ' <attributes><attribute namespace= \' %s \' name= \' %s \' > %s </attribute></attributes> ' % ( aname [ 0 ] , aname [ 1 ] , values )
2010-06-18 16:06:01 +02:00
url = makeurl ( apiurl , attributepath )
2009-12-30 15:10:11 +01:00
for data in streamfile ( url , http_POST , data = d ) :
sys . stdout . write ( data )
2009-10-30 10:40:46 +01:00
2007-07-16 18:20:09 +02:00
# upload file
if opts . file :
if opts . file == ' - ' :
f = sys . stdin . read ( )
2007-07-13 18:01:02 +02:00
else :
2007-07-16 18:20:09 +02:00
try :
f = open ( opts . file ) . read ( )
except :
sys . exit ( ' could not open file \' %s \' . ' % opts . file )
if cmd == ' prj ' :
2009-05-18 16:50:43 +02:00
edit_meta ( metatype = ' prj ' ,
2007-07-16 18:20:09 +02:00
data = f ,
edit = opts . edit ,
2011-03-16 10:20:38 +01:00
force = opts . force ,
2010-06-18 16:06:01 +02:00
apiurl = apiurl ,
2007-07-16 18:20:09 +02:00
path_args = quote_plus ( project ) )
elif cmd == ' pkg ' :
2009-05-18 16:50:43 +02:00
edit_meta ( metatype = ' pkg ' ,
2007-07-16 18:20:09 +02:00
data = f ,
edit = opts . edit ,
2010-06-18 16:06:01 +02:00
apiurl = apiurl ,
2007-07-16 18:20:09 +02:00
path_args = ( quote_plus ( project ) , quote_plus ( package ) ) )
elif cmd == ' prjconf ' :
2009-05-18 16:50:43 +02:00
edit_meta ( metatype = ' prjconf ' ,
2007-07-16 18:20:09 +02:00
data = f ,
edit = opts . edit ,
2010-06-18 16:06:01 +02:00
apiurl = apiurl ,
2007-07-16 18:20:09 +02:00
path_args = quote_plus ( project ) )
elif cmd == ' user ' :
2009-05-18 16:50:43 +02:00
edit_meta ( metatype = ' user ' ,
2007-07-16 18:20:09 +02:00
data = f ,
edit = opts . edit ,
2010-06-18 16:06:01 +02:00
apiurl = apiurl ,
2007-07-16 18:20:09 +02:00
path_args = ( quote_plus ( user ) ) )
2007-07-19 12:08:42 +02:00
elif cmd == ' pattern ' :
2009-05-18 16:50:43 +02:00
edit_meta ( metatype = ' pattern ' ,
2007-07-19 12:08:42 +02:00
data = f ,
edit = opts . edit ,
2010-06-18 16:06:01 +02:00
apiurl = apiurl ,
2007-07-19 12:08:42 +02:00
path_args = ( project , pattern ) )
2007-07-16 18:20:09 +02:00
2007-07-13 18:01:02 +02:00
2007-07-19 14:23:42 +02:00
# delete
if opts . delete :
path = metatypes [ cmd ] [ ' path ' ]
if cmd == ' pattern ' :
path = path % ( project , pattern )
2010-06-18 16:06:01 +02:00
u = makeurl ( apiurl , [ path ] )
2008-04-10 23:04:17 +02:00
http_DELETE ( u )
2009-10-30 10:40:46 +01:00
elif cmd == ' attribute ' :
if not opts . attribute :
2009-12-30 15:10:11 +01:00
raise oscerr . WrongOptions ( ' no attribute given to create ' )
2009-10-30 10:40:46 +01:00
attributepath . append ( opts . attribute )
2010-06-18 16:06:01 +02:00
u = makeurl ( apiurl , attributepath )
2009-12-30 15:10:11 +01:00
for data in streamfile ( u , http_DELETE ) :
sys . stdout . write ( data )
2007-07-19 14:23:42 +02:00
else :
2009-12-30 15:10:11 +01:00
raise oscerr . WrongOptions ( ' The --delete switch is only for pattern metadata or attributes. ' )
2007-07-19 14:23:42 +02:00
2010-12-30 03:14:24 +01:00
# TODO: rewrite and consolidate the current submitrequest/createrequest "mess"
2008-03-05 00:41:00 +01:00
@cmdln.option ( ' -m ' , ' --message ' , metavar = ' TEXT ' ,
help = ' specify message TEXT ' )
2008-03-13 00:37:35 +01:00
@cmdln.option ( ' -r ' , ' --revision ' , metavar = ' REV ' ,
2010-08-31 18:42:52 +02:00
help = ' specify a certain source revision ID (the md5 sum) for the source package ' )
2009-11-17 17:59:17 +01:00
@cmdln.option ( ' -s ' , ' --supersede ' , metavar = ' SUPERSEDE ' ,
help = ' Superseding another request by this one ' )
2008-06-03 17:01:01 +02:00
@cmdln.option ( ' --nodevelproject ' , action = ' store_true ' ,
help = ' do not follow a defined devel project ' \
' (primary project where a package is developed) ' )
2009-09-05 15:46:55 +02:00
@cmdln.option ( ' --cleanup ' , action = ' store_true ' ,
help = ' remove package if submission gets accepted (default for home:<id>:branch projects) ' )
@cmdln.option ( ' --no-cleanup ' , action = ' store_true ' ,
help = ' never remove source package on accept, but update its content ' )
@cmdln.option ( ' --no-update ' , action = ' store_true ' ,
help = ' never touch source package on accept (will break source links) ' )
2009-08-28 09:33:16 +02:00
@cmdln.option ( ' -d ' , ' --diff ' , action = ' store_true ' ,
help = ' show diff only instead of creating the actual request ' )
2009-11-13 09:58:37 +01:00
@cmdln.option ( ' --yes ' , action = ' store_true ' ,
help = ' proceed without asking. ' )
2008-07-09 22:38:49 +02:00
@cmdln.alias ( " sr " )
2009-06-02 16:57:42 +02:00
@cmdln.alias ( " submitreq " )
2009-08-20 21:28:05 +02:00
@cmdln.alias ( " submitpac " )
2009-06-02 16:57:42 +02:00
def do_submitrequest ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Create request to submit source into another Project
2008-03-05 00:41:00 +01:00
2010-07-27 15:20:35 +02:00
[ See http : / / en . opensuse . org / openSUSE : Build_Service_Collaboration for information
2008-06-06 14:04:34 +02:00
on this topic . ]
2009-06-02 16:57:42 +02:00
See the " request " command for showing and modifing existing requests .
2009-06-02 15:14:46 +02:00
2009-06-02 16:57:42 +02:00
usage :
2009-07-13 11:36:19 +02:00
osc submitreq [ OPTIONS ]
osc submitreq [ OPTIONS ] DESTPRJ [ DESTPKG ]
osc submitreq [ OPTIONS ] SOURCEPRJ SOURCEPKG DESTPRJ [ DESTPKG ]
2010-11-26 12:39:09 +01:00
osc submitpac . . . is a shorthand for osc submitreq - - cleanup . . .
2009-06-02 16:57:42 +02:00
$ { cmd_option_list }
2009-06-02 15:14:46 +02:00
"""
2010-11-26 14:53:30 +01:00
if opts . cleanup and opts . no_cleanup :
raise oscerr . WrongOptions ( ' \' --cleanup \' and \' --no-cleanup \' are mutually exclusive ' )
2009-12-19 14:44:51 +01:00
src_update = conf . config [ ' submitrequest_on_accept_action ' ] or None
2009-09-05 15:46:55 +02:00
# we should check here for home:<id>:branch and default to update, but that would require OBS 1.7 server
2010-11-26 12:39:09 +01:00
2010-11-26 14:51:07 +01:00
if subcmd == ' submitpac ' and not opts . no_cleanup :
2010-11-26 12:39:09 +01:00
opts . cleanup = True ;
2009-09-05 15:46:55 +02:00
if opts . cleanup :
2009-10-20 16:30:15 +02:00
src_update = " cleanup "
2009-09-05 15:46:55 +02:00
elif opts . no_cleanup :
2009-10-20 16:30:15 +02:00
src_update = " update "
2009-09-05 15:46:55 +02:00
elif opts . no_update :
2009-10-20 16:30:15 +02:00
src_update = " noupdate "
2009-09-05 15:46:55 +02:00
2009-06-02 16:57:42 +02:00
args = slash_split ( args )
2009-06-02 15:14:46 +02:00
2009-06-05 07:46:20 +02:00
# remove this block later again
oldcmds = [ ' create ' , ' list ' , ' log ' , ' show ' , ' decline ' , ' accept ' , ' delete ' , ' revoke ' ]
if args and args [ 0 ] in oldcmds :
2011-01-05 16:31:02 +01:00
print >> sys . stderr , " ************************************************************************ "
print >> sys . stderr , " * WARNING: It looks that you are using this command with a * "
print >> sys . stderr , " * deprecated syntax. * "
print >> sys . stderr , " * Please run \" osc sr --help \" and \" osc rq --help \" * "
print >> sys . stderr , " * to see the new syntax. * "
print >> sys . stderr , " ************************************************************************ "
2009-06-05 23:45:29 +02:00
if args [ 0 ] == ' create ' :
args . pop ( 0 )
else :
sys . exit ( 1 )
2009-06-05 07:46:20 +02:00
2009-06-02 16:57:42 +02:00
if len ( args ) > 4 :
2009-06-02 15:14:46 +02:00
raise oscerr . WrongArgs ( ' Too many arguments. ' )
2009-11-13 09:58:37 +01:00
if len ( args ) > 0 and len ( args ) < = 2 and is_project_dir ( os . getcwd ( ) ) :
2009-12-25 00:39:13 +01:00
sys . exit ( ' osc submitrequest from project directory is only working without target specs and for source linked files \n ' )
2009-11-13 09:58:37 +01:00
2010-04-30 17:13:21 +02:00
apiurl = self . get_api_url ( )
2009-11-16 10:42:58 +01:00
2009-11-13 09:58:37 +01:00
if len ( args ) == 0 and is_project_dir ( os . getcwd ( ) ) :
import cgi
# submit requests for multiple packages are currently handled via multiple requests
# They could be also one request with multiple actions, but that avoids to accepts parts of it.
2009-12-21 23:47:25 +01:00
project = store_read_project ( os . curdir )
2009-11-13 09:58:37 +01:00
sr_ids = [ ]
pi = [ ]
pac = [ ]
targetprojects = [ ]
# loop via all packages for checking their state
2009-12-21 23:47:25 +01:00
for p in meta_get_packagelist ( apiurl , project ) :
2011-03-04 15:50:06 +01:00
if p . startswith ( " _patchinfo: " ) or p . startswith ( " patchinfo " ) :
2010-02-24 20:02:52 +01:00
pi . append ( p )
2009-11-13 09:58:37 +01:00
else :
2010-03-05 12:54:12 +01:00
# get _link info from server, that knows about the local state ...
2010-02-24 20:02:52 +01:00
u = makeurl ( apiurl , [ ' source ' , project , p ] )
f = http_GET ( u )
root = ET . parse ( f ) . getroot ( )
linkinfo = root . find ( ' linkinfo ' )
if linkinfo == None :
print " Package " , p , " is not a source link. "
sys . exit ( " This is currently not supported. " )
if linkinfo . get ( ' error ' ) :
print " Package " , p , " is a broken source link. "
sys . exit ( " Please fix this first " )
t = linkinfo . get ( ' project ' )
if t :
if len ( root . findall ( ' entry ' ) ) > 1 : # This is not really correct, but should work mostly
# Real fix is to ask the api if sources are modificated
# but there is no such call yet.
targetprojects . append ( t )
pac . append ( p )
print " Submitting package " , p
else :
print " Skipping package " , p
else :
2010-03-05 12:54:12 +01:00
print " Skipping package " , p , " since it is a source link pointing inside the project. "
2009-11-13 09:58:37 +01:00
2010-08-05 17:00:45 +02:00
# was this project created by clone request ?
u = makeurl ( apiurl , [ ' source ' , project , ' _attribute ' , ' OBS:RequestCloned ' ] )
f = http_GET ( u )
root = ET . parse ( f ) . getroot ( )
value = root . findtext ( ' attribute/value ' )
myreqs = { }
if value :
myreqs = [ value ]
2009-11-13 09:58:37 +01:00
if not opts . yes :
if pi :
2010-02-24 20:02:52 +01:00
print " Submitting patchinfo " , ' , ' . join ( pi ) , " to " , ' , ' . join ( targetprojects )
2010-08-05 17:00:45 +02:00
repl = raw_input ( ' \n Everything fine? Can we create the requests ? (y/n) ' )
if repl . lower ( ) != ' y ' :
2010-04-20 15:22:03 +02:00
print >> sys . stderr , ' Aborted... '
raise oscerr . UserAbort ( )
2009-11-13 09:58:37 +01:00
2010-08-05 17:00:45 +02:00
2009-11-13 09:58:37 +01:00
# loop via all packages to do the action
for p in pac :
2009-12-21 23:47:25 +01:00
result = create_submit_request ( apiurl , project , p )
2009-11-13 09:58:37 +01:00
if not result :
2010-02-27 20:11:15 +01:00
# sys.exit(result)
sys . exit ( " submit request creation failed " )
2009-11-13 09:58:37 +01:00
sr_ids . append ( result )
# create submit requests for all found patchinfos
actionxml = " "
options_block = " "
if src_update :
options_block = """ <options><sourceupdate> %s </sourceupdate></options> """ % ( src_update )
for p in pi :
for t in targetprojects :
s = """ <action type= " submit " > <source project= " %s " package= " %s " /> <target project= " %s " package= " %s " /> %s </action> """ % \
2009-12-21 23:47:25 +01:00
( project , p , t , p , options_block )
2009-11-13 09:58:37 +01:00
actionxml + = s
if actionxml != " " :
xml = """ <request> %s <state name= " new " /> <description> %s </description> </request> """ % \
( actionxml , cgi . escape ( opts . message or " " ) )
u = makeurl ( apiurl , [ ' request ' ] , query = ' cmd=create ' )
f = http_POST ( u , data = xml )
2010-02-28 02:30:13 +01:00
2009-11-13 09:58:37 +01:00
root = ET . parse ( f ) . getroot ( )
sr_ids . append ( root . get ( ' id ' ) )
print " Requests created: " ,
for i in sr_ids :
2010-02-27 20:11:15 +01:00
print i ,
2010-08-05 17:00:45 +02:00
repl = ' '
if len ( myreqs ) > 0 :
print ' \n \n There are already following submit request: %s . ' % \
' , ' . join ( [ str ( i ) for i in myreqs ] )
repl = raw_input ( ' \n Supersede the old requests? (y/n) ' )
if repl . lower ( ) == ' y ' :
for req in myreqs :
change_request_state ( apiurl , str ( req ) , ' superseded ' ,
' superseded by %s ' % result , result )
2010-06-26 20:54:02 +02:00
sys . exit ( ' Successfully finished ' )
2009-11-13 09:58:37 +01:00
elif len ( args ) < = 2 :
2009-06-02 16:57:42 +02:00
# try using the working copy at hand
p = findpacs ( os . curdir ) [ 0 ]
src_project = p . prjname
src_package = p . name
2009-12-15 17:38:09 +01:00
apiurl = p . apiurl
2009-06-02 16:57:42 +02:00
if len ( args ) == 0 and p . islink ( ) :
dst_project = p . linkinfo . project
dst_package = p . linkinfo . package
elif len ( args ) > 0 :
dst_project = args [ 0 ]
if len ( args ) == 2 :
dst_package = args [ 1 ]
2009-06-02 15:14:46 +02:00
else :
dst_package = src_package
else :
2009-06-02 16:57:42 +02:00
sys . exit ( ' Package \' %s \' is not a source link, so I cannot guess the submit target. \n '
' Please provide it the target via commandline arguments. ' % p . name )
2010-09-21 11:19:27 +02:00
modified = [ i for i in p . filenamelist if not p . status ( i ) in ( ' ' , ' ? ' , ' S ' ) ]
2009-06-02 16:57:42 +02:00
if len ( modified ) > 0 :
print ' Your working copy has local modifications. '
repl = raw_input ( ' Proceed without committing the local changes? (y|N) ' )
if repl != ' y ' :
2010-04-20 15:22:03 +02:00
raise oscerr . UserAbort ( )
2009-06-02 16:57:42 +02:00
elif len ( args ) > = 3 :
# get the arguments from the commandline
src_project , src_package , dst_project = args [ 0 : 3 ]
if len ( args ) == 4 :
dst_package = args [ 3 ]
else :
dst_package = src_package
else :
raise oscerr . WrongArgs ( ' Incorrect number of arguments. \n \n ' \
+ self . get_cmd_help ( ' request ' ) )
if not opts . nodevelproject :
devloc = None
try :
devloc = show_develproject ( apiurl , dst_project , dst_package )
except urllib2 . HTTPError :
print >> sys . stderr , """ \
2009-06-02 15:14:46 +02:00
Warning : failed to fetch meta data for ' %s ' package ' %s ' ( new package ? ) """ \
2009-06-02 16:57:42 +02:00
% ( dst_project , dst_package )
pass
2009-06-02 15:14:46 +02:00
2009-10-20 16:30:15 +02:00
if devloc and \
dst_project != devloc and \
src_project != devloc :
print """ \
2010-02-02 14:38:50 +01:00
A different project , % s , is defined as the place where development
2009-06-02 15:14:46 +02:00
of the package % s primarily takes place .
Please submit there instead , or use - - nodevelproject to force direct submission . """ \
2009-06-02 16:57:42 +02:00
% ( devloc , dst_package )
2010-02-02 14:38:50 +01:00
if not opts . diff :
sys . exit ( 1 )
2010-02-02 14:38:35 +01:00
rdiff = None
if opts . diff or not opts . message :
try :
rdiff = ' old: %s / %s \n new: %s / %s ' % ( dst_project , dst_package , src_project , src_package )
rdiff + = server_diff ( apiurl ,
dst_project , dst_package , opts . revision ,
src_project , src_package , None , True )
except :
rdiff = ' '
2010-08-05 17:00:45 +02:00
2009-08-28 09:33:16 +02:00
if opts . diff :
2010-09-10 17:28:45 +02:00
run_pager ( rdiff )
2010-08-13 08:55:18 +02:00
return
2009-08-28 09:33:16 +02:00
2010-08-05 17:00:45 +02:00
# Are there already requests to this package ?
2010-12-09 17:36:31 +01:00
reqs = get_request_list ( apiurl , dst_project , dst_package , req_type = ' submit ' , req_state = [ ' new ' , ' review ' ] )
2010-08-05 17:00:45 +02:00
user = conf . get_apiurl_usr ( apiurl )
myreqs = [ i for i in reqs if i . state . who == user ]
repl = ' '
if len ( myreqs ) > 0 :
print ' There are already following submit request: %s . ' % \
2010-12-30 13:28:11 +01:00
' , ' . join ( [ i . reqid for i in myreqs ] )
2010-08-05 17:00:45 +02:00
repl = raw_input ( ' Supersede the old requests? (y/n/c) ' )
if repl . lower ( ) == ' c ' :
print >> sys . stderr , ' Aborting '
raise oscerr . UserAbort ( )
if not opts . message :
difflines = [ ]
doappend = False
changes_re = re . compile ( r ' ^--- .* \ .changes ' )
for line in rdiff . split ( ' \n ' ) :
if line . startswith ( ' --- ' ) :
if changes_re . match ( line ) :
doappend = True
else :
doappend = False
if doappend :
difflines . append ( line )
opts . message = edit_message ( footer = rdiff , template = ' \n ' . join ( parse_diff_for_commit_message ( ' \n ' . join ( difflines ) ) ) )
result = create_submit_request ( apiurl ,
src_project , src_package ,
dst_project , dst_package ,
opts . message , orev = opts . revision , src_update = src_update )
if repl . lower ( ) == ' y ' :
for req in myreqs :
2010-12-30 13:28:11 +01:00
change_request_state ( apiurl , req . reqid , ' superseded ' ,
2010-08-05 17:00:45 +02:00
' superseded by %s ' % result , result )
if opts . supersede :
2011-02-08 16:16:18 +01:00
change_request_state ( apiurl , opts . supersede , ' superseded ' ,
2010-08-05 17:00:45 +02:00
opts . message or ' ' , result )
print ' created request id ' , result
2009-06-02 15:14:46 +02:00
2010-06-15 17:07:14 +02:00
def _actionparser ( self , opt_str , value , parser ) :
2010-05-24 13:28:44 +02:00
value = [ ]
if not hasattr ( parser . values , ' actiondata ' ) :
setattr ( parser . values , ' actiondata ' , [ ] )
if parser . values . actions == None :
parser . values . actions = [ ]
rargs = parser . rargs
while rargs :
arg = rargs [ 0 ]
if ( ( arg [ : 2 ] == " -- " and len ( arg ) > 2 ) or
( arg [ : 1 ] == " - " and len ( arg ) > 1 and arg [ 1 ] != " - " ) ) :
break
else :
value . append ( arg )
del rargs [ 0 ]
parser . values . actions . append ( value [ 0 ] )
del value [ 0 ]
parser . values . actiondata . append ( value )
def _submit_request ( self , args , opts , options_block ) :
actionxml = " "
apiurl = self . get_api_url ( )
if len ( args ) == 0 and is_project_dir ( os . getcwd ( ) ) :
# submit requests for multiple packages are currently handled via multiple requests
# They could be also one request with multiple actions, but that avoids to accepts parts of it.
project = store_read_project ( os . curdir )
pi = [ ]
pac = [ ]
targetprojects = [ ]
rdiffmsg = [ ]
# loop via all packages for checking their state
for p in meta_get_packagelist ( apiurl , project ) :
if p . startswith ( " _patchinfo: " ) :
pi . append ( p )
else :
# get _link info from server, that knows about the local state ...
u = makeurl ( apiurl , [ ' source ' , project , p ] )
f = http_GET ( u )
root = ET . parse ( f ) . getroot ( )
linkinfo = root . find ( ' linkinfo ' )
if linkinfo == None :
print " Package " , p , " is not a source link. "
sys . exit ( " This is currently not supported. " )
if linkinfo . get ( ' error ' ) :
print " Package " , p , " is a broken source link. "
sys . exit ( " Please fix this first " )
t = linkinfo . get ( ' project ' )
if t :
rdiff = ' '
try :
rdiff = server_diff ( apiurl , t , p , opts . revision , project , p , None , True )
except :
rdiff = ' '
if rdiff != ' ' :
targetprojects . append ( t )
pac . append ( p )
rdiffmsg . append ( " old: %s / %s \n new: %s / %s \n %s " % ( t , p , project , p , rdiff ) )
else :
print " Skipping package " , p , " since it has no difference with the target package. "
else :
print " Skipping package " , p , " since it is a source link pointing inside the project. "
if opts . diff :
print ' ' . join ( rdiffmsg )
sys . exit ( 0 )
if not opts . yes :
if pi :
print " Submitting patchinfo " , ' , ' . join ( pi ) , " to " , ' , ' . join ( targetprojects )
print " \n Everything fine? Can we create the requests ? [y/n] "
if sys . stdin . read ( 1 ) != " y " :
sys . exit ( " Aborted... " )
# loop via all packages to do the action
for p in pac :
s = """ <action type= " submit " > <source project= " %s " package= " %s " rev= " %s " /> <target project= " %s " package= " %s " /> %s </action> """ % \
( project , p , opts . revision or show_upstream_rev ( apiurl , project , p ) , t , p , options_block )
actionxml + = s
# create submit requests for all found patchinfos
for p in pi :
for t in targetprojects :
s = """ <action type= " submit " > <source project= " %s " package= " %s " /> <target project= " %s " package= " %s " /> %s </action> """ % \
( project , p , t , p , options_block )
actionxml + = s
return actionxml
elif len ( args ) < = 2 :
# try using the working copy at hand
p = findpacs ( os . curdir ) [ 0 ]
src_project = p . prjname
src_package = p . name
if len ( args ) == 0 and p . islink ( ) :
dst_project = p . linkinfo . project
dst_package = p . linkinfo . package
elif len ( args ) > 0 :
dst_project = args [ 0 ]
if len ( args ) == 2 :
dst_package = args [ 1 ]
else :
dst_package = src_package
else :
sys . exit ( ' Package \' %s \' is not a source link, so I cannot guess the submit target. \n '
' Please provide it the target via commandline arguments. ' % p . name )
modified = [ i for i in p . filenamelist if p . status ( i ) != ' ' and p . status ( i ) != ' ? ' ]
if len ( modified ) > 0 :
print ' Your working copy has local modifications. '
repl = raw_input ( ' Proceed without committing the local changes? (y|N) ' )
if repl != ' y ' :
sys . exit ( 1 )
elif len ( args ) > = 3 :
# get the arguments from the commandline
src_project , src_package , dst_project = args [ 0 : 3 ]
if len ( args ) == 4 :
dst_package = args [ 3 ]
else :
dst_package = src_package
else :
raise oscerr . WrongArgs ( ' Incorrect number of arguments. \n \n ' \
+ self . get_cmd_help ( ' request ' ) )
if not opts . nodevelproject :
devloc = None
try :
devloc = show_develproject ( apiurl , dst_project , dst_package )
except urllib2 . HTTPError :
print >> sys . stderr , """ \
Warning : failed to fetch meta data for ' %s ' package ' %s ' ( new package ? ) """ \
% ( dst_project , dst_package )
pass
if devloc and \
dst_project != devloc and \
src_project != devloc :
print """ \
A different project , % s , is defined as the place where development
of the package % s primarily takes place .
Please submit there instead , or use - - nodevelproject to force direct submission . """ \
% ( devloc , dst_package )
if not opts . diff :
sys . exit ( 1 )
rdiff = None
if opts . diff :
try :
rdiff = ' old: %s / %s \n new: %s / %s ' % ( dst_project , dst_package , src_project , src_package )
rdiff + = server_diff ( apiurl ,
dst_project , dst_package , opts . revision ,
src_project , src_package , None , True )
except :
rdiff = ' '
if opts . diff :
2010-09-10 17:28:45 +02:00
run_pager ( rdiff )
2010-05-24 13:28:44 +02:00
else :
2010-12-09 17:36:31 +01:00
reqs = get_request_list ( apiurl , dst_project , dst_package , req_type = ' submit ' , req_state = [ ' new ' , ' review ' ] )
2010-05-24 13:28:44 +02:00
user = conf . get_apiurl_usr ( apiurl )
myreqs = [ i for i in reqs if i . state . who == user ]
repl = ' '
if len ( myreqs ) > 0 :
print ' You already created the following submit request: %s . ' % \
2010-12-30 13:28:11 +01:00
' , ' . join ( [ i . reqid for i in myreqs ] )
2010-05-24 13:28:44 +02:00
repl = raw_input ( ' Supersede the old requests? (y/n/c) ' )
if repl . lower ( ) == ' c ' :
print >> sys . stderr , ' Aborting '
sys . exit ( 1 )
actionxml = """ <action type= " submit " > <source project= " %s " package= " %s " rev= " %s " /> <target project= " %s " package= " %s " /> %s </action> """ % \
( src_project , src_package , opts . revision or show_upstream_rev ( apiurl , src_project , src_package ) , dst_project , dst_package , options_block )
if repl . lower ( ) == ' y ' :
for req in myreqs :
2010-12-30 13:28:11 +01:00
change_request_state ( apiurl , req . reqid , ' superseded ' ,
2010-05-24 13:28:44 +02:00
' superseded by %s ' % result , result )
if opts . supersede :
2011-02-08 16:16:18 +01:00
change_request_state ( apiurl , opts . supersede , ' superseded ' , ' ' , result )
2010-05-24 13:28:44 +02:00
#print 'created request id', result
return actionxml
def _delete_request ( self , args , opts ) :
if len ( args ) < 1 :
raise oscerr . WrongArgs ( ' Please specify at least a project. ' )
if len ( args ) > 2 :
raise oscerr . WrongArgs ( ' Too many arguments. ' )
package = " "
if len ( args ) > 1 :
package = """ package= " %s " """ % ( args [ 1 ] )
actionxml = """ <action type= " delete " > <target project= " %s " %s /> </action> """ % ( args [ 0 ] , package )
return actionxml
def _changedevel_request ( self , args , opts ) :
if len ( args ) > 4 :
raise oscerr . WrongArgs ( ' Too many arguments. ' )
2011-03-09 16:10:48 +01:00
if len ( args ) == 0 and is_package_dir ( ' . ' ) and find_default_project ( ) :
2010-05-24 13:28:44 +02:00
wd = os . curdir
devel_project = store_read_project ( wd )
devel_package = package = store_read_package ( wd )
2011-03-09 16:10:48 +01:00
project = find_default_project ( self . get_api_url ( ) , package )
2010-05-24 13:28:44 +02:00
else :
if len ( args ) < 3 :
raise oscerr . WrongArgs ( ' Too few arguments. ' )
devel_project = args [ 2 ]
project = args [ 0 ]
package = args [ 1 ]
devel_package = package
if len ( args ) > 3 :
devel_package = args [ 3 ]
actionxml = """ <action type= " change_devel " > <source project= " %s " package= " %s " /> <target project= " %s " package= " %s " /> </action> """ % \
( devel_project , devel_package , project , package )
return actionxml
2011-01-10 13:12:09 +01:00
def _add_me ( self , args , opts ) :
if len ( args ) > 3 :
raise oscerr . WrongArgs ( ' Too many arguments. ' )
if len ( args ) < 2 :
raise oscerr . WrongArgs ( ' Too few arguments. ' )
apiurl = self . get_api_url ( )
user = conf . get_apiurl_usr ( apiurl )
2011-01-12 11:29:46 +01:00
role = args [ 0 ]
project = args [ 1 ]
2011-01-10 13:12:09 +01:00
actionxml = """ <action type= " add_role " > <target project= " %s " /> <person name= " %s " role= " %s " /> </action> """ % \
( project , user , role )
if len ( args ) > 2 :
package = args [ 2 ]
actionxml = """ <action type= " add_role " > <target project= " %s " package= " %s " /> <person name= " %s " role= " %s " /> </action> """ % \
( project , package , user , role )
if get_user_meta ( apiurl , user ) == None :
raise oscerr . WrongArgs ( ' osc: an error occured. ' )
return actionxml
2011-01-11 20:02:48 +01:00
def _add_user ( self , args , opts ) :
2010-05-24 13:28:44 +02:00
if len ( args ) > 4 :
raise oscerr . WrongArgs ( ' Too many arguments. ' )
if len ( args ) < 3 :
raise oscerr . WrongArgs ( ' Too few arguments. ' )
apiurl = self . get_api_url ( )
user = args [ 0 ]
role = args [ 1 ]
project = args [ 2 ]
2010-09-09 22:07:50 +02:00
actionxml = """ <action type= " add_role " > <target project= " %s " /> <person name= " %s " role= " %s " /> </action> """ % \
( project , user , role )
2010-05-24 13:28:44 +02:00
if len ( args ) > 3 :
package = args [ 3 ]
2010-09-09 22:07:50 +02:00
actionxml = """ <action type= " add_role " > <target project= " %s " package= " %s " /> <person name= " %s " role= " %s " /> </action> """ % \
( project , package , user , role )
2010-05-24 13:28:44 +02:00
if get_user_meta ( apiurl , user ) == None :
raise oscerr . WrongArgs ( ' osc: an error occured. ' )
return actionxml
2011-01-11 20:02:48 +01:00
def _add_group ( self , args , opts ) :
if len ( args ) > 4 :
raise oscerr . WrongArgs ( ' Too many arguments. ' )
if len ( args ) < 3 :
raise oscerr . WrongArgs ( ' Too few arguments. ' )
apiurl = self . get_api_url ( )
group = args [ 0 ]
role = args [ 1 ]
project = args [ 2 ]
actionxml = """ <action type= " add_role " > <target project= " %s " /> <group name= " %s " role= " %s " /> </action> """ % \
( project , group , role )
if len ( args ) > 3 :
package = args [ 3 ]
actionxml = """ <action type= " add_role " > <target project= " %s " package= " %s " /> <group name= " %s " role= " %s " /> </action> """ % \
( project , package , group , role )
if get_group ( apiurl , group ) == None :
raise oscerr . WrongArgs ( ' osc: an error occured. ' )
return actionxml
2010-05-24 13:28:44 +02:00
def _set_bugowner ( self , args , opts ) :
if len ( args ) > 3 :
raise oscerr . WrongArgs ( ' Too many arguments. ' )
if len ( args ) < 2 :
raise oscerr . WrongArgs ( ' Too few arguments. ' )
apiurl = self . get_api_url ( )
user = args [ 0 ]
project = args [ 1 ]
if len ( args ) > 2 :
package = args [ 2 ]
if get_user_meta ( apiurl , user ) == None :
raise oscerr . WrongArgs ( ' osc: an error occured. ' )
actionxml = """ <action type= " set_bugowner " > <target project= " %s " package= " %s " /> <person name= " %s " /> </action> """ % \
( project , package , user )
return actionxml
@cmdln.option ( ' -a ' , ' --action ' , action = ' callback ' , callback = _actionparser , dest = ' actions ' ,
help = ' specify action type of a request, can be : submit/delete/change_devel/add_role/set_bugowner ' )
@cmdln.option ( ' -m ' , ' --message ' , metavar = ' TEXT ' ,
help = ' specify message TEXT ' )
@cmdln.option ( ' -r ' , ' --revision ' , metavar = ' REV ' ,
help = ' for " create " , specify a certain source revision ID (the md5 sum) ' )
@cmdln.option ( ' -s ' , ' --supersede ' , metavar = ' SUPERSEDE ' ,
help = ' Superseding another request by this one ' )
@cmdln.option ( ' --nodevelproject ' , action = ' store_true ' ,
help = ' do not follow a defined devel project ' \
' (primary project where a package is developed) ' )
@cmdln.option ( ' --cleanup ' , action = ' store_true ' ,
help = ' remove package if submission gets accepted (default for home:<id>:branch projects) ' )
@cmdln.option ( ' --no-cleanup ' , action = ' store_true ' ,
help = ' never remove source package on accept, but update its content ' )
@cmdln.option ( ' --no-update ' , action = ' store_true ' ,
help = ' never touch source package on accept (will break source links) ' )
@cmdln.option ( ' -d ' , ' --diff ' , action = ' store_true ' ,
help = ' show diff only instead of creating the actual request ' )
@cmdln.option ( ' --yes ' , action = ' store_true ' ,
help = ' proceed without asking. ' )
@cmdln.alias ( " creq " )
def do_createrequest ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : create multiple requests with a single command
usage :
osc creq [ OPTIONS ] [
- a submit SOURCEPRJ SOURCEPKG DESTPRJ [ DESTPKG ]
- a delete PROJECT [ PACKAGE ]
- a change_devel PROJECT PACKAGE DEVEL_PROJECT [ DEVEL_PACKAGE ]
2011-01-10 13:12:09 +01:00
- a add_me ROLE PROJECT [ PACKAGE ]
2011-01-11 20:02:48 +01:00
- a add_group GROUP ROLE PROJECT [ PACKAGE ]
2010-05-24 13:28:44 +02:00
- a add_role USER ROLE PROJECT [ PACKAGE ]
- a set_bugowner USER PROJECT [ PACKAGE ]
]
Option - m works for all types of request , the rest work only for submit .
example :
osc creq - a submit - a delete home : someone : branches : openSUSE : Tools - a change_devel openSUSE : Tools osc home : someone : branches : openSUSE : Tools - m ok
This will submit all modified packages under current directory , delete project home : someone : branches : openSUSE : Tools and change the devel project to home : someone : branches : openSUSE : Tools for package osc in project openSUSE : Tools .
$ { cmd_option_list }
"""
src_update = conf . config [ ' submitrequest_on_accept_action ' ] or None
# we should check here for home:<id>:branch and default to update, but that would require OBS 1.7 server
if opts . cleanup :
src_update = " cleanup "
elif opts . no_cleanup :
src_update = " update "
elif opts . no_update :
src_update = " noupdate "
options_block = " "
if src_update :
options_block = """ <options><sourceupdate> %s </sourceupdate></options> """ % ( src_update )
args = slash_split ( args )
apiurl = self . get_api_url ( )
i = 0
actionsxml = " "
for ai in opts . actions :
if ai == ' submit ' :
args = opts . actiondata [ i ]
i = i + 1
actionsxml + = self . _submit_request ( args , opts , options_block )
elif ai == ' delete ' :
args = opts . actiondata [ i ]
actionsxml + = self . _delete_request ( args , opts )
i = i + 1
elif ai == ' change_devel ' :
args = opts . actiondata [ i ]
actionsxml + = self . _changedevel_request ( args , opts )
i = i + 1
2011-01-10 13:12:09 +01:00
elif ai == ' add_me ' :
args = opts . actiondata [ i ]
actionsxml + = self . _add_me ( args , opts )
i = i + 1
2011-01-11 20:02:48 +01:00
elif ai == ' add_group ' :
args = opts . actiondata [ i ]
actionsxml + = self . _add_group ( args , opts )
i = i + 1
2010-05-24 13:28:44 +02:00
elif ai == ' add_role ' :
args = opts . actiondata [ i ]
2011-01-11 20:02:48 +01:00
actionsxml + = self . _add_user ( args , opts )
2010-05-24 13:28:44 +02:00
i = i + 1
elif ai == ' set_bugowner ' :
args = opts . actiondata [ i ]
actionsxml + = self . _set_bugowner ( args , opts )
i = i + 1
else :
raise oscerr . WrongArgs ( ' Unsupported action %s ' % ai )
if actionsxml == " " :
sys . exit ( ' No actions need to be taken. ' )
if not opts . message :
opts . message = edit_message ( )
import cgi
xml = """ <request> %s <state name= " new " /> <description> %s </description> </request> """ % \
( actionsxml , cgi . escape ( opts . message or " " ) )
u = makeurl ( apiurl , [ ' request ' ] , query = ' cmd=create ' )
f = http_POST ( u , data = xml )
root = ET . parse ( f ) . getroot ( )
return root . get ( ' id ' )
2009-06-02 15:14:46 +02:00
2010-08-18 11:42:50 +02:00
@cmdln.option ( ' -m ' , ' --message ' , metavar = ' TEXT ' ,
help = ' specify message TEXT ' )
2010-11-24 16:41:02 +01:00
@cmdln.option ( ' -r ' , ' --role ' , metavar = ' role ' , default = ' maintainer ' ,
help = ' specify user role (default: maintainer) ' )
2010-11-25 22:23:12 +01:00
@cmdln.alias ( " reqmaintainership " )
@cmdln.alias ( " reqms " )
def do_requestmaintainership ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : requests to add user as maintainer
2010-08-18 11:42:50 +02:00
usage :
2010-11-25 22:23:12 +01:00
osc requestmaintainership # for current user in checked out package
osc requestmaintainership USER # for specified user in checked out package
osc requestmaintainership PROJECT PACKAGE # for current user
osc requestmaintainership PROJECT PACKAGE USER # request for specified user
2010-08-18 11:42:50 +02:00
$ { cmd_option_list }
"""
2011-01-25 21:06:28 +01:00
import cgi
2010-08-18 11:42:50 +02:00
args = slash_split ( args )
apiurl = self . get_api_url ( )
2011-01-25 21:06:28 +01:00
if len ( args ) == 2 :
2010-08-18 11:42:50 +02:00
project = args [ 0 ]
package = args [ 1 ]
2010-08-18 12:40:43 +02:00
user = conf . get_apiurl_usr ( apiurl )
2010-08-18 11:42:50 +02:00
elif len ( args ) == 3 :
project = args [ 0 ]
package = args [ 1 ]
2010-08-18 12:40:43 +02:00
user = args [ 2 ]
2011-01-25 21:06:28 +01:00
elif len ( args ) < 2 and is_package_dir ( os . curdir ) :
project = store_read_project ( os . curdir )
package = store_read_package ( os . curdir )
if len ( args ) == 0 :
user = conf . get_apiurl_usr ( apiurl )
else :
user = args [ 0 ]
2010-08-18 11:42:50 +02:00
else :
2010-08-18 11:46:57 +02:00
raise oscerr . WrongArgs ( ' Wrong number of arguments. ' )
2010-08-18 11:42:50 +02:00
2010-11-25 22:23:12 +01:00
if not opts . role in ( ' maintainer ' , ' bugowner ' ) :
raise oscerr . WrongOptions ( ' invalid \' --role \' : either specify \' maintainer \' or \' bugowner \' ' )
2010-08-18 11:42:50 +02:00
if not opts . message :
opts . message = edit_message ( )
2011-01-25 21:06:28 +01:00
r = Request ( )
r . add_action ( ' add_role ' , tgt_project = project , tgt_package = package ,
person_name = user , person_role = opts . role )
r . description = cgi . escape ( opts . message or ' ' )
r . create ( apiurl )
print r . reqid
2010-08-18 11:42:50 +02:00
2009-06-02 16:57:42 +02:00
@cmdln.option ( ' -m ' , ' --message ' , metavar = ' TEXT ' ,
help = ' specify message TEXT ' )
@cmdln.alias ( " dr " )
2010-12-14 15:49:27 +01:00
@cmdln.alias ( " dropreq " )
@cmdln.alias ( " droprequest " )
2009-06-02 16:57:42 +02:00
@cmdln.alias ( " deletereq " )
def do_deleterequest ( self , subcmd , opts , * args ) :
2010-12-14 15:49:27 +01:00
""" $ {cmd_name} : Request to delete (or ' drop ' ) a package or project
2009-06-02 15:14:46 +02:00
2009-06-02 16:57:42 +02:00
usage :
2011-01-21 11:04:47 +01:00
osc deletereq [ - m TEXT ] # works in checked out project/package
2009-06-02 16:57:42 +02:00
osc deletereq [ - m TEXT ] PROJECT [ PACKAGE ]
$ { cmd_option_list }
"""
2011-01-25 20:41:42 +01:00
import cgi
2009-06-02 15:14:46 +02:00
2009-06-02 16:57:42 +02:00
args = slash_split ( args )
2009-06-02 15:14:46 +02:00
2010-07-06 14:16:24 +02:00
project = None
package = None
2011-01-25 20:41:42 +01:00
if len ( args ) > 2 :
raise oscerr . WrongArgs ( ' Too many arguments. ' )
2010-07-06 14:16:24 +02:00
elif len ( args ) == 1 :
project = args [ 0 ]
2011-01-25 20:41:42 +01:00
elif len ( args ) == 2 :
2010-07-06 14:16:24 +02:00
project = args [ 0 ]
package = args [ 1 ]
2011-01-25 20:41:42 +01:00
elif is_project_dir ( os . getcwd ( ) ) :
project = store_read_project ( os . curdir )
elif is_package_dir ( os . getcwd ( ) ) :
project = store_read_project ( os . curdir )
package = store_read_package ( os . curdir )
else :
raise oscerr . WrongArgs ( ' Please specify at least a project. ' )
2009-06-23 12:06:31 +02:00
2009-08-19 13:28:16 +02:00
if not opts . message :
2010-07-06 14:16:24 +02:00
import textwrap
if package is not None :
footer = textwrap . TextWrapper ( width = 66 ) . fill (
' please explain why you like to delete package %s of project %s '
% ( package , project ) )
else :
footer = textwrap . TextWrapper ( width = 66 ) . fill (
' please explain why you like to delete project %s ' % project )
opts . message = edit_message ( footer )
2009-08-19 13:28:16 +02:00
2011-01-25 20:41:42 +01:00
r = Request ( )
r . add_action ( ' delete ' , tgt_project = project , tgt_package = package )
r . description = cgi . escape ( opts . message )
r . create ( self . get_api_url ( ) )
print r . reqid
2009-06-02 15:14:46 +02:00
2009-06-02 16:57:42 +02:00
@cmdln.option ( ' -m ' , ' --message ' , metavar = ' TEXT ' ,
help = ' specify message TEXT ' )
@cmdln.alias ( " cr " )
@cmdln.alias ( " changedevelreq " )
def do_changedevelrequest ( self , subcmd , opts , * args ) :
2009-07-23 10:01:31 +02:00
""" $ {cmd_name} : Create request to change the devel package definition.
2009-06-02 15:14:46 +02:00
2010-07-27 15:20:35 +02:00
[ See http : / / en . opensuse . org / openSUSE : Build_Service_Collaboration
2010-07-26 19:45:42 +02:00
for information on this topic . ]
2009-06-02 16:57:42 +02:00
See the " request " command for showing and modifing existing requests .
osc changedevelrequest PROJECT PACKAGE DEVEL_PROJECT [ DEVEL_PACKAGE ]
"""
2011-01-25 20:41:42 +01:00
import cgi
2010-04-30 17:13:21 +02:00
2011-03-09 16:10:48 +01:00
if len ( args ) == 0 and is_package_dir ( ' . ' ) and find_default_project ( ) :
2010-02-11 11:26:03 +01:00
wd = os . curdir
2010-02-24 11:41:59 +01:00
devel_project = store_read_project ( wd )
devel_package = package = store_read_package ( wd )
2011-03-09 16:10:48 +01:00
project = find_default_project ( self . get_api_url ( ) , package )
2011-01-25 20:41:42 +01:00
elif len ( args ) < 3 :
raise oscerr . WrongArgs ( ' Too few arguments. ' )
elif len ( args ) > 4 :
raise oscerr . WrongArgs ( ' Too many arguments. ' )
2010-02-11 11:26:03 +01:00
else :
devel_project = args [ 2 ]
project = args [ 0 ]
package = args [ 1 ]
devel_package = package
2011-01-25 20:41:42 +01:00
if len ( args ) == 4 :
2010-02-11 11:26:03 +01:00
devel_package = args [ 3 ]
2009-08-19 13:28:16 +02:00
if not opts . message :
2010-02-24 11:41:59 +01:00
import textwrap
footer = textwrap . TextWrapper ( width = 66 ) . fill (
' please explain why you like to change the devel project of %s / %s to %s / %s '
% ( project , package , devel_project , devel_package ) )
opts . message = edit_message ( footer )
2009-08-19 13:28:16 +02:00
2011-01-25 20:41:42 +01:00
r = Request ( )
r . add_action ( ' change_devel ' , src_project = devel_project , src_package = devel_package ,
tgt_project = project , tgt_package = package )
r . description = cgi . escape ( opts . message )
r . create ( self . get_api_url ( ) )
print r . reqid
2009-06-02 15:14:46 +02:00
@cmdln.option ( ' -d ' , ' --diff ' , action = ' store_true ' ,
help = ' generate a diff ' )
@cmdln.option ( ' -u ' , ' --unified ' , action = ' store_true ' ,
help = ' output the diff in the unified diff format ' )
@cmdln.option ( ' -m ' , ' --message ' , metavar = ' TEXT ' ,
help = ' specify message TEXT ' )
2009-11-20 17:06:05 +01:00
@cmdln.option ( ' -t ' , ' --type ' , metavar = ' TYPE ' ,
2009-06-19 15:10:33 +02:00
help = ' limit to requests which contain a given action type (submit/delete/change_devel) ' )
2009-08-19 15:00:22 +02:00
@cmdln.option ( ' -a ' , ' --all ' , action = ' store_true ' ,
2009-08-20 21:28:05 +02:00
help = ' all states. Same as \' -s all \' ' )
2011-02-08 16:16:18 +01:00
@cmdln.option ( ' -f ' , ' --force ' , action = ' store_true ' ,
help = ' enforce state change, can be used to ignore open reviews ' )
2011-02-22 19:13:59 +01:00
@cmdln.option ( ' -s ' , ' --state ' , default = ' ' , # default is 'all' if no args given, 'new,review' otherwise
help = ' only list requests in one of the comma separated given states (new/review/accepted/revoked/declined) or " all " [default= " new,review " , or " all " , if no args given] ' )
2009-08-21 02:42:51 +02:00
@cmdln.option ( ' -D ' , ' --days ' , metavar = ' DAYS ' ,
2009-09-28 21:50:57 +02:00
help = ' only list requests in state " new " or changed in the last DAYS. [default= %(request_list_days)s ] ' )
2009-08-20 21:28:05 +02:00
@cmdln.option ( ' -U ' , ' --user ' , metavar = ' USER ' ,
2010-07-29 13:45:44 +02:00
help = ' requests or reviews limited for the specified USER ' )
@cmdln.option ( ' -G ' , ' --group ' , metavar = ' GROUP ' ,
help = ' requests or reviews limited for the specified GROUP ' )
2011-01-23 21:21:32 +01:00
@cmdln.option ( ' -P ' , ' --project ' , metavar = ' PROJECT ' ,
help = ' requests or reviews limited for the specified PROJECT ' )
@cmdln.option ( ' -p ' , ' --package ' , metavar = ' PACKAGE ' ,
help = ' requests or reviews limited for the specified PACKAGE, requires also a PROJECT ' )
2009-06-02 15:14:46 +02:00
@cmdln.option ( ' -b ' , ' --brief ' , action = ' store_true ' , default = False ,
help = ' print output in list view as list subcommand ' )
@cmdln.option ( ' -M ' , ' --mine ' , action = ' store_true ' ,
help = ' only show requests created by yourself ' )
2009-09-28 21:50:57 +02:00
@cmdln.option ( ' -B ' , ' --bugowner ' , action = ' store_true ' ,
help = ' also show requests about packages where I am bugowner ' )
2011-01-30 14:24:21 +01:00
@cmdln.option ( ' -e ' , ' --edit ' , action = ' store_true ' ,
help = ' edit a submit action ' )
2010-02-11 01:47:47 +01:00
@cmdln.option ( ' -i ' , ' --interactive ' , action = ' store_true ' ,
help = ' interactive review of request ' )
2010-03-23 16:21:09 +01:00
@cmdln.option ( ' --non-interactive ' , action = ' store_true ' ,
help = ' non-interactive review of request ' )
2010-02-25 22:56:21 +01:00
@cmdln.option ( ' --exclude-target-project ' , action = ' append ' ,
help = ' exclude target project from request list ' )
2010-03-13 21:06:18 +01:00
@cmdln.option ( ' --involved-projects ' , action = ' store_true ' ,
2010-03-15 13:34:38 +01:00
help = ' show all requests for project/packages where USER is involved ' )
2010-09-14 16:02:21 +02:00
@cmdln.option ( ' --source-buildstatus ' , action = ' store_true ' ,
help = ' print the buildstatus of the source package (only works with " show " ) ' )
2009-06-02 15:14:46 +02:00
@cmdln.alias ( " rq " )
2009-11-17 17:59:17 +01:00
@cmdln.alias ( " review " )
2010-02-26 09:55:58 +01:00
# FIXME: rewrite this mess and split request and review
2009-06-02 15:14:46 +02:00
def do_request ( self , subcmd , opts , * args ) :
2010-02-26 09:55:58 +01:00
""" $ {cmd_name} : Show or modify requests and reviews
2009-06-02 15:14:46 +02:00
2010-07-27 15:20:35 +02:00
[ See http : / / en . opensuse . org / openSUSE : Build_Service_Collaboration
2010-07-26 19:45:42 +02:00
for information on this topic . ]
2009-06-02 15:14:46 +02:00
2010-02-26 09:55:58 +01:00
The ' request ' command has the following sub commands :
2008-03-05 00:41:00 +01:00
2009-08-20 21:28:05 +02:00
" list " lists open requests attached to a project or package or person .
Uses the project / package of the current directory if none of
- M , - U USER , project / package are given .
2008-03-05 00:41:00 +01:00
2008-08-19 16:18:05 +02:00
" log " will show the history of the given ID
2008-03-06 11:25:45 +01:00
" show " will show the request itself , and generate a diff for review , if
2010-01-02 12:25:37 +01:00
used with the - - diff option . The keyword show can be omitted if the ID is numeric .
2008-03-05 00:41:00 +01:00
2010-02-26 09:55:58 +01:00
" decline " will change the request state to " declined "
2008-03-05 00:41:00 +01:00
2010-11-24 14:18:45 +01:00
" reopen " will set the request back to new or review .
2011-02-11 16:12:38 +01:00
" supersede " will supersede one request with another existing one .
2008-07-25 11:34:29 +02:00
2010-02-26 09:55:58 +01:00
" revoke " will set the request state to " revoked "
2008-07-09 17:22:18 +02:00
2008-03-13 00:37:35 +01:00
" accept " will change the request state to " accepted " and will trigger
the actual submit process . That would normally be a server - side copy of
the source package to the target package .
2008-03-05 00:41:00 +01:00
2010-02-26 09:55:58 +01:00
" checkout " will checkout the request ' s source package ( " submit " requests only).
The ' review ' command has the following sub commands :
" list " lists open requests that need to be reviewed by the
specified user or group
" add " adds a person or group as reviewer to a request
" accept " mark the review positive
" decline " mark the review negative . A negative review will
decline the request .
2008-03-13 00:37:35 +01:00
usage :
2009-09-28 21:50:57 +02:00
osc request list [ - M ] [ - U USER ] [ - s state ] [ - D DAYS ] [ - t type ] [ - B ] [ PRJ [ PKG ] ]
2009-06-02 15:14:46 +02:00
osc request log ID
2009-09-03 19:28:27 +02:00
osc request [ show ] [ - d ] [ - b ] ID
2010-08-10 16:36:29 +02:00
2009-06-02 15:14:46 +02:00
osc request accept [ - m TEXT ] ID
osc request decline [ - m TEXT ] ID
osc request revoke [ - m TEXT ] ID
2010-08-10 16:36:29 +02:00
osc request reopen [ - m TEXT ] ID
2011-02-11 16:12:38 +01:00
osc request supersede [ - m TEXT ] ID SUPERSEDE_ID
2010-08-10 16:36:29 +02:00
osc request approvenew [ - m TEXT ] PROJECT
2009-09-16 23:39:45 +02:00
osc request checkout / co ID
2010-08-10 16:36:29 +02:00
osc request clone [ - m TEXT ] ID
2010-07-29 13:45:44 +02:00
osc review list [ - U USER ] [ - G GROUP ] [ - s state ]
2010-10-12 11:09:19 +02:00
osc review add [ - m TEXT ] [ - U USER ] [ - G GROUP ] ID
2009-11-17 17:59:17 +01:00
osc review accept [ - m TEXT ] ID
osc review decline [ - m TEXT ] ID
2010-11-24 14:18:45 +01:00
osc review reopen [ - m TEXT ] ID
2011-02-11 16:12:38 +01:00
osc review supersede [ - m TEXT ] ID SUPERSEDE_ID
2010-08-10 16:36:29 +02:00
2008-03-05 00:41:00 +01:00
$ { cmd_option_list }
"""
args = slash_split ( args )
2009-08-21 23:31:45 +02:00
if opts . all and opts . state :
2010-03-23 16:21:09 +01:00
raise oscerr . WrongOptions ( ' Sorry, the options \' --all \' and \' --state \' ' \
' are mutually exclusive. ' )
2009-08-21 23:31:45 +02:00
if opts . mine and opts . user :
2010-03-23 16:21:09 +01:00
raise oscerr . WrongOptions ( ' Sorry, the options \' --user \' and \' --mine \' ' \
' are mutually exclusive. ' )
if opts . interactive and opts . non_interactive :
raise oscerr . WrongOptions ( ' Sorry, the options \' --interactive \' and ' \
' \' --non-interactive \' are mutually exclusive ' )
2009-08-21 23:31:45 +02:00
2009-08-20 21:28:05 +02:00
if not args :
args = [ ' list ' ]
opts . mine = 1
if opts . state == ' ' :
opts . state = ' all '
if opts . state == ' ' :
2011-02-22 19:13:59 +01:00
opts . state = ' new,review '
2009-08-20 21:28:05 +02:00
2010-08-13 09:42:47 +02:00
if args [ 0 ] == ' help ' :
2010-08-10 16:36:29 +02:00
return self . do_help ( [ ' help ' , ' request ' ] )
2011-02-11 16:12:38 +01:00
cmds = [ ' list ' , ' log ' , ' show ' , ' decline ' , ' reopen ' , ' clone ' , ' accept ' , ' approvenew ' , ' wipe ' , ' supersede ' , ' revoke ' , ' checkout ' , ' co ' ]
2010-08-13 09:51:20 +02:00
if subcmd != ' review ' and args [ 0 ] not in cmds :
2009-09-03 19:28:27 +02:00
raise oscerr . WrongArgs ( ' Unknown request action %s . Choose one of %s . ' \
% ( args [ 0 ] , ' , ' . join ( cmds ) ) )
2011-02-11 16:12:38 +01:00
cmds = [ ' list ' , ' add ' , ' decline ' , ' accept ' , ' reopen ' , ' supersede ' ]
2010-08-13 09:51:20 +02:00
if subcmd == ' review ' and args [ 0 ] not in cmds :
2010-08-10 16:36:29 +02:00
raise oscerr . WrongArgs ( ' Unknown review action %s . Choose one of %s . ' \
% ( args [ 0 ] , ' , ' . join ( cmds ) ) )
2008-03-05 00:41:00 +01:00
cmd = args [ 0 ]
del args [ 0 ]
2010-10-12 10:59:53 +02:00
apiurl = self . get_api_url ( )
2010-05-19 12:29:56 +02:00
if cmd in [ ' list ' ] :
2008-06-24 11:37:49 +02:00
min_args , max_args = 0 , 2
2011-02-11 16:12:38 +01:00
elif cmd in [ ' supersede ' ] :
min_args , max_args = 2 , 2
2008-03-05 00:41:00 +01:00
else :
min_args , max_args = 1 , 1
if len ( args ) < min_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
raise oscerr . WrongArgs ( ' Too few arguments. ' )
2008-03-05 00:41:00 +01:00
if len ( args ) > max_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
raise oscerr . WrongArgs ( ' Too many arguments. ' )
2010-07-30 11:36:17 +02:00
if cmd in [ ' add ' ] and not opts . user and not opts . group :
2010-10-12 10:59:53 +02:00
opts . user = conf . get_apiurl_usr ( apiurl )
2008-06-06 14:04:34 +02:00
2011-02-11 16:12:38 +01:00
reqid = None
supersedid = None
2010-05-19 12:50:52 +02:00
if cmd == ' list ' or cmd == ' approvenew ' :
2008-06-24 11:37:49 +02:00
package = None
project = None
if len ( args ) > 0 :
project = args [ 0 ]
2009-08-21 03:26:37 +02:00
elif not opts . mine and not opts . user :
2009-05-15 17:32:15 +02:00
try :
2009-07-24 21:15:51 +02:00
project = store_read_project ( os . curdir )
2009-05-15 17:32:15 +02:00
package = store_read_package ( os . curdir )
except oscerr . NoWorkingCopy :
pass
2008-06-24 11:37:49 +02:00
2008-03-05 00:41:00 +01:00
if len ( args ) > 1 :
package = args [ 1 ]
2011-02-11 16:12:38 +01:00
elif cmd == ' supersede ' :
reqid = args [ 0 ]
supersedid = args [ 1 ]
2010-08-05 15:54:48 +02:00
elif cmd in [ ' log ' , ' add ' , ' show ' , ' decline ' , ' reopen ' , ' clone ' , ' accept ' , ' wipe ' , ' revoke ' , ' checkout ' , ' co ' ] :
2008-03-05 00:41:00 +01:00
reqid = args [ 0 ]
2010-08-05 15:54:48 +02:00
# clone all packages from a given request
if cmd in [ ' clone ' ] :
2010-10-26 15:34:32 +02:00
# should we force a message?
2011-01-29 23:14:19 +01:00
print ' Cloned packages are available in project: %s ' % clone_request ( apiurl , reqid , opts . message )
2010-08-05 15:54:48 +02:00
2010-07-30 11:36:17 +02:00
# add new reviewer to existing request
2010-08-05 15:54:48 +02:00
elif cmd in [ ' add ' ] and subcmd == ' review ' :
2010-07-30 11:36:17 +02:00
query = { ' cmd ' : ' addreview ' }
if opts . user :
query [ ' by_user ' ] = opts . user
if opts . group :
query [ ' by_group ' ] = opts . group
2011-01-23 21:21:32 +01:00
if opts . project :
query [ ' by_project ' ] = opts . project
if opts . package :
query [ ' by_package ' ] = opts . package
2010-07-30 11:36:17 +02:00
url = makeurl ( apiurl , [ ' request ' , reqid ] , query )
2010-10-12 11:09:19 +02:00
if not opts . message :
opts . message = edit_message ( )
2010-08-05 10:24:00 +02:00
r = http_POST ( url , data = opts . message )
2011-02-22 17:52:12 +01:00
print ET . parse ( r ) . getroot ( ) . get ( ' code ' )
2010-07-30 11:36:17 +02:00
2010-05-19 12:50:52 +02:00
# list and approvenew
2010-07-30 11:36:17 +02:00
elif cmd == ' list ' or cmd == ' approvenew ' :
2010-09-07 17:31:07 +02:00
states = ( ' new ' , ' accepted ' , ' revoked ' , ' declined ' , ' review ' , ' superseded ' )
2009-05-17 15:07:55 +02:00
who = ' '
2010-05-19 12:50:52 +02:00
if cmd == ' approvenew ' :
2010-05-19 12:29:56 +02:00
states = ( ' new ' )
results = get_request_list ( apiurl , project , package , ' ' , [ ' new ' ] )
2010-03-13 21:06:18 +01:00
else :
2010-05-19 12:29:56 +02:00
state_list = opts . state . split ( ' , ' )
2010-07-29 13:45:44 +02:00
if opts . all :
state_list = [ ' all ' ]
if subcmd == ' review ' :
state_list = [ ' review ' ]
elif opts . state == ' all ' :
2010-05-19 12:29:56 +02:00
state_list = [ ' all ' ]
else :
for s in state_list :
2010-09-21 19:59:15 +02:00
if not s in states and not s == ' all ' :
2010-05-19 12:29:56 +02:00
raise oscerr . WrongArgs ( ' Unknown state \' %s \' , try one of %s ' % ( s , ' , ' . join ( states ) ) )
if opts . mine :
who = conf . get_apiurl_usr ( apiurl )
if opts . user :
who = opts . user
## FIXME -B not implemented!
if opts . bugowner :
if ( self . options . debug ) :
print ' list: option --bugowner ignored: not impl. '
2010-07-29 13:45:44 +02:00
if subcmd == ' review ' :
# FIXME: do the review list for the user and for all groups he belong to
2011-01-23 21:21:32 +01:00
results = get_review_list ( apiurl , project , package , who , opts . group , opts . project , opts . package , state_list )
2010-05-19 12:29:56 +02:00
else :
2010-07-29 13:45:44 +02:00
if opts . involved_projects :
who = who or conf . get_apiurl_usr ( apiurl )
results = get_user_projpkgs_request_list ( apiurl , who , req_state = state_list ,
req_type = opts . type , exclude_projects = opts . exclude_target_project or [ ] )
else :
results = get_request_list ( apiurl , project , package , who ,
state_list , opts . type , opts . exclude_target_project or [ ] )
2010-05-19 12:29:56 +02:00
2008-06-27 18:36:36 +02:00
results . sort ( reverse = True )
2009-08-20 21:28:05 +02:00
import time
2009-08-21 02:42:51 +02:00
days = opts . days or conf . config [ ' request_list_days ' ]
since = ' '
2009-10-20 16:30:15 +02:00
try :
2009-08-21 02:42:51 +02:00
days = int ( days )
except ValueError :
days = 0
if days > 0 :
since = time . strftime ( ' % Y- % m- %d T % H: % M: % S ' , time . localtime ( time . time ( ) - days * 24 * 3600 ) )
2008-06-27 18:36:36 +02:00
2009-08-20 21:28:05 +02:00
skipped = 0
## bs has received 2009-09-20 a new xquery compare() function
## which allows us to limit the list inside of get_request_list
## That would be much faster for coolo. But counting the remainder
2009-09-28 21:50:57 +02:00
## would not be possible with current xquery implementation.
## Workaround: fetch all, and filter on client side.
2009-09-03 13:25:12 +02:00
## FIXME: date filtering should become implemented on server side
2008-03-05 00:41:00 +01:00
for result in results :
2009-09-28 21:50:57 +02:00
if days == 0 or result . state . when > since or result . state . name == ' new ' :
2010-09-17 21:03:52 +02:00
if ( opts . interactive or conf . config [ ' request_show_interactive ' ] ) and not opts . non_interactive :
2010-09-17 23:03:29 +02:00
request_interactive_review ( apiurl , result )
2010-09-17 21:03:52 +02:00
else :
2010-12-30 03:10:27 +01:00
print result . list_view ( ) , ' \n '
2009-08-20 21:28:05 +02:00
else :
skipped + = 1
if skipped :
2009-08-21 02:42:51 +02:00
print " There are %d requests older than %s days. \n " % ( skipped , days )
2008-03-05 00:41:00 +01:00
2010-05-19 12:50:52 +02:00
if cmd == ' approvenew ' :
2010-05-19 12:29:56 +02:00
print " \n *** Approve them all ? [y/n] *** "
if sys . stdin . read ( 1 ) == " y " :
2010-06-29 15:32:53 +02:00
2010-05-19 12:29:56 +02:00
if not opts . message :
opts . message = edit_message ( )
for result in results :
print result . reqid , " : " ,
2010-07-29 17:29:07 +02:00
r = change_request_state ( apiurl ,
2011-02-08 16:16:18 +01:00
result . reqid , ' accepted ' , opts . message or ' ' , force = opts . force )
2010-08-18 16:17:34 +02:00
print ' Result of change request state: %s ' % r
2010-05-19 12:29:56 +02:00
else :
print >> sys . stderr , ' Aborted... '
raise oscerr . UserAbort ( )
2008-08-19 16:18:05 +02:00
elif cmd == ' log ' :
2010-07-29 17:29:07 +02:00
for l in get_request_log ( apiurl , reqid ) :
2008-08-19 16:18:05 +02:00
print l
2008-03-05 00:41:00 +01:00
# show
elif cmd == ' show ' :
2010-08-03 09:34:33 +02:00
r = get_request ( apiurl , reqid )
2009-04-22 13:02:32 +02:00
if opts . brief :
print r . list_view ( )
2011-01-30 14:24:21 +01:00
elif opts . edit :
if not r . get_actions ( ' submit ' ) :
raise oscerr . WrongOptions ( ' \' --edit \' not possible ' \
' (request has no \' submit \' action) ' )
return request_interactive_review ( apiurl , r , ' e ' )
2010-03-23 16:21:09 +01:00
elif ( opts . interactive or conf . config [ ' request_show_interactive ' ] ) and not opts . non_interactive :
2010-07-29 17:29:07 +02:00
return request_interactive_review ( apiurl , r )
2009-04-22 13:02:32 +02:00
else :
print r
2010-09-14 16:02:21 +02:00
if opts . source_buildstatus :
2011-01-29 18:47:26 +01:00
sr_actions = r . get_actions ( ' submit ' )
if not sr_actions :
raise oscerr . WrongOptions ( ' \' --source-buildstatus \' not possible ' \
' (request has no \' submit \' actions) ' )
for action in sr_actions :
print ' Buildstatus for \' %s / %s \' : ' % ( action . src_project , action . src_package )
print ' \n ' . join ( get_results ( apiurl , action . src_project , action . src_package ) )
2011-01-29 17:24:45 +01:00
if opts . diff :
diff = ' '
2008-03-20 21:11:30 +01:00
try :
2010-09-02 10:29:28 +02:00
# works since OBS 2.1
2011-01-29 17:24:45 +01:00
diff = request_diff ( apiurl , reqid )
2008-03-20 21:11:30 +01:00
except urllib2 . HTTPError , e :
2010-09-02 10:29:28 +02:00
# for OBS 2.0 and before
2011-01-29 17:47:28 +01:00
sr_actions = r . get_actions ( ' submit ' )
2011-01-29 17:24:45 +01:00
if not sr_actions :
raise oscerr . WrongOptions ( ' \' --diff \' not possible (request has no \' submit \' actions) ' )
for action in sr_actions :
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 '
run_pager ( diff )
2008-03-05 00:41:00 +01:00
2009-09-16 23:39:45 +02:00
# checkout
elif cmd == ' checkout ' or cmd == ' co ' :
2010-07-29 17:29:07 +02:00
r = get_request ( apiurl , reqid )
2011-01-29 18:47:26 +01:00
sr_actions = r . get_actions ( ' submit ' )
if not sr_actions :
raise oscerr . WrongArgs ( ' \' checkout \' not possible (request has no \' submit \' actions) ' )
for action in sr_actions :
checkout_package ( apiurl , action . src_project , action . src_package , \
action . src_rev , expand_link = True , prj_dir = action . src_project )
2008-03-05 00:41:00 +01:00
2009-08-19 13:28:16 +02:00
else :
2011-02-11 16:12:38 +01:00
state_map = { ' reopen ' : ' new ' , ' accept ' : ' accepted ' , ' decline ' : ' declined ' , ' wipe ' : ' deleted ' , ' revoke ' : ' revoked ' , ' supersede ' : ' superseded ' }
2009-11-17 17:59:17 +01:00
# Change review state only
if subcmd == ' review ' :
2010-08-18 17:58:42 +02:00
if not opts . message :
opts . message = edit_message ( )
2011-02-11 16:12:38 +01:00
if cmd in [ ' accept ' , ' decline ' , ' reopen ' , ' supersede ' ] :
2010-07-29 17:29:07 +02:00
r = change_review_state ( apiurl ,
2011-02-11 16:12:38 +01:00
reqid , state_map [ cmd ] , conf . get_apiurl_usr ( apiurl ) , opts . group , opts . project , opts . package , opts . message or ' ' , supersed = supersedid )
2010-08-18 16:20:24 +02:00
print r
2009-11-17 17:59:17 +01:00
# Change state of entire request
2011-02-11 16:12:38 +01:00
elif cmd in [ ' reopen ' , ' accept ' , ' decline ' , ' wipe ' , ' revoke ' , ' supersede ' ] :
2010-08-18 17:58:42 +02:00
rq = get_request ( apiurl , reqid )
if rq . state . name == state_map [ cmd ] :
repl = raw_input ( " \n *** The state of the request (# %s ) is already ' %s ' . Change state anyway? [y/n] *** " % ( reqid , rq . state . name ) )
if repl . lower ( ) != ' y ' :
print >> sys . stderr , ' Aborted... '
raise oscerr . UserAbort ( )
if not opts . message :
2010-11-14 18:32:02 +01:00
tmpl = change_request_state_template ( rq , state_map [ cmd ] )
opts . message = edit_message ( template = tmpl )
2010-07-29 17:29:07 +02:00
r = change_request_state ( apiurl ,
2011-02-11 16:12:38 +01:00
reqid , state_map [ cmd ] , opts . message or ' ' , supersed = supersedid , force = opts . force )
2010-08-18 16:17:34 +02:00
print ' Result of change request state: %s ' % r
2008-03-05 00:41:00 +01:00
2007-07-16 18:20:09 +02:00
# editmeta and its aliases are all depracated
@cmdln.alias ( " editprj " )
@cmdln.alias ( " createprj " )
@cmdln.alias ( " editpac " )
@cmdln.alias ( " createpac " )
@cmdln.alias ( " edituser " )
@cmdln.alias ( " usermeta " )
2009-06-02 15:14:46 +02:00
@cmdln.hide ( 1 )
2007-07-16 18:20:09 +02:00
def do_editmeta ( self , subcmd , opts , * args ) :
2009-05-18 16:50:43 +02:00
""" $ {cmd_name} :
2007-07-16 18:20:09 +02:00
Obsolete command to edit metadata . Use ' meta ' now .
See the help output of ' meta ' .
2007-07-13 18:01:02 +02:00
2007-07-16 18:20:09 +02:00
"""
2007-07-13 18:01:02 +02:00
2007-07-16 18:20:09 +02:00
print >> sys . stderr , ' This command is obsolete. Use \' osc meta <metatype> ... \' . '
print >> sys . stderr , ' See \' osc help meta \' . '
#self.do_help([None, 'meta'])
return 2
2007-07-13 18:01:02 +02:00
2009-04-09 10:21:12 +02:00
@cmdln.option ( ' -r ' , ' --revision ' , metavar = ' rev ' ,
help = ' use the specified revision. ' )
2010-09-07 12:14:13 +02:00
@cmdln.option ( ' -R ' , ' --use-plain-revision ' , action = ' store_true ' ,
help = ' Don \' t expand revsion based on baserev, the revision which was used when commit happened. ' )
2010-09-07 15:03:01 +02:00
@cmdln.option ( ' -b ' , ' --use-baserev ' , action = ' store_true ' ,
help = ' Use the revisions which exists when the original commit happend and don \' t try to merge later commits. ' )
2009-06-18 11:18:17 +02:00
@cmdln.option ( ' -u ' , ' --unset ' , action = ' store_true ' ,
help = ' remove revision in link, it will point always to latest revision ' )
2009-04-09 10:21:12 +02:00
def do_setlinkrev ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Updates a revision number in a source link.
2009-05-18 16:50:43 +02:00
2009-04-09 10:21:12 +02:00
This command adds or updates a specified revision number in a source link .
The current revision of the source is used , if no revision number is specified .
2009-05-18 16:50:43 +02:00
usage :
2009-04-09 10:21:12 +02:00
osc setlinkrev
2009-06-18 11:18:17 +02:00
osc setlinkrev PROJECT [ PACKAGE ]
2009-04-09 10:21:12 +02:00
$ { cmd_option_list }
"""
args = slash_split ( args )
2010-07-29 17:29:07 +02:00
apiurl = self . get_api_url ( )
2009-06-18 11:18:17 +02:00
package = None
2011-03-21 16:57:22 +01:00
expand = True
2011-02-22 17:43:05 +01:00
baserev = False
if opts . use_plain_revision :
2011-03-21 16:57:22 +01:00
expand = False
2011-02-22 17:43:05 +01:00
if opts . use_baserev :
baserev = True
rev = parseRevisionOption ( opts . revision ) [ 0 ] or ' '
if opts . unset :
rev = None
2010-02-09 00:08:21 +01:00
if len ( args ) == 0 :
2009-04-09 10:21:12 +02:00
p = findpacs ( os . curdir ) [ 0 ]
project = p . prjname
package = p . name
2009-04-09 13:44:32 +02:00
apiurl = p . apiurl
if not p . islink ( ) :
2009-04-16 10:13:55 +02:00
sys . exit ( ' Local directory is no checked out source link package, aborting ' )
2009-04-09 10:21:12 +02:00
elif len ( args ) == 2 :
project = args [ 0 ]
package = args [ 1 ]
2009-06-18 11:18:17 +02:00
elif len ( args ) == 1 :
project = args [ 0 ]
2009-04-09 10:21:12 +02:00
else :
raise oscerr . WrongArgs ( ' Incorrect number of arguments. \n \n ' \
+ self . get_cmd_help ( ' setlinkrev ' ) )
2009-06-18 11:18:17 +02:00
if package :
2011-02-22 17:43:05 +01:00
packages = [ package ]
2009-06-18 11:18:17 +02:00
else :
packages = meta_get_packagelist ( apiurl , project )
for p in packages :
2011-02-22 17:43:05 +01:00
print ' setting revision for package %s ' % p
2011-03-21 16:57:22 +01:00
set_link_rev ( apiurl , project , p , revision = rev , expand = expand , baserev = baserev )
2009-04-09 10:21:12 +02:00
2010-01-11 16:36:33 +01:00
def do_linktobranch ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Convert a package containing a classic link with patch to a branch
This command tells the server to convert a _link with or without a project . diff
to a branch . This is a full copy with a _link file pointing to the branched place .
usage :
2010-01-14 12:24:48 +01:00
osc linktobranch # can be used in checked out package
osc linktobranch PROJECT PACKAGE
2010-01-11 16:36:33 +01:00
$ { cmd_option_list }
"""
args = slash_split ( args )
2010-04-30 17:13:21 +02:00
apiurl = self . get_api_url ( )
2010-01-14 12:24:48 +01:00
if len ( args ) == 0 :
wd = os . curdir
project = store_read_project ( wd )
package = store_read_package ( wd )
2010-01-14 20:25:14 +01:00
update_local_dir = True
2010-01-14 12:24:48 +01:00
elif len ( args ) < 2 :
raise oscerr . WrongArgs ( ' Too few arguments (required none or two) ' )
elif len ( args ) > 2 :
raise oscerr . WrongArgs ( ' Too many arguments (required none or two) ' )
else :
project = args [ 0 ]
package = args [ 1 ]
2010-01-14 20:25:14 +01:00
update_local_dir = False
2010-01-11 16:36:33 +01:00
2010-01-14 12:24:48 +01:00
# execute
link_to_branch ( apiurl , project , package )
2010-01-14 20:25:14 +01:00
if update_local_dir :
2010-02-18 14:14:31 +01:00
pac = Package ( wd )
pac . update ( rev = pac . latest_rev ( ) )
2010-01-11 16:36:33 +01:00
2011-02-11 17:38:59 +01:00
@cmdln.option ( ' -m ' , ' --message ' , metavar = ' TEXT ' ,
help = ' specify message TEXT ' )
2011-02-11 17:11:44 +01:00
def do_detachbranch ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : replace a link with its expanded sources
If a package is a link it is replaced with its expanded sources . The link
does not exist anymore .
usage :
osc detachbranch # can be used in package working copy
osc detachbranch PROJECT PACKAGE
$ { cmd_option_list }
"""
args = slash_split ( args )
apiurl = self . get_api_url ( )
if len ( args ) == 0 :
project = store_read_project ( os . curdir )
package = store_read_package ( os . curdir )
elif len ( args ) == 2 :
project , package = args
elif len ( args ) > 2 :
raise oscerr . WrongArgs ( ' Too many arguments (required none or two) ' )
else :
raise oscerr . WrongArgs ( ' Too few arguments (required none or two) ' )
try :
2011-02-11 17:38:59 +01:00
copy_pac ( apiurl , project , package , apiurl , project , package , expand = True , comment = opts . message )
2011-02-11 17:11:44 +01:00
except urllib2 . HTTPError , e :
root = ET . fromstring ( show_files_meta ( apiurl , project , package , ' latest ' , expand = False ) )
li = Linkinfo ( )
li . read ( root . find ( ' linkinfo ' ) )
if li . islink ( ) and li . haserror ( ) :
raise oscerr . LinkExpandError ( project , package , li . error )
2011-02-11 17:38:59 +01:00
elif not li . islink ( ) :
print >> sys . stderr , ' package \' %s / %s \' is no link ' % ( project , package )
else :
raise e
2011-02-11 17:11:44 +01:00
2009-05-13 09:59:01 +02:00
@cmdln.option ( ' -C ' , ' --cicount ' , choices = [ ' add ' , ' copy ' , ' local ' ] ,
help = ' cicount attribute in the link, known values are add, copy, and local, default in buildservice is currently add. ' )
2009-06-18 11:18:17 +02:00
@cmdln.option ( ' -c ' , ' --current ' , action = ' store_true ' ,
help = ' link fixed against current revision. ' )
2008-06-26 12:47:58 +02:00
@cmdln.option ( ' -r ' , ' --revision ' , metavar = ' rev ' ,
help = ' link the specified revision. ' )
2009-06-15 17:19:16 +02:00
@cmdln.option ( ' -f ' , ' --force ' , action = ' store_true ' ,
help = ' overwrite an existing link file if it is there. ' )
2009-12-21 14:24:33 +01:00
@cmdln.option ( ' -d ' , ' --disable-publish ' , action = ' store_true ' ,
help = ' disable publishing of the linked package ' )
2007-04-25 01:00:12 +02:00
def do_linkpac ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : " Link " a package to another package
2009-05-18 16:50:43 +02:00
2007-04-25 01:00:12 +02:00
A linked package is a clone of another package , but plus local
modifications . It can be cross - project .
2006-08-07 12:08:54 +02:00
2007-04-25 01:00:12 +02:00
The DESTPAC name is optional ; the source packages ' name will be used if
DESTPAC is omitted .
2006-08-07 12:08:54 +02:00
2007-04-25 01:00:12 +02:00
Afterwards , you will want to ' checkout DESTPRJ DESTPAC ' .
2006-08-07 12:08:54 +02:00
2007-04-25 01:00:12 +02:00
To add a patch , add the patch as file and add it to the _link file .
You can also specify text which will be inserted at the top of the spec file .
2006-08-07 12:08:54 +02:00
2007-04-25 01:00:12 +02:00
See the examples in the _link file .
2006-08-07 12:08:54 +02:00
2010-07-21 09:46:54 +02:00
NOTE : In case you are not aware about the difference of ' linkpac ' and ' branch ' command
you should use the ' branch ' command by default .
2009-05-18 16:50:43 +02:00
usage :
2007-04-25 01:00:12 +02:00
osc linkpac SOURCEPRJ SOURCEPAC DESTPRJ [ DESTPAC ]
$ { cmd_option_list }
"""
2006-08-07 12:08:54 +02:00
2007-06-26 15:17:38 +02:00
args = slash_split ( args )
2010-07-29 17:29:07 +02:00
apiurl = self . get_api_url ( )
2007-06-26 15:17:38 +02:00
2007-04-25 01:00:12 +02:00
if not args or len ( args ) < 3 :
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 . WrongArgs ( ' Incorrect number of arguments. \n \n ' \
+ self . get_cmd_help ( ' linkpac ' ) )
2006-08-07 12:08:54 +02:00
2008-06-26 12:47:58 +02:00
rev , dummy = parseRevisionOption ( opts . revision )
2007-04-25 01:00:12 +02:00
src_project = args [ 0 ]
src_package = args [ 1 ]
dst_project = args [ 2 ]
if len ( args ) > 3 :
dst_package = args [ 3 ]
else :
dst_package = src_package
2006-09-21 16:33:24 +02:00
2007-04-25 01:00:12 +02:00
if src_project == dst_project and src_package == dst_package :
2010-01-09 14:25:41 +01:00
raise oscerr . WrongArgs ( ' Error: source and destination are the same. ' )
2008-06-26 12:47:58 +02:00
2009-11-02 22:02:58 +01:00
if src_project == dst_project and not opts . cicount :
# in this case, the user usually wants to build different spec
# files from the same source
opts . cicount = " copy "
2009-04-08 13:48:34 +02:00
if opts . current :
2010-07-29 17:29:07 +02:00
rev = show_upstream_rev ( apiurl , src_project , src_package )
2009-04-08 13:48:34 +02:00
2008-06-26 12:47:58 +02:00
if rev and not checkRevision ( src_project , src_package , rev ) :
print >> sys . stderr , ' Revision \' %s \' does not exist ' % rev
sys . exit ( 1 )
2009-12-21 14:24:33 +01:00
link_pac ( src_project , src_package , dst_project , dst_package , opts . force , rev , opts . cicount , opts . disable_publish )
2006-09-21 16:33:24 +02:00
2010-07-20 14:48:27 +02:00
@cmdln.option ( ' --nosources ' , action = ' store_true ' ,
help = ' ignore source packages when copying build results to destination project ' )
2009-07-31 16:31:20 +02:00
@cmdln.option ( ' -m ' , ' --map-repo ' , metavar = ' SRC=TARGET[,SRC=TARGET] ' ,
help = ' Allows repository mapping(s) to be given as SRC=TARGET[,SRC=TARGET] ' )
2009-12-21 14:24:33 +01:00
@cmdln.option ( ' -d ' , ' --disable-publish ' , action = ' store_true ' ,
help = ' disable publishing of the aggregated package ' )
2007-10-30 14:45:54 +01:00
def do_aggregatepac ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : " Aggregate " a package to another package
2009-05-18 16:50:43 +02:00
2008-07-17 19:46:21 +02:00
Aggregation of a package means that the build results ( binaries ) of a
package are basically copied into another project .
This can be used to make packages available from building that are
needed in a project but available only in a different project . Note
2009-05-18 16:50:43 +02:00
that this is done at the expense of disk space . See
2010-12-03 12:39:18 +01:00
http : / / en . opensuse . org / openSUSE : Build_Service_Tips_and_Tricks #link_and_aggregate
2008-07-17 19:46:21 +02:00
for more information .
2007-10-30 14:45:54 +01:00
The DESTPAC name is optional ; the source packages ' name will be used if
DESTPAC is omitted .
2009-05-18 16:50:43 +02:00
usage :
2007-10-30 14:45:54 +01:00
osc aggregatepac SOURCEPRJ SOURCEPAC DESTPRJ [ DESTPAC ]
$ { cmd_option_list }
"""
args = slash_split ( args )
if not args or len ( args ) < 3 :
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 . WrongArgs ( ' Incorrect number of arguments. \n \n ' \
+ self . get_cmd_help ( ' aggregatepac ' ) )
2007-10-30 14:45:54 +01:00
src_project = args [ 0 ]
src_package = args [ 1 ]
dst_project = args [ 2 ]
if len ( args ) > 3 :
dst_package = args [ 3 ]
else :
dst_package = src_package
if src_project == dst_project and src_package == dst_package :
2010-01-09 14:25:41 +01:00
raise oscerr . WrongArgs ( ' Error: source and destination are the same. ' )
2009-07-31 16:31:20 +02:00
repo_map = { }
if opts . map_repo :
for pair in opts . map_repo . split ( ' , ' ) :
src_tgt = pair . split ( ' = ' )
if len ( src_tgt ) != 2 :
2010-01-09 14:25:41 +01:00
raise oscerr . WrongOptions ( ' map " %s " must be SRC=TARGET[,SRC=TARGET] ' % opts . map_repo )
2009-07-31 16:31:20 +02:00
repo_map [ src_tgt [ 0 ] ] = src_tgt [ 1 ]
2010-07-20 14:48:27 +02:00
aggregate_pac ( src_project , src_package , dst_project , dst_package , repo_map , opts . disable_publish , opts . nosources )
2006-09-21 16:33:24 +02:00
2008-05-21 17:49:00 +02:00
2008-04-02 16:36:23 +02:00
@cmdln.option ( ' -c ' , ' --client-side-copy ' , action = ' store_true ' ,
help = ' do a (slower) client-side copy ' )
2008-04-30 14:28:25 +02:00
@cmdln.option ( ' -k ' , ' --keep-maintainers ' , action = ' store_true ' ,
help = ' keep original maintainers. Default is remove all and replace with the one calling the script. ' )
2009-03-11 16:23:23 +01:00
@cmdln.option ( ' -d ' , ' --keep-develproject ' , action = ' store_true ' ,
help = ' keep develproject tag in the package metadata ' )
2009-05-14 13:50:53 +02:00
@cmdln.option ( ' -r ' , ' --revision ' , metavar = ' rev ' ,
2009-08-20 21:28:05 +02:00
help = ' link the specified revision. ' )
2007-05-04 23:51:54 +02:00
@cmdln.option ( ' -t ' , ' --to-apiurl ' , metavar = ' URL ' ,
help = ' URL of destination api server. Default is the source api server. ' )
2009-05-14 13:50:53 +02:00
@cmdln.option ( ' -m ' , ' --message ' , metavar = ' TEXT ' ,
help = ' specify message TEXT ' )
2009-03-31 00:17:18 +02:00
@cmdln.option ( ' -e ' , ' --expand ' , action = ' store_true ' ,
help = ' if the source package is a link then copy the expanded version of the link ' )
2007-04-25 01:00:12 +02:00
def do_copypac ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Copy a package
2006-09-21 16:33:24 +02:00
2009-05-18 16:50:43 +02:00
A way to copy package to somewhere else .
2008-04-02 16:36:23 +02:00
It can be done across buildservice instances , if the - t option is used .
2010-08-11 22:42:16 +02:00
In that case , a client - side copy and link expansion are implied .
2008-04-02 16:36:23 +02:00
Using - - client - side - copy always involves downloading all files , and
uploading them to the target .
2006-09-21 16:33:24 +02:00
2007-04-25 01:00:12 +02:00
The DESTPAC name is optional ; the source packages ' name will be used if
DESTPAC is omitted .
2006-09-21 16:33:24 +02:00
2009-05-18 16:50:43 +02:00
usage :
2007-04-25 01:00:12 +02:00
osc copypac SOURCEPRJ SOURCEPAC DESTPRJ [ DESTPAC ]
$ { cmd_option_list }
"""
2006-09-21 16:33:24 +02:00
2007-06-26 15:17:38 +02:00
args = slash_split ( args )
2007-04-25 01:00:12 +02:00
if not args or len ( args ) < 3 :
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 . WrongArgs ( ' Incorrect number of arguments. \n \n ' \
+ self . get_cmd_help ( ' copypac ' ) )
2006-09-21 16:33:24 +02:00
2007-04-25 01:00:12 +02:00
src_project = args [ 0 ]
src_package = args [ 1 ]
dst_project = args [ 2 ]
if len ( args ) > 3 :
dst_package = args [ 3 ]
else :
dst_package = src_package
2006-09-21 16:33:24 +02:00
2007-05-04 23:51:54 +02:00
src_apiurl = conf . config [ ' apiurl ' ]
if opts . to_apiurl :
2009-12-15 17:24:25 +01:00
dst_apiurl = conf . config [ ' apiurl_aliases ' ] . get ( opts . to_apiurl , opts . to_apiurl )
2007-05-04 23:51:54 +02:00
else :
dst_apiurl = src_apiurl
2008-04-02 16:36:23 +02:00
if src_apiurl != dst_apiurl :
opts . client_side_copy = True
2010-08-11 22:42:16 +02:00
opts . expand = True
2008-03-17 22:46:42 +01:00
2009-05-14 13:50:53 +02:00
rev , dummy = parseRevisionOption ( opts . revision )
if opts . message :
2009-07-15 20:53:47 +02:00
comment = opts . message
else :
2009-08-20 21:28:05 +02:00
if not rev :
2009-10-20 16:30:15 +02:00
rev = show_upstream_rev ( src_apiurl , src_project , src_package )
2009-07-15 20:53:47 +02:00
comment = ' osc copypac from project: %s package: %s revision: %s ' % ( src_project , src_package , rev )
2009-05-14 13:50:53 +02:00
2010-05-08 08:03:56 +02:00
if src_project == dst_project and \
src_package == dst_package and \
not rev and \
src_apiurl == dst_apiurl :
raise oscerr . WrongArgs ( ' Source and destination are the same. ' )
2009-05-18 16:50:43 +02:00
r = 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 = opts . client_side_copy ,
2009-03-11 16:23:23 +01:00
keep_maintainers = opts . keep_maintainers ,
2009-03-31 00:17:18 +02:00
keep_develproject = opts . keep_develproject ,
2009-05-14 13:50:53 +02:00
expand = opts . expand ,
revision = rev ,
comment = comment )
2008-03-17 22:46:42 +01:00
print r
2006-08-11 12:37:29 +02:00
2011-03-07 19:45:44 +01:00
@cmdln.option ( ' -m ' , ' --message ' , metavar = ' TEXT ' ,
help = ' specify message TEXT ' )
def do_releaserequest ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Create a request for releasing a maintenance update.
[ See http : / / doc . opensuse . org / products / draft / OBS / obs - reference - guide / cha . obs . maintenance_setup . html
for information on this topic . ]
This command is used by the maintence team to start the release process of a maintenance update .
This includes usually testing based on the defined reviewers of the update project .
usage :
osc releaserequest [ SOURCEPROJECT ]
$ { cmd_option_list }
"""
# FIXME: additional parameters can be a certain repo list to create a partitial release
args = slash_split ( args )
apiurl = self . get_api_url ( )
source_project = None
if len ( args ) > 1 :
raise oscerr . WrongArgs ( ' Too many arguments. ' )
if len ( args ) == 0 and is_project_dir ( os . curdir ) :
source_project = store_read_project ( os . curdir )
elif len ( args ) == 0 :
raise oscerr . WrongArgs ( ' Too few arguments. ' )
if len ( args ) > 0 :
source_project = args [ 0 ]
if not opts . message :
opts . message = edit_message ( )
r = create_release_request ( apiurl , source_project , opts . message )
print r . reqid
2011-03-07 11:46:51 +01:00
@cmdln.option ( ' -a ' , ' --attribute ' , metavar = ' ATTRIBUTE ' ,
2011-03-11 11:07:35 +01:00
help = ' Use this attribute to find default maintenance project (default is OBS:MaintenanceProject) ' )
2011-03-07 11:46:51 +01:00
@cmdln.option ( ' -m ' , ' --message ' , metavar = ' TEXT ' ,
help = ' specify message TEXT ' )
def do_maintenancerequest ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Create a request for starting a maintenance incident.
[ See http : / / doc . opensuse . org / products / draft / OBS / obs - reference - guide / cha . obs . maintenance_setup . html
for information on this topic . ]
This command is asking the maintence team to start a maintence incident based on a
created maintenance update . Please see the " mbranch " command on how to create such a project and
the " patchinfo " command how add the required maintenance update informations .
usage :
osc maintenancerequest [ SOURCEPROJECT [ TARGETPROJECT ] ]
$ { cmd_option_list }
"""
args = slash_split ( args )
apiurl = self . get_api_url ( )
2011-03-11 11:07:35 +01:00
attribute = " OBS:MaintenanceProject " # default attribute as defined in api code.
2011-03-07 11:46:51 +01:00
if opts . attribute :
attribute = opts . attribute
source_project = target_project = None
if len ( args ) > 2 :
raise oscerr . WrongArgs ( ' Too many arguments. ' )
2011-03-07 13:08:34 +01:00
if len ( args ) == 0 and is_project_dir ( os . curdir ) :
source_project = store_read_project ( os . curdir )
elif len ( args ) == 0 :
raise oscerr . WrongArgs ( ' Too few arguments. ' )
2011-03-07 11:46:51 +01:00
if len ( args ) > 0 :
source_project = args [ 0 ]
2011-03-07 13:08:34 +01:00
2011-03-07 11:46:51 +01:00
if len ( args ) > 1 :
target_project = args [ 1 ]
else :
2011-03-07 13:08:34 +01:00
xpath = ' attribute/@name = \' %s \' ' % attribute
res = search ( apiurl , project_id = xpath )
root = res [ ' project_id ' ]
project = root . find ( ' project ' )
if project is None :
2011-03-11 11:07:35 +01:00
sys . exit ( ' Unable to find defined OBS:MaintenanceProject project on server. ' )
2011-03-07 13:08:34 +01:00
target_project = project . get ( ' name ' )
print ' Using target project \' %s \' ' % target_project
2011-03-07 11:46:51 +01:00
if not opts . message :
opts . message = edit_message ( )
2011-03-07 13:08:34 +01:00
r = create_maintenance_request ( apiurl , source_project , target_project , opts . message )
print r . reqid
2011-03-07 11:46:51 +01:00
2009-11-02 09:32:15 +01:00
@cmdln.option ( ' -c ' , ' --checkout ' , action = ' store_true ' ,
help = ' Checkout branched package afterwards ' \
' ( \' osc bco \' is a shorthand for this option) ' )
@cmdln.option ( ' -a ' , ' --attribute ' , metavar = ' ATTRIBUTE ' ,
help = ' Use this attribute to find affected packages (default is OBS:Maintained) ' )
@cmdln.option ( ' -u ' , ' --update-project-attribute ' , metavar = ' UPDATE_ATTRIBUTE ' ,
help = ' Use this attribute to find update projects (default is OBS:UpdateProject) ' )
def do_mbranch ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Multiple branch of a package
2010-07-27 15:20:35 +02:00
[ See http : / / en . opensuse . org / openSUSE : Build_Service_Concept_Maintenance
2010-07-26 19:45:42 +02:00
for information on this topic . ]
2009-11-02 09:32:15 +01:00
This command is used for creating multiple links of defined version of a package
in one project . This is esp . used for maintenance updates .
The branched package will live in
home : USERNAME : branches : ATTRIBUTE : PACKAGE
if nothing else specified .
usage :
osc mbranch [ SOURCEPACKAGE [ TARGETPROJECT ] ]
$ { cmd_option_list }
"""
args = slash_split ( args )
2010-07-29 17:29:07 +02:00
apiurl = self . get_api_url ( )
2009-11-02 09:32:15 +01:00
tproject = None
maintained_attribute = conf . config [ ' maintained_attribute ' ]
maintained_update_project_attribute = conf . config [ ' maintained_update_project_attribute ' ]
2010-02-09 00:08:21 +01:00
if not len ( args ) or len ( args ) > 2 :
2009-11-02 09:32:15 +01:00
raise oscerr . WrongArgs ( ' Wrong number of arguments. ' )
if len ( args ) > = 1 :
package = args [ 0 ]
if len ( args ) > = 2 :
tproject = args [ 1 ]
2010-07-29 17:29:07 +02:00
r = attribute_branch_pkg ( apiurl , maintained_attribute , maintained_update_project_attribute , \
2009-11-02 09:32:15 +01:00
package , tproject )
if r is None :
2010-02-28 02:30:13 +01:00
print >> sys . stderr , ' ERROR: Attribute branch call came not back with a project. '
2009-11-02 09:32:15 +01:00
sys . exit ( 1 )
print " Project " + r + " created. "
if opts . checkout :
2010-10-09 16:26:55 +02:00
Project . init_project ( apiurl , r , r , conf . config [ ' do_package_tracking ' ] )
2009-11-02 09:32:15 +01:00
print statfrmt ( ' A ' , r )
# all packages
2010-07-29 17:29:07 +02:00
for package in meta_get_packagelist ( apiurl , r ) :
2009-11-02 09:32:15 +01:00
try :
2010-07-29 17:29:07 +02:00
checkout_package ( apiurl , r , package , expand_link = True , prj_dir = r )
2009-11-02 09:32:15 +01:00
except :
print >> sys . stderr , ' Error while checkout package: \n ' , package
if conf . config [ ' verbose ' ] :
print ' Note: You can use " osc delete " or " osc submitpac " when done. \n '
2009-08-20 21:28:05 +02:00
@cmdln.alias ( ' branchco ' )
@cmdln.alias ( ' bco ' )
@cmdln.alias ( ' getpac ' )
2008-06-03 15:16:55 +02:00
@cmdln.option ( ' --nodevelproject ' , action = ' store_true ' ,
help = ' do not follow a defined devel project ' \
' (primary project where a package is developed) ' )
2009-04-17 14:02:02 +02:00
@cmdln.option ( ' -c ' , ' --checkout ' , action = ' store_true ' ,
2011-02-02 17:11:14 +01:00
help = ' Checkout branched package afterwards using " co -e -S " ' \
2009-08-20 21:28:05 +02:00
' ( \' osc bco \' is a shorthand for this option) ' )
2010-05-17 20:14:49 +02:00
@cmdln.option ( ' -f ' , ' --force ' , default = False , action = " store_true " ,
2010-05-19 10:47:01 +02:00
help = ' force branch, overwrite target ' )
2010-03-02 01:34:17 +01:00
@cmdln.option ( ' -m ' , ' --message ' , metavar = ' TEXT ' ,
help = ' specify message TEXT ' )
2010-05-17 20:14:49 +02:00
@cmdln.option ( ' -r ' , ' --revision ' , metavar = ' rev ' ,
help = ' branch against a specific revision ' )
2008-10-16 14:34:41 +02:00
def do_branch ( self , subcmd , opts , * args ) :
2008-05-21 17:49:00 +02:00
""" $ {cmd_name} : Branch a package
2010-07-27 15:20:35 +02:00
[ See http : / / en . opensuse . org / openSUSE : Build_Service_Collaboration
2010-07-26 19:45:42 +02:00
for information on this topic . ]
2008-06-06 14:04:34 +02:00
2008-05-21 17:49:00 +02:00
Create a source link from a package of an existing project to a new
subproject of the requesters home project ( home : branches : )
The branched package will live in
home : USERNAME : branches : PROJECT / PACKAGE
2009-04-17 14:02:02 +02:00
if nothing else specified .
2009-05-18 16:50:43 +02:00
2011-03-09 16:10:48 +01:00
With getpac or bco , the branched package will come from one of
2009-09-03 23:32:36 +02:00
% ( getpac_default_project ) s
2011-03-17 18:48:20 +01:00
( list of projects from oscrc : getpac_default_project )
if nothing else is specfied on the command line .
2009-09-03 20:08:43 +02:00
2009-05-18 16:50:43 +02:00
usage :
2010-04-27 12:23:03 +02:00
osc branch
2009-04-17 14:02:02 +02:00
osc branch SOURCEPROJECT SOURCEPACKAGE
osc branch SOURCEPROJECT SOURCEPACKAGE TARGETPROJECT
osc branch SOURCEPROJECT SOURCEPACKAGE TARGETPROJECT TARGETPACKAGE
2010-08-20 13:23:23 +02:00
osc getpac SOURCEPACKAGE
2009-08-20 21:28:05 +02:00
osc bco . . .
2008-05-21 17:49:00 +02:00
$ { cmd_option_list }
"""
2009-09-03 20:08:43 +02:00
if subcmd == ' getpac ' or subcmd == ' branchco ' or subcmd == ' bco ' : opts . checkout = True
2008-10-16 14:34:41 +02:00
args = slash_split ( args )
2009-04-17 14:02:02 +02:00
tproject = tpackage = None
2009-08-20 21:28:05 +02:00
2009-09-03 23:32:36 +02:00
if ( subcmd == ' getpac ' or subcmd == ' bco ' ) and len ( args ) == 1 :
2011-03-09 16:10:48 +01:00
def_p = find_default_project ( self . get_api_url ( ) , args [ 0 ] )
print >> sys . stderr , ' defaulting to %s / %s ' % ( def_p , args [ 0 ] )
2009-09-03 20:08:43 +02:00
# python has no args.unshift ???
2011-03-09 16:10:48 +01:00
args = [ def_p , args [ 0 ] ]
2010-04-27 12:23:03 +02:00
if len ( args ) == 0 and is_package_dir ( ' . ' ) :
args = ( store_read_project ( ' . ' ) , store_read_package ( ' . ' ) )
2009-09-03 20:08:43 +02:00
2010-02-08 23:31:27 +01:00
if len ( args ) < 2 or len ( args ) > 4 :
2008-10-16 14:34:41 +02:00
raise oscerr . WrongArgs ( ' Wrong number of arguments. ' )
2010-04-27 12:23:03 +02:00
2010-07-29 17:29:07 +02:00
apiurl = self . get_api_url ( )
2010-08-20 13:25:32 +02:00
expected = ' home: %s :branches: %s ' % ( conf . get_apiurl_usr ( apiurl ) , args [ 0 ] )
2009-04-17 14:02:02 +02:00
if len ( args ) > = 3 :
2010-01-15 10:29:07 +01:00
expected = tproject = args [ 2 ]
2009-04-17 14:02:02 +02:00
if len ( args ) > = 4 :
tpackage = args [ 3 ]
2008-10-16 14:34:41 +02:00
2010-02-08 19:58:14 +01:00
exists , targetprj , targetpkg , srcprj , srcpkg = \
2010-07-29 17:29:07 +02:00
branch_pkg ( apiurl , args [ 0 ] , args [ 1 ] ,
2009-10-20 16:30:15 +02:00
nodevelproject = opts . nodevelproject , rev = opts . revision ,
target_project = tproject , target_package = tpackage ,
2010-05-17 20:14:49 +02:00
return_existing = opts . checkout , msg = opts . message or ' ' ,
force = opts . force )
2010-02-08 19:58:14 +01:00
if exists :
print >> sys . stderr , ' Using existing branch project: %s ' % targetprj
2009-08-20 21:28:05 +02:00
2009-09-23 01:31:10 +02:00
devloc = None
2011-02-08 16:56:16 +01:00
if not exists and ( srcprj != args [ 0 ] or srcpkg != args [ 1 ] ) :
try :
root = ET . fromstring ( ' ' . join ( show_attribute_meta ( apiurl , args [ 0 ] , None , None ,
conf . config [ ' maintained_update_project_attribute ' ] , False , False ) ) )
# this might raise an AttributeError
uproject = root . find ( ' attribute ' ) . find ( ' value ' ) . text
print ' \n Note: The branch has been created from the configured update project: %s ' \
% uproject
except ( AttributeError , urllib2 . HTTPError ) , e :
devloc = srcprj
print ' \n Note: The branch has been created of a different project, \n ' \
' %s , \n ' \
' which is the primary location of where development for \n ' \
' that package takes place. \n ' \
' That \' s also where you would normally make changes against. \n ' \
' A direct branch of the specified package can be forced \n ' \
' with the --nodevelproject option. \n ' % devloc
2009-04-17 14:02:02 +02:00
2010-02-08 19:58:14 +01:00
package = tpackage or args [ 1 ]
2009-04-17 14:02:02 +02:00
if opts . checkout :
2011-02-02 19:35:32 +01:00
checkout_package ( apiurl , targetprj , package , server_service_files = True ,
2010-02-08 19:58:14 +01:00
expand_link = True , prj_dir = targetprj )
2009-08-20 21:28:05 +02:00
if conf . config [ ' verbose ' ] :
print ' Note: You can use " osc delete " or " osc submitpac " when done. \n '
2009-04-17 14:02:02 +02:00
else :
apiopt = ' '
2010-07-29 17:29:07 +02:00
if conf . get_configParser ( ) . get ( ' general ' , ' apiurl ' ) != apiurl :
apiopt = ' -A %s ' % apiurl
2009-04-17 14:02:02 +02:00
print ' A working copy of the branched package can be checked out with: \n \n ' \
' osc %s co %s / %s ' \
2010-02-08 19:58:14 +01:00
% ( apiopt , targetprj , package )
2010-07-29 17:29:07 +02:00
print_request_list ( apiurl , args [ 0 ] , args [ 1 ] )
2009-09-23 01:31:10 +02:00
if devloc :
2011-02-08 16:56:16 +01:00
print_request_list ( apiurl , devloc , srcpkg )
2008-05-21 17:49:00 +02:00
2009-05-18 16:50:43 +02:00
2010-05-21 19:02:42 +02:00
def do_undelete ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Restores a deleted project or package on the server.
The server restores a package including the sources and meta configuration .
Binaries remain to be lost and will be rebuild .
usage :
osc undelete PROJECT
osc undelete PROJECT PACKAGE [ PACKAGE . . . ]
$ { cmd_option_list }
"""
args = slash_split ( args )
if len ( args ) < 1 :
raise oscerr . WrongArgs ( ' Missing argument. ' )
2010-07-29 17:29:07 +02:00
apiurl = self . get_api_url ( )
2010-05-21 19:02:42 +02:00
prj = args [ 0 ]
pkgs = args [ 1 : ]
if pkgs :
for pkg in pkgs :
2010-07-29 17:29:07 +02:00
undelete_package ( apiurl , prj , pkg )
2010-05-21 19:02:42 +02:00
else :
2010-07-29 17:29:07 +02:00
undelete_project ( apiurl , prj )
2010-05-21 19:02:42 +02:00
2006-08-11 12:37:29 +02:00
2007-10-14 01:15:49 +02:00
@cmdln.option ( ' -f ' , ' --force ' , action = ' store_true ' ,
2009-08-20 21:28:05 +02:00
help = ' deletes a package or an empty project ' )
2009-05-04 21:07:05 +02:00
def do_rdelete ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Delete a project or packages on the server.
2006-09-25 17:11:03 +02:00
2007-10-14 01:15:49 +02:00
As a safety measure , project must be empty ( i . e . , you need to delete all
2011-03-05 20:08:47 +01:00
packages first ) . Also , packages must have no requests pending ( i . e . , you need
to accept / revoke such requests first ) .
If you are sure that you want to remove this project and all
2007-10-14 01:15:49 +02:00
its packages use \' --force \' switch.
2006-09-25 17:11:03 +02:00
2009-05-04 21:07:05 +02:00
usage :
2010-11-24 14:17:14 +01:00
osc rdelete [ - f ] PROJECT [ PACKAGE ]
2007-05-08 10:59:10 +02:00
2007-04-25 01:00:12 +02:00
$ { cmd_option_list }
"""
2006-09-25 17:11:03 +02:00
2009-05-04 21:07:05 +02:00
args = slash_split ( args )
2010-11-24 14:17:14 +01:00
if len ( args ) < 1 or len ( args ) > 2 :
raise oscerr . WrongArgs ( ' Wrong number of arguments ' )
2010-07-29 17:29:07 +02:00
apiurl = self . get_api_url ( )
2009-05-04 21:07:05 +02:00
prj = args [ 0 ]
2010-11-24 14:17:14 +01:00
# empty arguments result in recursive project delete ...
if not len ( prj ) :
raise oscerr . WrongArgs ( ' Project argument is empty ' )
if len ( args ) > 1 :
pkg = args [ 1 ]
if not len ( pkg ) :
raise oscerr . WrongArgs ( ' Package argument is empty ' )
2011-03-05 20:08:47 +01:00
## FIXME: core.py:commitDelPackage() should have something similar
rlist = get_request_list ( apiurl , prj , pkg )
for rq in rlist : print rq
if len ( rlist ) > = 1 and not opts . force :
print >> sys . stderr , ' Package has pending requests. Deleting the package will break them. ' \
' They should be accepted/declined/revoked before deleting the package. ' \
' Or just use \' --force \' . '
sys . exit ( 1 )
2010-11-24 14:17:14 +01:00
delete_package ( apiurl , prj , pkg )
2010-07-29 17:29:07 +02:00
elif len ( meta_get_packagelist ( apiurl , prj ) ) > = 1 and not opts . force :
2007-10-14 01:15:49 +02:00
print >> sys . stderr , ' Project contains packages. It must be empty before deleting it. ' \
' If you are sure that you want to remove this project and all its ' \
2011-03-05 20:08:47 +01:00
' packages use the \' --force \' switch. '
2007-10-14 01:15:49 +02:00
sys . exit ( 1 )
else :
2010-07-29 17:29:07 +02:00
delete_project ( apiurl , prj )
2009-05-04 21:07:05 +02:00
@cmdln.hide ( 1 )
def do_deletepac ( self , subcmd , opts , * args ) :
2009-05-11 15:21:33 +02:00
print """ $ {cmd_name} is obsolete !
Please use either
2009-05-04 21:07:05 +02:00
osc delete for checked out packages or projects
or
osc rdelete for server side operations . """
sys . exit ( 1 )
@cmdln.hide ( 1 )
@cmdln.option ( ' -f ' , ' --force ' , action = ' store_true ' ,
help = ' deletes a project and its packages ' )
def do_deleteprj ( self , subcmd , opts , project ) :
""" $ {cmd_name} is obsolete !
2006-09-25 17:11:03 +02:00
2009-05-04 21:07:05 +02:00
Please use
osc rdelete PROJECT
"""
sys . exit ( 1 )
2006-09-25 17:11:03 +02:00
2008-08-08 17:23:03 +02:00
@cmdln.alias ( ' metafromspec ' )
2007-06-30 17:39:47 +02:00
@cmdln.option ( ' ' , ' --specfile ' , metavar = ' FILE ' ,
help = ' Path to specfile. (if you pass more than working copy this option is ignored) ' )
2007-04-25 01:00:12 +02:00
def do_updatepacmetafromspec ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Update package meta information from a specfile
2006-09-25 17:11:03 +02:00
2007-04-25 01:00:12 +02:00
ARG , if specified , is a package working copy .
2006-09-25 17:11:03 +02:00
2007-04-25 01:00:12 +02:00
$ { cmd_usage }
$ { cmd_option_list }
"""
2006-05-31 14:13:26 +02:00
2007-04-25 01:00:12 +02:00
args = parseargs ( args )
2010-02-09 00:08:21 +01:00
if opts . specfile and len ( args ) == 1 :
2007-06-30 17:39:47 +02:00
specfile = opts . specfile
else :
specfile = None
2007-04-25 01:00:12 +02:00
pacs = findpacs ( args )
for p in pacs :
2007-06-30 17:39:47 +02:00
p . read_meta_from_spec ( specfile )
2007-07-16 15:40:58 +02:00
p . update_package_meta ( )
2006-05-31 14:13:26 +02:00
2010-12-24 22:44:19 +01:00
@cmdln.alias ( ' linkdiff ' )
@cmdln.alias ( ' ldiff ' )
2007-04-25 01:00:12 +02:00
@cmdln.alias ( ' di ' )
2009-05-18 16:50:43 +02:00
@cmdln.option ( ' -c ' , ' --change ' , metavar = ' rev ' ,
help = ' the change made by revision rev (like -r rev-1:rev). '
' If rev is negative this is like -r rev:rev-1. ' )
2007-07-04 14:55:26 +02:00
@cmdln.option ( ' -r ' , ' --revision ' , metavar = ' rev1[:rev2] ' ,
help = ' If rev1 is specified it will compare your working copy against '
' the revision (rev1) on the server. '
2009-01-09 18:09:29 +01:00
' If rev1 and rev2 are specified it will compare rev1 against rev2 '
2009-01-16 15:45:27 +01:00
' (NOTE: changes in your working copy are ignored in this case) ' )
2009-09-07 20:49:01 +02:00
@cmdln.option ( ' -p ' , ' --plain ' , action = ' store_true ' ,
help = ' output the diff in plain (not unified) diff format ' )
2010-12-24 22:44:19 +01:00
@cmdln.option ( ' -l ' , ' --link ' , action = ' store_true ' ,
help = ' (osc linkdiff): compare against the base revision of the link ' )
2010-04-10 15:44:15 +02:00
@cmdln.option ( ' --missingok ' , action = ' store_true ' ,
help = ' do not fail if the source or target project/package does not exist on the server ' )
2007-04-25 01:00:12 +02:00
def do_diff ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Generates a diff
2006-05-31 14:13:26 +02:00
2007-04-25 01:00:12 +02:00
Generates a diff , comparing local changes against the repository
server .
2009-05-18 16:50:43 +02:00
2007-04-25 01:00:12 +02:00
$ { cmd_usage }
2010-12-24 22:44:19 +01:00
ARG , if specified , is a filename to include in the diff .
Default : all files .
osc diff - - link
osc linkdiff
Compare current checkout directory against the link base .
osc diff - - link PROJ PACK
osc linkdiff PROJ PACK
Compare a package against the link base ( ignoring working copy changes ) .
2007-04-25 01:00:12 +02:00
$ { cmd_option_list }
"""
2010-12-24 22:44:19 +01:00
if ( subcmd == ' ldiff ' or subcmd == ' linkdiff ' ) :
opts . link = True
2007-04-25 01:00:12 +02:00
args = parseargs ( args )
2010-12-24 22:44:19 +01:00
pacs = None
if not opts . link or not len ( args ) == 2 :
pacs = findpacs ( args )
if opts . link :
query = { ' rev ' : ' latest ' }
if pacs :
u = makeurl ( pacs [ 0 ] . apiurl , [ ' source ' , pacs [ 0 ] . prjname , pacs [ 0 ] . name ] , query = query )
else :
u = makeurl ( self . get_api_url ( ) , [ ' source ' , args [ 0 ] , args [ 1 ] ] , query = query )
f = http_GET ( u )
root = ET . parse ( f ) . getroot ( )
linkinfo = root . find ( ' linkinfo ' )
if linkinfo == None :
raise oscerr . APIError ( ' package is not a source link ' )
baserev = linkinfo . get ( ' baserev ' )
opts . revision = baserev
if pacs :
print " diff working copy against linked revision %s \n " % baserev
else :
print " diff commited package against linked revision %s \n " % baserev
run_pager ( server_diff ( self . get_api_url ( ) , args [ 0 ] , args [ 1 ] , baserev ,
args [ 0 ] , args [ 1 ] , linkinfo . get ( ' lsrcmd5 ' ) , not opts . plain , opts . missingok ) )
return
2009-05-18 16:50:43 +02:00
if opts . change :
try :
rev = int ( opts . change )
if rev > 0 :
rev1 = rev - 1
rev2 = rev
elif rev < 0 :
rev1 = - rev
rev2 = - rev - 1
else :
return
except :
2009-09-07 20:49:01 +02:00
print >> sys . stderr , ' Revision \' %s \' not an integer ' % opts . change
2009-05-18 16:50:43 +02:00
return
else :
rev1 , rev2 = parseRevisionOption ( opts . revision )
2007-11-26 19:13:51 +01:00
diff = ' '
for pac in pacs :
2009-01-09 18:09:29 +01:00
if not rev2 :
2010-08-27 16:24:12 +02:00
for i in pac . get_diff ( rev1 ) :
sys . stdout . write ( ' ' . join ( i ) )
2009-01-09 18:09:29 +01:00
else :
2010-12-23 10:33:31 +01:00
diff + = server_diff_noex ( pac . apiurl , pac . prjname , pac . name , rev1 ,
pac . prjname , pac . name , rev2 , not opts . plain , opts . missingok )
2010-09-10 17:28:45 +02:00
run_pager ( diff )
2007-07-04 14:55:26 +02:00
2007-04-25 01:00:12 +02:00
2007-11-29 18:22:57 +01:00
@cmdln.option ( ' --oldprj ' , metavar = ' OLDPRJ ' ,
2010-01-10 12:12:26 +01:00
help = ' project to compare against '
' (deprecated, use 3 argument form) ' )
2007-11-29 18:22:57 +01:00
@cmdln.option ( ' --oldpkg ' , metavar = ' OLDPKG ' ,
2010-01-10 12:12:26 +01:00
help = ' package to compare against '
' (deprecated, use 3 argument form) ' )
2011-03-03 10:07:32 +01:00
@cmdln.option ( ' -M ' , ' --meta ' , action = ' store_true ' ,
help = ' diff meta data ' )
2007-11-29 18:22:57 +01:00
@cmdln.option ( ' -r ' , ' --revision ' , metavar = ' N[:M] ' ,
help = ' revision id, where N = old revision and M = new revision ' )
2009-09-07 20:49:01 +02:00
@cmdln.option ( ' -p ' , ' --plain ' , action = ' store_true ' ,
help = ' output the diff in plain (not unified) diff format ' )
@cmdln.option ( ' -c ' , ' --change ' , metavar = ' rev ' ,
2010-01-10 12:12:26 +01:00
help = ' the change made by revision rev (like -r rev-1:rev). '
2009-09-07 20:49:01 +02:00
' If rev is negative this is like -r rev:rev-1. ' )
2010-04-10 15:44:15 +02:00
@cmdln.option ( ' --missingok ' , action = ' store_true ' ,
help = ' do not fail if the source or target project/package does not exist on the server ' )
2010-10-19 15:25:25 +02:00
@cmdln.option ( ' -u ' , ' --unexpand ' , action = ' store_true ' ,
help = ' diff unexpanded version if sources are linked ' )
2010-01-10 12:12:26 +01:00
def do_rdiff ( self , subcmd , opts , * args ) :
2007-12-10 15:23:58 +01:00
""" $ {cmd_name} : Server-side " pretty " diff of two packages
2007-11-29 18:22:57 +01:00
2010-01-10 12:12:26 +01:00
Compares two packages ( three or four arguments ) or shows the
changes of a specified revision of a package ( two arguments )
If no revision is specified the latest revision is used .
2007-11-29 18:32:52 +01:00
2009-07-27 22:03:01 +02:00
Note that this command doesn ' t return a normal diff (which could be
applied as patch ) , but a " pretty " diff , which also compares the content
of tarballs .
2007-11-29 18:32:52 +01:00
2007-11-29 18:22:57 +01:00
2010-01-10 12:12:26 +01:00
usage :
osc $ { cmd_name } OLDPRJ OLDPAC NEWPRJ [ NEWPAC ]
osc $ { cmd_name } PROJECT PACKAGE
2007-11-29 18:22:57 +01:00
$ { cmd_option_list }
"""
2010-01-10 12:12:26 +01:00
args = slash_split ( args )
2010-07-29 17:29:07 +02:00
apiurl = self . get_api_url ( )
2010-01-10 12:12:26 +01:00
2009-09-07 20:49:01 +02:00
rev1 = None
rev2 = None
2010-01-10 12:12:26 +01:00
old_project = None
old_package = None
new_project = None
new_package = None
if len ( args ) == 2 :
new_project = args [ 0 ]
new_package = args [ 1 ]
if opts . oldprj :
old_project = opts . oldprj
if opts . oldpkg :
old_package = opts . oldpkg
elif len ( args ) == 3 or len ( args ) == 4 :
if opts . oldprj or opts . oldpkg :
raise oscerr . WrongArgs ( ' --oldpkg and --oldprj are only valid with two arguments ' )
old_project = args [ 0 ]
2010-01-18 10:25:00 +01:00
new_package = old_package = args [ 1 ]
2010-01-10 12:12:26 +01:00
new_project = args [ 2 ]
if len ( args ) == 4 :
new_package = args [ 3 ]
2011-03-03 10:07:32 +01:00
elif len ( args ) == 1 and opts . meta :
new_project = args [ 0 ]
new_package = ' _project '
2010-01-10 12:12:26 +01:00
else :
raise oscerr . WrongArgs ( ' Wrong number of arguments ' )
2011-03-03 10:07:32 +01:00
if opts . meta :
opts . unexpand = True
2010-01-10 12:12:26 +01:00
2009-09-07 20:49:01 +02:00
if opts . change :
try :
rev = int ( opts . change )
if rev > 0 :
rev1 = rev - 1
rev2 = rev
elif rev < 0 :
rev1 = - rev
rev2 = - rev - 1
else :
return
except :
print >> sys . stderr , ' Revision \' %s \' not an integer ' % opts . change
return
else :
if opts . revision :
rev1 , rev2 = parseRevisionOption ( opts . revision )
2007-11-29 18:22:57 +01:00
2010-12-23 10:33:31 +01:00
rdiff = server_diff_noex ( apiurl ,
old_project , old_package , rev1 ,
new_project , new_package , rev2 , not opts . plain , opts . missingok ,
2011-03-03 10:07:32 +01:00
meta = opts . meta ,
2010-12-23 10:33:31 +01:00
expand = not opts . unexpand )
2010-10-19 15:25:25 +02:00
2010-09-10 17:28:45 +02:00
run_pager ( rdiff )
2007-11-29 18:22:57 +01:00
2009-11-30 10:31:22 +01:00
@cmdln.hide ( 1 )
2009-10-08 16:40:06 +02:00
@cmdln.alias ( ' in ' )
2009-08-20 21:28:05 +02:00
def do_install ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : install a package after build via zypper in -r
2011-03-24 15:20:51 +01:00
Not implemented here . Please try
http : / / software . opensuse . org / search ? q = osc - plugin - install & include_home = true
2009-08-20 21:28:05 +02:00
2009-10-08 16:40:06 +02:00
2009-08-20 21:28:05 +02:00
$ { cmd_usage }
$ { cmd_option_list }
"""
2009-10-08 16:40:06 +02:00
args = slash_split ( args )
args = expand_proj_pack ( args )
2009-11-10 01:56:52 +01:00
2010-02-28 02:30:13 +01:00
## FIXME:
2009-11-10 01:56:52 +01:00
## if there is only one argument, and it ends in .ymp
2010-02-28 02:30:13 +01:00
## then fetch it, Parse XML to get the first
2009-11-10 01:56:52 +01:00
## metapackage.group.repositories.repository.url
## and construct zypper cmd's for all
## metapackage.group.software.item.name
##
## if args[0] is already an url, the use it as is.
2011-03-24 13:56:37 +01:00
cmd = " sudo zypper -p http://download.opensuse.org/repositories/ %s / %s --no-refresh -v in %s " % ( re . sub ( ' : ' , ' :/ ' , args [ 0 ] ) , ' openSUSE_11.4 ' , args [ 1 ] )
2009-08-20 21:28:05 +02:00
print self . do_install . __doc__
2009-10-20 16:30:15 +02:00
print " Example: \n " + cmd
2009-08-20 21:28:05 +02:00
2007-11-29 18:22:57 +01:00
2007-04-25 01:00:12 +02:00
def do_repourls ( self , subcmd , opts , * args ) :
2009-05-18 16:50:43 +02:00
""" $ {cmd_name} : Shows URLs of .repo files
2007-04-25 01:00:12 +02:00
Shows URLs on which to access the project . repos files ( yum - style
2007-07-16 11:45:17 +02:00
metadata ) on download . opensuse . org .
2006-05-23 15:48:58 +02:00
2009-11-30 10:31:28 +01:00
usage :
osc repourls [ PROJECT ]
2006-05-23 15:48:58 +02:00
2007-04-25 01:00:12 +02:00
$ { cmd_option_list }
"""
2006-05-23 15:48:58 +02:00
2010-04-30 17:13:21 +02:00
apiurl = self . get_api_url ( )
2007-03-12 16:46:15 +01:00
2009-11-30 10:31:28 +01:00
if len ( args ) == 1 :
project = args [ 0 ]
elif len ( args ) == 0 :
project = store_read_project ( ' . ' )
else :
raise oscerr . WrongArgs ( ' Wrong number of arguments ' )
2006-05-23 15:48:58 +02:00
2009-11-30 10:31:28 +01:00
# XXX: API should somehow tell that
url_tmpl = ' http://download.opensuse.org/repositories/ %s / %s / %s .repo '
repos = get_repositories_of_project ( apiurl , project )
for repo in repos :
print url_tmpl % ( project . replace ( ' : ' , ' :/ ' ) , repo , project )
2006-05-23 15:48:58 +02:00
2007-07-04 14:55:26 +02:00
@cmdln.option ( ' -r ' , ' --revision ' , metavar = ' rev ' ,
2007-07-04 15:48:24 +02:00
help = ' checkout the specified revision. '
' NOTE: if you checkout the complete project '
' this option is ignored! ' )
2008-03-24 21:24:49 +01:00
@cmdln.option ( ' -e ' , ' --expand-link ' , action = ' store_true ' ,
2009-05-18 16:50:43 +02:00
help = ' if a package is a link, check out the expanded '
2008-06-06 14:04:34 +02:00
' sources (no-op, since this became the default) ' )
@cmdln.option ( ' -u ' , ' --unexpand-link ' , action = ' store_true ' ,
help = ' if a package is a link, check out the _link file ' \
' instead of the expanded sources ' )
2010-05-25 14:00:50 +02:00
@cmdln.option ( ' -M ' , ' --meta ' , action = ' store_true ' ,
2010-05-22 08:22:12 +02:00
help = ' checkout out meta data instead of sources ' )
2009-04-16 19:41:47 +02:00
@cmdln.option ( ' -c ' , ' --current-dir ' , action = ' store_true ' ,
help = ' place PACKAGE folder in the current directory ' \
' instead of a PROJECT/PACKAGE directory ' )
2009-08-07 14:18:15 +02:00
@cmdln.option ( ' -s ' , ' --source-service-files ' , action = ' store_true ' ,
2011-02-02 17:11:14 +01:00
help = ' Run source services. ' )
2010-06-08 11:24:10 +02:00
@cmdln.option ( ' -S ' , ' --server-side-source-service-files ' , action = ' store_true ' ,
help = ' Use server side generated sources instead of local generation. ' )
2010-04-22 15:27:54 +02:00
@cmdln.option ( ' -l ' , ' --limit-size ' , metavar = ' limit_size ' ,
help = ' Skip all files with a given size ' )
2007-04-25 01:00:12 +02:00
@cmdln.alias ( ' co ' )
def do_checkout ( self , subcmd , opts , * args ) :
2007-12-10 15:23:58 +01:00
""" $ {cmd_name} : Check out content from the repository
2009-05-18 16:50:43 +02:00
2007-04-25 01:00:12 +02:00
Check out content from the repository server , creating a local working
copy .
2008-03-24 21:24:49 +01:00
When checking out a single package , the option - - revision can be used
2009-05-27 14:09:50 +02:00
to specify a revision of the package to be checked out .
2008-03-24 21:24:49 +01:00
2009-05-18 16:50:43 +02:00
When a package is a source link , then it will be checked out in
expanded form . If - - unexpand - link option is used , the checkout will
2008-06-06 14:04:34 +02:00
instead produce the raw _link file plus patches .
2007-04-25 01:00:12 +02:00
2009-05-18 16:50:43 +02:00
usage :
2007-04-25 01:00:12 +02:00
osc co PROJECT [ PACKAGE ] [ FILE ]
2009-04-17 10:39:04 +02:00
osc co PROJECT # entire project
osc co PROJECT PACKAGE # a package
osc co PROJECT PACKAGE FILE # single file -> to current dir
2009-04-24 01:59:40 +02:00
while inside a project directory :
osc co PACKAGE # check out PACKAGE from project
2011-01-31 17:49:04 +01:00
2011-02-01 20:07:29 +01:00
with the result of rpm - q - - qf ' %% {disturl} n ' PACKAGE
2011-01-31 17:49:04 +01:00
osc co obs : / / API / PROJECT / PLATFORM / REVISION - PACKAGE
2009-04-17 10:39:04 +02:00
2007-04-25 01:00:12 +02:00
$ { cmd_option_list }
"""
2008-06-06 14:04:34 +02:00
2009-09-16 23:39:45 +02:00
if opts . unexpand_link :
expand_link = False
else :
expand_link = True
2011-02-01 18:37:17 +01:00
# XXX: this too openSUSE-setup specific...
2011-01-31 17:49:04 +01:00
# FIXME: this should go into ~jw/patches/osc/osc.proj_pack_20101201.diff
# to be available to all subcommands via @cmdline.prep(proj_pack)
# obs://build.opensuse.org/openSUSE:11.3/standard/fc6c25e795a89503e99d59da5dc94a79-screen
m = re . match ( r " obs://([^/]+)/( \ S+)/([^/]+)/([A-Fa-f \ d]+) \ -( \ S+) " , args [ 0 ] )
if m and len ( args ) == 1 :
2011-02-01 18:37:17 +01:00
apiurl = " https:// " + m . group ( 1 )
project = project_dir = m . group ( 2 )
# platform = m.group(3)
opts . revision = m . group ( 4 )
package = m . group ( 5 )
apiurl = apiurl . replace ( ' /build. ' , ' /api. ' )
filename = None
2011-01-31 17:49:04 +01:00
else :
2011-02-01 18:37:17 +01:00
args = slash_split ( args )
project = package = filename = None
apiurl = self . get_api_url ( )
try :
project = project_dir = args [ 0 ]
package = args [ 1 ]
filename = args [ 2 ]
except :
pass
2007-04-25 01:00:12 +02:00
2011-02-01 18:37:17 +01:00
if len ( args ) == 1 and is_project_dir ( os . curdir ) :
project = store_read_project ( os . curdir )
project_dir = os . curdir
2009-04-17 10:39:04 +02:00
package = args [ 0 ]
2008-06-06 14:04:34 +02:00
2007-07-04 14:55:26 +02:00
rev , dummy = parseRevisionOption ( opts . revision )
2009-10-16 10:26:01 +02:00
if rev == None :
2009-10-20 16:30:15 +02:00
rev = " latest "
2007-07-04 14:55:26 +02:00
2009-10-16 10:26:01 +02:00
if rev and rev != " latest " and not checkRevision ( project , package , rev ) :
2007-07-06 13:54:34 +02:00
print >> sys . stderr , ' Revision \' %s \' does not exist ' % rev
sys . exit ( 1 )
2007-04-25 01:00:12 +02:00
if filename :
2011-03-08 18:48:00 +01:00
# Note: same logic as with 'osc cat' (not 'osc ls', which never merges!)
2010-12-30 02:31:28 +01:00
if expand_link :
2011-03-08 18:48:00 +01:00
rev = show_upstream_srcmd5 ( apiurl , project , package , expand = True , revision = rev )
2010-02-09 20:57:10 +01:00
get_source_file ( apiurl , project , package , filename , revision = rev , progress_obj = self . download_progress )
2007-04-25 01:00:12 +02:00
elif package :
2009-09-16 23:39:45 +02:00
if opts . current_dir :
project_dir = None
2010-02-09 20:57:10 +01:00
checkout_package ( apiurl , project , package , rev , expand_link = expand_link , \
2010-09-03 14:51:20 +02:00
prj_dir = project_dir , service_files = opts . source_service_files , server_service_files = opts . server_side_source_service_files , progress_obj = self . download_progress , size_limit = opts . limit_size , meta = opts . meta )
2009-09-18 03:10:41 +02:00
print_request_list ( apiurl , project , package )
2007-04-25 01:00:12 +02:00
elif project :
2009-05-15 13:40:50 +02:00
prj_dir = project
2009-09-08 13:16:21 +02:00
if sys . platform [ : 3 ] == ' win ' :
2009-05-15 13:40:50 +02:00
prj_dir = prj_dir . replace ( ' : ' , ' ; ' )
if os . path . exists ( prj_dir ) :
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
sys . exit ( ' osc: project \' %s \' already exists ' % project )
# check if the project does exist (show_project_meta will throw an exception)
2009-04-17 10:39:04 +02:00
show_project_meta ( apiurl , project )
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
2010-10-09 16:26:55 +02:00
Project . init_project ( apiurl , prj_dir , project , conf . config [ ' do_package_tracking ' ] )
2009-05-15 13:40:50 +02:00
print statfrmt ( ' A ' , prj_dir )
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
2007-04-25 01:00:12 +02:00
# all packages
2009-04-17 10:39:04 +02:00
for package in meta_get_packagelist ( apiurl , project ) :
2008-10-02 17:46:52 +02:00
try :
2010-02-09 20:57:10 +01:00
checkout_package ( apiurl , project , package , expand_link = expand_link , \
2010-09-03 14:51:20 +02:00
prj_dir = prj_dir , service_files = opts . source_service_files , server_service_files = opts . server_side_source_service_files , progress_obj = self . download_progress , size_limit = opts . limit_size , meta = opts . meta )
2008-10-02 17:46:52 +02:00
except oscerr . LinkExpandError , e :
print >> sys . stderr , ' Link cannot be expanded: \n ' , e
2009-04-22 14:32:29 +02:00
print >> sys . stderr , ' Use " osc repairlink " for fixing merge conflicts: \n '
2008-10-02 17:46:52 +02:00
# check out in unexpanded form at least
2010-02-09 20:57:10 +01:00
checkout_package ( apiurl , project , package , expand_link = False , \
2010-09-03 14:51:20 +02:00
prj_dir = prj_dir , service_files = opts . source_service_files , server_service_files = opts . server_side_source_service_files , progress_obj = self . download_progress , size_limit = opts . limit_size , meta = opts . meta )
2009-09-18 03:10:41 +02:00
print_request_list ( apiurl , project )
2008-10-02 17:46:52 +02:00
2007-04-25 01:00:12 +02: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
raise oscerr . WrongArgs ( ' Missing argument. \n \n ' \
+ self . get_cmd_help ( ' checkout ' ) )
2007-04-25 01:00:12 +02:00
2008-05-21 15:44:49 +02:00
@cmdln.option ( ' -q ' , ' --quiet ' , action = ' store_true ' ,
help = ' print as little as possible ' )
2007-04-25 01:00:12 +02:00
@cmdln.option ( ' -v ' , ' --verbose ' , action = ' store_true ' ,
help = ' print extra information ' )
2010-08-11 18:05:12 +02:00
@cmdln.option ( ' -e ' , ' --show-excluded ' , action = ' store_true ' ,
help = ' also show files which are excluded by the ' \
' " exclude_glob " config option ' )
2007-04-25 01:00:12 +02:00
@cmdln.alias ( ' st ' )
def do_status ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Show status of files in working copy
Show the status of files in a local working copy , indicating whether
files have been changed locally , deleted , added , . . .
The first column in the output specifies the status and is one of the
following characters :
' ' no modifications
' A ' Added
' C ' Conflicted
' D ' Deleted
' M ' Modified
' ? ' item is not under version control
2009-07-15 23:16:34 +02:00
' ! ' item is missing ( removed by non - osc command ) or incomplete
2007-04-25 01:00:12 +02:00
examples :
osc st
osc st < directory >
osc st file1 file2 . . .
2009-05-18 16:50:43 +02:00
usage :
2007-04-25 01:00:12 +02:00
osc status [ OPTS ] [ PATH . . . ]
$ { cmd_option_list }
"""
2010-12-22 23:17:11 +01:00
if opts . quiet and opts . verbose :
raise oscerr . WrongOptions ( ' \' --quiet \' and \' --verbose \' are mutually exclusive ' )
2007-04-25 01:00:12 +02:00
2010-12-22 23:17:11 +01:00
args = parseargs ( args )
lines = [ ]
excl_states = ( ' ' , )
if opts . quiet :
excl_states + = ( ' ? ' , )
elif opts . verbose :
excl_states = ( )
2007-04-25 01:00:12 +02:00
for arg in args :
if is_project_dir ( arg ) :
2008-03-10 19:04:23 +01:00
prj = Project ( arg , False )
2010-12-22 23:17:11 +01:00
# don't exclude packages with state ' ' because the packages
# might have modified etc. files
prj_excl = [ st for st in excl_states if st != ' ' ]
for st , pac in sorted ( prj . get_status ( * prj_excl ) , lambda x , y : cmp ( x [ 1 ] , y [ 1 ] ) ) :
p = prj . get_pacobj ( pac )
if p is None :
# state is != ' '
lines . append ( statfrmt ( st , os . path . normpath ( os . path . join ( prj . dir , pac ) ) ) )
continue
if st == ' ' and opts . verbose or st != ' ' :
lines . append ( statfrmt ( st , os . path . normpath ( os . path . join ( prj . dir , pac ) ) ) )
states = p . get_status ( opts . show_excluded , * excl_states )
for st , filename in sorted ( states , lambda x , y : cmp ( x [ 1 ] , y [ 1 ] ) ) :
lines . append ( statfrmt ( st , os . path . normpath ( os . path . join ( p . dir , filename ) ) ) )
2007-04-25 01:00:12 +02:00
else :
2010-12-22 23:17:11 +01:00
p = findpacs ( [ arg ] ) [ 0 ]
for st , filename in sorted ( p . get_status ( opts . show_excluded , * excl_states ) , lambda x , y : cmp ( x [ 1 ] , y [ 1 ] ) ) :
lines . append ( statfrmt ( st , os . path . normpath ( os . path . join ( p . dir , filename ) ) ) )
# arrange the lines in order: unknown files first
# filenames are already sorted
lines = [ l for l in lines if l [ 0 ] == ' ? ' ] + \
[ l for l in lines if l [ 0 ] != ' ? ' ]
2010-12-25 20:57:26 +01:00
if lines :
print ' \n ' . join ( lines )
2006-06-02 16:00:58 +02:00
2006-05-23 15:48:58 +02:00
2007-04-25 01:00:12 +02:00
def do_add ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Mark files to be added upon the next commit
2006-05-23 15:48:58 +02:00
2010-05-14 16:59:45 +02:00
In case a URL is given the file will get downloaded and registered to be downloaded
by the server as well via the download_url source service .
This is recommended for release tar balls to track their source and to help
others to review your changes esp . on version upgrades .
2009-05-18 16:50:43 +02:00
usage :
2010-05-14 16:59:45 +02:00
osc add URL [ URL . . . ]
2007-04-25 01:00:12 +02:00
osc add FILE [ FILE . . . ]
$ { cmd_option_list }
"""
if not 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
raise oscerr . WrongArgs ( ' Missing argument. \n \n ' \
+ self . get_cmd_help ( ' add ' ) )
2006-05-23 15:48:58 +02:00
2010-05-14 16:59:45 +02:00
# Do some magic here, when adding a url. We want that the server to download the tar ball and to verify it
2010-05-14 16:44:42 +02:00
for arg in parseargs ( args ) :
2011-01-26 17:29:43 +01:00
if arg . startswith ( ' http:// ' ) or arg . startswith ( ' https:// ' ) or arg . startswith ( ' ftp:// ' ) or arg . startswith ( ' git:// ' ) :
2010-09-20 11:09:43 +02:00
if arg . endswith ( ' .git ' ) :
addGitSource ( arg )
else :
addDownloadUrlService ( arg )
2010-05-14 16:44:42 +02:00
else :
2010-05-19 15:34:59 +02:00
addFiles ( [ arg ] )
2006-05-23 15:48:58 +02:00
2009-05-18 16:50:43 +02:00
2008-03-10 19:04:23 +01:00
def do_mkpac ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Create a new package under version control
2006-09-29 15:15:41 +02:00
2008-03-10 19:04:23 +01:00
usage :
osc mkpac new_package
$ { cmd_option_list }
"""
2008-03-18 00:43:32 +01:00
if not conf . config [ ' do_package_tracking ' ] :
2008-12-17 23:45:58 +01:00
print >> sys . stderr , " to use this feature you have to enable \' do_package_tracking \' " \
" in the [general] section in the configuration file "
2008-03-18 00:43:32 +01:00
sys . exit ( 1 )
2008-03-10 19:04:23 +01:00
if len ( args ) != 1 :
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 . WrongArgs ( ' Wrong number of arguments. ' )
2008-03-15 23:51:37 +01:00
createPackageDir ( args [ 0 ] )
2006-05-23 15:48:58 +02:00
2008-08-20 21:24:55 +02:00
@cmdln.option ( ' -r ' , ' --recursive ' , action = ' store_true ' ,
help = ' If CWD is a project dir then scan all package dirs as well ' )
2009-05-11 15:21:33 +02:00
@cmdln.alias ( ' ar ' )
2007-04-25 01:00:12 +02:00
def do_addremove ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Adds new files, removes disappeared files
2006-04-20 16:26:50 +02:00
2007-04-25 01:00:12 +02:00
Adds all files new in the local copy , and removes all disappeared files .
2006-04-20 16:26:50 +02:00
2007-04-25 01:00:12 +02:00
ARG , if specified , is a package working copy .
2006-04-20 16:26:50 +02:00
2007-04-25 01:00:12 +02:00
$ { cmd_usage }
$ { cmd_option_list }
"""
2006-05-11 09:27:50 +02:00
2007-04-25 01:00:12 +02:00
args = parseargs ( args )
2008-08-20 21:24:55 +02:00
arg_list = args [ : ]
for arg in arg_list :
2009-03-16 22:29:42 +01:00
if is_project_dir ( arg ) and conf . config [ ' do_package_tracking ' ] :
2008-08-20 21:24:55 +02:00
prj = Project ( arg , False )
for pac in prj . pacs_unvers :
pac_dir = getTransActPath ( os . path . join ( prj . dir , pac ) )
if os . path . isdir ( pac_dir ) :
addFiles ( [ pac_dir ] , prj )
for pac in prj . pacs_broken :
if prj . get_state ( pac ) != ' D ' :
prj . set_state ( pac , ' D ' )
print statfrmt ( ' D ' , getTransActPath ( os . path . join ( prj . dir , pac ) ) )
if opts . recursive :
for pac in prj . pacs_have :
state = prj . get_state ( pac )
if state != None and state != ' D ' :
pac_dir = getTransActPath ( os . path . join ( prj . dir , pac ) )
args . append ( pac_dir )
args . remove ( arg )
prj . write_packages ( )
2009-03-16 22:29:42 +01:00
elif is_project_dir ( arg ) :
print >> sys . stderr , ' osc: addremove is not supported in a project dir unless ' \
' \' do_package_tracking \' is enabled in the configuration file '
sys . exit ( 1 )
2008-08-20 21:24:55 +02:00
2007-04-25 01:00:12 +02:00
pacs = findpacs ( args )
for p in pacs :
2010-09-06 15:28:23 +02:00
p . todo = list ( set ( p . filenamelist + p . filenamelist_unvers + p . to_be_added ) )
2007-04-25 01:00:12 +02:00
for filename in p . todo :
if os . path . isdir ( filename ) :
continue
2007-07-06 13:20:30 +02:00
# ignore foo.rXX, foo.mine for files which are in 'C' state
if os . path . splitext ( filename ) [ 0 ] in p . in_conflict :
2009-10-20 16:30:15 +02:00
continue
2007-04-25 01:00:12 +02:00
state = p . status ( filename )
if state == ' ? ' :
2009-08-20 21:28:05 +02:00
# TODO: should ignore typical backup files suffix ~ or .orig
2007-04-25 01:00:12 +02:00
p . addfile ( filename )
elif state == ' ! ' :
2010-09-06 15:28:23 +02:00
p . delete_file ( filename )
2008-08-20 21:24:55 +02:00
print statfrmt ( ' D ' , getTransActPath ( os . path . join ( p . dir , filename ) ) )
2007-04-25 01:00:12 +02:00
@cmdln.alias ( ' ci ' )
@cmdln.alias ( ' checkin ' )
2007-07-12 01:24:26 +02:00
@cmdln.option ( ' -m ' , ' --message ' , metavar = ' TEXT ' ,
help = ' specify log message TEXT ' )
2007-07-13 12:02:35 +02:00
@cmdln.option ( ' -F ' , ' --file ' , metavar = ' FILE ' ,
2011-03-30 23:33:30 +02:00
help = ' read log message from FILE, \' - \' denotes standard input. ' )
2009-08-03 15:03:24 +02:00
@cmdln.option ( ' -f ' , ' --force ' , default = False , action = " store_true " ,
help = ' force commit - do not tests a file list ' )
2010-05-20 12:02:53 +02:00
@cmdln.option ( ' --skip-validation ' , default = False , action = " store_true " ,
help = ' Skip the source validation ' )
2010-05-22 08:51:04 +02:00
@cmdln.option ( ' --verbose-validation ' , default = False , action = " store_true " ,
2010-07-19 11:10:15 +02:00
help = ' Run the source validation with verbose information ' )
2007-04-25 01:00:12 +02:00
def do_commit ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Upload content to the repository server
Upload content which is changed in your working copy , to the repository
server .
2009-08-05 07:54:12 +02:00
Optionally checks the state of a working copy , if found a file with
unknown state , it requests an user input :
2009-08-03 15:03:24 +02:00
* skip - don ' t change anything, just move to another file
* remove - remove a file from dir
* edit file list - edit filelist using EDITOR
* commit - don ' t check anything and commit package
* abort - abort commit - this is default value
2009-08-05 07:54:12 +02:00
This can be supressed by check_filelist config item , or - f / - - force
command line option .
2009-08-03 15:03:24 +02:00
2009-05-18 16:50:43 +02:00
examples :
2007-04-25 01:00:12 +02:00
osc ci # current dir
osc ci < dir >
osc ci file1 file2 . . .
$ { cmd_usage }
$ { cmd_option_list }
"""
2008-05-21 15:44:49 +02:00
args = parseargs ( args )
2010-05-20 12:02:53 +02:00
validators = conf . config [ ' source_validator_directory ' ]
if opts . skip_validation :
validators = None
elif not os . path . exists ( validators ) :
2011-01-05 16:31:02 +01:00
print >> sys . stderr , " WARNING: source_validator_directory configured but it " \
2010-11-18 22:47:01 +01:00
" does not exist: \n \t %s \n " \
" \t Install osc-source_validator to fix. " % validators
2010-05-20 12:02:53 +02:00
validators = None
2010-09-09 12:49:53 +02:00
2010-05-22 08:51:04 +02:00
msg = ' '
2008-03-10 19:04:23 +01:00
if opts . message :
msg = opts . message
elif opts . file :
2011-03-30 23:33:30 +02:00
if opts . file == ' - ' :
msg = sys . stdin . read ( )
else :
try :
msg = open ( opts . file ) . read ( )
except :
sys . exit ( ' could not open file \' %s \' . ' % opts . file )
2007-04-25 01:00:12 +02:00
2008-08-20 21:24:55 +02:00
arg_list = args [ : ]
for arg in arg_list :
2008-03-10 19:04:23 +01:00
if conf . config [ ' do_package_tracking ' ] and is_project_dir ( arg ) :
2010-05-19 18:36:38 +02:00
try :
2010-09-09 12:30:49 +02:00
prj = Project ( arg )
2010-09-09 12:49:53 +02:00
prj . validate_pacs ( validators , opts . verbose_validation )
2010-09-09 12:30:49 +02:00
if not msg :
msg = edit_message ( )
prj . commit ( msg = msg )
2010-08-16 16:27:00 +02:00
except oscerr . ExtRuntimeError , e :
2010-05-19 18:36:38 +02:00
print >> sys . stderr , " ERROR: source_validator failed " , e
return 1
2008-03-10 19:04:23 +01:00
args . remove ( arg )
2007-04-25 01:00:12 +02:00
2008-03-10 19:04:23 +01:00
pacs = findpacs ( args )
2008-05-21 15:44:49 +02:00
2009-08-04 16:12:45 +02:00
if conf . config [ ' check_filelist ' ] and not opts . force :
2009-08-03 15:03:24 +02:00
check_filelist_before_commit ( pacs )
2009-07-31 13:32:34 +02:00
2008-03-10 19:04:23 +01:00
if conf . config [ ' do_package_tracking ' ] and len ( pacs ) > 0 :
prj_paths = { }
single_paths = [ ]
files = { }
2010-09-09 12:30:49 +02:00
# XXX: this is really ugly
pac_objs = { }
2008-03-10 19:04:23 +01:00
# it is possible to commit packages from different projects at the same
# time: iterate over all pacs and put each pac to the right project in the dict
for pac in pacs :
path = os . path . normpath ( os . path . join ( pac . dir , os . pardir ) )
if is_project_dir ( path ) :
pac_path = os . path . basename ( os . path . normpath ( pac . absdir ) )
prj_paths . setdefault ( path , [ ] ) . append ( pac_path )
2010-09-09 12:30:49 +02:00
pac_objs . setdefault ( path , [ ] ) . append ( pac )
2008-03-10 19:04:23 +01:00
files [ pac_path ] = pac . todo
else :
single_paths . append ( pac . dir )
2010-09-09 12:30:49 +02:00
for prj_path , packages in prj_paths . iteritems ( ) :
prj = Project ( prj_path )
2010-09-09 12:49:53 +02:00
prj . validate_pacs ( validators , opts . verbose_validation , * packages )
2010-09-09 12:30:49 +02:00
if not msg :
2010-12-26 13:33:14 +01:00
msg = get_commit_msg ( prj . absdir , pac_objs [ prj_path ] )
2010-09-09 12:30:49 +02:00
prj . commit ( packages , msg = msg , files = files )
2010-12-26 13:33:14 +01:00
store_unlink_file ( prj . absdir , ' _commit_msg ' )
2008-03-10 19:04:23 +01:00
for pac in single_paths :
2010-09-09 12:30:49 +02:00
p = Package ( pac )
2010-09-09 12:49:53 +02:00
p . validate ( validators , opts . verbose_validation )
2010-09-09 12:30:49 +02:00
if not msg :
2010-12-26 13:33:14 +01:00
msg = get_commit_msg ( p . absdir , [ p ] )
2010-09-09 12:30:49 +02:00
p . commit ( msg )
2010-12-26 13:33:14 +01:00
store_unlink_file ( p . absdir , ' _commit_msg ' )
2008-03-10 19:04:23 +01:00
else :
for p in pacs :
2010-09-09 12:30:49 +02:00
p = Package ( pac )
2010-09-09 12:49:53 +02:00
p . validate ( validators , opts . verbose_validation )
2010-09-09 12:30:49 +02:00
if not msg :
2010-12-26 13:33:14 +01:00
msg = get_commit_msg ( p . absdir , [ p ] )
2010-09-09 12:30:49 +02:00
p . commit ( msg )
2010-12-26 13:33:14 +01:00
store_unlink_file ( p . absdir , ' _commit_msg ' )
2006-04-20 16:26:50 +02:00
2008-03-24 21:24:49 +01:00
@cmdln.option ( ' -r ' , ' --revision ' , metavar = ' REV ' ,
2007-07-04 14:55:26 +02:00
help = ' update to specified revision (this option will be ignored '
' if you are going to update the complete project or more than '
' one package) ' )
2008-03-24 21:24:49 +01:00
@cmdln.option ( ' -u ' , ' --unexpand-link ' , action = ' store_true ' ,
help = ' if a package is an expanded link, update to the raw _link file ' )
@cmdln.option ( ' -e ' , ' --expand-link ' , action = ' store_true ' ,
help = ' if a package is a link, update to the expanded sources ' )
2009-09-03 16:56:48 +02:00
@cmdln.option ( ' -s ' , ' --source-service-files ' , action = ' store_true ' ,
2010-11-24 15:34:40 +01:00
help = ' Run local source services after update. ' )
2010-06-08 11:24:10 +02:00
@cmdln.option ( ' -S ' , ' --server-side-source-service-files ' , action = ' store_true ' ,
help = ' Use server side generated sources instead of local generation. ' )
2010-04-22 15:27:54 +02:00
@cmdln.option ( ' -l ' , ' --limit-size ' , metavar = ' limit_size ' ,
help = ' Skip all files with a given size ' )
2007-04-25 01:00:12 +02:00
@cmdln.alias ( ' up ' )
def do_update ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Update a working copy
2006-04-20 16:26:50 +02:00
2009-05-18 16:50:43 +02:00
examples :
2006-04-20 16:26:50 +02:00
2007-04-25 01:00:12 +02:00
1. osc up
If the current working directory is a package , update it .
If the directory is a project directory , update all contained
packages , AND check out newly added packages .
2006-05-23 15:48:58 +02:00
2007-04-25 01:00:12 +02:00
To update only checked out packages , without checking out new
ones , you might want to use " osc up * " from within the project
dir .
2006-05-23 15:48:58 +02:00
2007-04-25 01:00:12 +02:00
2. osc up PAC
Update the packages specified by the path argument ( s )
2006-04-20 16:26:50 +02:00
2008-03-24 21:24:49 +01:00
When - - expand - link is used with source link packages , the expanded
sources will be checked out . Without this option , the _link file and
patches will be checked out . The option - - unexpand - link can be used to
switch back to the " raw " source with a _link file plus patch ( es ) .
2007-04-25 01:00:12 +02:00
$ { cmd_usage }
$ { cmd_option_list }
"""
2006-04-20 16:26:50 +02:00
2009-08-12 01:01:03 +02:00
if ( opts . expand_link and opts . unexpand_link ) \
or ( opts . expand_link and opts . revision ) \
or ( opts . unexpand_link and opts . revision ) :
raise oscerr . WrongOptions ( ' Sorry, the options --expand-link, --unexpand-link and '
' --revision are mutually exclusive. ' )
2007-04-25 01:00:12 +02:00
args = parseargs ( args )
2008-08-20 21:24:55 +02:00
arg_list = args [ : ]
2006-04-24 14:04:20 +02:00
2008-08-20 21:24:55 +02:00
for arg in arg_list :
2007-04-25 01:00:12 +02:00
if is_project_dir ( arg ) :
2010-02-09 20:57:10 +01:00
prj = Project ( arg , progress_obj = self . download_progress )
2006-04-20 16:26:50 +02:00
2008-03-10 19:04:23 +01:00
if conf . config [ ' do_package_tracking ' ] :
2009-05-18 16:50:43 +02:00
prj . update ( expand_link = opts . expand_link ,
2008-03-24 21:24:49 +01:00
unexpand_link = opts . unexpand_link )
2008-03-10 19:04:23 +01:00
args . remove ( arg )
2009-05-18 16:50:43 +02:00
else :
# if not tracking package, and 'update' is run inside a project dir,
2008-03-10 19:04:23 +01:00
# it should do the following:
# (a) update all packages
args + = prj . pacs_have
# (b) fetch new packages
2010-01-21 14:47:04 +01:00
prj . checkout_missing_pacs ( expand_link = not opts . unexpand_link )
2008-03-10 19:04:23 +01:00
args . remove ( arg )
2009-09-18 03:10:41 +02:00
print_request_list ( prj . apiurl , prj . name )
2006-06-06 12:50:40 +02:00
2009-06-09 11:34:25 +02:00
args . sort ( )
2010-02-09 20:57:10 +01:00
pacs = findpacs ( args , progress_obj = self . download_progress )
2006-04-20 16:26:50 +02:00
2010-02-09 00:08:21 +01:00
if opts . revision and len ( args ) == 1 :
2007-07-04 14:55:26 +02:00
rev , dummy = parseRevisionOption ( opts . revision )
2008-02-18 14:44:20 +01:00
if not checkRevision ( pacs [ 0 ] . prjname , pacs [ 0 ] . name , rev , pacs [ 0 ] . apiurl ) :
2007-07-06 13:54:34 +02:00
print >> sys . stderr , ' Revision \' %s \' does not exist ' % rev
sys . exit ( 1 )
2007-07-04 14:55:26 +02:00
else :
rev = None
2007-04-25 01:00:12 +02:00
for p in pacs :
if len ( pacs ) > 1 :
print ' Updating %s ' % p . name
2008-03-24 21:24:49 +01:00
2010-08-25 11:55:56 +02:00
# this shouldn't be needed anymore with the new update mechanism
# an expand/unexpand update is treated like a normal update (there's nothing special)
2010-01-20 17:55:44 +01:00
# FIXME: ugly workaround for #399247
2010-08-25 11:55:56 +02:00
# if opts.expand_link or opts.unexpand_link:
# if [ i for i in p.filenamelist+p.filenamelist_unvers if p.status(i) != ' ' and p.status(i) != '?']:
# print >>sys.stderr, 'osc: cannot expand/unexpand because your working ' \
# 'copy has local modifications.\nPlease revert/commit them ' \
# 'and try again.'
# sys.exit(1)
2009-04-06 22:08:14 +02:00
2008-11-19 13:13:18 +01:00
if not rev :
if opts . expand_link and p . islink ( ) and not p . isexpanded ( ) :
2010-01-20 17:55:44 +01:00
if p . haslinkerror ( ) :
try :
2010-08-19 13:43:48 +02:00
rev = show_upstream_xsrcmd5 ( p . apiurl , p . prjname , p . name , revision = p . rev )
2010-01-20 17:55:44 +01:00
except :
2010-08-19 13:43:48 +02:00
rev = show_upstream_xsrcmd5 ( p . apiurl , p . prjname , p . name , revision = p . rev , linkrev = ' base ' )
2010-01-20 17:55:44 +01:00
p . mark_frozen ( )
else :
2010-06-08 11:24:10 +02:00
p . update ( rev , opts . server_side_source_service_files , opts . limit_size )
2010-01-20 17:55:44 +01:00
rev = p . linkinfo . xsrcmd5
print ' Expanding to rev ' , rev
2008-11-19 13:13:18 +01:00
elif opts . unexpand_link and p . islink ( ) and p . isexpanded ( ) :
print ' Unexpanding to rev ' , p . linkinfo . lsrcmd5
2010-06-08 11:24:10 +02:00
p . update ( rev , opts . server_side_source_service_files , opts . limit_size )
2008-11-19 13:13:18 +01:00
rev = p . linkinfo . lsrcmd5
elif p . islink ( ) and p . isexpanded ( ) :
2009-04-21 18:52:26 +02:00
rev = p . latest_rev ( )
2008-03-24 21:24:49 +01:00
2010-06-08 11:24:10 +02:00
p . update ( rev , opts . server_side_source_service_files , opts . limit_size )
if opts . source_service_files :
print ' Running local source services '
p . run_source_services ( )
2010-01-20 17:55:44 +01:00
if opts . unexpand_link :
p . unmark_frozen ( )
2008-06-11 10:29:27 +02:00
rev = None
2009-09-18 03:10:41 +02:00
print_request_list ( p . apiurl , p . prjname , p . name )
2009-05-18 16:50:43 +02:00
2006-05-22 12:50:37 +02:00
2008-03-10 19:04:23 +01:00
@cmdln.option ( ' -f ' , ' --force ' , action = ' store_true ' ,
2009-05-04 21:07:05 +02:00
help = ' forces removal of entire package and its files ' )
2007-04-25 01:00:12 +02:00
@cmdln.alias ( ' rm ' )
@cmdln.alias ( ' del ' )
@cmdln.alias ( ' remove ' )
def do_delete ( self , subcmd , opts , * args ) :
2009-10-08 16:21:43 +02:00
""" $ {cmd_name} : Mark files or package directories to be deleted upon the next ' checkin '
2006-05-22 12:50:37 +02:00
2009-05-18 16:50:43 +02:00
usage :
2009-10-08 16:21:43 +02:00
cd . . . / PROJECT / PACKAGE
osc delete FILE [ . . . ]
cd . . . / PROJECT
osc delete PACKAGE [ . . . ]
2009-05-04 21:07:05 +02:00
This command works on check out copies . Use " rdelete " for working on server
side only . This is needed for removing the entire project .
2009-10-08 16:21:43 +02:00
As a safety measure , projects must be empty ( i . e . , you need to delete all
2009-10-20 16:30:15 +02:00
packages first ) .
2009-10-08 16:21:43 +02:00
If you are sure that you want to remove a package and all
its files use \' --force \' switch. Sometimes this also works without --force.
2009-05-04 21:07:05 +02:00
2007-04-25 01:00:12 +02:00
$ { cmd_option_list }
"""
2006-05-22 12:50:37 +02:00
2007-04-25 01:00:12 +02:00
if not 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
raise oscerr . WrongArgs ( ' Missing argument. \n \n ' \
+ self . get_cmd_help ( ' delete ' ) )
2006-06-26 17:11:22 +02:00
2007-04-25 01:00:12 +02:00
args = parseargs ( args )
2008-03-10 19:04:23 +01:00
# check if args contains a package which was removed by
# a non-osc command and mark it with the 'D'-state
2008-08-20 21:24:55 +02:00
arg_list = args [ : ]
for i in arg_list :
2008-03-10 19:04:23 +01:00
if not os . path . exists ( i ) :
prj_dir , pac_dir = getPrjPacPaths ( i )
if is_project_dir ( prj_dir ) :
prj = Project ( prj_dir , False )
if i in prj . pacs_broken :
if prj . get_state ( i ) != ' A ' :
prj . set_state ( pac_dir , ' D ' )
else :
prj . del_package_node ( i )
print statfrmt ( ' D ' , getTransActPath ( i ) )
args . remove ( i )
prj . write_packages ( )
2007-04-25 01:00:12 +02:00
pacs = findpacs ( args )
2006-04-20 16:26:50 +02:00
2007-04-25 01:00:12 +02:00
for p in pacs :
2008-03-10 19:04:23 +01:00
if not p . todo :
prj_dir , pac_dir = getPrjPacPaths ( p . absdir )
2009-05-04 21:07:05 +02:00
if is_project_dir ( prj_dir ) :
2009-10-20 16:30:15 +02:00
if conf . config [ ' do_package_tracking ' ] :
prj = Project ( prj_dir , False )
prj . delPackage ( p , opts . force )
else :
2011-01-05 16:31:02 +01:00
print >> sys . stderr , " WARNING: package tracking is disabled, operation skipped ! "
2008-03-10 19:04:23 +01:00
else :
pathn = getTransActPath ( p . dir )
for filename in p . todo :
2010-07-28 12:13:46 +02:00
p . clear_from_conflictlist ( filename )
2009-07-15 23:10:38 +02:00
ret , state = p . delete_file ( filename , opts . force )
if ret :
print statfrmt ( ' D ' , os . path . join ( pathn , filename ) )
continue
if state == ' ? ' :
2008-03-10 19:04:23 +01:00
sys . exit ( ' \' %s \' is not under version control ' % filename )
2009-07-15 23:10:38 +02:00
elif state in [ ' A ' , ' M ' ] and not opts . force :
sys . exit ( ' \' %s \' has local modifications (use --force to remove this file) ' % filename )
2011-01-18 19:38:33 +01:00
elif state == ' S ' :
sys . exit ( ' \' %s \' is marked as skipped and no local file with this name exists ' % filename )
2006-05-23 15:48:58 +02:00
2007-04-25 01:00:12 +02:00
def do_resolved ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Remove ' conflicted ' state on working copy files
2009-05-18 16:50:43 +02:00
2007-04-25 01:00:12 +02:00
If an upstream change can ' t be merged automatically, a file is put into
in ' conflicted ' ( ' C ' ) state . Within the file , conflicts are marked with
special << << << < as well as == == == == and >> >> >> > lines .
2009-05-18 16:50:43 +02:00
2007-04-25 01:00:12 +02:00
After manually resolving all conflicting parts , use this command to
remove the ' conflicted ' state .
Note : this subcommand does not semantically resolve conflicts or
remove conflict markers ; it merely removes the conflict - related
artifact files and allows PATH to be committed again .
2006-05-23 15:48:58 +02:00
2009-05-18 16:50:43 +02:00
usage :
2007-04-25 01:00:12 +02:00
osc resolved FILE [ FILE . . . ]
$ { cmd_option_list }
"""
2006-05-23 15:48:58 +02:00
2007-04-25 01:00:12 +02:00
if not 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
raise oscerr . WrongArgs ( ' Missing argument. \n \n ' \
+ self . get_cmd_help ( ' resolved ' ) )
2006-04-20 16:26:50 +02:00
2007-04-25 01:00:12 +02:00
args = parseargs ( args )
pacs = findpacs ( args )
2006-04-28 17:37:25 +02:00
2007-04-25 01:00:12 +02:00
for p in pacs :
for filename in p . todo :
print ' Resolved conflicted state of " %s " ' % filename
p . clear_from_conflictlist ( filename )
2006-04-20 16:26:50 +02:00
2010-07-28 16:04:27 +02:00
@cmdln.alias ( ' dists ' )
2010-07-29 07:37:54 +02:00
# FIXME: using just ^DISCONTINUED as match is not a general approach and only valid for one instance
# we need to discuss an api call for that, if we need this
# @cmdln.option('-d', '--discontinued', action='store_true',
# help='show discontinued distributions')
2010-07-28 16:04:27 +02:00
def do_distributions ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Shows all available distributions
2010-08-13 00:30:05 +02:00
This command shows the available distributions . For active distributions
it shows the name , project and name of the repository and a suggested default repository name .
2010-07-28 16:04:27 +02:00
usage :
osc distributions
$ { cmd_option_list }
"""
apiurl = self . get_api_url ( )
2010-07-29 07:37:54 +02:00
print ' \n ' . join ( get_distibutions ( apiurl ) ) #FIXME:, opts.discontinued))
2010-07-28 16:04:27 +02:00
2009-05-15 11:24:53 +02:00
@cmdln.hide ( 1 )
2007-05-04 23:51:54 +02:00
def do_results_meta ( self , subcmd , opts , * args ) :
2009-05-25 13:33:04 +02:00
print " Command results_meta is obsolete. Please use: osc results --xml "
2009-05-15 11:24:53 +02:00
sys . exit ( 1 )
2006-05-22 16:12:06 +02:00
2009-05-25 13:33:04 +02:00
@cmdln.hide ( 1 )
2009-08-20 21:28:05 +02:00
@cmdln.option ( ' -l ' , ' --last-build ' , action = ' store_true ' ,
help = ' show last build results (succeeded/failed/unknown) ' )
@cmdln.option ( ' -r ' , ' --repo ' , action = ' append ' , default = [ ] ,
help = ' Show results only for specified repo(s) ' )
@cmdln.option ( ' -a ' , ' --arch ' , action = ' append ' , default = [ ] ,
help = ' Show results only for specified architecture(s) ' )
@cmdln.option ( ' ' , ' --xml ' , action = ' store_true ' ,
help = ' generate output in XML (former results_meta) ' )
2009-05-25 13:33:04 +02:00
def do_rresults ( self , subcmd , opts , * args ) :
2009-08-20 21:28:05 +02:00
print " Command rresults is obsolete. Running ' osc results ' instead "
self . do_results ( ' results ' , opts , * args )
2009-05-25 13:33:04 +02:00
sys . exit ( 1 )
2009-05-18 16:50:43 +02:00
2009-07-07 16:30:15 +02:00
@cmdln.option ( ' -f ' , ' --force ' , action = ' store_true ' , default = False ,
help = " Don ' t ask and delete files " )
def do_rremove ( self , subcmd , opts , project , package , * files ) :
""" $ {cmd_name} : Remove source files from selected package
$ { cmd_usage }
$ { cmd_option_list }
"""
2010-08-13 00:30:05 +02:00
apiurl = self . get_api_url ( )
2009-07-07 16:30:15 +02:00
if len ( files ) == 0 :
if not ' / ' in project :
raise oscerr . WrongArgs ( " Missing operand, type osc help rremove for help " )
else :
files = ( package , )
project , package = project . split ( ' / ' )
2010-08-20 14:34:41 +02:00
for filename in files :
2009-07-07 16:30:15 +02:00
if not opts . force :
2010-08-20 14:34:41 +02:00
resp = raw_input ( " rm: remove source file ` %s ' from ` %s / %s ' ? (yY|nN) " % ( filename , project , package ) )
2009-07-07 16:30:15 +02:00
if resp not in ( ' y ' , ' Y ' ) :
continue
try :
2010-08-20 14:34:41 +02:00
delete_files ( apiurl , project , package , ( filename , ) )
2009-07-07 16:30:15 +02:00
except urllib2 . HTTPError , e :
if opts . force :
2009-12-25 00:39:13 +01:00
print >> sys . stderr , e
2009-07-07 16:30:15 +02:00
body = e . read ( )
if e . code in [ 400 , 403 , 404 , 500 ] :
if ' <summary> ' in body :
msg = body . split ( ' <summary> ' ) [ 1 ]
msg = msg . split ( ' </summary> ' ) [ 0 ]
print >> sys . stderr , msg
else :
raise e
2008-06-17 08:12:48 +02:00
@cmdln.alias ( ' r ' )
2009-02-23 13:25:56 +01:00
@cmdln.option ( ' -l ' , ' --last-build ' , action = ' store_true ' ,
help = ' show last build results (succeeded/failed/unknown) ' )
2009-05-15 10:48:32 +02:00
@cmdln.option ( ' -r ' , ' --repo ' , action = ' append ' , default = [ ] ,
2009-05-15 09:16:26 +02:00
help = ' Show results only for specified repo(s) ' )
2009-05-15 10:48:32 +02:00
@cmdln.option ( ' -a ' , ' --arch ' , action = ' append ' , default = [ ] ,
2009-05-15 09:16:26 +02:00
help = ' Show results only for specified architecture(s) ' )
2010-05-06 14:23:27 +02:00
@cmdln.option ( ' -v ' , ' --verbose ' , action = ' store_true ' , default = False ,
help = ' more verbose output ' )
2010-04-20 15:38:52 +02:00
@cmdln.option ( ' ' , ' --xml ' , action = ' store_true ' , default = False ,
2009-05-15 11:24:53 +02:00
help = ' generate output in XML (former results_meta) ' )
2010-04-20 15:38:52 +02:00
@cmdln.option ( ' ' , ' --csv ' , action = ' store_true ' , default = False ,
help = ' generate output in CSV format ' )
@cmdln.option ( ' ' , ' --format ' , default = ' %(repository)s | %(arch)s | %(state)s | %(dirty)s | %(code)s | %(details)s ' ,
help = ' format string for csv output ' )
2007-04-25 01:00:12 +02:00
def do_results ( self , subcmd , opts , * args ) :
2010-12-02 23:36:40 +01:00
""" $ {cmd_name} : Shows the build results of a package or project
2006-04-20 16:26:50 +02:00
2009-05-25 12:41:16 +02:00
Usage :
2010-12-02 23:36:40 +01:00
osc results # (inside working copy of PRJ or PKG)
osc results PROJECT [ PACKAGE ]
2008-05-16 14:25:50 +02:00
$ { cmd_option_list }
"""
2009-05-25 13:33:04 +02:00
2009-05-10 22:29:34 +02:00
args = slash_split ( args )
2009-08-20 21:28:05 +02:00
2010-04-30 17:13:21 +02:00
apiurl = self . get_api_url ( )
2010-12-02 23:36:40 +01:00
if len ( args ) < 2 :
2009-05-25 13:33:04 +02:00
wd = os . curdir
2010-01-14 15:20:00 +01:00
if is_project_dir ( wd ) :
2010-01-15 10:29:07 +01:00
opts . csv = None
2010-06-21 17:10:25 +02:00
if opts . arch == [ ] :
opts . arch = None
if opts . repo == [ ] :
opts . repo = None
2010-01-15 10:29:07 +01:00
opts . hide_legend = None
opts . name_filter = None
opts . status_filter = None
2010-01-15 11:00:50 +01:00
opts . vertical = None
2010-07-28 15:38:01 +02:00
opts . show_non_building = None
2010-08-30 16:28:10 +02:00
opts . show_excluded = None
2010-02-27 20:11:15 +01:00
self . do_prjresults ( ' prjresults ' , opts , * args )
2010-01-14 20:25:14 +01:00
sys . exit ( 0 )
2010-01-14 15:20:00 +01:00
else :
2010-01-14 20:25:14 +01:00
project = store_read_project ( wd )
package = store_read_package ( wd )
2009-05-10 22:29:34 +02:00
elif len ( args ) > 2 :
2010-12-02 23:36:40 +01:00
raise oscerr . WrongArgs ( ' Too many arguments (required none, one, or two) ' )
2009-05-25 13:33:04 +02:00
else :
project = args [ 0 ]
package = args [ 1 ]
2009-05-18 16:50:43 +02:00
2010-04-20 15:38:52 +02:00
if opts . xml and opts . csv :
raise oscerr . WrongOptions ( " --xml and --csv are mutual exclusive " )
2010-05-06 14:23:27 +02:00
args = [ apiurl , project , package , opts . last_build , opts . repo , opts . arch ]
2010-04-20 15:38:52 +02:00
if opts . xml :
2011-02-17 01:30:19 +01:00
print ' ' . join ( show_results_meta ( * args ) ) ,
2010-04-20 15:38:52 +02:00
elif opts . csv :
2010-12-06 21:44:38 +01:00
print ' \n ' . join ( format_results ( get_package_results ( * args ) , opts . format ) )
2010-04-20 15:38:52 +02:00
else :
2010-05-06 14:23:27 +02:00
args . append ( opts . verbose )
2010-12-06 21:44:38 +01:00
print ' \n ' . join ( get_results ( * args ) )
2009-05-18 16:50:43 +02:00
2010-01-14 15:20:00 +01:00
# WARNING: this function is also called by do_results. You need to set a default there
# as well when adding a new option!
2008-05-15 20:09:24 +02:00
@cmdln.option ( ' -q ' , ' --hide-legend ' , action = ' store_true ' ,
help = ' hide the legend ' )
2008-03-13 12:13:22 +01:00
@cmdln.option ( ' -c ' , ' --csv ' , action = ' store_true ' ,
2008-02-12 13:45:06 +01:00
help = ' csv output ' )
2008-05-15 20:09:24 +02:00
@cmdln.option ( ' -s ' , ' --status-filter ' , metavar = ' STATUS ' ,
help = ' show only packages with buildstatus STATUS (see legend) ' )
@cmdln.option ( ' -n ' , ' --name-filter ' , metavar = ' EXPR ' ,
2008-08-19 21:37:08 +02:00
help = ' show only packages whose names match EXPR ' )
2009-10-15 16:24:12 +02:00
@cmdln.option ( ' -a ' , ' --arch ' , metavar = ' ARCH ' ,
help = ' show results only for specified architecture(s) ' )
@cmdln.option ( ' -r ' , ' --repo ' , metavar = ' REPO ' ,
help = ' show results only for specified repo(s) ' )
2010-01-11 16:36:21 +01:00
@cmdln.option ( ' -V ' , ' --vertical ' , action = ' store_true ' ,
help = ' list packages vertically instead horizontally ' )
2010-08-04 17:16:59 +02:00
@cmdln.option ( ' --show-excluded ' , action = ' store_true ' ,
help = ' show packages that are excluded in all repos, also hide repos that have only excluded packages ' )
2008-06-17 08:12:48 +02:00
@cmdln.alias ( ' pr ' )
2007-04-25 01:00:12 +02:00
def do_prjresults ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Shows project-wide build results
2009-05-18 16:50:43 +02:00
2009-05-25 13:33:04 +02:00
Usage :
osc prjresults ( inside working copy )
2010-01-11 16:36:21 +01:00
osc prjresults PROJECT
2008-08-19 21:37:08 +02:00
2007-04-25 01:00:12 +02:00
$ { cmd_option_list }
"""
2010-04-30 17:13:21 +02:00
apiurl = self . get_api_url ( )
2006-04-29 22:44:09 +02:00
2009-05-25 13:33:04 +02:00
if args :
if len ( args ) == 1 :
project = args [ 0 ]
2008-08-19 21:37:08 +02:00
else :
2010-01-11 16:36:21 +01:00
raise oscerr . WrongArgs ( ' Wrong number of arguments. ' )
2009-05-25 13:33:04 +02:00
else :
wd = os . curdir
2008-08-19 21:37:08 +02:00
project = store_read_project ( wd )
2006-05-23 15:48:58 +02:00
2010-08-04 17:16:59 +02:00
print ' \n ' . join ( get_prj_results ( apiurl , project , hide_legend = opts . hide_legend , csv = opts . csv , status_filter = opts . status_filter , name_filter = opts . name_filter , repo = opts . repo , arch = opts . arch , vertical = opts . vertical , show_excluded = opts . show_excluded ) )
2007-04-25 01:00:12 +02:00
2008-05-16 14:25:50 +02:00
@cmdln.option ( ' -q ' , ' --hide-legend ' , action = ' store_true ' ,
help = ' hide the legend ' )
@cmdln.option ( ' -c ' , ' --csv ' , action = ' store_true ' ,
help = ' csv output ' )
@cmdln.option ( ' -s ' , ' --status-filter ' , metavar = ' STATUS ' ,
help = ' show only packages with buildstatus STATUS (see legend) ' )
@cmdln.option ( ' -n ' , ' --name-filter ' , metavar = ' EXPR ' ,
2008-08-19 21:37:08 +02:00
help = ' show only packages whose names match EXPR ' )
2008-05-16 14:25:50 +02:00
2009-05-25 13:33:04 +02:00
@cmdln.hide ( 1 )
def do_rprjresults ( self , subcmd , opts , * args ) :
print " Command rprjresults is obsolete. Please use ' osc prjresults ' "
sys . exit ( 1 )
2009-05-18 16:50:43 +02:00
2007-07-12 01:24:26 +02:00
@cmdln.alias ( ' bl ' )
2011-01-07 23:05:44 +01:00
@cmdln.alias ( ' blt ' )
@cmdln.alias ( ' buildlogtail ' )
@cmdln.option ( ' -o ' , ' --offset ' , metavar = ' OFFSET ' ,
help = ' get log start or end from the offset ' )
2009-11-23 11:13:19 +01:00
def do_buildlog ( self , subcmd , opts , * args ) :
2007-04-25 01:00:12 +02:00
""" $ {cmd_name} : Shows the build log of a package
Shows the log file of the build of a package . Can be used to follow the
log while it is being written .
Needs to be called from within a package directory .
2006-05-23 15:48:58 +02:00
2011-01-07 23:05:44 +01:00
When called as buildlogtail ( or blt ) it just shows the end of the logfile .
This is usefull to see just a build failure reasons .
2009-09-08 10:14:27 +02:00
The arguments REPOSITORY and ARCH are the first two columns in the ' osc
2010-02-16 13:49:14 +01:00
results ' output. If the buildlog url is used buildlog command has the
same behavior as remotebuildlog .
2007-04-25 01:00:12 +02:00
2010-02-16 13:49:14 +01:00
$ { cmd_usage } [ REPOSITORY ARCH | BUILDLOGURL ]
2007-04-25 01:00:12 +02:00
$ { cmd_option_list }
"""
2010-02-16 13:49:14 +01:00
repository = arch = None
2010-04-30 17:13:21 +02:00
apiurl = self . get_api_url ( )
2010-02-16 13:49:14 +01:00
if len ( args ) == 1 and args [ 0 ] . startswith ( ' http ' ) :
apiurl , project , package , repository , arch = parse_buildlogurl ( args [ 0 ] )
2010-07-26 19:02:48 +02:00
elif len ( args ) < 2 :
self . print_repos ( )
elif len ( args ) > 2 :
raise oscerr . WrongArgs ( ' Too many arguments. ' )
2010-02-16 13:49:14 +01:00
else :
wd = os . curdir
package = store_read_package ( wd )
project = store_read_project ( wd )
2010-07-26 19:02:48 +02:00
repository = args [ 0 ]
arch = args [ 1 ]
2007-03-13 00:21:34 +01:00
2009-05-14 13:09:26 +02:00
offset = 0
2011-01-07 23:05:44 +01:00
if subcmd == " blt " or subcmd == " buildlogtail " :
query = { ' view ' : ' entry ' }
u = makeurl ( self . get_api_url ( ) , [ ' build ' , project , repository , arch , package , ' _log ' ] , query = query )
f = http_GET ( u )
root = ET . parse ( f ) . getroot ( )
offset = int ( root . find ( ' entry ' ) . get ( ' size ' ) )
if opts . offset :
offset = offset - int ( opts . offset )
else :
2011-02-27 14:20:41 +01:00
offset = offset - ( 8 * 1024 )
2011-01-07 23:05:44 +01:00
if offset < 0 :
offset = 0
elif opts . offset :
offset = int ( opts . offset )
2009-05-14 13:09:26 +02:00
2009-09-08 10:14:27 +02:00
print_buildlog ( apiurl , project , package , repository , arch , offset )
2008-01-03 23:10:16 +01:00
2011-03-02 14:38:24 +01:00
def print_repos ( self , repos_only = False , exc_class = oscerr . WrongArgs , exc_msg = ' Missing arguments ' ) :
2010-02-27 20:11:15 +01:00
wd = os . curdir
doprint = False
if is_package_dir ( wd ) :
2010-08-20 14:34:41 +02:00
msg = " package "
2010-02-27 20:11:15 +01:00
doprint = True
elif is_project_dir ( wd ) :
2010-08-20 14:34:41 +02:00
msg = " project "
2010-02-27 20:11:15 +01:00
doprint = True
if doprint :
2010-08-20 14:34:41 +02:00
print ' Valid arguments for this %s are: ' % msg
2010-02-27 20:11:15 +01:00
print
2010-07-30 16:17:41 +02:00
if repos_only :
self . do_repositories ( " repos_only " , None )
else :
self . do_repositories ( None , None )
2011-03-02 14:38:24 +01:00
raise exc_class ( exc_msg )
2009-11-23 11:13:19 +01:00
2008-01-03 23:10:16 +01:00
@cmdln.alias ( ' rbl ' )
2009-05-21 14:05:39 +02:00
@cmdln.alias ( ' rbuildlog ' )
2011-01-07 23:05:44 +01:00
@cmdln.alias ( ' rblt ' )
@cmdln.alias ( ' rbuildlogtail ' )
@cmdln.alias ( ' remotebuildlogtail ' )
@cmdln.option ( ' -o ' , ' --offset ' , metavar = ' OFFSET ' ,
help = ' get log starting or ending from the offset ' )
2008-01-03 23:10:16 +01:00
def do_remotebuildlog ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Shows the build log of a package
Shows the log file of the build of a package . Can be used to follow the
log while it is being written .
2011-01-07 23:05:44 +01:00
remotebuildlogtail shows just the tail of the log file .
2008-01-03 23:10:16 +01:00
usage :
2009-09-08 10:14:27 +02:00
osc remotebuildlog project package repository arch
2008-01-03 23:10:16 +01:00
or
2009-09-08 10:14:27 +02:00
osc remotebuildlog project / package / repository / arch
2010-02-16 12:23:25 +01:00
or
osc remotebuildlog buildlogurl
2008-01-03 23:10:16 +01:00
$ { cmd_option_list }
"""
2010-01-28 20:00:34 +01:00
if len ( args ) == 1 and args [ 0 ] . startswith ( ' http ' ) :
2010-01-28 13:20:11 +01:00
apiurl , project , package , repository , arch = parse_buildlogurl ( args [ 0 ] )
else :
args = slash_split ( args )
2010-07-29 17:29:07 +02:00
apiurl = self . get_api_url ( )
2010-01-28 13:20:11 +01:00
if len ( args ) < 4 :
raise oscerr . WrongArgs ( ' Too few arguments. ' )
elif len ( args ) > 4 :
raise oscerr . WrongArgs ( ' Too many arguments. ' )
else :
project , package , repository , arch = args
2010-02-28 02:30:13 +01:00
2011-01-08 15:06:36 +01:00
offset = 0
2011-01-07 23:05:44 +01:00
if subcmd == " rblt " or subcmd == " rbuildlogtail " or subcmd == " remotebuildlogtail " :
query = { ' view ' : ' entry ' }
u = makeurl ( self . get_api_url ( ) , [ ' build ' , project , repository , arch , package , ' _log ' ] , query = query )
f = http_GET ( u )
root = ET . parse ( f ) . getroot ( )
offset = int ( root . find ( ' entry ' ) . get ( ' size ' ) )
if opts . offset :
offset = offset - int ( opts . offset )
else :
2011-02-27 14:20:41 +01:00
offset = offset - ( 8 * 1024 )
2011-01-07 23:05:44 +01:00
if offset < 0 :
offset = 0
elif opts . offset :
offset = int ( opts . offset )
2008-01-03 23:10:16 +01:00
2010-01-28 13:20:11 +01:00
print_buildlog ( apiurl , project , package , repository , arch , offset )
2006-05-23 15:48:58 +02:00
2010-02-12 15:54:33 +01:00
@cmdln.alias ( ' lbl ' )
2011-01-07 23:05:44 +01:00
@cmdln.option ( ' -o ' , ' --offset ' , metavar = ' OFFSET ' ,
2010-02-12 15:54:33 +01:00
help = ' get log starting from offset ' )
2010-02-23 13:41:10 +01:00
def do_localbuildlog ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Shows the build log of a local buildchroot
2010-02-18 14:20:40 +01:00
2010-02-23 13:41:10 +01:00
usage :
osc lbl [ REPOSITORY ARCH ]
osc lbl # show log of newest last local build
2010-02-18 14:20:40 +01:00
$ { cmd_option_list }
"""
2010-02-12 15:54:33 +01:00
if conf . config [ ' build-type ' ] :
2010-02-23 13:41:10 +01:00
# FIXME: raise Exception instead
2010-02-12 15:54:33 +01:00
print >> sys . stderr , ' Not implemented for VMs '
sys . exit ( 1 )
2010-02-23 13:41:10 +01:00
if len ( args ) == 0 :
package = store_read_package ( ' . ' )
import glob
files = glob . glob ( os . path . join ( os . getcwd ( ) , store , " _buildinfo-* " ) )
if not files :
self . print_repos ( )
cfg = files [ 0 ]
# find newest file
for f in files [ 1 : ] :
if os . stat ( f ) . st_mtime > os . stat ( cfg ) . st_mtime :
cfg = f
root = ET . parse ( cfg ) . getroot ( )
project = root . get ( " project " )
repo = root . get ( " repository " )
arch = root . find ( " arch " ) . text
elif len ( args ) == 2 :
project = store_read_project ( ' . ' )
package = store_read_package ( ' . ' )
repo = args [ 0 ]
arch = args [ 1 ]
else :
if is_package_dir ( os . curdir ) :
self . print_repos ( )
raise oscerr . WrongArgs ( ' Wrong number of arguments. ' )
2010-02-12 15:54:33 +01:00
buildroot = os . environ . get ( ' OSC_BUILD_ROOT ' , conf . config [ ' build-root ' ] )
2010-02-23 13:41:10 +01:00
buildroot = buildroot % { ' project ' : project , ' package ' : package ,
2010-02-18 14:20:40 +01:00
' repo ' : repo , ' arch ' : arch }
2010-02-12 15:54:33 +01:00
offset = 0
2011-01-28 15:52:10 +01:00
if opts . offset :
offset = int ( opts . offset )
2010-02-12 15:54:33 +01:00
logfile = os . path . join ( buildroot , ' .build.log ' )
if not os . path . isfile ( logfile ) :
raise oscerr . OscIOError ( None , ' logfile \' %s \' does not exist ' % logfile )
f = open ( logfile , ' r ' )
f . seek ( offset )
data = f . read ( BUFSIZE )
while len ( data ) :
sys . stdout . write ( data )
data = f . read ( BUFSIZE )
f . close ( )
2006-09-25 17:11:03 +02:00
2009-12-09 07:53:33 +01:00
@cmdln.alias ( ' tr ' )
def do_triggerreason ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Show reason why a package got triggered to build
The server decides when a package needs to get rebuild , this command
shows the detailed reason for a package . A brief reason is also stored
in the jobhistory , which can be accessed via " osc jobhistory " .
Trigger reasons might be :
- new build ( never build yet or rebuild manually forced )
- source change ( eg . on updating sources )
- meta change ( packages which are used for building have changed )
- rebuild count sync ( In case that it is configured to sync release numbers )
usage in package or project directory :
osc reason REPOSITORY ARCH
osc reason PROJECT PACKAGE REPOSITORY ARCH
$ { cmd_option_list }
"""
wd = os . curdir
args = slash_split ( args )
project = package = repository = arch = None
2010-02-28 02:30:13 +01:00
2010-02-09 00:08:21 +01:00
if len ( args ) < 2 :
2009-12-09 07:53:33 +01:00
self . print_repos ( )
2010-04-30 17:13:21 +02:00
apiurl = self . get_api_url ( )
2009-12-09 07:53:33 +01:00
if len ( args ) == 2 : # 2
if is_package_dir ( ' . ' ) :
2010-02-27 20:11:15 +01:00
package = store_read_package ( wd )
2009-12-09 07:53:33 +01:00
else :
2010-02-27 20:11:15 +01:00
raise oscerr . WrongArgs ( ' package is not specified. ' )
2009-12-09 07:53:33 +01:00
project = store_read_project ( wd )
repository = args [ 0 ]
arch = args [ 1 ]
elif len ( args ) == 4 :
project = args [ 0 ]
package = args [ 1 ]
repository = args [ 2 ]
arch = args [ 3 ]
else :
raise oscerr . WrongArgs ( ' Too many arguments. ' )
print apiurl , project , package , repository , arch
xml = show_package_trigger_reason ( apiurl , project , package , repository , arch )
2009-12-26 14:22:34 +01:00
root = ET . fromstring ( xml )
reason = root . find ( ' explain ' ) . text
2009-12-09 07:53:33 +01:00
print reason
if reason == " meta change " :
2010-02-27 20:11:15 +01:00
print " changed keys: "
for package in root . findall ( ' packagechange ' ) :
print " " , package . get ( ' change ' ) , package . get ( ' key ' )
2009-12-09 07:53:33 +01:00
2009-12-04 16:20:17 +01:00
# FIXME: the new osc syntax should allow to specify multiple packages
# FIXME: the command should optionally use buildinfo data to show all dependencies
@cmdln.alias ( ' whatdependson ' )
def do_dependson ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Show the build dependencies
The command dependson and whatdependson can be used to find out what
will be triggered when a certain package changes .
This is no guarantee , since the new build might have changed dependencies .
2010-02-28 02:30:13 +01:00
dependson shows the build dependencies inside of a project , valid for a
2009-12-04 16:20:17 +01:00
given repository and architecture .
2010-02-28 02:30:13 +01:00
NOTE : to see all binary packages , which can trigger a build you need to
2009-12-04 16:20:17 +01:00
refer the buildinfo , since this command shows only the dependencies
inside of a project .
The arguments REPOSITORY and ARCH can be taken from the first two columns
of the ' osc repos ' output .
usage in package or project directory :
osc dependson REPOSITORY ARCH
osc whatdependson REPOSITORY ARCH
usage :
osc dependson PROJECT [ PACKAGE ] REPOSITORY ARCH
osc whatdependson PROJECT [ PACKAGE ] REPOSITORY ARCH
$ { cmd_option_list }
"""
wd = os . curdir
args = slash_split ( args )
project = packages = repository = arch = reverse = None
2010-02-28 02:30:13 +01:00
2010-02-09 00:08:21 +01:00
if len ( args ) < 2 and ( is_package_dir ( ' . ' ) or is_project_dir ( ' . ' ) ) :
2009-12-04 16:20:17 +01:00
self . print_repos ( )
if len ( args ) > 5 :
raise oscerr . WrongArgs ( ' Too many arguments. ' )
2010-04-30 17:13:21 +02:00
apiurl = self . get_api_url ( )
2009-12-04 16:20:17 +01:00
if len ( args ) < 3 : # 2
if is_package_dir ( ' . ' ) :
2010-02-27 20:11:15 +01:00
packages = [ store_read_package ( wd ) ]
2009-12-04 16:20:17 +01:00
elif not is_project_dir ( ' . ' ) :
2010-02-27 20:11:15 +01:00
raise oscerr . WrongArgs ( ' Project and package is not specified. ' )
2009-12-04 16:20:17 +01:00
project = store_read_project ( wd )
repository = args [ 0 ]
arch = args [ 1 ]
if len ( args ) == 3 :
project = args [ 0 ]
repository = args [ 1 ]
arch = args [ 2 ]
if len ( args ) == 4 :
project = args [ 0 ]
packages = [ args [ 1 ] ]
repository = args [ 2 ]
arch = args [ 3 ]
if subcmd == ' whatdependson ' :
reverse = 1
xml = get_dependson ( apiurl , project , repository , arch , packages , reverse )
2009-12-26 14:22:34 +01:00
root = ET . fromstring ( xml )
for package in root . findall ( ' package ' ) :
2009-12-04 16:20:17 +01:00
print package . get ( ' name ' ) , " : "
for dep in package . findall ( ' pkgdep ' ) :
2010-02-27 20:11:15 +01:00
print " " , dep . text
2009-12-04 16:20:17 +01:00
2007-05-09 11:36:55 +02:00
@cmdln.option ( ' -x ' , ' --extra-pkgs ' , metavar = ' PAC ' , action = ' append ' ,
help = ' Add this package when computing the buildinfo ' )
2010-07-26 15:41:02 +02:00
@cmdln.option ( ' -p ' , ' --prefer-pkgs ' , metavar = ' DIR ' , action = ' append ' ,
help = ' Prefer packages from this directory when installing the build-root ' )
2007-04-25 01:00:12 +02:00
def do_buildinfo ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Shows the build info
Shows the build " info " which is used in building a package .
This command is mostly used internally by the ' build ' subcommand .
It needs to be called from within a package directory .
The BUILD_DESCR argument is optional . BUILD_DESCR is a local RPM specfile
or Debian " dsc " file . If specified , it is sent to the server , and the
buildinfo will be based on it . If the argument is not supplied , the
buildinfo is derived from the specfile which is currently on the source
repository server .
The returned data is XML and contains a list of the packages used in
building , their source , and the expanded BuildRequires .
2010-09-10 15:17:45 +02:00
The arguments REPOSITORY and ARCH are optional . They can be taken from
the first two columns of the ' osc repos ' output . If not specified ,
REPOSITORY defaults to the ' build_repositoy ' config entry in your ' .oscrc '
and ARCH defaults to your host architecture .
2007-04-25 01:00:12 +02:00
2009-05-18 16:50:43 +02:00
usage :
2010-10-04 15:57:52 +02:00
in a package working copy :
osc buildinfo [ OPTS ] REPOSITORY ARCH BUILD_DESCR
osc buildinfo [ OPTS ] REPOSITORY ( ARCH = hostarch , BUILD_DESCR is detected automatically )
osc buildinfo [ OPTS ] ARCH ( REPOSITORY = build_repository ( config option ) , BUILD_DESCR is detected automatically )
osc buildinfo [ OPTS ] BUILD_DESCR ( REPOSITORY = build_repository ( config option ) , ARCH = hostarch )
osc buildinfo [ OPTS ] ( REPOSITORY = build_repository ( config option ) , ARCH = hostarch , BUILD_DESCR is detected automatically )
Note : if BUILD_DESCR does not exist locally the remote BUILD_DESCR is used
osc buildinfo [ OPTS ] PROJECT PACKAGE REPOSITORY ARCH [ BUILD_DESCR ]
2009-11-06 20:52:28 +01:00
2007-04-25 01:00:12 +02:00
$ { cmd_option_list }
"""
2006-09-25 17:11:03 +02:00
wd = os . curdir
2009-11-06 20:52:28 +01:00
args = slash_split ( args )
2010-02-28 02:30:13 +01:00
2010-10-04 15:57:52 +02:00
project = package = repository = arch = build_descr = None
if len ( args ) < = 3 :
if not is_package_dir ( ' . ' ) :
raise oscerr . WrongArgs ( ' Incorrect number of arguments (Note: \' . \' is no package wc) ' )
project = store_read_project ( ' . ' )
package = store_read_package ( ' . ' )
repository , arch , build_descr = self . parse_repoarchdescr ( args , ignore_descr = True )
2010-09-10 15:17:45 +02:00
elif len ( args ) == 4 or len ( args ) == 5 :
2009-11-06 20:52:28 +01:00
project = args [ 0 ]
package = args [ 1 ]
repository = args [ 2 ]
arch = args [ 3 ]
2010-10-04 15:57:52 +02:00
if len ( args ) == 5 :
build_descr = args [ 4 ]
2010-09-10 15:17:45 +02:00
else :
raise oscerr . WrongArgs ( ' Too many arguments. ' )
apiurl = self . get_api_url ( )
2007-04-25 01:00:12 +02:00
2010-07-26 15:41:02 +02:00
build_descr_data = None
2010-10-04 15:57:52 +02:00
if not build_descr is None :
build_descr_data = open ( build_descr , ' r ' ) . read ( )
2010-07-26 15:41:02 +02:00
if opts . prefer_pkgs and build_descr_data is None :
raise oscerr . WrongArgs ( ' error: a build description is needed if \' --prefer-pkgs \' is used ' )
elif opts . prefer_pkgs :
from build import get_prefer_pkgs
print ' Scanning the following dirs for local packages: %s ' % ' , ' . join ( opts . prefer_pkgs )
prefer_pkgs , cpio = get_prefer_pkgs ( opts . prefer_pkgs , arch , os . path . splitext ( args [ 2 ] ) [ 1 ] )
cpio . add ( os . path . basename ( args [ 2 ] ) , build_descr_data )
build_descr_data = cpio . get ( )
2007-04-25 01:00:12 +02:00
2009-05-18 16:50:43 +02:00
print ' ' . join ( get_buildinfo ( apiurl ,
2009-09-08 10:14:27 +02:00
project , package , repository , arch ,
2010-07-26 15:41:02 +02:00
specfile = build_descr_data ,
2007-05-09 11:36:55 +02:00
addlist = opts . extra_pkgs ) )
2007-04-25 01:00:12 +02:00
2006-09-25 17:11:03 +02:00
2009-11-06 20:52:28 +01:00
def do_buildconfig ( self , subcmd , opts , * args ) :
2007-04-25 01:00:12 +02:00
""" $ {cmd_name} : Shows the build config
Shows the build configuration which is used in building a package .
This command is mostly used internally by the ' build ' command .
The returned data is the project - wide build configuration in a format
which is directly readable by the build script . It contains RPM macros
and BuildRequires expansions , for example .
2010-07-27 13:58:52 +02:00
The argument REPOSITORY an be taken from the first column of the
' osc repos ' output .
2007-04-25 01:00:12 +02:00
2009-11-06 20:52:28 +01:00
usage :
2010-07-27 13:58:52 +02:00
osc buildconfig REPOSITORY ( in pkg or prj dir )
osc buildconfig PROJECT REPOSITORY
2007-04-25 01:00:12 +02:00
$ { cmd_option_list }
"""
wd = os . curdir
2009-11-06 20:52:28 +01:00
args = slash_split ( args )
2010-02-28 02:30:13 +01:00
2010-07-27 13:58:52 +02:00
if len ( args ) < 1 and ( is_package_dir ( ' . ' ) or is_project_dir ( ' . ' ) ) :
2010-07-30 16:17:41 +02:00
self . print_repos ( True )
2009-11-06 20:52:28 +01:00
2010-07-27 13:58:52 +02:00
if len ( args ) > 2 :
2009-11-06 20:52:28 +01:00
raise oscerr . WrongArgs ( ' Too many arguments. ' )
2010-04-30 17:13:21 +02:00
apiurl = self . get_api_url ( )
2010-07-27 13:58:52 +02:00
if len ( args ) == 1 :
2010-07-30 16:17:41 +02:00
#FIXME: check if args[0] is really a repo and not a project, need a is_project() function for this
2009-11-06 20:52:28 +01:00
project = store_read_project ( wd )
repository = args [ 0 ]
2010-07-27 13:58:52 +02:00
elif len ( args ) == 2 :
2009-11-06 20:52:28 +01:00
project = args [ 0 ]
2010-07-27 13:58:52 +02:00
repository = args [ 1 ]
2009-11-06 20:52:28 +01:00
else :
raise oscerr . WrongArgs ( ' Wrong number of arguments. ' )
2006-09-25 17:11:03 +02:00
2010-07-27 13:58:52 +02:00
print ' ' . join ( get_buildconfig ( apiurl , project , repository ) )
2006-09-25 17:11:03 +02:00
2006-05-23 15:48:58 +02:00
2010-07-29 16:59:54 +02:00
@cmdln.alias ( ' repos ' )
@cmdln.alias ( ' platforms ' )
def do_repositories ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : shows repositories configured for a project.
It skips repositories by default which are disabled for a given package .
2006-06-22 13:26:01 +02:00
2009-11-30 10:57:39 +01:00
usage :
osc repos
2010-07-12 14:56:08 +02:00
osc repos [ PROJECT ] [ PACKAGE ]
2006-09-25 17:11:03 +02:00
2007-04-25 01:00:12 +02:00
$ { cmd_option_list }
"""
2006-09-15 13:47:34 +02:00
2010-04-30 17:13:21 +02:00
apiurl = self . get_api_url ( )
2010-07-29 16:59:54 +02:00
project = None
2010-07-12 14:56:08 +02:00
package = None
disabled = None
2006-09-15 13:47:34 +02:00
2009-11-30 10:57:39 +01:00
if len ( args ) == 1 :
project = args [ 0 ]
2010-07-29 16:59:54 +02:00
elif len ( args ) == 2 :
2010-07-12 14:56:08 +02:00
project = args [ 0 ]
package = args [ 1 ]
2009-11-30 10:57:39 +01:00
elif len ( args ) == 0 :
2010-07-12 14:56:08 +02:00
if is_package_dir ( ' . ' ) :
package = store_read_package ( ' . ' )
project = store_read_project ( ' . ' )
elif is_project_dir ( ' . ' ) :
project = store_read_project ( ' . ' )
2009-11-30 10:57:39 +01:00
else :
raise oscerr . WrongArgs ( ' Wrong number of arguments ' )
2006-07-05 12:25:31 +02:00
2010-07-29 16:59:54 +02:00
if project is None :
raise oscerr . WrongArgs ( ' No project specified ' )
2010-07-12 14:56:08 +02:00
if package is not None :
disabled = show_package_disabled_repos ( apiurl , project , package )
2010-07-30 16:17:41 +02:00
if subcmd == ' repos_only ' :
for repo in get_repositories_of_project ( apiurl , project ) :
if ( disabled is None ) or ( ( disabled is not None ) and ( repo not in disabled ) ) :
print repo
else :
data = [ ]
for repo in get_repos_of_project ( apiurl , project ) :
if ( disabled is None ) or ( ( disabled is not None ) and ( repo . name not in disabled ) ) :
data + = [ repo . name , repo . arch ]
for row in build_table ( 2 , data , width = 2 ) :
print row
2006-07-05 12:25:31 +02:00
2010-01-30 16:18:30 +01:00
2010-10-04 15:57:52 +02:00
def parse_repoarchdescr ( self , args , noinit = False , alternative_project = None , ignore_descr = False ) :
2010-01-30 16:18:30 +01:00
""" helper to parse the repo, arch and build description from args """
import osc . build
2010-04-27 18:18:34 +02:00
import glob
2010-01-30 16:18:30 +01:00
arg_arch = arg_repository = arg_descr = None
if len ( args ) < 3 :
for arg in args :
if arg . endswith ( ' .spec ' ) or arg . endswith ( ' .dsc ' ) or arg . endswith ( ' .kiwi ' ) :
arg_descr = arg
else :
if arg in osc . build . can_also_build . get ( osc . build . hostarch , [ ] ) or \
arg in osc . build . hostarch :
arg_arch = arg
elif not arg_repository :
arg_repository = arg
else :
raise oscerr . WrongArgs ( ' unexpected argument: \' %s \' ' % arg )
else :
arg_repository , arg_arch , arg_descr = args
arg_arch = arg_arch or osc . build . hostarch
2010-04-29 14:25:38 +02:00
repositories = [ ]
# store list of repos for potential offline use
2011-01-06 14:10:59 +01:00
repolistfile = os . path . join ( os . getcwd ( ) , osc . core . store , " _build_repositories " )
2010-04-29 14:25:38 +02:00
if noinit :
if os . path . exists ( repolistfile ) :
f = open ( repolistfile , ' r ' )
repositories = [ l . strip ( ) for l in f . readlines ( ) ]
f . close ( )
else :
2010-01-30 16:18:30 +01:00
project = alternative_project or store_read_project ( ' . ' )
2010-06-30 13:37:26 +02:00
apiurl = self . get_api_url ( )
repositories = get_repositories_of_project ( apiurl , project )
2010-01-30 16:18:30 +01:00
if not len ( repositories ) :
raise oscerr . WrongArgs ( ' no repositories defined for project \' %s \' ' % project )
2010-05-07 11:56:42 +02:00
try :
f = open ( repolistfile , ' w ' )
f . write ( ' \n ' . join ( repositories ) + ' \n ' )
f . close ( )
except :
pass
2010-04-29 14:25:38 +02:00
if not arg_repository and len ( repositories ) :
# Use a default value from config, but just even if it's available
# unless try standard, or openSUSE_Factory
arg_repository = repositories [ - 1 ]
for repository in ( conf . config [ ' build_repository ' ] , ' standard ' , ' openSUSE_Factory ' ) :
if repository in repositories :
arg_repository = repository
break
if not arg_repository :
2010-01-30 16:18:30 +01:00
raise oscerr . WrongArgs ( ' please specify a repository ' )
2010-04-29 14:25:38 +02:00
elif not arg_repository in repositories :
raise oscerr . WrongArgs ( ' %s is not a valid repository, use one of: %s ' % ( arg_repository , ' , ' . join ( repositories ) ) )
2010-01-30 16:18:30 +01:00
2010-04-27 18:18:34 +02:00
# can be implemented using
2010-04-30 15:19:35 +02:00
# reduce(lambda x, y: x + y, (glob.glob(x) for x in ('*.spec', '*.dsc', '*.kiwi')))
2010-04-27 18:18:34 +02:00
# but be a bit more readable :)
2010-08-08 23:15:25 +02:00
descr = glob . glob ( ' *.spec ' ) + glob . glob ( ' *.dsc ' ) + glob . glob ( ' *.kiwi ' )
2010-04-27 18:23:03 +02:00
2010-01-30 16:18:30 +01:00
# FIXME:
# * request repos from server and select by build type.
if not arg_descr and len ( descr ) == 1 :
arg_descr = descr [ 0 ]
2010-04-30 15:25:24 +02:00
elif not arg_descr :
2010-05-12 11:41:43 +02:00
msg = None
2010-04-27 18:23:03 +02:00
if len ( descr ) > 1 :
2011-01-30 16:38:11 +01:00
# guess/prefer build descrs like the following:
# <pac>-<repo>.<ext> > <pac>.<ext>
pac = os . path . basename ( os . getcwd ( ) )
if is_package_dir ( os . getcwd ( ) ) :
pac = store_read_package ( os . getcwd ( ) )
extensions = [ ' spec ' , ' dsc ' , ' kiwi ' ]
cands = [ i for i in descr for ext in extensions if i == ' %s - %s . %s ' % ( pac , arg_repository , ext ) ]
if len ( cands ) == 1 :
arg_descr = cands [ 0 ]
else :
cands = [ i for i in descr for ext in extensions if i == ' %s . %s ' % ( pac , ext ) ]
if len ( cands ) == 1 :
arg_descr = cands [ 0 ]
2010-08-08 23:15:25 +02:00
if not arg_descr :
2010-08-04 17:17:28 +02:00
msg = ' Multiple build description files found: %s ' % ' , ' . join ( descr )
2010-10-04 15:57:52 +02:00
elif not ignore_descr :
2010-04-27 18:23:03 +02:00
msg = ' Missing argument: build description (spec, dsc or kiwi file) '
try :
p = Package ( ' . ' )
if p . islink ( ) and not p . isexpanded ( ) :
msg + = ' (this package is not expanded - you might want to try osc up --expand) '
except :
pass
2010-05-12 11:41:43 +02:00
if msg :
raise oscerr . WrongArgs ( msg )
2010-04-27 18:23:03 +02:00
2010-01-30 16:18:30 +01:00
return arg_repository , arg_arch , arg_descr
2007-04-25 01:00:12 +02:00
@cmdln.option ( ' --clean ' , action = ' store_true ' ,
help = ' Delete old build root before initializing it ' )
2010-04-17 10:53:53 +02:00
@cmdln.option ( ' -o ' , ' --offline ' , action = ' store_true ' ,
help = ' Start with cached prjconf and packages without contacting the api server ' )
@cmdln.option ( ' -l ' , ' --preload ' , action = ' store_true ' ,
help = ' Preload all files into the chache for offline operation ' )
2007-09-03 12:25:18 +02:00
@cmdln.option ( ' --no-changelog ' , action = ' store_true ' ,
help = ' don \' t update the package changelog from a changes file ' )
2009-10-20 16:30:15 +02:00
@cmdln.option ( ' --rsync-src ' , metavar = ' RSYNCSRCPATH ' , dest = ' rsyncsrc ' ,
2009-08-18 23:28:33 +02:00
help = ' Copy folder to buildroot after installing all RPMs. Use together with --rsync-dest. This is the path on the HOST filesystem e.g. /tmp/linux-kernel-tree. It defines RSYNCDONE 1 . ' )
2009-10-20 16:30:15 +02:00
@cmdln.option ( ' --rsync-dest ' , metavar = ' RSYNCDESTPATH ' , dest = ' rsyncdest ' ,
2009-08-18 23:28:33 +02:00
help = ' Copy folder to buildroot after installing all RPMs. Use together with --rsync-src. This is the path on the TARGET filesystem e.g. /usr/src/packages/BUILD/linux-2.6 . ' )
@cmdln.option ( ' --overlay ' , metavar = ' OVERLAY ' ,
help = ' Copy overlay filesystem to buildroot after installing all RPMs . ' )
2007-04-25 01:00:12 +02:00
@cmdln.option ( ' --noinit ' , ' --no-init ' , action = ' store_true ' ,
help = ' Skip initialization of build root and start with build immediately. ' )
2008-07-23 22:05:09 +02:00
@cmdln.option ( ' --nochecks ' , ' --no-checks ' , action = ' store_true ' ,
help = ' Do not run post build checks on the resulting packages. ' )
2008-01-24 19:06:45 +01:00
@cmdln.option ( ' --no-verify ' , action = ' store_true ' ,
2010-08-12 21:34:08 +02:00
help = ' Skip signature verification of packages used for build. (Global config in .oscrc: no_verify) ' )
2010-02-05 10:32:27 +01:00
@cmdln.option ( ' --noservice ' , ' --no-service ' , action = ' store_true ' ,
help = ' Skip run of local source services as specified in _service file. ' )
2007-05-03 17:54:40 +02:00
@cmdln.option ( ' -p ' , ' --prefer-pkgs ' , metavar = ' DIR ' , action = ' append ' ,
2007-05-02 15:49:57 +02:00
help = ' Prefer packages from this directory when installing the build-root ' )
2009-05-18 16:50:43 +02:00
@cmdln.option ( ' -k ' , ' --keep-pkgs ' , metavar = ' DIR ' ,
2007-05-03 17:54:40 +02:00
help = ' Save built packages into this directory ' )
2007-05-09 11:36:55 +02:00
@cmdln.option ( ' -x ' , ' --extra-pkgs ' , metavar = ' PAC ' , action = ' append ' ,
help = ' Add this package when installing the build-root ' )
2009-11-23 14:53:59 +01:00
@cmdln.option ( ' --root ' , metavar = ' ROOT ' ,
help = ' Build in specified directory ' )
2008-04-24 11:00:23 +02:00
@cmdln.option ( ' -j ' , ' --jobs ' , metavar = ' N ' ,
help = ' Compile with N jobs ' )
2008-12-11 12:36:07 +01:00
@cmdln.option ( ' --icecream ' , metavar = ' N ' ,
help = ' use N parallel build jobs with icecream ' )
@cmdln.option ( ' --ccache ' , action = ' store_true ' ,
help = ' use ccache to speed up rebuilds ' )
2009-11-24 10:49:26 +01:00
@cmdln.option ( ' --with ' , metavar = ' X ' , dest = ' _with ' , action = ' append ' ,
2008-12-11 12:36:07 +01:00
help = ' enable feature X for build ' )
2009-11-24 10:49:26 +01:00
@cmdln.option ( ' --without ' , metavar = ' X ' , action = ' append ' ,
2008-12-11 12:36:07 +01:00
help = ' disable feature X for build ' )
2010-12-07 16:07:20 +01:00
@cmdln.option ( ' --define ' , metavar = ' \' X Y \' ' , action = ' append ' ,
help = ' define macro X with value Y ' )
2007-05-14 10:29:50 +02:00
@cmdln.option ( ' --userootforbuild ' , action = ' store_true ' ,
help = ' Run build as root. The default is to build as '
' unprivileged user. Note that a line " # norootforbuild " '
' in the spec file will invalidate this option. ' )
2010-02-12 22:54:39 +01:00
@cmdln.option ( ' --build-uid ' , metavar = ' uid:gid| " caller " ' ,
help = ' specify the numeric uid:gid pair to assign to the '
' unprivileged " abuild " user or use " caller " to use the current user uid:gid ' )
2009-03-31 13:45:30 +02:00
@cmdln.option ( ' --local-package ' , action = ' store_true ' ,
2008-01-07 15:54:31 +01:00
help = ' build a package which does not exist on the server ' )
2009-12-09 06:53:27 +01:00
@cmdln.option ( ' --linksources ' , action = ' store_true ' ,
help = ' use hard links instead of a deep copied source ' )
2010-04-29 14:27:29 +02:00
@cmdln.option ( ' --vm-type ' , metavar = ' TYPE ' ,
help = ' use VM type TYPE (e.g. kvm) ' )
2009-03-31 13:45:30 +02:00
@cmdln.option ( ' --alternative-project ' , metavar = ' PROJECT ' ,
2008-01-07 15:54:31 +01:00
help = ' specify the build target project ' )
2008-03-11 16:18:02 +01:00
@cmdln.option ( ' -d ' , ' --debuginfo ' , action = ' store_true ' ,
help = ' also build debuginfo sub-packages ' )
2009-03-31 13:45:30 +02:00
@cmdln.option ( ' --disable-debuginfo ' , action = ' store_true ' ,
help = ' disable build of debuginfo packages ' )
2008-05-08 14:21:57 +02:00
@cmdln.option ( ' -b ' , ' --baselibs ' , action = ' store_true ' ,
help = ' Create -32bit/-64bit/-x86 rpms for other architectures ' )
2009-12-01 14:36:11 +01:00
@cmdln.option ( ' --release ' , metavar = ' N ' ,
help = ' set release number of the package to N ' )
2010-09-07 16:08:05 +02:00
@cmdln.option ( ' --disable-cpio-bulk-download ' , action = ' store_true ' ,
2010-09-15 15:28:47 +02:00
help = ' disable downloading packages as cpio archive from api ' )
@cmdln.option ( ' --cpio-bulk-download ' , action = ' store_false ' ,
dest = ' disable_cpio_bulk_download ' , help = SUPPRESS_HELP )
2010-01-20 09:15:17 +01:00
@cmdln.option ( ' --download-api-only ' , action = ' store_true ' ,
help = SUPPRESS_HELP )
2010-06-24 10:51:38 +02:00
@cmdln.option ( ' --oldpackages ' , metavar = ' DIR ' ,
help = ' take previous build from DIR (special values: _self, _link) ' )
2010-06-24 10:51:55 +02:00
@cmdln.option ( ' --shell ' , action = ' store_true ' ,
help = SUPPRESS_HELP )
2007-04-25 01:00:12 +02:00
def do_build ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Build a package on your local machine
2006-09-15 13:47:34 +02:00
2007-04-25 01:00:12 +02:00
You need to call the command inside a package directory , which should be a
buildsystem checkout . ( Local modifications are fine . )
2006-07-05 12:25:31 +02:00
2009-09-08 10:14:27 +02:00
The arguments REPOSITORY and ARCH can be taken from the first two columns
2007-04-25 01:00:12 +02:00
of the ' osc repos ' output . BUILD_DESCR is either a RPM spec file , or a
Debian dsc file .
2006-07-05 12:25:31 +02:00
2010-02-12 22:54:39 +01:00
The command honours packagecachedir , build - root and build - uid
settings in . oscrc , if present . You may want to set su - wrapper = ' sudo '
in . oscrc , and configure sudo with option NOPASSWD for / usr / bin / build .
2006-07-05 12:25:31 +02:00
2007-05-02 15:49:57 +02:00
If neither - - clean nor - - noinit is given , build will reuse an existing
build - root again , removing unneeded packages and add missing ones . This
is usually the fastest option .
2006-07-05 12:25:31 +02:00
2008-01-07 15:54:31 +01:00
If the package doesn ' t exist on the server please use the --local-package
option .
If the project of the package doesn ' t exist on the server please use the
- - alternative - project < alternative - project > option :
Example :
osc build [ OPTS ] - - alternative - project openSUSE : 10.3 standard i586 BUILD_DESCR
2009-05-18 16:50:43 +02:00
usage :
2009-09-08 10:14:27 +02:00
osc build [ OPTS ] REPOSITORY ARCH BUILD_DESCR
osc build [ OPTS ] REPOSITORY ( ARCH = hostarch , BUILD_DESCR is detected automatically )
osc build [ OPTS ] ARCH ( REPOSITORY = build_repository ( config option ) , BUILD_DESCR is detected automatically )
osc build [ OPTS ] BUILD_DESCR ( REPOSITORY = build_repository ( config option ) , ARCH = hostarch )
osc build [ OPTS ] ( REPOSITORY = build_repository ( config option ) , ARCH = hostarch , BUILD_DESCR is detected automatically )
2008-04-09 20:45:59 +02:00
2009-05-18 16:50:43 +02:00
# Note:
# Configuration can be overridden by envvars, e.g.
# OSC_SU_WRAPPER overrides the setting of su-wrapper.
2008-04-09 20:45:59 +02:00
# OSC_BUILD_ROOT overrides the setting of build-root.
# OSC_PACKAGECACHEDIR overrides the setting of packagecachedir.
$ { cmd_option_list }
"""
2006-07-14 19:39:46 +02:00
2007-04-25 01:00:12 +02:00
import osc . build
2006-07-14 19:45:44 +02:00
2007-09-03 16:52:45 +02:00
if not os . path . exists ( ' /usr/lib/build/debtransform ' ) \
and not os . path . exists ( ' /usr/lib/lbuild/debtransform ' ) :
2007-07-19 12:49:30 +02:00
sys . stderr . write ( ' Error: you need build.rpm with version 2007.3.12 or newer. \n ' )
2007-07-16 11:45:17 +02:00
sys . stderr . write ( ' See http://download.opensuse.org/repositories/openSUSE:/Tools/ \n ' )
2007-04-25 01:00:12 +02:00
return 1
2006-07-17 15:15:42 +02:00
2009-03-31 13:45:30 +02:00
if opts . debuginfo and opts . disable_debuginfo :
raise oscerr . WrongOptions ( ' osc: --debuginfo and --disable-debuginfo are mutual exclusive ' )
2008-07-30 18:45:00 +02:00
if len ( args ) > 3 :
raise oscerr . WrongArgs ( ' Too many arguments ' )
2009-05-18 16:50:43 +02:00
2010-04-17 10:53:53 +02:00
args = self . parse_repoarchdescr ( args , opts . noinit or opts . offline , opts . alternative_project )
2009-11-26 10:52:26 +01:00
2009-09-03 16:56:48 +02:00
# check for source services
2010-02-05 10:32:27 +01:00
if not opts . noservice and not opts . noinit and os . listdir ( ' . ' ) . count ( " _service " ) :
2009-09-03 16:56:48 +02:00
p = Package ( ' . ' )
p . run_source_services ( )
2010-08-12 23:13:51 +02:00
if conf . config [ ' no_verify ' ] :
2010-08-12 21:34:08 +02:00
opts . no_verify = True
2010-08-26 18:50:20 +02:00
if opts . keep_pkgs and not os . path . isdir ( opts . keep_pkgs ) :
if os . path . exists ( opts . keep_pkgs ) :
raise oscerr . WrongOptions ( ' Preferred save location \' %s \' is not a directory ' % opts . keep_pkgs )
else :
os . makedirs ( opts . keep_pkgs )
2007-05-03 17:54:40 +02:00
if opts . prefer_pkgs :
for d in opts . prefer_pkgs :
2007-05-02 15:49:57 +02:00
if not os . path . isdir ( d ) :
2010-01-09 14:25:41 +01:00
raise oscerr . WrongOptions ( ' Preferred package location \' %s \' is not a directory ' % d )
2007-05-02 15:49:57 +02:00
2010-04-17 10:53:53 +02:00
if opts . noinit and opts . offline :
raise oscerr . WrongOptions ( ' --noinit and --offline are mutually exclusive ' )
if opts . offline and opts . preload :
raise oscerr . WrongOptions ( ' --offline and --preload are mutually exclusive ' )
2010-01-30 16:18:30 +01:00
print ' Building %s for %s / %s ' % ( args [ 2 ] , args [ 0 ] , args [ 1 ] )
2010-06-30 13:37:26 +02:00
return osc . build . main ( self . get_api_url ( ) , opts , args )
2006-07-14 19:39:46 +02:00
2009-05-18 16:50:43 +02:00
2010-01-30 16:18:30 +01:00
@cmdln.option ( ' --local-package ' , action = ' store_true ' ,
help = ' package doesn \' t exist on the server ' )
@cmdln.option ( ' --alternative-project ' , metavar = ' PROJECT ' ,
help = ' specify the used build target project ' )
@cmdln.option ( ' --noinit ' , ' --no-init ' , action = ' store_true ' ,
help = ' do not guess/verify specified repository ' )
@cmdln.option ( ' -r ' , ' --root ' , action = ' store_true ' ,
help = ' login as root instead of abuild ' )
2010-04-17 10:53:53 +02:00
@cmdln.option ( ' -o ' , ' --offline ' , action = ' store_true ' ,
help = ' Use cached data without contacting the api server ' )
2010-01-30 16:18:30 +01:00
def do_chroot ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : chroot into the buildchroot
chroot into the buildchroot for the given repository , arch and build description
( NOTE : this command does not work if " build-type " is set in the config )
usage :
osc chroot [ OPTS ] REPOSITORY ARCH BUILD_DESCR
osc chroot [ OPTS ] REPOSITORY ( ARCH = hostarch , BUILD_DESCR is detected automatically )
osc chroot [ OPTS ] ARCH ( REPOSITORY = build_repository ( config option ) , BUILD_DESCR is detected automatically )
osc chroot [ OPTS ] BUILD_DESCR ( REPOSITORY = build_repository ( config option ) , ARCH = hostarch )
osc chroot [ OPTS ] ( REPOSITORY = build_repository ( config option ) , ARCH = hostarch , BUILD_DESCR is detected automatically )
$ { cmd_option_list }
"""
if len ( args ) > 3 :
raise oscerr . WrongArgs ( ' Too many arguments ' )
if conf . config [ ' build-type ' ] :
print >> sys . stderr , ' Not implemented for VMs '
sys . exit ( 1 )
user = ' abuild '
if opts . root :
2010-04-08 23:15:55 +02:00
user = ' root '
2010-04-17 10:53:53 +02:00
repository , arch , descr = self . parse_repoarchdescr ( args , opts . noinit or opts . offline , opts . alternative_project )
2010-01-30 16:18:30 +01:00
project = opts . alternative_project or store_read_project ( ' . ' )
if opts . local_package :
package = os . path . splitext ( descr ) [ 0 ]
else :
package = store_read_package ( ' . ' )
buildroot = os . environ . get ( ' OSC_BUILD_ROOT ' , conf . config [ ' build-root ' ] ) \
% { ' repo ' : repository , ' arch ' : arch , ' project ' : project , ' package ' : package }
if not os . path . isdir ( buildroot ) :
raise oscerr . OscIOError ( None , ' \' %s \' is not a directory ' % buildroot )
2010-01-30 21:41:49 +01:00
suwrapper = os . environ . get ( ' OSC_SU_WRAPPER ' , conf . config [ ' su-wrapper ' ] )
sucmd = suwrapper . split ( ) [ 0 ]
suargs = ' ' . join ( suwrapper . split ( ) [ 1 : ] )
if suwrapper . startswith ( ' su ' ) :
cmd = [ sucmd , ' %s chroot " %s " su - %s ' % ( suargs , buildroot , user ) ]
else :
cmd = [ sucmd , ' chroot ' , buildroot , ' su ' , ' - ' , user ]
if suargs :
cmd . insert ( 1 , suargs )
print ' running: %s ' % ' ' . join ( cmd )
os . execvp ( sucmd , cmd )
2010-01-30 16:18:30 +01:00
2006-07-14 19:39:46 +02:00
2009-05-13 11:04:27 +02:00
@cmdln.option ( ' ' , ' --csv ' , action = ' store_true ' ,
help = ' generate output in CSV (separated by |) ' )
2007-04-25 01:00:12 +02:00
@cmdln.alias ( ' buildhist ' )
2009-09-08 10:14:27 +02:00
def do_buildhistory ( self , subcmd , opts , * args ) :
2007-04-25 01:00:12 +02:00
""" $ {cmd_name} : Shows the build history of a package
2006-05-19 22:13:29 +02:00
2009-09-08 10:14:27 +02:00
The arguments REPOSITORY and ARCH can be taken from the first two columns
2007-04-25 01:00:12 +02:00
of the ' osc repos ' output .
2009-09-08 10:14:27 +02:00
usage :
osc buildhist REPOSITORY ARCHITECTURE
osc buildhist PROJECT PACKAGE REPOSITORY ARCHITECTURE
2007-04-25 01:00:12 +02:00
$ { cmd_option_list }
"""
2006-05-23 15:48:58 +02:00
2010-02-09 00:08:21 +01:00
if len ( args ) < 2 and is_package_dir ( ' . ' ) :
2009-11-23 11:13:19 +01:00
self . print_repos ( )
2010-04-30 17:13:21 +02:00
apiurl = self . get_api_url ( )
2009-09-08 10:14:27 +02:00
if len ( args ) == 4 :
2009-10-20 16:30:15 +02:00
project = args [ 0 ]
package = args [ 1 ]
repository = args [ 2 ]
arch = args [ 3 ]
2009-09-08 10:14:27 +02:00
elif len ( args ) == 2 :
2009-10-20 16:30:15 +02:00
wd = os . curdir
package = store_read_package ( wd )
project = store_read_project ( wd )
repository = args [ 0 ]
arch = args [ 1 ]
2009-09-08 10:14:27 +02:00
else :
2009-10-20 16:30:15 +02:00
raise oscerr . WrongArgs ( ' Wrong number of arguments ' )
2006-09-29 12:37:53 +02:00
2009-05-13 11:04:27 +02:00
format = ' text '
if opts . csv :
format = ' csv '
2009-09-08 10:14:27 +02:00
print ' \n ' . join ( get_buildhistory ( apiurl , project , package , repository , arch , format ) )
2006-06-08 12:30:29 +02:00
2009-05-13 11:04:27 +02:00
@cmdln.option ( ' ' , ' --csv ' , action = ' store_true ' ,
help = ' generate output in CSV (separated by |) ' )
2009-11-13 14:31:10 +01:00
@cmdln.option ( ' -l ' , ' --limit ' , metavar = ' limit ' ,
help = ' for setting the number of results ' )
2009-02-20 12:04:45 +01:00
@cmdln.alias ( ' jobhist ' )
2009-11-06 19:47:54 +01:00
def do_jobhistory ( self , subcmd , opts , * args ) :
2009-02-20 12:04:45 +01:00
""" $ {cmd_name} : Shows the job history of a project
2009-09-08 10:14:27 +02:00
The arguments REPOSITORY and ARCH can be taken from the first two columns
2009-02-20 12:04:45 +01:00
of the ' osc repos ' output .
2009-11-06 19:47:54 +01:00
usage :
osc jobhist REPOSITORY ARCHITECTURE ( in project dir )
osc jobhist PROJECT [ PACKAGE ] REPOSITORY ARCHITECTURE
2009-02-20 12:04:45 +01:00
$ { cmd_option_list }
"""
wd = os . curdir
2009-11-06 19:47:54 +01:00
args = slash_split ( args )
2010-02-09 02:27:29 +01:00
if len ( args ) < 2 and ( is_project_dir ( ' . ' ) or is_package_dir ( ' . ' ) ) :
2009-11-23 11:13:19 +01:00
self . print_repos ( )
2010-04-30 17:13:21 +02:00
apiurl = self . get_api_url ( )
2009-11-06 19:47:54 +01:00
if len ( args ) == 4 :
project = args [ 0 ]
package = args [ 1 ]
repository = args [ 2 ]
arch = args [ 3 ]
elif len ( args ) == 3 :
project = args [ 0 ]
package = None # skipped = prj
repository = args [ 1 ]
arch = args [ 2 ]
elif len ( args ) == 2 :
package = None
try :
package = store_read_package ( wd )
except :
pass
project = store_read_project ( wd )
repository = args [ 0 ]
arch = args [ 1 ]
else :
raise oscerr . WrongArgs ( ' Wrong number of arguments ' )
2009-02-20 12:04:45 +01:00
2009-05-13 11:04:27 +02:00
format = ' text '
if opts . csv :
format = ' csv '
2009-11-23 11:13:12 +01:00
print_jobhistory ( apiurl , project , package , repository , arch , format , opts . limit )
2009-02-20 12:04:45 +01:00
2009-05-25 13:33:04 +02:00
@cmdln.hide ( 1 )
def do_rlog ( self , subcmd , opts , * args ) :
print " Command rlog is obsolete. Please use ' osc log ' "
sys . exit ( 1 )
2006-10-10 16:04:34 +02:00
2010-01-14 11:58:34 +01:00
2007-07-12 02:48:52 +02:00
@cmdln.option ( ' -r ' , ' --revision ' , metavar = ' rev ' ,
help = ' show log of the specified revision ' )
2009-05-13 10:53:32 +02:00
@cmdln.option ( ' ' , ' --csv ' , action = ' store_true ' ,
help = ' generate output in CSV (separated by |) ' )
@cmdln.option ( ' ' , ' --xml ' , action = ' store_true ' ,
help = ' generate output in XML ' )
2011-01-19 20:26:38 +01:00
@cmdln.option ( ' -D ' , ' --deleted ' , action = ' store_true ' ,
help = ' work on deleted package ' )
2010-05-25 14:00:50 +02:00
@cmdln.option ( ' -M ' , ' --meta ' , action = ' store_true ' ,
2010-05-25 13:59:46 +02:00
help = ' checkout out meta data instead of sources ' )
2009-05-25 13:33:04 +02:00
def do_log ( self , subcmd , opts , * args ) :
2007-07-12 01:24:26 +02:00
""" $ {cmd_name} : Shows the commit log of a package
2009-05-25 12:41:16 +02:00
Usage :
2009-05-25 13:33:04 +02:00
osc log ( inside working copy )
2010-05-27 07:17:27 +02:00
osc log remote_project [ remote_package ]
2009-05-25 12:41:16 +02:00
2008-09-23 15:39:54 +02:00
$ { cmd_option_list }
"""
2009-05-25 12:41:16 +02:00
args = slash_split ( args )
2010-04-30 17:13:21 +02:00
apiurl = self . get_api_url ( )
2009-05-25 12:41:16 +02:00
if len ( args ) == 0 :
2009-05-25 13:33:04 +02:00
wd = os . curdir
2010-06-07 09:01:32 +02:00
if is_project_dir ( wd ) or is_package_dir ( wd ) :
project = store_read_project ( wd )
if is_project_dir ( wd ) :
package = " _project "
else :
package = store_read_package ( wd )
2010-05-27 07:21:33 +02:00
else :
2010-06-07 09:01:32 +02:00
raise oscerr . NoWorkingCopy ( " Error: \" %s \" is not an osc working copy. " % os . path . abspath ( wd ) )
2010-05-27 07:17:27 +02:00
elif len ( args ) < 1 :
2009-05-25 13:33:04 +02:00
raise oscerr . WrongArgs ( ' Too few arguments (required none or two) ' )
2009-05-25 12:41:16 +02:00
elif len ( args ) > 2 :
2009-05-25 13:33:04 +02:00
raise oscerr . WrongArgs ( ' Too many arguments (required none or two) ' )
2010-05-27 07:17:27 +02:00
elif len ( args ) == 1 :
project = args [ 0 ]
package = " _project "
2009-05-25 13:33:04 +02:00
else :
project = args [ 0 ]
package = args [ 1 ]
2009-05-25 12:41:16 +02:00
2008-09-23 15:39:54 +02:00
rev , dummy = parseRevisionOption ( opts . revision )
2010-05-27 02:18:00 +02:00
if rev and not checkRevision ( project , package , rev , apiurl , opts . meta ) :
2008-09-23 15:39:54 +02:00
print >> sys . stderr , ' Revision \' %s \' does not exist ' % rev
sys . exit ( 1 )
2009-05-13 10:53:32 +02:00
format = ' text '
if opts . csv :
format = ' csv '
if opts . xml :
format = ' xml '
2011-01-19 20:26:38 +01:00
log = ' \n ' . join ( get_commitlog ( apiurl , project , package , rev , format , opts . meta , opts . deleted ) )
2010-05-03 10:05:36 +02:00
run_pager ( log )
2008-09-23 15:39:54 +02:00
2010-09-01 12:44:47 +02:00
def do_service ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Handle source services
Source services can be used to modify sources like downloading files ,
verify files , generating files or modify existing files .
usage :
osc service COMMAND ( inside working copy )
2011-02-15 09:41:03 +01:00
osc service run [ SOURCE_SERVICE ]
osc service disabledrun
osc service remoterun [ PROJECT PACKAGE ]
2010-09-01 12:44:47 +02:00
COMMAND can be :
2011-02-15 09:41:03 +01:00
run r run defined services locally , it takes an optional parameter to run only a
specified source service . In case paramteres exists for this one in _service file
they are used .
2011-01-26 16:30:57 +01:00
disabledrun dr run only disabled services locally and store files as local created
remoterun rr trigger a re - run on the server side
2010-09-01 12:44:47 +02:00
$ { cmd_option_list }
"""
args = slash_split ( args )
2011-02-17 14:22:16 +01:00
project = package = singleservice = mode = None
2010-09-01 12:44:47 +02:00
apiurl = self . get_api_url ( )
2011-03-22 10:21:25 +01:00
if len ( args ) < 1 :
raise oscerr . WrongArgs ( ' No command given. ' )
elif len ( args ) < 3 :
2010-09-01 12:44:47 +02:00
if is_package_dir ( os . curdir ) :
project = store_read_project ( os . curdir )
package = store_read_package ( os . curdir )
else :
raise oscerr . WrongArgs ( ' Too few arguments. ' )
2011-02-15 09:41:03 +01:00
if len ( args ) == 2 :
singleservice = args [ 1 ]
2011-02-17 01:57:53 +01:00
elif len ( args ) == 3 and args [ 0 ] == ' remoterun ' :
2010-09-01 12:44:47 +02:00
project = args [ 1 ]
package = args [ 2 ]
else :
2011-02-17 01:57:53 +01:00
raise oscerr . WrongArgs ( ' Too many arguments. ' )
2010-09-01 12:44:47 +02:00
command = args [ 0 ]
2011-03-22 10:21:25 +01:00
if not ( command in ( ' run ' , ' localrun ' , ' disabledrun ' , ' remoterun ' , ' lr ' , ' dr ' , ' r ' , ' rr ' ) ) :
raise oscerr . WrongArgs ( ' Wrong command given. ' )
2011-01-26 17:22:03 +01:00
if command == " remoterun " or command == " rr " :
2010-09-01 12:44:47 +02:00
print runservice ( apiurl , project , package )
2011-02-15 09:41:03 +01:00
return
2010-09-01 12:44:47 +02:00
2011-02-17 14:22:16 +01:00
if command in ( ' run ' , ' localrun ' , ' disabledrun ' , ' lr ' , ' dr ' , ' r ' ) :
2010-09-01 12:44:47 +02:00
if not is_package_dir ( os . curdir ) :
raise oscerr . WrongArgs ( ' Local directory is no package ' )
p = Package ( " . " )
2011-01-26 16:30:57 +01:00
if command == " localrun " or command == " lr " :
2011-02-15 09:41:03 +01:00
mode = " local "
2011-01-26 16:30:57 +01:00
elif command == " disabledrun " or command == " dr " :
2011-02-15 09:41:03 +01:00
mode = " disabled "
2011-02-17 14:22:16 +01:00
p . run_source_services ( mode , singleservice )
2010-09-01 12:44:47 +02:00
2010-11-08 16:20:01 +01:00
@cmdln.option ( ' -a ' , ' --arch ' , metavar = ' ARCH ' ,
help = ' trigger rebuilds for a specific architecture ' )
@cmdln.option ( ' -r ' , ' --repo ' , metavar = ' REPO ' ,
help = ' trigger rebuilds for a specific repository ' )
2007-04-25 01:00:12 +02:00
@cmdln.option ( ' -f ' , ' --failed ' , action = ' store_true ' ,
help = ' rebuild all failed packages ' )
2011-02-22 22:44:04 +01:00
@cmdln.option ( ' --all ' , action = ' store_true ' ,
help = ' Rebuild all packages of entire project ' )
2009-06-15 17:38:39 +02:00
@cmdln.alias ( ' rebuildpac ' )
def do_rebuild ( self , subcmd , opts , * args ) :
2010-04-23 12:01:24 +02:00
""" $ {cmd_name} : Trigger package rebuilds
2006-06-08 12:30:29 +02:00
2007-04-25 01:00:12 +02:00
Note that it is normally NOT needed to kick off rebuilds like this , because
they principally happen in a fully automatic way , triggered by source
check - ins . In particular , the order in which packages are built is handled
by the build service .
2006-09-25 17:11:03 +02:00
2009-09-08 10:14:27 +02:00
The arguments REPOSITORY and ARCH can be taken from the first two columns
2009-06-23 12:06:31 +02:00
of the ' osc repos ' output .
2006-06-08 12:30:29 +02:00
2009-05-18 16:50:43 +02:00
usage :
2010-04-23 12:01:24 +02:00
osc rebuild ( inside working copy )
2009-09-08 10:14:27 +02:00
osc rebuild PROJECT [ PACKAGE [ REPOSITORY [ ARCH ] ] ]
2007-04-25 01:00:12 +02:00
$ { cmd_option_list }
"""
2006-06-08 12:30:29 +02:00
2007-06-26 15:17:38 +02:00
args = slash_split ( args )
2010-04-23 12:01:24 +02:00
package = repo = arch = code = None
2010-07-29 17:29:07 +02:00
apiurl = self . get_api_url ( )
2010-04-23 12:01:24 +02:00
2010-11-08 16:20:01 +01:00
if opts . repo :
repo = opts . repo
if opts . arch :
arch = opts . arch
2007-04-25 01:00:12 +02:00
if len ( args ) < 1 :
2010-05-25 17:50:36 +02:00
if is_package_dir ( os . curdir ) :
2010-04-23 12:01:24 +02:00
project = store_read_project ( os . curdir )
package = store_read_package ( os . curdir )
2010-05-25 17:50:36 +02:00
apiurl = store_read_apiurl ( os . curdir )
2010-10-08 12:25:32 +02:00
elif is_project_dir ( os . curdir ) :
project = store_read_project ( os . curdir )
apiurl = store_read_apiurl ( os . curdir )
2010-05-05 09:03:51 +02:00
else :
2010-04-23 12:01:24 +02:00
raise oscerr . WrongArgs ( ' Too few arguments. ' )
2010-05-05 09:03:51 +02:00
else :
project = args [ 0 ]
if len ( args ) > 1 :
package = args [ 1 ]
2006-05-23 15:48:58 +02:00
2007-04-25 01:00:12 +02:00
if len ( args ) > 2 :
repo = args [ 2 ]
if len ( args ) > 3 :
arch = args [ 3 ]
2006-05-23 15:48:58 +02:00
2007-04-25 01:00:12 +02:00
if opts . failed :
code = ' failed '
2011-02-22 22:44:04 +01:00
if not ( opts . all or package or repo or arch or code ) :
raise oscerr . WrongOptions ( ' No option has been provided. If you want to rebuild all packages of the entire project, use --all option. ' )
2010-05-25 17:50:36 +02:00
print rebuild ( apiurl , project , package , repo , arch , code )
2006-05-23 15:48:58 +02:00
2006-04-20 16:26:50 +02:00
2007-05-04 23:51:54 +02:00
def do_info ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Print information about a working copy
Print information about each ARG ( default : ' . ' )
ARG is a working - copy path .
$ { cmd_usage }
$ { cmd_option_list }
"""
args = parseargs ( args )
pacs = findpacs ( args )
for p in pacs :
print p . info ( )
2006-05-19 22:13:29 +02:00
2007-06-14 16:30:36 +02:00
@cmdln.option ( ' -a ' , ' --arch ' , metavar = ' ARCH ' ,
help = ' Abort builds for a specific architecture ' )
@cmdln.option ( ' -r ' , ' --repo ' , metavar = ' REPO ' ,
help = ' Abort builds for a specific repository ' )
2011-02-22 22:44:04 +01:00
@cmdln.option ( ' --all ' , action = ' store_true ' ,
help = ' Abort all running builds of entire project ' )
2007-06-14 16:30:36 +02:00
def do_abortbuild ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Aborts the build of a certain project/package
2009-05-18 16:50:43 +02:00
2007-06-14 16:30:36 +02:00
With the optional argument < package > you can specify a certain package
otherwise all builds in the project will be cancelled .
2009-05-18 16:50:43 +02:00
usage :
2007-06-14 16:30:36 +02:00
osc abortbuild [ OPTS ] PROJECT [ PACKAGE ]
$ { cmd_option_list }
"""
2010-07-29 17:29:07 +02:00
apiurl = self . get_api_url ( )
2007-06-14 16:30:36 +02:00
if len ( args ) < 1 :
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 . WrongArgs ( ' Missing <project> argument. ' )
2007-06-14 16:30:36 +02:00
if len ( args ) == 2 :
package = args [ 1 ]
else :
package = None
2011-02-22 22:44:04 +01:00
if not ( opts . all or package or repo or arch ) :
raise oscerr . WrongOptions ( ' No option has been provided. If you want to abort all packages of the entire project, use --all option. ' )
2010-07-29 17:29:07 +02:00
print abortbuild ( apiurl , args [ 0 ] , package , opts . arch , opts . repo )
2007-06-14 16:30:36 +02:00
@cmdln.option ( ' -a ' , ' --arch ' , metavar = ' ARCH ' ,
2007-07-04 16:57:19 +02:00
help = ' Delete all binary packages for a specific architecture ' )
2007-06-14 16:30:36 +02:00
@cmdln.option ( ' -r ' , ' --repo ' , metavar = ' REPO ' ,
help = ' Delete all binary packages for a specific repository ' )
2007-07-04 16:57:19 +02:00
@cmdln.option ( ' --build-disabled ' , action = ' store_true ' ,
help = ' Delete all binaries of packages for which the build is disabled ' )
2007-10-27 21:13:24 +02:00
@cmdln.option ( ' --build-failed ' , action = ' store_true ' ,
help = ' Delete all binaries of packages for which the build failed ' )
@cmdln.option ( ' --broken ' , action = ' store_true ' ,
help = ' Delete all binaries of packages for which the package source is bad ' )
2010-04-23 14:38:00 +02:00
@cmdln.option ( ' --unresolvable ' , action = ' store_true ' ,
help = ' Delete all binaries of packages which have dependency errors ' )
2009-05-31 13:00:03 +02:00
@cmdln.option ( ' --all ' , action = ' store_true ' ,
help = ' Delete all binaries regardless of the package status (previously default) ' )
2007-06-14 16:30:36 +02:00
def do_wipebinaries ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Delete all binary packages of a certain project/package
2007-07-15 15:49:13 +02:00
With the optional argument < package > you can specify a certain package
2007-06-14 16:30:36 +02:00
otherwise all binary packages in the project will be deleted .
2009-05-18 16:50:43 +02:00
usage :
2011-01-21 11:04:47 +01:00
osc wipebinaries OPTS # works in checked out project dir
2009-05-31 13:00:03 +02:00
osc wipebinaries OPTS PROJECT [ PACKAGE ]
2007-06-14 16:30:36 +02:00
$ { cmd_option_list }
"""
2009-05-18 16:50:43 +02:00
2007-06-26 15:17:38 +02:00
args = slash_split ( args )
2010-06-29 15:32:53 +02:00
package = project = None
apiurl = self . get_api_url ( )
2010-06-27 19:07:46 +02:00
# try to get project and package from checked out dirs
2007-06-14 16:30:36 +02:00
if len ( args ) < 1 :
2010-06-27 19:07:46 +02:00
if is_project_dir ( os . getcwd ( ) ) :
project = store_read_project ( os . curdir )
if is_package_dir ( os . getcwd ( ) ) :
project = store_read_project ( os . curdir )
package = store_read_package ( os . curdir )
if project is None :
raise oscerr . WrongArgs ( ' Missing <project> argument. ' )
2008-06-11 10:01:10 +02:00
if len ( args ) > 2 :
raise oscerr . WrongArgs ( ' Wrong number of arguments. ' )
2010-06-27 19:07:46 +02:00
# respect given project and package
if len ( args ) > = 1 :
project = args [ 0 ]
2007-06-14 16:30:36 +02:00
if len ( args ) == 2 :
2010-06-27 19:07:46 +02:00
package = args [ 1 ]
2007-10-27 21:13:24 +02:00
codes = [ ]
if opts . build_disabled :
codes . append ( ' disabled ' )
if opts . build_failed :
codes . append ( ' failed ' )
if opts . broken :
codes . append ( ' broken ' )
2010-04-23 14:38:00 +02:00
if opts . unresolvable :
codes . append ( ' unresolvable ' )
2009-07-07 16:31:59 +02:00
if opts . all or opts . repo or opts . arch :
2009-05-31 13:00:03 +02:00
codes . append ( None )
2007-10-27 21:13:24 +02:00
if len ( codes ) == 0 :
2010-01-09 14:25:41 +01:00
raise oscerr . WrongOptions ( ' No option has been provided. If you want to delete all binaries, use --all option. ' )
2007-10-27 21:13:24 +02:00
# make a new request for each code= parameter
for code in codes :
2010-06-27 19:07:46 +02:00
print wipebinaries ( apiurl , project , package , opts . arch , opts . repo , code )
2007-06-14 16:30:36 +02:00
2008-09-30 16:54:08 +02:00
@cmdln.option ( ' -q ' , ' --quiet ' , action = ' store_true ' ,
help = ' do not show downloading progress ' )
2011-01-21 10:35:47 +01:00
@cmdln.option ( ' -d ' , ' --destdir ' , default = ' ./binaries ' , metavar = ' DIR ' ,
2008-09-30 16:54:08 +02:00
help = ' destination directory ' )
2009-01-16 11:31:38 +01:00
@cmdln.option ( ' --sources ' , action = " store_true " ,
help = ' also fetch source packages ' )
2010-09-27 17:43:44 +02:00
@cmdln.option ( ' --debug ' , action = " store_true " ,
help = ' also fetch debug packages ' )
2009-04-21 11:46:32 +02:00
def do_getbinaries ( self , subcmd , opts , * args ) :
2008-09-30 16:54:08 +02:00
""" $ {cmd_name} : Download binaries to a local directory
2009-05-18 16:50:43 +02:00
This command downloads packages directly from the api server .
2009-02-20 16:01:16 +01:00
Thus , it directly accesses the packages that are used for building
others even when they are not " published " yet .
2008-09-30 16:54:08 +02:00
2009-04-21 11:46:32 +02:00
usage :
2010-07-01 15:32:21 +02:00
osc getbinaries REPOSITORY # works in checked out project/package (check out all archs in subdirs)
osc getbinaries REPOSITORY ARCHITECTURE # works in checked out project/package
2009-04-21 11:46:32 +02:00
osc getbinaries PROJECT PACKAGE REPOSITORY ARCHITECTURE
2008-09-30 16:54:08 +02:00
$ { cmd_option_list }
"""
2009-04-21 11:46:32 +02:00
args = slash_split ( args )
2010-04-30 17:13:21 +02:00
apiurl = self . get_api_url ( )
2010-07-12 14:56:08 +02:00
package = None
project = None
2009-04-21 11:46:32 +02:00
2010-04-21 15:20:40 +02:00
if len ( args ) < 1 and is_package_dir ( ' . ' ) :
2009-11-23 11:13:19 +01:00
self . print_repos ( )
2010-05-22 18:27:11 +02:00
architecture = None
2009-04-21 11:46:32 +02:00
if len ( args ) == 4 :
project = args [ 0 ]
package = args [ 1 ]
repository = args [ 2 ]
architecture = args [ 3 ]
2010-05-22 18:27:11 +02:00
elif len ( args ) < = 2 :
2010-07-01 15:32:21 +02:00
if is_package_dir ( os . getcwd ( ) ) :
project = store_read_project ( os . curdir )
package = store_read_package ( os . curdir )
elif is_project_dir ( os . getcwd ( ) ) :
project = store_read_project ( os . curdir )
else :
2010-05-22 18:27:11 +02:00
raise oscerr . WrongArgs ( ' Missing arguments: either specify <project> and ' \
2010-07-01 15:32:21 +02:00
' <package> or move to a project or package working copy ' )
2010-05-22 18:27:11 +02:00
repository = args [ 0 ]
if len ( args ) == 2 :
2009-10-20 16:30:15 +02:00
architecture = args [ 1 ]
2009-04-21 11:46:32 +02:00
else :
2010-04-21 15:20:40 +02:00
raise oscerr . WrongArgs ( ' Need either 1, 2 or 4 arguments ' )
2009-04-21 11:46:32 +02:00
2011-03-02 14:25:22 +01:00
repos = list ( get_repos_of_project ( apiurl , project ) )
if not [ i for i in repos if repository == i . name ] :
2011-03-02 14:38:24 +01:00
self . print_repos ( exc_msg = ' Invalid repository \' %s \' ' % repository )
2011-03-02 14:25:22 +01:00
2010-05-22 18:27:11 +02:00
arches = [ architecture ]
if architecture is None :
2011-03-02 14:25:22 +01:00
arches = [ i . arch for i in repos if repository == i . name ]
2010-07-01 15:32:21 +02:00
2010-08-13 00:30:05 +02:00
if package is None :
package = meta_get_packagelist ( apiurl , project )
else :
package = [ package ]
2010-07-01 15:32:21 +02:00
2011-01-21 10:35:47 +01:00
# Set binary target directory and create if not existing
target_dir = os . path . normpath ( opts . destdir )
if not os . path . isdir ( target_dir ) :
print ' Creating %s ' % target_dir
os . makedirs ( target_dir , 0755 )
2010-05-22 18:27:11 +02:00
for arch in arches :
2010-07-01 15:32:21 +02:00
for pac in package :
2010-08-13 00:30:05 +02:00
binaries = get_binarylist ( apiurl , project , repository , arch ,
package = pac , verbose = True )
if not binaries :
print >> sys . stderr , ' no binaries found: Either the package %s ' \
' does not exist or no binaries have been built. ' % pac
continue
for i in binaries :
# skip source rpms
2010-09-27 17:43:44 +02:00
if not opts . sources :
if i . name . endswith ( ' .src.rpm ' ) :
2010-09-28 16:20:55 +02:00
continue
2010-09-27 17:43:44 +02:00
if not opts . debug :
if i . name . find ( ' -debuginfo- ' ) > = 0 :
2010-09-28 16:20:55 +02:00
continue
2010-12-23 10:32:50 +01:00
if i . name . find ( ' -debugsource- ' ) > = 0 :
continue
2010-08-13 00:30:05 +02:00
fname = ' %s / %s ' % ( target_dir , i . name )
if os . path . exists ( fname ) :
st = os . stat ( fname )
if st . st_mtime == i . mtime and st . st_size == i . size :
continue
get_binary_file ( apiurl ,
project ,
repository , arch ,
i . name ,
package = pac ,
target_filename = fname ,
target_mtime = i . mtime ,
progress_meter = not opts . quiet )
2008-09-30 16:54:08 +02:00
2010-01-12 15:10:32 +01:00
@cmdln.option ( ' -b ' , ' --bugowner ' , action = ' store_true ' ,
help = ' restrict listing to items where the user is bugowner ' )
@cmdln.option ( ' -m ' , ' --maintainer ' , action = ' store_true ' ,
help = ' restrict listing to items where the user is maintainer ' )
2009-08-21 03:26:37 +02:00
@cmdln.option ( ' -a ' , ' --all ' , action = ' store_true ' ,
2010-01-12 15:10:32 +01:00
help = ' all involvements ' )
@cmdln.option ( ' -U ' , ' --user ' , metavar = ' USER ' ,
help = ' search for USER instead of yourself ' )
2010-03-13 14:06:48 +01:00
@cmdln.option ( ' --exclude-project ' , action = ' append ' ,
2010-01-12 15:10:32 +01:00
help = ' exclude requests for specified project ' )
@cmdln.option ( ' -v ' , ' --verbose ' , action = ' store_true ' ,
help = ' verbose listing ' )
2010-07-07 16:25:09 +02:00
@cmdln.option ( ' --maintained ' , action = ' store_true ' ,
help = ' limit search results to packages with maintained attribute set. ' )
2010-01-12 15:10:32 +01:00
def do_my ( self , subcmd , opts , type ) :
""" $ {cmd_name} : show packages, projects or requests involving yourself
Examples :
# list packages where I am bugowner
osc $ { cmd_name } pkg - b
# list projects where I am maintainer
osc $ { cmd_name } prj - m
# list request for all my projects and packages
osc $ { cmd_name } rq
# list requests, excluding project 'foo' and 'bar'
osc $ { cmd_name } rq - - exclude - project foo , bar
# list submitrequests I made
osc $ { cmd_name } sr
$ { cmd_usage }
where TYPE is one of requests , submitrequests ,
projects or packages ( rq , sr , prj or pkg )
$ { cmd_option_list }
2009-09-03 20:08:43 +02:00
"""
2009-08-21 03:26:37 +02:00
2011-03-03 16:31:33 +01:00
# TODO: please clarify the difference between sr and rq.
# My first implementeation was to make no difference between requests FROM one
# of my projects and TO one of my projects. The current implementation appears to make this difference.
# The usage above indicates, that sr would be a subset of rq, which is no the case with my tests.
# jw.
2010-01-12 15:10:32 +01:00
args_rq = ( ' requests ' , ' request ' , ' req ' , ' rq ' )
args_sr = ( ' submitrequests ' , ' submitrequest ' , ' submitreq ' , ' submit ' , ' sr ' )
args_prj = ( ' projects ' , ' project ' , ' projs ' , ' proj ' , ' prj ' )
args_pkg = ( ' packages ' , ' package ' , ' pack ' , ' pkgs ' , ' pkg ' )
2010-03-13 14:06:48 +01:00
if opts . bugowner and opts . maintainer :
raise oscerr . WrongOptions ( ' Sorry, \' --bugowner \' and \' maintainer \' are mutually exclusive ' )
elif opts . all and ( opts . bugowner or opts . maintainer ) :
raise oscerr . WrongOptions ( ' Sorry, \' --all \' and \' --bugowner \' or \' --maintainer \' are mutually exclusive ' )
2009-08-21 03:26:37 +02:00
2010-04-30 17:13:21 +02:00
apiurl = self . get_api_url ( )
2010-04-21 15:58:57 +02:00
2010-03-13 14:06:48 +01:00
exclude_projects = [ ]
for i in opts . exclude_project or [ ] :
prj = i . split ( ' , ' )
if len ( prj ) == 1 :
exclude_projects . append ( i )
else :
exclude_projects . extend ( prj )
2010-01-12 15:10:32 +01:00
if not opts . user :
2010-04-21 15:58:57 +02:00
user = conf . get_apiurl_usr ( apiurl )
2010-01-12 15:10:32 +01:00
else :
user = opts . user
list_requests = False
2010-03-13 14:06:48 +01:00
what = { ' project ' : ' ' , ' package ' : ' ' }
2010-01-12 15:10:32 +01:00
if type in args_rq :
list_requests = True
elif type in args_prj :
2010-03-13 14:06:48 +01:00
what = { ' project ' : ' ' }
elif type in args_sr :
2010-04-21 15:58:57 +02:00
requests = get_request_list ( apiurl , req_who = user , exclude_target_projects = exclude_projects )
2011-02-09 15:51:26 +01:00
for r in sorted ( requests ) :
2010-12-30 03:10:27 +01:00
print r . list_view ( ) , ' \n '
2010-03-13 14:06:48 +01:00
return
elif not type in args_pkg :
2010-01-12 15:10:32 +01:00
raise oscerr . WrongArgs ( " invalid type %s " % type )
2010-03-13 14:06:48 +01:00
role_filter = ' '
if opts . maintainer :
2010-01-12 15:10:32 +01:00
role_filter = ' maintainer '
elif opts . bugowner :
role_filter = ' bugowner '
2010-03-13 14:06:48 +01:00
elif list_requests :
role_filter = ' maintainer '
if opts . all :
role_filter = ' '
2011-01-23 21:21:32 +01:00
if list_requests :
# try api side search as supported since OBS 2.2
try :
2011-02-04 10:29:13 +01:00
u = makeurl ( apiurl , [ ' request ' ] , {
' view ' : ' collection ' ,
2011-03-07 09:22:13 +01:00
' state ' : ' new ' ,
2011-02-04 10:29:13 +01:00
' user ' : user ,
} )
f = http_GET ( u )
root = ET . parse ( f ) . getroot ( )
2011-02-04 10:14:04 +01:00
requests = [ ]
2011-02-04 10:29:13 +01:00
for node in root . findall ( ' request ' ) :
2011-02-04 10:14:04 +01:00
r = Request ( )
2011-02-04 10:29:13 +01:00
r . read ( node )
2011-02-04 10:14:04 +01:00
requests . append ( r )
2011-02-09 15:53:36 +01:00
for r in sorted ( requests ) :
2011-02-04 10:14:04 +01:00
print r . list_view ( ) , ' \n '
return
2011-02-04 10:14:30 +01:00
except urllib2 . HTTPError , e :
if e . code == 400 :
# skip it ... try again with old style below
pass
2011-01-23 21:21:32 +01:00
2010-09-29 19:57:00 +02:00
res = get_user_projpkgs ( apiurl , user , role_filter , exclude_projects ,
what . has_key ( ' project ' ) , what . has_key ( ' package ' ) ,
opts . maintained , opts . verbose )
2010-12-22 08:45:36 +01:00
# map of project =>[list of packages]
# if list of packages is empty user is maintainer of the whole project
2010-03-13 14:06:48 +01:00
request_todo = { }
2010-12-22 08:45:36 +01:00
2010-03-13 14:06:48 +01:00
roles = { }
if len ( what . keys ( ) ) == 2 :
2010-09-29 19:57:00 +02:00
for i in res . get ( ' project_id ' , res . get ( ' project ' , { } ) ) . findall ( ' project ' ) :
2010-03-13 14:06:48 +01:00
request_todo [ i . get ( ' name ' ) ] = [ ]
roles [ i . get ( ' name ' ) ] = [ p . get ( ' role ' ) for p in i . findall ( ' person ' ) if p . get ( ' userid ' ) == user ]
2010-09-29 19:57:00 +02:00
for i in res . get ( ' package_id ' , res . get ( ' package ' , { } ) ) . findall ( ' package ' ) :
2010-12-22 08:45:36 +01:00
prj = i . get ( ' project ' )
roles [ ' / ' . join ( [ prj , i . get ( ' name ' ) ] ) ] = [ p . get ( ' role ' ) for p in i . findall ( ' person ' ) if p . get ( ' userid ' ) == user ]
if not prj in request_todo or request_todo [ prj ] != [ ] :
request_todo . setdefault ( prj , [ ] ) . append ( i . get ( ' name ' ) )
2010-03-13 14:06:48 +01:00
else :
2010-09-29 19:57:00 +02:00
for i in res . get ( ' project_id ' , res . get ( ' project ' , { } ) ) . findall ( ' project ' ) :
2010-03-13 14:06:48 +01:00
roles [ i . get ( ' name ' ) ] = [ p . get ( ' role ' ) for p in i . findall ( ' person ' ) if p . get ( ' userid ' ) == user ]
2010-01-12 15:10:32 +01:00
if list_requests :
2011-01-23 21:21:32 +01:00
# old style, only for OBS 2.1 and before. Should not be used, since it is slow and incomplete
2010-04-21 15:58:57 +02:00
requests = get_user_projpkgs_request_list ( apiurl , user , projpkgs = request_todo )
2011-02-09 15:53:36 +01:00
for r in sorted ( requests ) :
2010-12-30 03:10:27 +01:00
print r . list_view ( ) , ' \n '
2011-03-03 16:31:33 +01:00
if not len ( requests ) :
print " -> try also ' osc my sr ' to see more. "
2010-01-12 15:10:32 +01:00
else :
2010-03-13 14:06:48 +01:00
for i in sorted ( roles . keys ( ) ) :
out = ' %s ' % i
prjpac = i . split ( ' / ' )
if type in args_pkg and len ( prjpac ) == 1 and not opts . verbose :
continue
2010-01-12 15:10:32 +01:00
if opts . verbose :
2010-03-13 14:06:48 +01:00
out = ' %s ( %s ) ' % ( i , ' , ' . join ( sorted ( roles [ i ] ) ) )
if len ( prjpac ) == 2 :
out = ' %s ( %s ) ' % ( prjpac [ 1 ] , ' , ' . join ( sorted ( roles [ i ] ) ) )
print out
2009-08-21 03:26:37 +02:00
2008-09-30 16:54:08 +02:00
2007-08-09 13:35:08 +02:00
@cmdln.option ( ' --repos-baseurl ' , action = ' store_true ' ,
help = ' show base URLs of download repositories ' )
2009-04-07 20:45:42 +02:00
@cmdln.option ( ' -e ' , ' --exact ' , action = ' store_true ' ,
2009-11-23 17:13:57 +01:00
help = ' show only exact matches, this is default now ' )
@cmdln.option ( ' -s ' , ' --substring ' , action = ' store_true ' ,
help = ' Show also results where the search term is a sub string, slower search ' )
2007-07-15 15:49:13 +02:00
@cmdln.option ( ' --package ' , action = ' store_true ' ,
help = ' search for a package ' )
@cmdln.option ( ' --project ' , action = ' store_true ' ,
help = ' search for a project ' )
@cmdln.option ( ' --title ' , action = ' store_true ' ,
help = ' search for matches in the \' title \' element ' )
@cmdln.option ( ' --description ' , action = ' store_true ' ,
help = ' search for matches in the \' description \' element ' )
2009-10-22 12:10:15 +02:00
@cmdln.option ( ' -a ' , ' --limit-to-attribute ' , metavar = ' ATTRIBUTE ' ,
help = ' match only when given attribute exists in meta data ' )
2007-07-15 15:49:13 +02:00
@cmdln.option ( ' -v ' , ' --verbose ' , action = ' store_true ' ,
help = ' show more information ' )
2010-12-26 21:14:40 +01:00
@cmdln.option ( ' -V ' , ' --version ' , action = ' store_true ' ,
help = ' show package version, revision, and srcmd5. CAUTION: This is slow and unreliable ' )
2008-06-24 17:07:44 +02:00
@cmdln.option ( ' -i ' , ' --involved ' , action = ' store_true ' ,
2009-08-21 03:26:37 +02:00
help = ' show projects/packages where given person (or myself) is involved as bugowner or maintainer ' )
@cmdln.option ( ' -b ' , ' --bugowner ' , action = ' store_true ' ,
help = ' as -i, but only bugowner ' )
@cmdln.option ( ' -m ' , ' --maintainer ' , action = ' store_true ' ,
help = ' as -i, but only maintainer ' )
2009-11-06 17:08:20 +01:00
@cmdln.option ( ' --maintained ' , action = ' store_true ' ,
help = ' limit search results to packages with maintained attribute set. ' )
2009-08-21 03:26:37 +02:00
@cmdln.option ( ' -M ' , ' --mine ' , action = ' store_true ' ,
help = ' shorthand for --bugowner --package ' )
2009-05-15 10:33:25 +02:00
@cmdln.option ( ' --csv ' , action = ' store_true ' ,
help = ' generate output in CSV (separated by |) ' )
2010-03-15 16:08:00 +01:00
@cmdln.option ( ' --binary ' , action = ' store_true ' ,
help = ' search binary packages ' )
@cmdln.option ( ' -B ' , ' --baseproject ' , metavar = ' PROJECT ' ,
help = ' search packages built for PROJECT (implies --binary) ' )
2009-11-06 17:08:20 +01:00
@cmdln.alias ( ' sm ' )
2009-08-21 03:26:37 +02:00
@cmdln.alias ( ' se ' )
2010-03-20 12:27:27 +01:00
@cmdln.alias ( ' bse ' )
2011-01-17 19:28:50 +01:00
def do_search ( self , subcmd , opts , * args ) :
2007-12-10 15:23:58 +01:00
""" $ {cmd_name} : Search for a project and/or package.
2007-07-15 15:49:13 +02:00
If no option is specified osc will search for projects and
packages which contains the \' search term \' in their name,
title or description .
usage :
osc search \' search term \' <options>
2010-03-20 12:27:27 +01:00
osc sm \' source package name \' ( ' osc search - - maintained ' )
osc bse . . . ( ' osc search --binary ' )
2010-11-12 23:55:11 +01:00
osc se ' perl(Foo::Bar) ' ( ' osc --package perl-Foo-Bar ' )
2007-07-15 15:49:13 +02:00
$ { cmd_option_list }
"""
2010-03-10 23:36:09 +01:00
def build_xpath ( attr , what , substr = False ) :
if substr :
return ' contains( %s , \' %s \' ) ' % ( attr , what )
else :
return ' %s = \' %s \' ' % ( attr , what )
2009-09-03 20:08:43 +02:00
2011-01-17 19:33:02 +01:00
search_term = ' '
2011-01-17 19:28:50 +01:00
if len ( args ) > 1 :
raise oscerr . WrongArgs ( ' Too many arguments ' )
elif len ( args ) == 0 :
if opts . involved or opts . bugowner or opts . maintainer or opts . mine :
search_term = conf . get_apiurl_usr ( conf . config [ ' apiurl ' ] )
else :
raise oscerr . WrongArgs ( ' Too few arguments ' )
2011-01-17 19:33:02 +01:00
else :
search_term = args [ 0 ]
2011-01-17 19:28:50 +01:00
2011-01-30 21:37:45 +01:00
# XXX: is it a good idea to make this the default?
# support perl symbols:
2010-11-12 23:55:11 +01:00
if re . match ( ' ^perl \ ( \ w+(:: \ w+)* \ )$ ' , search_term ) :
search_term = re . sub ( ' \ ) ' , ' ' , re . sub ( ' (::| \ () ' , ' - ' , search_term ) )
opts . package = True
2009-09-03 20:08:43 +02:00
if opts . mine :
opts . bugowner = True
opts . package = True
2009-10-20 16:30:15 +02:00
2010-03-10 23:36:09 +01:00
if ( opts . title or opts . description ) and ( opts . involved or opts . bugowner or opts . maintainer ) :
raise oscerr . WrongOptions ( ' Sorry, the options \' --title \' and/or \' --description \' ' \
' are mutually exclusive with \' -i \' / \' -b \' / \' -m \' / \' -M \' ' )
if opts . substring and opts . exact :
raise oscerr . WrongOptions ( ' Sorry, the options \' --substring \' and \' --exact \' are mutually exclusive ' )
2007-07-15 15:49:13 +02:00
2009-11-06 17:08:20 +01:00
if subcmd == ' sm ' or opts . maintained :
2009-11-02 10:28:27 +01:00
opts . package = True
2009-11-23 17:13:57 +01:00
if not opts . substring :
opts . exact = True
2010-03-20 12:27:27 +01:00
if subcmd == ' bse ' or opts . baseproject :
2010-03-15 16:08:00 +01:00
opts . binary = True
if opts . binary and ( opts . title or opts . description or opts . involved or opts . bugowner or opts . maintainer
or opts . project or opts . package ) :
raise oscerr . WrongOptions ( ' Sorry, \' --binary \' and \' --title \' or \' --description \' or \' --involved ' \
' or \' --bugowner \' or \' --maintainer \' or \' --limit-to-attribute <attr> \ ' \
' or \' --project \' or \' --package \' are mutually exclusive ' )
2010-02-28 02:30:13 +01:00
2010-07-29 17:29:07 +02:00
apiurl = self . get_api_url ( )
2010-03-10 23:36:09 +01:00
xpath = ' '
if opts . title :
xpath = xpath_join ( xpath , build_xpath ( ' title ' , search_term , opts . substring ) , inner = True )
if opts . description :
xpath = xpath_join ( xpath , build_xpath ( ' description ' , search_term , opts . substring ) , inner = True )
2010-03-15 16:08:00 +01:00
if opts . project or opts . package or opts . binary :
2010-03-10 23:36:09 +01:00
xpath = xpath_join ( xpath , build_xpath ( ' @name ' , search_term , opts . substring ) , inner = True )
# role filter
role_filter = ' '
if opts . bugowner or opts . maintainer or opts . involved :
xpath = xpath_join ( xpath , ' person/@userid = \' %s \' ' % search_term , inner = True )
role_filter = ' %s ( %s ) ' % ( search_term , ' person ' )
2010-03-12 15:22:11 +01:00
role_filter_xpath = xpath
2010-03-10 23:36:09 +01:00
if opts . bugowner and not opts . maintainer :
xpath = xpath_join ( xpath , ' person/@role= \' bugowner \' ' , op = ' and ' )
2010-03-12 15:22:11 +01:00
role_filter = ' bugowner '
2010-03-10 23:36:09 +01:00
elif not opts . bugowner and opts . maintainer :
xpath = xpath_join ( xpath , ' person/@role= \' maintainer \' ' , op = ' and ' )
2010-03-12 15:22:11 +01:00
role_filter = ' maintainer '
2010-03-10 23:36:09 +01:00
if opts . limit_to_attribute :
xpath = xpath_join ( xpath , ' attribute/@name= \' %s \' ' % opts . limit_to_attribute , op = ' and ' )
2010-03-15 16:08:00 +01:00
if opts . baseproject :
xpath = xpath_join ( xpath , ' path/@project= \' %s \' ' % opts . baseproject , op = ' and ' )
2009-08-21 03:26:37 +02:00
2010-03-10 23:36:09 +01:00
if not xpath :
xpath = xpath_join ( xpath , build_xpath ( ' @name ' , search_term , opts . substring ) , inner = True )
xpath = xpath_join ( xpath , build_xpath ( ' title ' , search_term , opts . substring ) , inner = True )
xpath = xpath_join ( xpath , build_xpath ( ' description ' , search_term , opts . substring ) , inner = True )
what = { ' project ' : xpath , ' package ' : xpath }
if subcmd == ' sm ' or opts . maintained :
xpath = xpath_join ( xpath , ' (project/attribute/@name= \' %(attr)s \' or attribute/@name= \' %(attr)s \' ) ' % { ' attr ' : conf . config [ ' maintained_attribute ' ] } , op = ' and ' )
what = { ' package ' : xpath }
elif opts . project and not opts . package :
what = { ' project ' : xpath }
elif not opts . project and opts . package :
what = { ' package ' : xpath }
2010-03-18 17:57:25 +01:00
elif opts . binary :
2010-03-15 16:08:00 +01:00
what = { ' published/binary/id ' : xpath }
2010-03-12 15:22:11 +01:00
try :
2010-07-29 17:29:07 +02:00
res = search ( apiurl , * * what )
2010-03-12 15:22:11 +01:00
except urllib2 . HTTPError , e :
if e . code != 400 or not role_filter :
raise e
# backward compatibility: local role filtering
if opts . limit_to_attribute :
role_filter_xpath = xpath_join ( role_filter_xpath , ' attribute/@name= \' %s \' ' % opts . limit_to_attribute , op = ' and ' )
what = dict ( [ [ kind , role_filter_xpath ] for kind in what . keys ( ) ] )
2010-07-29 17:29:07 +02:00
res = search ( apiurl , * * what )
2010-03-13 14:06:48 +01:00
filter_role ( res , search_term , role_filter )
2010-03-12 15:22:11 +01:00
if role_filter :
role_filter = ' %s ( %s ) ' % ( search_term , role_filter )
2010-03-15 16:08:00 +01:00
kind_map = { ' published/binary/id ' : ' binary ' }
2010-03-10 23:36:09 +01:00
for kind , root in res . iteritems ( ) :
results = [ ]
2010-03-15 16:08:00 +01:00
for node in root . findall ( kind_map . get ( kind , kind ) ) :
2010-03-10 23:36:09 +01:00
result = [ ]
project = node . get ( ' project ' )
package = None
if project is None :
project = node . get ( ' name ' )
else :
package = node . get ( ' name ' )
result . append ( project )
if not package is None :
result . append ( package )
2010-12-26 21:14:40 +01:00
2011-02-11 15:11:50 +01:00
if opts . version and package != None :
2011-02-21 13:41:02 +01:00
sr = get_source_rev ( apiurl , project , package )
v = sr . get ( ' version ' )
r = sr . get ( ' rev ' )
s = sr . get ( ' srcmd5 ' )
2010-12-26 21:14:40 +01:00
if not v or v == ' unknown ' : v = ' - '
if not r : r = ' - '
if not s : s = ' - '
result . append ( v )
result . append ( r )
result . append ( s )
2010-03-10 23:36:09 +01:00
if opts . verbose :
title = node . findtext ( ' title ' ) . strip ( )
if len ( title ) > 60 :
title = title [ : 61 ] + ' ... '
result . append ( title )
2010-12-26 21:14:40 +01:00
2010-03-10 23:36:09 +01:00
if opts . repos_baseurl :
# FIXME: no hardcoded URL of instance
result . append ( ' http://download.opensuse.org/repositories/ %s / ' % project . replace ( ' : ' , ' :/ ' ) )
2010-03-15 16:08:00 +01:00
if kind == ' published/binary/id ' :
result . append ( node . get ( ' filepath ' ) )
2010-03-10 23:36:09 +01:00
results . append ( result )
if not len ( results ) :
2009-08-21 03:26:37 +02:00
print ' No matches found for \' %s \' in %s s ' % ( role_filter or search_term , kind )
2009-06-09 19:07:02 +02:00
continue
2010-03-10 23:36:09 +01:00
# construct a sorted, flat list
2010-08-12 20:21:04 +02:00
# Sort by first column, follwed by second column if we have two columns, else sort by first.
2010-08-13 00:07:59 +02:00
results . sort ( lambda x , y : ( cmp ( x [ 0 ] , y [ 0 ] ) or
( len ( x ) > 1 and len ( y ) > 1 and cmp ( x [ 1 ] , y [ 1 ] ) ) ) )
2010-03-10 23:36:09 +01:00
new = [ ]
for i in results :
new . extend ( i )
results = new
headline = [ ]
2010-03-15 16:08:00 +01:00
if kind == ' package ' or kind == ' published/binary/id ' :
2009-10-08 16:40:06 +02:00
headline = [ ' # Project ' , ' # Package ' ]
2007-07-15 15:49:13 +02:00
else :
2009-06-09 19:07:02 +02:00
headline = [ ' # Project ' ]
2011-02-11 15:11:50 +01:00
if opts . version and kind == ' package ' :
2010-12-26 21:14:40 +01:00
headline . append ( ' # Ver ' )
headline . append ( ' Rev ' )
headline . append ( ' Srcmd5 ' )
2009-06-09 19:07:02 +02:00
if opts . verbose :
headline . append ( ' # Title ' )
if opts . repos_baseurl :
headline . append ( ' # URL ' )
2010-03-15 16:08:00 +01:00
if opts . binary :
headline . append ( ' # filepath ' )
2009-06-09 19:07:02 +02:00
if not opts . csv :
2010-03-10 23:36:09 +01:00
if len ( what . keys ( ) ) > 1 :
2009-06-09 19:07:02 +02:00
print ' # ' * 68
2009-08-21 03:26:37 +02:00
print ' matches for \' %s \' in %s s: \n ' % ( role_filter or search_term , kind )
2010-03-10 23:36:09 +01:00
for row in build_table ( len ( headline ) , results , headline , 2 , csv = opts . csv ) :
2009-06-09 19:07:02 +02:00
print row
2007-06-29 20:26:30 +02:00
2007-07-25 12:56:04 +02:00
2007-07-23 18:03:30 +02:00
@cmdln.option ( ' -p ' , ' --project ' , metavar = ' project ' ,
2009-12-25 18:16:35 +01:00
help = ' specify the path to a project ' )
2007-07-23 18:03:30 +02:00
@cmdln.option ( ' -n ' , ' --name ' , metavar = ' name ' ,
help = ' specify a package name ' )
@cmdln.option ( ' -t ' , ' --title ' , metavar = ' title ' ,
help = ' set a title ' )
@cmdln.option ( ' -d ' , ' --description ' , metavar = ' description ' ,
help = ' set the description of the package ' )
2007-07-30 13:12:42 +02:00
@cmdln.option ( ' ' , ' --delete-old-files ' , action = ' store_true ' ,
help = ' delete existing files from the server ' )
2007-07-30 20:11:52 +02:00
@cmdln.option ( ' -c ' , ' --commit ' , action = ' store_true ' ,
2007-08-08 17:44:14 +02:00
help = ' commit the new files ' )
2007-07-25 14:14:32 +02:00
def do_importsrcpkg ( self , subcmd , opts , srpm ) :
2007-12-10 15:23:58 +01:00
""" $ {cmd_name} : Import a new package from a src.rpm
2007-07-23 18:03:30 +02:00
A new package dir will be created inside the project dir
( if no project is specified and the current working dir is a
project dir the package will be created in this project ) . If
the package does not exist on the server it will be created
too otherwise the meta data of the existing package will be
updated ( < title / > and < description / > ) .
2008-11-29 14:32:25 +01:00
The src . rpm will be extracted into the package dir . The files
won ' t be committed unless you explicitly pass the --commit switch.
2007-07-23 18:03:30 +02:00
2007-07-25 14:21:46 +02:00
SRPM is the path of the src . rpm in the local filesystem ,
or an URL .
2007-07-25 14:14:32 +02:00
$ { cmd_usage }
2007-07-23 18:03:30 +02:00
$ { cmd_option_list }
"""
import glob
2009-09-09 17:28:21 +02:00
from util import rpmquery
2007-07-23 18:03:30 +02:00
2008-03-10 19:04:23 +01:00
if opts . delete_old_files and conf . config [ ' do_package_tracking ' ] :
# IMHO the --delete-old-files option doesn't really fit into our
# package tracking strategy
print >> sys . stderr , ' --delete-old-files is not supported anymore '
print >> sys . stderr , ' when do_package_tracking is enabled '
sys . exit ( 1 )
2007-07-25 14:21:46 +02:00
if ' :// ' in srpm :
print ' trying to fetch ' , srpm
import urlgrabber
urlgrabber . urlgrab ( srpm )
srpm = os . path . basename ( srpm )
2007-07-25 14:14:32 +02:00
srpm = os . path . abspath ( srpm )
2008-03-15 23:51:37 +01:00
if not os . path . isfile ( srpm ) :
print >> sys . stderr , ' file \' %s \' does not exist ' % srpm
sys . exit ( 1 )
2007-07-23 18:03:30 +02:00
if opts . project :
project_dir = opts . project
else :
2008-03-10 19:04:23 +01:00
project_dir = os . curdir
2007-07-23 18:03:30 +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 conf . config [ ' do_package_tracking ' ] :
project = Project ( project_dir )
2007-07-23 18:03:30 +02: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
project = store_read_project ( project_dir )
2007-07-23 18:03:30 +02:00
2009-09-09 17:28:21 +02:00
rpmq = rpmquery . RpmQuery . query ( srpm )
title , pac , descr , url = rpmq . summary ( ) , rpmq . name ( ) , rpmq . description ( ) , rpmq . url ( )
if url is None :
url = ' '
2007-07-23 18:03:30 +02:00
if opts . title :
title = opts . title
if opts . name :
pac = opts . name
if opts . description :
descr = opts . description
2009-05-18 16:50:43 +02:00
2007-07-29 17:27:27 +02:00
# title and description can be empty
if not pac :
print >> sys . stderr , ' please specify a package name with the \' --name \' option. ' \
' The automatic detection failed '
sys . exit ( 1 )
2008-03-15 23:51:37 +01:00
if conf . config [ ' do_package_tracking ' ] :
2009-12-25 00:08:29 +01:00
createPackageDir ( os . path . join ( project . dir , pac ) , project )
2008-03-15 23:51:37 +01:00
else :
if not os . path . exists ( os . path . join ( project_dir , pac ) ) :
apiurl = store_read_apiurl ( project_dir )
user = conf . get_apiurl_usr ( apiurl )
2008-03-10 19:04:23 +01:00
data = meta_exists ( metatype = ' pkg ' ,
path_args = ( quote_plus ( project ) , quote_plus ( pac ) ) ,
template_args = ( {
' name ' : pac ,
2008-03-15 23:51:37 +01:00
' user ' : user } ) , apiurl = apiurl )
2008-03-10 19:04:23 +01:00
if data :
data = ET . fromstring ( ' ' . join ( data ) )
2010-08-30 14:05:06 +02:00
data . find ( ' title ' ) . text = ' ' . join ( title )
2008-03-10 19:04:23 +01:00
data . find ( ' description ' ) . text = ' ' . join ( descr )
2009-01-21 22:55:53 +01:00
data . find ( ' url ' ) . text = url
2008-03-10 19:04:23 +01:00
data = ET . tostring ( data )
else :
print >> sys . stderr , ' error - cannot get meta data '
sys . exit ( 1 )
edit_meta ( metatype = ' pkg ' ,
path_args = ( quote_plus ( project ) , quote_plus ( pac ) ) ,
2008-03-15 23:51:37 +01:00
data = data , apiurl = apiurl )
2010-08-30 14:05:06 +02:00
Package . init_package ( apiurl , project , pac , os . path . join ( project_dir , pac ) )
2007-07-30 13:12:42 +02:00
else :
2008-03-15 23:51:37 +01:00
print >> sys . stderr , ' error - local package already exists '
2007-07-30 13:12:42 +02:00
sys . exit ( 1 )
2008-03-15 23:51:37 +01:00
2010-08-30 14:05:06 +02:00
unpack_srcrpm ( srpm , os . path . join ( project_dir , pac ) )
p = Package ( os . path . join ( project_dir , pac ) )
2008-03-15 23:51:37 +01:00
if len ( p . filenamelist ) == 0 and opts . commit :
print ' Adding files to working copy... '
2011-01-20 20:38:36 +01:00
addFiles ( glob . glob ( ' %s /* ' % os . path . join ( project_dir , pac ) ) )
2008-03-15 23:51:37 +01:00
if conf . config [ ' do_package_tracking ' ] :
project . commit ( ( pac , ) )
else :
p . update_datastructs ( )
p . commit ( )
elif opts . commit and opts . delete_old_files :
2010-08-20 14:34:41 +02:00
for filename in p . filenamelist :
p . delete_remote_source_file ( filename )
2008-03-15 23:51:37 +01:00
p . update_local_filesmeta ( )
print ' Adding files to working copy... '
addFiles ( glob . glob ( ' * ' ) )
p . update_datastructs ( )
p . commit ( )
2007-07-23 18:03:30 +02:00
else :
2008-03-15 23:51:37 +01:00
print ' No files were committed to the server. Please ' \
' commit them manually. '
print ' Package \' %s \' only imported locally ' % pac
2007-07-23 18:03:30 +02:00
sys . exit ( 1 )
print ' Package \' %s \' imported successfully ' % pac
2007-07-25 12:56:04 +02:00
2007-07-25 14:14:32 +02:00
2010-07-29 11:43:56 +02:00
@cmdln.option ( ' -X ' , ' -m ' , ' --method ' , default = ' GET ' , metavar = ' HTTP_METHOD ' ,
2007-07-25 12:56:04 +02:00
help = ' specify HTTP method to use (GET|PUT|DELETE|POST) ' )
@cmdln.option ( ' -d ' , ' --data ' , default = None , metavar = ' STRING ' ,
help = ' specify string data for e.g. POST ' )
2010-07-29 11:43:56 +02:00
@cmdln.option ( ' -T ' , ' -f ' , ' --file ' , default = None , metavar = ' FILE ' ,
2007-07-25 12:56:04 +02:00
help = ' specify filename for e.g. PUT or DELETE ' )
2009-05-18 16:50:43 +02:00
@cmdln.option ( ' -a ' , ' --add-header ' , default = None , metavar = ' NAME STRING ' ,
2008-03-16 21:46:16 +01:00
nargs = 2 , action = ' append ' , dest = ' headers ' ,
help = ' add the specified header to the request ' )
2009-06-04 16:14:01 +02:00
def do_api ( self , subcmd , opts , url ) :
2007-07-25 12:56:04 +02:00
""" $ {cmd_name} : Issue an arbitrary request to the API
Useful for testing .
URL can be specified either partially ( only the path component ) , or fully
with URL scheme and hostname ( ' http://... ' ) .
Note the global - A and - H options ( see osc help ) .
Examples :
2009-06-04 16:14:01 +02:00
osc api / source / home : user
2010-07-29 11:43:56 +02:00
osc api - X PUT - T / etc / fstab source / home : user / test5 / myfstab
2007-07-25 12:56:04 +02:00
$ { cmd_usage }
$ { cmd_option_list }
"""
2010-07-29 17:29:07 +02:00
apiurl = self . get_api_url ( )
2007-07-25 12:56:04 +02:00
if not opts . method in [ ' GET ' , ' PUT ' , ' POST ' , ' DELETE ' ] :
sys . exit ( ' unknown method %s ' % opts . method )
if not url . startswith ( ' http ' ) :
if not url . startswith ( ' / ' ) :
url = ' / ' + url
2010-07-29 17:29:07 +02:00
url = apiurl + url
2007-07-25 12:56:04 +02:00
2008-03-16 21:46:16 +01:00
if opts . headers :
opts . headers = dict ( opts . headers )
2009-05-18 16:50:43 +02:00
r = http_request ( opts . method ,
url ,
data = opts . data ,
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
file = opts . file ,
2009-05-18 16:50:43 +02:00
headers = opts . headers )
2007-07-25 12:56:04 +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
out = r . read ( )
2007-07-25 12:56:04 +02:00
sys . stdout . write ( out )
2009-10-22 11:43:58 +02:00
@cmdln.option ( ' -v ' , ' --verbose ' , action = ' store_true ' ,
help = ' show more information ' )
@cmdln.option ( ' --nodevelproject ' , action = ' store_true ' ,
help = ' do not follow a defined devel project ' \
' (primary project where a package is developed) ' )
@cmdln.option ( ' -e ' , ' --email ' , action = ' store_true ' ,
help = ' show email addresses instead of user names ' )
def do_bugowner ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Show bugowners of a project/package
2007-07-25 12:56:04 +02:00
2010-02-28 02:30:13 +01:00
osc bugowner PRJ
2009-10-22 11:43:58 +02:00
osc bugowner PRJ PKG
2010-09-10 14:20:42 +02:00
PRJ and PKG default to current working - copy path .
2009-11-10 01:56:52 +01:00
Prints bugowner if defined , or maintainer otherwise .
2009-10-22 11:43:58 +02:00
2010-09-10 14:20:42 +02:00
Shortcut for osc maintainer - B [ PRJ ] PKG
2009-10-22 11:43:58 +02:00
$ { cmd_option_list }
"""
2010-01-13 10:03:14 +01:00
opts . role = ( )
2009-11-10 01:56:52 +01:00
opts . bugowner = True
opts . bugowner_only = None
opts . add = None
opts . delete = None
opts . devel_project = None
2009-10-22 11:43:58 +02:00
if len ( args ) == 1 :
2011-03-09 16:10:48 +01:00
def_p = find_default_project ( self . get_api_url ( ) , args [ 0 ] )
print >> sys . stderr , ' defaulting to %s / %s ' % ( def_p , args [ 0 ] )
2009-10-22 11:43:58 +02:00
# python has no args.unshift ???
2011-03-09 16:10:48 +01:00
args = [ def_p , args [ 0 ] ]
2009-11-10 01:56:52 +01:00
return self . do_maintainer ( subcmd , opts , * args )
2009-10-22 11:43:58 +02:00
2009-12-25 17:19:44 +01:00
@cmdln.option ( ' -b ' , ' --bugowner-only ' , action = ' store_true ' ,
2009-06-18 18:20:49 +02:00
help = ' Show only the bugowner ' )
2009-10-22 11:43:58 +02:00
@cmdln.option ( ' -B ' , ' --bugowner ' , action = ' store_true ' ,
help = ' Show only the bugowner if defined, or maintainer otherwise ' )
2007-09-03 12:17:26 +02:00
@cmdln.option ( ' -e ' , ' --email ' , action = ' store_true ' ,
help = ' show email addresses instead of user names ' )
2009-06-18 18:20:49 +02:00
@cmdln.option ( ' --nodevelproject ' , action = ' store_true ' ,
help = ' do not follow a defined devel project ' \
' (primary project where a package is developed) ' )
2007-09-03 18:18:37 +02:00
@cmdln.option ( ' -v ' , ' --verbose ' , action = ' store_true ' ,
help = ' show more information ' )
2008-05-20 10:29:54 +02:00
@cmdln.option ( ' -D ' , ' --devel-project ' , metavar = ' devel_project ' ,
help = ' define the project where this package is primarily developed ' )
2007-09-12 20:01:13 +02:00
@cmdln.option ( ' -a ' , ' --add ' , metavar = ' user ' ,
2009-12-30 21:54:57 +01:00
help = ' add a new maintainer/bugowner (can be specified via --role) ' )
2007-09-12 20:01:13 +02:00
@cmdln.option ( ' -d ' , ' --delete ' , metavar = ' user ' ,
2009-12-30 21:54:57 +01:00
help = ' delete a maintainer/bugowner (can be specified via --role) ' )
2009-12-25 17:31:13 +01:00
@cmdln.option ( ' -r ' , ' --role ' , metavar = ' role ' , action = ' append ' , default = [ ] ,
2009-06-19 15:57:27 +02:00
help = ' Specify user role ' )
2007-09-03 12:17:26 +02:00
def do_maintainer ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Show maintainers of a project/package
2009-05-18 16:50:43 +02:00
2007-09-12 20:01:13 +02:00
osc maintainer PRJ < options >
osc maintainer PRJ PKG < options >
2010-09-10 14:20:42 +02:00
PRJ and PKG default to current working - copy path .
2009-05-18 16:50:43 +02:00
2007-09-03 12:17:26 +02:00
$ { cmd_usage }
$ { cmd_option_list }
"""
2009-05-18 16:50:43 +02:00
2007-09-12 20:01:13 +02:00
pac = None
2010-09-10 14:20:42 +02:00
prj = None
2009-12-26 14:22:34 +01:00
root = None
2009-12-25 17:19:44 +01:00
roles = [ ' bugowner ' , ' maintainer ' ]
2009-12-25 17:31:13 +01:00
if len ( opts . role ) :
roles = opts . role
2009-12-25 17:19:44 +01:00
if opts . bugowner_only or opts . bugowner :
2009-06-18 18:20:49 +02:00
roles = [ ' bugowner ' ]
2010-09-10 14:20:42 +02:00
if len ( args ) == 0 :
try :
pac = store_read_package ( ' . ' )
except oscerr . NoWorkingCopy :
pass
prj = store_read_project ( ' . ' )
elif len ( args ) == 1 :
2007-09-12 20:01:13 +02:00
prj = args [ 0 ]
2007-09-03 12:17:26 +02:00
elif len ( args ) == 2 :
2007-09-12 20:01:13 +02:00
prj = args [ 0 ]
pac = args [ 1 ]
2007-09-03 12:17:26 +02:00
else :
2010-02-02 16:14:00 +01:00
raise oscerr . WrongArgs ( ' Wrong number of arguments. ' )
2009-05-18 16:50:43 +02:00
2010-07-29 17:29:07 +02:00
apiurl = self . get_api_url ( )
2009-06-18 18:20:49 +02:00
if opts . add :
2009-08-26 16:22:54 +02:00
for role in roles :
2010-07-29 17:29:07 +02:00
addPerson ( apiurl , prj , pac , opts . add , role )
2007-09-12 20:01:13 +02:00
elif opts . delete :
2009-08-26 16:22:54 +02:00
for role in roles :
2010-07-29 17:29:07 +02:00
delPerson ( apiurl , prj , pac , opts . delete , role )
2008-05-20 10:29:54 +02:00
elif opts . devel_project :
2009-12-25 17:19:44 +01:00
# XXX: does it really belong to this command?
2010-07-29 17:29:07 +02:00
setDevelProject ( apiurl , prj , pac , opts . devel_project )
2009-06-23 12:06:31 +02:00
else :
2010-02-02 16:14:00 +01:00
if pac :
2010-07-29 17:29:07 +02:00
m = show_package_meta ( apiurl , prj , pac )
2010-02-02 16:14:00 +01:00
root = ET . fromstring ( ' ' . join ( m ) )
if not opts . nodevelproject :
while root . findall ( ' devel ' ) :
d = root . find ( ' devel ' )
prj = d . get ( ' project ' , prj )
pac = d . get ( ' package ' , pac )
if opts . verbose :
print " Following to the development space: %s / %s " % ( prj , pac )
2010-07-29 17:29:07 +02:00
m = show_package_meta ( apiurl , prj , pac )
2010-02-02 16:14:00 +01:00
root = ET . fromstring ( ' ' . join ( m ) )
if not root . findall ( ' person ' ) :
if opts . verbose :
print " No dedicated persons in package defined, showing the project persons. "
pac = None
2010-07-29 17:29:07 +02:00
m = show_project_meta ( apiurl , prj )
2010-02-02 16:14:00 +01:00
root = ET . fromstring ( ' ' . join ( m ) )
else :
2010-07-29 17:29:07 +02:00
m = show_project_meta ( apiurl , prj )
2010-02-02 16:14:00 +01:00
root = ET . fromstring ( ' ' . join ( m ) )
2009-06-18 18:20:49 +02:00
# showing the maintainers
2009-12-25 17:19:44 +01:00
maintainers = { }
2009-12-26 14:22:34 +01:00
for person in root . findall ( ' person ' ) :
2009-12-25 17:19:44 +01:00
maintainers . setdefault ( person . get ( ' role ' ) , [ ] ) . append ( person . get ( ' userid ' ) )
2009-06-18 18:20:49 +02:00
for role in roles :
2009-12-25 17:19:44 +01:00
if opts . bugowner and not len ( maintainers . get ( role , [ ] ) ) :
role = ' maintainer '
2010-02-02 16:15:06 +01:00
if pac :
print " %s of %s / %s : " % ( role , prj , pac )
else :
print " %s of %s : " % ( role , prj )
2009-06-18 18:20:49 +02:00
if opts . email :
emails = [ ]
2009-12-25 17:19:44 +01:00
for maintainer in maintainers . get ( role , [ ] ) :
2010-07-29 17:29:07 +02:00
user = get_user_data ( apiurl , maintainer , ' email ' )
2009-12-12 15:02:58 +01:00
if len ( user ) :
2009-06-18 18:20:49 +02:00
emails . append ( ' ' . join ( user ) )
2009-12-25 17:19:44 +01:00
print ' , ' . join ( emails ) or ' - '
2009-06-18 18:20:49 +02:00
elif opts . verbose :
userdata = [ ]
2009-12-25 17:19:44 +01:00
for maintainer in maintainers . get ( role , [ ] ) :
2010-07-29 17:29:07 +02:00
user = get_user_data ( apiurl , maintainer , ' login ' , ' realname ' , ' email ' )
2010-02-02 16:15:06 +01:00
userdata . append ( user [ 0 ] )
if user [ 1 ] != ' - ' :
userdata . append ( " %s < %s > " % ( user [ 1 ] , user [ 2 ] ) )
else :
userdata . append ( user [ 2 ] )
for row in build_table ( 2 , userdata , None , 3 ) :
2009-06-18 18:20:49 +02:00
print row
else :
2009-12-25 17:19:44 +01:00
print ' , ' . join ( maintainers . get ( role , [ ] ) ) or ' - '
print
2007-09-03 12:17:26 +02:00
2008-01-15 19:58:58 +01:00
@cmdln.option ( ' -r ' , ' --revision ' , metavar = ' rev ' ,
help = ' print out the specified revision ' )
2009-08-20 21:28:05 +02:00
@cmdln.option ( ' -e ' , ' --expand ' , action = ' store_true ' ,
2010-03-08 10:56:29 +01:00
help = ' force expansion of linked packages. ' )
@cmdln.option ( ' -u ' , ' --unexpand ' , action = ' store_true ' ,
help = ' always work with unexpanded packages. ' )
2011-01-12 17:04:22 +01:00
@cmdln.alias ( ' less ' )
2007-11-02 19:18:30 +01:00
def do_cat ( self , subcmd , opts , * args ) :
2007-12-10 15:23:58 +01:00
""" $ {cmd_name} : Output the content of a file to standard output
2007-07-25 12:56:04 +02:00
2007-11-02 19:18:30 +01:00
Examples :
osc cat project package file
osc cat project / package / file
2009-09-03 19:28:27 +02:00
osc cat http : / / api . opensuse . org / build / . . . / _log
osc cat http : / / api . opensuse . org / source / . . / _link
2007-11-02 19:18:30 +01:00
$ { cmd_usage }
$ { cmd_option_list }
"""
2009-09-03 19:28:27 +02:00
if len ( args ) == 1 and ( args [ 0 ] . startswith ( ' http:// ' ) or
args [ 0 ] . startswith ( ' https:// ' ) ) :
2009-10-20 16:30:15 +02:00
opts . method = ' GET '
opts . headers = None
opts . data = None
opts . file = None
return self . do_api ( ' list ' , opts , * args )
2009-09-03 19:28:27 +02:00
2007-11-02 19:18:30 +01:00
args = slash_split ( args )
if len ( args ) != 3 :
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 . WrongArgs ( ' Wrong number of arguments. ' )
2008-01-15 19:58:58 +01:00
rev , dummy = parseRevisionOption ( opts . revision )
2010-07-29 17:29:07 +02:00
apiurl = self . get_api_url ( )
2007-12-10 15:23:58 +01:00
2009-08-20 21:28:05 +02:00
query = { }
2009-04-09 17:52:59 +02:00
if opts . revision :
2009-08-20 21:28:05 +02:00
query [ ' rev ' ] = opts . revision
if opts . expand :
2010-07-29 17:29:07 +02:00
query [ ' rev ' ] = show_upstream_srcmd5 ( apiurl , args [ 0 ] , args [ 1 ] , expand = True , revision = opts . revision )
u = makeurl ( apiurl , [ ' source ' , args [ 0 ] , args [ 1 ] , args [ 2 ] ] , query = query )
2010-03-08 01:31:36 +01:00
try :
2011-01-22 16:41:06 +01:00
if subcmd == ' less ' :
2011-01-12 17:04:22 +01:00
f = http_GET ( u )
run_pager ( ' ' . join ( f . readlines ( ) ) )
else :
for data in streamfile ( u ) :
sys . stdout . write ( data )
2010-03-08 01:31:36 +01:00
except urllib2 . HTTPError , e :
2010-03-08 10:56:29 +01:00
if e . code == 404 and not opts . expand and not opts . unexpand :
2010-03-08 01:31:36 +01:00
print >> sys . stderr , ' expanding link... '
2010-07-29 17:29:07 +02:00
query [ ' rev ' ] = show_upstream_srcmd5 ( apiurl , args [ 0 ] , args [ 1 ] , expand = True , revision = opts . revision )
u = makeurl ( apiurl , [ ' source ' , args [ 0 ] , args [ 1 ] , args [ 2 ] ] , query = query )
2011-01-21 11:04:47 +01:00
if subcmd == " less " :
2011-01-12 17:04:22 +01:00
f = http_GET ( u )
run_pager ( ' ' . join ( f . readlines ( ) ) )
else :
2011-01-22 16:41:06 +01:00
for data in streamfile ( u ) :
sys . stdout . write ( data )
2010-03-08 01:31:36 +01:00
else :
e . osc_msg = ' If linked, try: cat -e '
raise e
2007-12-10 15:23:58 +01:00
2009-04-21 18:52:26 +02:00
# helper function to download a file from a specific revision
def download ( self , name , md5 , dir , destfile ) :
2009-05-22 17:00:31 +02:00
o = open ( destfile , ' wb ' )
2009-04-22 11:06:13 +02:00
if md5 != ' ' :
query = { ' rev ' : dir [ ' srcmd5 ' ] }
u = makeurl ( dir [ ' apiurl ' ] , [ ' source ' , dir [ ' project ' ] , dir [ ' package ' ] , pathname2url ( name ) ] , query = query )
for buf in streamfile ( u , http_GET , BUFSIZE ) :
o . write ( buf )
2010-05-03 16:06:33 +02:00
o . close ( )
2009-04-21 18:52:26 +02:00
2009-04-23 10:58:21 +02:00
2009-04-21 18:52:26 +02:00
@cmdln.option ( ' -d ' , ' --destdir ' , default = ' repairlink ' , metavar = ' DIR ' ,
2009-04-22 11:06:13 +02:00
help = ' destination directory ' )
2009-04-23 10:58:21 +02:00
def do_repairlink ( self , subcmd , opts , * args ) :
2009-04-22 11:06:13 +02:00
""" $ {cmd_name} : Repair a broken source link
2009-04-23 10:58:21 +02:00
This command checks out a package with merged source changes . It uses
a 3 - way merge to resolve file conflicts . After reviewing / repairing
2009-10-20 16:30:15 +02:00
the merge , use ' osc resolved ... ' and ' osc ci ' to re - create a
2009-08-20 21:28:05 +02:00
working source link .
2009-04-23 10:58:21 +02:00
2009-05-18 16:50:43 +02:00
usage :
2009-05-04 11:13:35 +02:00
* For merging conflicting changes of a checkout package :
2009-04-23 10:58:21 +02:00
osc repairlink
2009-05-04 11:13:35 +02:00
* Check out a package and merge changes :
2009-04-23 10:58:21 +02:00
osc repairlink PROJECT PACKAGE
2009-05-04 11:13:35 +02:00
* Pull conflicting changes from one project into another one :
osc repairlink PROJECT PACKAGE INTO_PROJECT [ INTO_PACKAGE ]
2009-04-22 11:06:13 +02:00
$ { cmd_option_list }
"""
2010-04-30 17:13:21 +02:00
apiurl = self . get_api_url ( )
2009-05-07 20:43:04 +02:00
if len ( args ) > = 3 and len ( args ) < = 4 :
2009-04-23 10:58:21 +02:00
prj = args [ 0 ]
2009-05-04 11:13:35 +02:00
package = target_package = args [ 1 ]
target_prj = args [ 2 ]
if len ( args ) == 4 :
2009-10-20 16:30:15 +02:00
target_package = args [ 3 ]
2009-05-07 20:43:04 +02:00
elif len ( args ) == 2 :
2009-05-04 11:13:35 +02:00
target_prj = prj = args [ 0 ]
target_package = package = args [ 1 ]
2009-05-07 20:43:04 +02:00
elif is_package_dir ( os . getcwd ( ) ) :
target_prj = prj = store_read_project ( os . getcwd ( ) )
target_package = package = store_read_package ( os . getcwd ( ) )
2009-04-23 10:58:21 +02:00
else :
2009-05-07 20:43:04 +02:00
raise oscerr . WrongArgs ( ' Please specify project and package ' )
2009-04-22 11:06:13 +02:00
2009-04-27 12:09:38 +02:00
# first try stored reference, then lastworking
query = { ' rev ' : ' latest ' }
2009-04-22 11:06:13 +02:00
u = makeurl ( apiurl , [ ' source ' , prj , package ] , query = query )
f = http_GET ( u )
root = ET . parse ( f ) . getroot ( )
linkinfo = root . find ( ' linkinfo ' )
if linkinfo == None :
raise oscerr . APIError ( ' package is not a source link ' )
if linkinfo . get ( ' error ' ) == None :
raise oscerr . APIError ( ' source link is not broken ' )
2009-04-27 12:09:38 +02:00
workingrev = None
baserev = linkinfo . get ( ' baserev ' )
if baserev != None :
query = { ' rev ' : ' latest ' , ' linkrev ' : baserev }
u = makeurl ( apiurl , [ ' source ' , prj , package ] , query = query )
f = http_GET ( u )
root = ET . parse ( f ) . getroot ( )
linkinfo = root . find ( ' linkinfo ' )
if linkinfo . get ( ' error ' ) == None :
workingrev = linkinfo . get ( ' xsrcmd5 ' )
if workingrev == None :
query = { ' lastworking ' : 1 }
u = makeurl ( apiurl , [ ' source ' , prj , package ] , query = query )
f = http_GET ( u )
root = ET . parse ( f ) . getroot ( )
linkinfo = root . find ( ' linkinfo ' )
if linkinfo == None :
raise oscerr . APIError ( ' package is not a source link ' )
if linkinfo . get ( ' error ' ) == None :
raise oscerr . APIError ( ' source link is not broken ' )
workingrev = linkinfo . get ( ' lastworking ' )
if workingrev == None :
raise oscerr . APIError ( ' source link never worked ' )
print " using last working link target "
else :
print " using link target of last commit "
2009-04-22 11:06:13 +02:00
query = { ' expand ' : 1 , ' emptylink ' : 1 }
u = makeurl ( apiurl , [ ' source ' , prj , package ] , query = query )
f = http_GET ( u )
meta = f . readlines ( )
2009-12-26 14:22:34 +01:00
root_new = ET . fromstring ( ' ' . join ( meta ) )
2009-04-22 15:14:17 +02:00
dir_new = { ' apiurl ' : apiurl , ' project ' : prj , ' package ' : package }
2009-04-22 11:06:13 +02:00
dir_new [ ' srcmd5 ' ] = root_new . get ( ' srcmd5 ' )
2009-05-07 21:13:50 +02:00
dir_new [ ' entries ' ] = [ [ n . get ( ' name ' ) , n . get ( ' md5 ' ) ] for n in root_new . findall ( ' entry ' ) ]
2009-04-22 11:06:13 +02:00
2009-04-27 12:09:38 +02:00
query = { ' rev ' : workingrev }
2009-04-22 11:06:13 +02:00
u = makeurl ( apiurl , [ ' source ' , prj , package ] , query = query )
f = http_GET ( u )
root_oldpatched = ET . parse ( f ) . getroot ( )
linkinfo_oldpatched = root_oldpatched . find ( ' linkinfo ' )
if linkinfo_oldpatched == None :
2009-04-27 12:09:38 +02:00
raise oscerr . APIError ( ' working rev is not a source link? ' )
2009-04-22 11:06:13 +02:00
if linkinfo_oldpatched . get ( ' error ' ) != None :
2009-04-27 12:09:38 +02:00
raise oscerr . APIError ( ' working rev is not working? ' )
2009-04-22 15:14:17 +02:00
dir_oldpatched = { ' apiurl ' : apiurl , ' project ' : prj , ' package ' : package }
2009-04-22 11:06:13 +02:00
dir_oldpatched [ ' srcmd5 ' ] = root_oldpatched . get ( ' srcmd5 ' )
2009-05-07 21:13:50 +02:00
dir_oldpatched [ ' entries ' ] = [ [ n . get ( ' name ' ) , n . get ( ' md5 ' ) ] for n in root_oldpatched . findall ( ' entry ' ) ]
2009-04-22 11:06:13 +02:00
query = { }
query [ ' rev ' ] = linkinfo_oldpatched . get ( ' srcmd5 ' )
u = makeurl ( apiurl , [ ' source ' , linkinfo_oldpatched . get ( ' project ' ) , linkinfo_oldpatched . get ( ' package ' ) ] , query = query )
f = http_GET ( u )
root_old = ET . parse ( f ) . getroot ( )
2009-04-22 15:14:17 +02:00
dir_old = { ' apiurl ' : apiurl }
2009-04-22 11:06:13 +02:00
dir_old [ ' project ' ] = linkinfo_oldpatched . get ( ' project ' )
dir_old [ ' package ' ] = linkinfo_oldpatched . get ( ' package ' )
2009-04-22 15:14:17 +02:00
dir_old [ ' srcmd5 ' ] = root_old . get ( ' srcmd5 ' )
2009-05-07 21:13:50 +02:00
dir_old [ ' entries ' ] = [ [ n . get ( ' name ' ) , n . get ( ' md5 ' ) ] for n in root_old . findall ( ' entry ' ) ]
2009-04-22 11:06:13 +02:00
entries_old = dict ( dir_old [ ' entries ' ] )
entries_oldpatched = dict ( dir_oldpatched [ ' entries ' ] )
entries_new = dict ( dir_new [ ' entries ' ] )
entries = { }
entries . update ( entries_old )
entries . update ( entries_oldpatched )
entries . update ( entries_new )
destdir = opts . destdir
if os . path . isdir ( destdir ) :
shutil . rmtree ( destdir )
os . mkdir ( destdir )
2010-08-30 13:46:49 +02:00
Package . init_package ( apiurl , target_prj , target_package , destdir )
2010-08-30 14:20:12 +02:00
store_write_string ( destdir , ' _files ' , ' ' . join ( meta ) + ' \n ' )
2009-10-20 16:30:15 +02:00
store_write_string ( destdir , ' _linkrepair ' , ' ' )
2009-04-22 11:06:13 +02:00
pac = Package ( destdir )
storedir = os . path . join ( destdir , store )
for name in sorted ( entries . keys ( ) ) :
md5_old = entries_old . get ( name , ' ' )
md5_new = entries_new . get ( name , ' ' )
md5_oldpatched = entries_oldpatched . get ( name , ' ' )
if md5_new != ' ' :
self . download ( name , md5_new , dir_new , os . path . join ( storedir , name ) )
if md5_old == md5_new :
if md5_oldpatched == ' ' :
pac . put_on_deletelist ( name )
continue
print statfrmt ( ' ' , name )
self . download ( name , md5_oldpatched , dir_oldpatched , os . path . join ( destdir , name ) )
continue
if md5_old == md5_oldpatched :
if md5_new == ' ' :
continue
2009-04-23 10:58:21 +02:00
print statfrmt ( ' U ' , name )
2009-04-22 11:06:13 +02:00
shutil . copy2 ( os . path . join ( storedir , name ) , os . path . join ( destdir , name ) )
continue
if md5_new == md5_oldpatched :
if md5_new == ' ' :
continue
print statfrmt ( ' G ' , name )
shutil . copy2 ( os . path . join ( storedir , name ) , os . path . join ( destdir , name ) )
continue
self . download ( name , md5_oldpatched , dir_oldpatched , os . path . join ( destdir , name + ' .mine ' ) )
if md5_new != ' ' :
shutil . copy2 ( os . path . join ( storedir , name ) , os . path . join ( destdir , name + ' .new ' ) )
else :
self . download ( name , md5_new , dir_new , os . path . join ( destdir , name + ' .new ' ) )
self . download ( name , md5_old , dir_old , os . path . join ( destdir , name + ' .old ' ) )
2009-04-23 11:03:59 +02:00
if binary_file ( os . path . join ( destdir , name + ' .mine ' ) ) or \
binary_file ( os . path . join ( destdir , name + ' .old ' ) ) or \
binary_file ( os . path . join ( destdir , name + ' .new ' ) ) :
shutil . copy2 ( os . path . join ( destdir , name + ' .new ' ) , os . path . join ( destdir , name ) )
print statfrmt ( ' C ' , name )
pac . put_on_conflictlist ( name )
continue
2009-05-22 17:00:31 +02:00
o = open ( os . path . join ( destdir , name ) , ' wb ' )
2010-03-05 11:45:35 +01:00
code = subprocess . call ( [ ' diff3 ' , ' -m ' , ' -E ' ,
2009-04-22 11:06:13 +02:00
' -L ' , ' .mine ' ,
2009-04-21 18:52:26 +02:00
os . path . join ( destdir , name + ' .mine ' ) ,
2009-04-22 11:06:13 +02:00
' -L ' , ' .old ' ,
2009-04-21 18:52:26 +02:00
os . path . join ( destdir , name + ' .old ' ) ,
2009-04-22 11:06:13 +02:00
' -L ' , ' .new ' ,
2009-04-21 18:52:26 +02:00
os . path . join ( destdir , name + ' .new ' ) ,
2009-04-22 11:06:13 +02:00
] , stdout = o )
if code == 0 :
2009-04-23 10:58:21 +02:00
print statfrmt ( ' G ' , name )
2009-04-27 12:09:38 +02:00
os . unlink ( os . path . join ( destdir , name + ' .mine ' ) )
os . unlink ( os . path . join ( destdir , name + ' .old ' ) )
os . unlink ( os . path . join ( destdir , name + ' .new ' ) )
2009-04-22 11:06:13 +02:00
elif code == 1 :
print statfrmt ( ' C ' , name )
pac . put_on_conflictlist ( name )
else :
print statfrmt ( ' ? ' , name )
pac . put_on_conflictlist ( name )
pac . write_deletelist ( )
pac . write_conflictlist ( )
print
print ' Please change into the \' %s \' directory, ' % destdir
2009-08-20 21:28:05 +02:00
print ' fix the conflicts (files marked with \' C \' above), '
print ' run \' osc resolved ... \' , and commit the changes. '
2009-04-21 18:52:26 +02:00
2009-10-16 16:16:25 +02:00
2009-12-17 17:16:56 +01:00
def do_pull ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : merge the changes of the link target into your working copy.
$ { cmd_option_list }
"""
if not is_package_dir ( ' . ' ) :
2009-12-17 20:20:35 +01:00
raise oscerr . NoWorkingCopy ( ' Error: \' %s \' is not an osc working copy. ' % os . path . abspath ( ' . ' ) )
p = Package ( ' . ' )
2009-12-17 17:16:56 +01:00
# check if everything is committed
2009-12-17 20:20:35 +01:00
for filename in p . filenamelist :
2010-07-28 12:08:40 +02:00
state = p . status ( filename )
if state != ' ' and state != ' S ' :
2009-12-17 20:20:35 +01:00
raise oscerr . WrongArgs ( ' Please commit your local changes first! ' )
2009-12-17 17:16:56 +01:00
# check if we need to update
upstream_rev = p . latest_rev ( )
2011-02-14 12:26:51 +01:00
if not ( p . isfrozen ( ) or p . ispulled ( ) ) :
raise oscerr . WrongArgs ( ' osc pull makes only sense with a detached head, did you mean osc up? ' )
2009-12-17 17:16:56 +01:00
if p . rev != upstream_rev :
2009-12-17 20:20:35 +01:00
raise oscerr . WorkingCopyOutdated ( ( p . absdir , p . rev , upstream_rev ) )
elif not p . islink ( ) :
raise oscerr . WrongArgs ( ' osc pull only works on linked packages. ' )
elif not p . isexpanded ( ) :
raise oscerr . WrongArgs ( ' osc pull only works on expanded links. ' )
2010-01-11 17:00:24 +01:00
linkinfo = p . linkinfo
baserev = linkinfo . baserev
if baserev == None :
raise oscerr . WrongArgs ( ' osc pull only works on links containing a base revision. ' )
2009-12-17 20:20:35 +01:00
2010-01-11 17:00:24 +01:00
# get revisions we need
query = { ' expand ' : 1 , ' emptylink ' : 1 }
u = makeurl ( p . apiurl , [ ' source ' , p . prjname , p . name ] , query = query )
f = http_GET ( u )
meta = f . readlines ( )
root_new = ET . fromstring ( ' ' . join ( meta ) )
linkinfo_new = root_new . find ( ' linkinfo ' )
if linkinfo_new == None :
raise oscerr . APIError ( ' link is not a really a link? ' )
if linkinfo_new . get ( ' error ' ) != None :
raise oscerr . APIError ( ' link target is broken ' )
2010-01-14 20:16:10 +01:00
if linkinfo_new . get ( ' srcmd5 ' ) == baserev :
2010-01-11 17:00:24 +01:00
print " Already up-to-date. "
2010-01-20 17:55:44 +01:00
p . unmark_frozen ( )
2010-01-11 17:00:24 +01:00
return
dir_new = { ' apiurl ' : p . apiurl , ' project ' : p . prjname , ' package ' : p . name }
dir_new [ ' srcmd5 ' ] = root_new . get ( ' srcmd5 ' )
dir_new [ ' entries ' ] = [ [ n . get ( ' name ' ) , n . get ( ' md5 ' ) ] for n in root_new . findall ( ' entry ' ) ]
2009-12-17 17:16:56 +01:00
2010-01-11 17:00:24 +01:00
dir_oldpatched = { ' apiurl ' : p . apiurl , ' project ' : p . prjname , ' package ' : p . name , ' srcmd5 ' : p . srcmd5 }
2010-01-14 20:16:10 +01:00
dir_oldpatched [ ' entries ' ] = [ [ f . name , f . md5 ] for f in p . filelist ]
2010-02-28 02:30:13 +01:00
2010-01-11 17:00:24 +01:00
query = { ' rev ' : linkinfo . srcmd5 }
u = makeurl ( p . apiurl , [ ' source ' , linkinfo . project , linkinfo . package ] , query = query )
f = http_GET ( u )
root_old = ET . parse ( f ) . getroot ( )
dir_old = { ' apiurl ' : p . apiurl , ' project ' : linkinfo . project , ' package ' : linkinfo . package , ' srcmd5 ' : linkinfo . srcmd5 }
dir_old [ ' entries ' ] = [ [ n . get ( ' name ' ) , n . get ( ' md5 ' ) ] for n in root_old . findall ( ' entry ' ) ]
# now do 3-way merge
entries_old = dict ( dir_old [ ' entries ' ] )
entries_oldpatched = dict ( dir_oldpatched [ ' entries ' ] )
entries_new = dict ( dir_new [ ' entries ' ] )
entries = { }
entries . update ( entries_old )
entries . update ( entries_oldpatched )
entries . update ( entries_new )
for name in sorted ( entries . keys ( ) ) :
2011-03-17 15:35:22 +01:00
if name . startswith ( ' _service: ' ) or name . startswith ( ' _service_ ' ) :
continue
2010-01-11 17:00:24 +01:00
md5_old = entries_old . get ( name , ' ' )
md5_new = entries_new . get ( name , ' ' )
md5_oldpatched = entries_oldpatched . get ( name , ' ' )
if md5_old == md5_new or md5_oldpatched == md5_new :
2010-01-14 20:16:10 +01:00
continue
2010-01-11 17:00:24 +01:00
if md5_old == md5_oldpatched :
if md5_new == ' ' :
2010-01-14 20:16:10 +01:00
print statfrmt ( ' D ' , name )
2010-01-11 17:00:24 +01:00
p . put_on_deletelist ( name )
2010-01-14 20:16:10 +01:00
os . unlink ( name )
2010-10-29 17:41:39 +02:00
elif md5_old == ' ' :
print statfrmt ( ' A ' , name )
self . download ( name , md5_new , dir_new , name )
p . put_on_addlist ( name )
2010-01-11 17:00:24 +01:00
else :
2010-01-14 20:16:10 +01:00
print statfrmt ( ' U ' , name )
2010-01-11 17:00:24 +01:00
self . download ( name , md5_new , dir_new , name )
2010-01-14 20:16:10 +01:00
continue
# need diff3 to resolve issue
if md5_oldpatched == ' ' :
open ( name , ' w ' ) . write ( ' ' )
os . rename ( name , name + ' .mine ' )
self . download ( name , md5_new , dir_new , name + ' .new ' )
2010-01-11 17:00:24 +01:00
self . download ( name , md5_old , dir_old , name + ' .old ' )
if binary_file ( name + ' .mine ' ) or binary_file ( name + ' .old ' ) or binary_file ( name + ' .new ' ) :
shutil . copy2 ( name + ' .new ' , name )
print statfrmt ( ' C ' , name )
p . put_on_conflictlist ( name )
continue
o = open ( name , ' wb ' )
2010-03-05 11:45:35 +01:00
code = subprocess . call ( [ ' diff3 ' , ' -m ' , ' -E ' ,
2010-01-11 17:00:24 +01:00
' -L ' , ' .mine ' , name + ' .mine ' ,
' -L ' , ' .old ' , name + ' .old ' ,
' -L ' , ' .new ' , name + ' .new ' ,
] , stdout = o )
if code == 0 :
print statfrmt ( ' G ' , name )
os . unlink ( name + ' .mine ' )
os . unlink ( name + ' .old ' )
os . unlink ( name + ' .new ' )
elif code == 1 :
print statfrmt ( ' C ' , name )
p . put_on_conflictlist ( name )
else :
print statfrmt ( ' ? ' , name )
p . put_on_conflictlist ( name )
p . write_deletelist ( )
2010-10-29 17:41:39 +02:00
p . write_addlist ( )
2010-01-11 17:00:24 +01:00
p . write_conflictlist ( )
# store new linkrev
2010-08-30 14:20:12 +02:00
store_write_string ( p . absdir , ' _pulled ' , linkinfo_new . get ( ' srcmd5 ' ) + ' \n ' )
2010-01-20 17:55:44 +01:00
p . unmark_frozen ( )
2010-01-11 17:00:24 +01:00
print
2010-01-14 20:16:10 +01:00
if len ( p . in_conflict ) :
2010-01-11 17:00:24 +01:00
print ' Please fix the conflicts (files marked with \' C \' above), '
print ' run \' osc resolved ... \' , and commit the changes '
2010-01-14 20:16:10 +01:00
print ' to update the link information. '
else :
print ' Please commit the changes to update the link information. '
2009-12-17 17:16:56 +01:00
2009-10-16 16:12:55 +02:00
@cmdln.option ( ' --create ' , action = ' store_true ' , default = False ,
help = ' create new gpg signing key for this project ' )
2010-07-13 13:53:47 +02:00
@cmdln.option ( ' --extend ' , action = ' store_true ' , default = False ,
help = ' extend expiration date of the gpg public key for this project ' )
2009-10-16 16:12:55 +02:00
@cmdln.option ( ' --delete ' , action = ' store_true ' , default = False ,
help = ' delete the gpg signing key in this project ' )
2009-11-26 11:56:28 +01:00
@cmdln.option ( ' --notraverse ' , action = ' store_true ' , default = False ,
help = ' don \' traverse projects upwards to find key ' )
2009-10-16 16:12:55 +02:00
def do_signkey ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Manage Project Signing Key
2010-07-13 13:53:47 +02:00
osc signkey [ - - create | - - delete | - - extend ] < PROJECT >
2009-11-26 11:56:28 +01:00
osc signkey [ - - notraverse ] < PROJECT >
2009-10-16 16:12:55 +02:00
This command is for managing gpg keys . It shows the public key
2009-10-20 16:30:15 +02:00
by default . There is no way to download or upload the private
2009-10-16 16:12:55 +02:00
part of a key by design .
However you can create a new own key . You may want to consider
to sign the public key with your own existing key .
If a project has no key , the key from upper level project will
be used ( eg . when dropping " KDE:KDE4:Community " key , the one from
" KDE:KDE4 " will be used ) .
2009-10-16 16:33:55 +02:00
WARNING : THE OLD KEY WILL NOT BE RESTORABLE WHEN USING DELETE OR CREATE
2009-10-16 16:12:55 +02:00
$ { cmd_usage }
$ { cmd_option_list }
"""
2010-04-30 17:13:21 +02:00
apiurl = self . get_api_url ( )
2009-10-16 16:12:55 +02:00
f = None
2009-11-26 11:56:28 +01:00
prj = None
if len ( args ) == 0 :
2010-08-20 14:34:41 +02:00
cwd = os . getcwd ( )
if is_project_dir ( cwd ) or is_package_dir ( cwd ) :
prj = store_read_project ( cwd )
2009-10-16 16:12:55 +02:00
if len ( args ) == 1 :
prj = args [ 0 ]
2009-11-26 11:56:28 +01:00
if not prj :
2009-10-16 16:12:55 +02:00
raise oscerr . WrongArgs ( ' Please specify just the project ' )
if opts . create :
2009-10-20 16:30:15 +02:00
url = makeurl ( apiurl , [ ' source ' , prj ] , query = ' cmd=createkey ' )
f = http_POST ( url )
2010-07-13 13:53:47 +02:00
elif opts . extend :
2010-07-13 14:53:25 +02:00
url = makeurl ( apiurl , [ ' source ' , prj ] , query = ' cmd=extendkey ' )
2010-07-13 13:53:47 +02:00
f = http_POST ( url )
2009-10-16 16:12:55 +02:00
elif opts . delete :
2009-10-20 16:30:15 +02:00
url = makeurl ( apiurl , [ ' source ' , prj , " _pubkey " ] )
f = http_DELETE ( url )
2009-10-16 16:12:55 +02:00
else :
2010-08-08 23:45:04 +02:00
while True :
2009-11-26 11:56:28 +01:00
try :
2010-08-08 23:45:04 +02:00
url = makeurl ( apiurl , [ ' source ' , prj , ' _pubkey ' ] )
2009-11-26 11:56:28 +01:00
f = http_GET ( url )
break
2010-08-08 23:45:04 +02:00
except urllib2 . HTTPError , e :
2009-11-26 11:56:28 +01:00
l = prj . rsplit ( ' : ' , 1 )
# try key from parent project
2010-08-08 23:45:04 +02:00
if not opts . notraverse and len ( l ) > 1 and l [ 0 ] and l [ 1 ] and e . code == 404 :
print ' %s has no key, trying %s ' % ( prj , l [ 0 ] )
prj = l [ 0 ]
2009-11-26 11:56:28 +01:00
else :
2009-12-12 15:02:58 +01:00
raise
2009-10-16 16:12:55 +02:00
2010-03-17 15:28:10 +01:00
while True :
2009-10-16 16:12:55 +02:00
buf = f . read ( 16384 )
2010-03-17 15:28:10 +01:00
if not buf :
break
sys . stdout . write ( buf )
2009-10-16 16:12:55 +02:00
2009-04-20 15:40:33 +02:00
@cmdln.option ( ' -m ' , ' --message ' ,
2009-04-22 16:44:17 +02:00
help = ' add MESSAGE to changes (not open an editor) ' )
@cmdln.option ( ' -e ' , ' --just-edit ' , action = ' store_true ' , default = False ,
2009-04-27 12:09:38 +02:00
help = ' just open changes (cannot be used with -m) ' )
2009-04-20 15:40:33 +02:00
def do_vc ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : Edit the changes file
2009-04-22 16:44:17 +02:00
osc vc [ - m MESSAGE | - e ] [ filename [ . changes ] | path [ file_with_comment ] ]
2009-04-20 15:40:33 +02:00
If no < filename > is given , exactly one * . changes or * . spec file has to
be in the cwd or in path .
2010-01-02 12:25:37 +01:00
The email address used in . changes file is read from BuildService
2009-04-20 15:40:33 +02:00
instance , or should be defined in ~ / . oscrc
[ https : / / api . opensuse . org / ]
user = login
pass = password
email = user @defined.email
or can be specified via mailaddr environment variable .
$ { cmd_usage }
$ { cmd_option_list }
"""
2009-05-18 16:50:43 +02:00
2010-07-26 16:46:21 +02:00
from subprocess import Popen
2009-04-20 15:40:33 +02:00
2010-08-20 13:00:57 +02:00
meego_style = False
if not args :
import glob , re
try :
fn_changelog = glob . glob ( ' *.changes ' ) [ 0 ]
fp = file ( fn_changelog )
titleline = fp . readline ( )
fp . close ( )
if re . match ( ' ^ \ * \ W+(.+ \ W+ \ d { 1,2} \ W+20 \ d {2} ) \ W+(.+) \ W+<(.+)> \ W+(.+)$ ' , titleline ) :
meego_style = True
except IndexError :
pass
2009-04-20 15:40:33 +02:00
2010-08-20 13:00:57 +02:00
if meego_style :
if not os . path . exists ( ' /usr/bin/vc ' ) :
print >> sys . stderr , ' Error: you need meego-packaging-tools for /usr/bin/vc command '
return 1
2010-08-23 10:08:09 +02:00
cmd_list = [ ' /usr/bin/vc ' ]
2010-08-20 13:00:57 +02:00
else :
if not os . path . exists ( ' /usr/lib/build/vc ' ) :
print >> sys . stderr , ' Error: you need build.rpm with version 2009.04.17 or newer '
print >> sys . stderr , ' See http://download.opensuse.org/repositories/openSUSE:/Tools/ '
return 1
2010-08-23 10:08:09 +02:00
cmd_list = [ ' /usr/lib/build/vc ' ]
2009-04-20 15:40:33 +02:00
# set user's email if no mailaddr exists
if not os . environ . has_key ( ' mailaddr ' ) :
2009-05-18 16:50:43 +02:00
2010-08-23 10:08:09 +02:00
if len ( args ) and is_package_dir ( args [ 0 ] ) :
apiurl = store_read_apiurl ( args [ 0 ] )
2009-04-20 15:40:33 +02:00
else :
2010-04-30 17:13:21 +02:00
apiurl = self . get_api_url ( )
2009-04-20 15:40:33 +02:00
2009-04-22 19:38:14 +02:00
user = conf . get_apiurl_usr ( apiurl )
2009-04-20 15:40:33 +02:00
2010-08-20 13:00:57 +02:00
try :
os . environ [ ' mailaddr ' ] , os . environ [ ' username ' ] = get_user_data ( apiurl , user , ' email ' , ' realname ' )
except Exception , e :
sys . exit ( ' %s \n get_user_data(email) failed. Try env mailaddr=.... \n ' % e )
# mailaddr can be overrided by config one
2009-11-18 21:31:08 +01:00
if conf . config [ ' api_host_options ' ] [ apiurl ] . has_key ( ' email ' ) :
os . environ [ ' mailaddr ' ] = conf . config [ ' api_host_options ' ] [ apiurl ] [ ' email ' ]
2009-04-20 15:40:33 +02:00
2010-08-20 13:00:57 +02:00
if meego_style :
if opts . message or opts . just_edit :
print >> sys . stderr , ' Warning: to edit MeeGo style changelog, opts will be ignored. '
else :
if opts . message :
cmd_list . append ( " -m " )
cmd_list . append ( opts . message )
2009-04-20 15:40:33 +02:00
2010-08-20 13:00:57 +02:00
if opts . just_edit :
cmd_list . append ( " -e " )
2009-04-22 16:44:17 +02:00
2010-08-23 10:08:09 +02:00
cmd_list . extend ( args )
2009-04-20 15:40:33 +02:00
vc = Popen ( cmd_list )
vc . wait ( )
sys . exit ( vc . returncode )
2009-11-24 17:25:48 +01:00
@cmdln.option ( ' -f ' , ' --force ' , action = ' store_true ' ,
help = ' forces removal of entire package and its files ' )
def do_mv ( self , subcmd , opts , source , dest ) :
""" $ {cmd_name} : Move SOURCE file to DEST and keep it under version control
$ { cmd_usage }
$ { cmd_option_list }
"""
if not os . path . isfile ( source ) :
raise oscerr . WrongArgs ( " Source file `` %s ' ' does not exists " % source )
if not opts . force and os . path . isfile ( dest ) :
raise oscerr . WrongArgs ( " Dest file `` %s ' ' already exists " % dest )
if not is_package_dir ( ' . ' ) :
raise oscerr . NoWorkingCopy ( " Error: \" %s \" is not an osc working copy. " % os . path . abspath ( dir ) )
p = findpacs ( ' . ' ) [ 0 ]
os . rename ( source , dest )
self . do_add ( subcmd , opts , dest )
self . do_delete ( subcmd , opts , source )
2010-03-07 22:50:11 +01:00
@cmdln.option ( ' -d ' , ' --delete ' , action = ' store_true ' ,
help = ' delete option from config or reset option to the default) ' )
2010-10-16 12:24:21 +02:00
@cmdln.option ( ' -s ' , ' --stdin ' , action = ' store_true ' ,
help = ' indicates that the config value should be read from stdin ' )
@cmdln.option ( ' -p ' , ' --prompt ' , action = ' store_true ' ,
help = ' prompt for a value ' )
@cmdln.option ( ' --no-echo ' , action = ' store_true ' ,
help = ' prompt for a value but do not echo entered characters ' )
2010-12-18 17:16:43 +01:00
@cmdln.option ( ' --dump ' , action = ' store_true ' ,
help = ' dump the complete configuration (without \' pass \' and \' passx \' options) ' )
@cmdln.option ( ' --dump-full ' , action = ' store_true ' ,
help = ' dump the complete configuration (including \' pass \' and \' passx \' options) ' )
def do_config ( self , subcmd , opts , * args ) :
2010-03-07 22:50:11 +01:00
""" $ {cmd_name} : get/set a config option
Examples :
osc config section option ( get current value )
osc config section option value ( set to value )
osc config section option - - delete ( delete option / reset to the default )
2010-10-16 12:24:21 +02:00
( section is either an apiurl or an alias or ' general ' )
2010-12-18 17:16:43 +01:00
osc config - - dump ( dump the complete configuration )
2010-03-07 22:50:11 +01:00
$ { cmd_usage }
$ { cmd_option_list }
"""
2010-12-18 17:16:43 +01:00
if len ( args ) < 2 and not ( opts . dump or opts . dump_full ) :
raise oscerr . WrongArgs ( ' Too few arguments ' )
elif opts . dump or opts . dump_full :
cp = conf . get_configParser ( conf . config [ ' conffile ' ] )
for sect in cp . sections ( ) :
print ' [ %s ] ' % sect
for opt in sorted ( cp . options ( sect ) ) :
if sect == ' general ' and opt in conf . api_host_options or \
sect != ' general ' and not opt in conf . api_host_options :
continue
if opt in ( ' pass ' , ' passx ' ) and not opts . dump_full :
continue
val = str ( cp . get ( sect , opt , raw = True ) )
# special handling for continuation lines
val = ' \n ' . join ( val . split ( ' \n ' ) )
print ' %s = %s ' % ( opt , val )
print
return
section , opt , val = args [ 0 ] , args [ 1 ] , args [ 2 : ]
2010-10-16 12:24:21 +02:00
if len ( val ) and ( opts . delete or opts . stdin or opts . prompt or opts . no_echo ) :
raise oscerr . WrongOptions ( ' Sorry, \' --delete \' or \' --stdin \' or \' --prompt \' or \' --no-echo \' ' \
' and the specification of a value argument are mutually exclusive ' )
elif ( opts . prompt or opts . no_echo ) and opts . stdin :
raise oscerr . WrongOptions ( ' Sorry, \' --prompt \' or \' --no-echo \' and \' --stdin \' are mutually exclusive ' )
elif opts . stdin :
# strip lines
val = [ i . strip ( ) for i in sys . stdin . readlines ( ) if i . strip ( ) ]
if not len ( val ) :
raise oscerr . WrongArgs ( ' error: read empty value from stdin ' )
elif opts . no_echo or opts . prompt :
if opts . no_echo :
import getpass
inp = getpass . getpass ( ' Value: ' ) . strip ( )
else :
inp = raw_input ( ' Value: ' ) . strip ( )
if not inp :
raise oscerr . WrongArgs ( ' error: no value was entered ' )
val = [ inp ]
2010-11-14 13:08:26 +01:00
opt , newval = conf . config_set_option ( section , opt , ' ' . join ( val ) , delete = opts . delete , update = True )
2010-03-07 22:50:11 +01:00
if newval is None and opts . delete :
print ' \' %s \' : \' %s \' got removed ' % ( section , opt )
elif newval is None :
print ' \' %s \' : \' %s \' is not set ' % ( section , opt )
else :
2010-10-16 12:32:21 +02:00
if opts . no_echo :
# supress value
print ' \' %s \' : set \' %s \' ' % ( section , opt )
2010-11-14 13:08:26 +01:00
elif opt == ' pass ' and not conf . config [ ' plaintext_passwd ' ] and newval == ' your_password ' :
opt , newval = conf . config_set_option ( section , ' passx ' )
print ' \' %s \' : \' pass \' was rewritten to \' passx \' : \' %s \' ' % ( section , newval )
2010-10-16 12:32:21 +02:00
else :
print ' \' %s \' : \' %s \' is set to \' %s \' ' % ( section , opt , newval )
2009-11-24 17:25:48 +01:00
2010-08-23 16:15:05 +02:00
def do_revert ( self , subcmd , opts , * files ) :
""" $ {cmd_name} : restore original wc file
Examples :
osc revert < modified file ( s ) >
Note : this only works for files in a package working copy
$ { cmd_usage }
$ { cmd_option_list }
"""
pacs = findpacs ( files )
for p in pacs :
if not len ( p . todo ) :
p . todo = p . filenamelist
for f in p . todo :
p . revert ( f )
2010-09-08 18:56:15 +02:00
2010-12-07 20:35:12 +01:00
@cmdln.option ( ' --force-apiurl ' , action = ' store_true ' ,
help = ' ask once for an apiurl and force this apiurl for all inconsistent projects/packages ' )
2010-09-08 18:56:15 +02:00
def do_repairwc ( self , subcmd , opts , * args ) :
""" $ {cmd_name} : try to repair an inconsistent working copy
Examples :
osc repairwc < path >
2010-09-14 14:51:18 +02:00
Note : if < path > is omitted it defaults to ' . ' ( < path > can be
a project or package working copy )
2010-09-08 18:56:15 +02:00
Warning : This command might delete some files in the storedir
( . osc ) . Please check the state of the wc afterwards ( via ' osc status ' ) .
$ { cmd_usage }
$ { cmd_option_list }
"""
2010-10-10 21:40:31 +02:00
def get_apiurl ( apiurls ) :
print ' No apiurl is defined for this working copy. \n ' \
' Please choose one from the following list (enter the number): '
for i in range ( len ( apiurls ) ) :
print ' %d ) %s ' % ( i , apiurls [ i ] )
num = raw_input ( ' > ' )
try :
num = int ( num )
except ValueError :
raise oscerr . WrongArgs ( ' \' %s \' is not a number. Aborting ' % num )
if num < 0 or num > = len ( apiurls ) :
raise oscerr . WrongArgs ( ' number \' %s \' out of range. Aborting ' % num )
return apiurls [ num ]
2010-09-08 18:56:15 +02:00
args = parseargs ( args )
2010-09-14 14:40:18 +02:00
pacs = [ ]
2010-12-09 20:36:06 +01:00
apiurls = conf . config [ ' api_host_options ' ] . keys ( )
2010-12-07 20:35:12 +01:00
apiurl = ' '
2010-09-14 14:40:18 +02:00
for i in args :
if is_project_dir ( i ) :
2010-10-10 21:40:31 +02:00
try :
prj = Project ( i , getPackageList = False )
except oscerr . WorkingCopyInconsistent , e :
2010-12-07 20:35:12 +01:00
if ' _apiurl ' in e . dirty_files and ( not apiurl or not opts . force_apiurl ) :
2010-10-10 21:40:31 +02:00
apiurl = get_apiurl ( apiurls )
prj = Project ( i , getPackageList = False , wc_check = False )
prj . wc_repair ( apiurl )
2010-09-14 14:40:18 +02:00
for p in prj . pacs_have :
if p in prj . pacs_broken :
continue
try :
Package ( os . path . join ( i , p ) )
except oscerr . WorkingCopyInconsistent :
pacs . append ( os . path . join ( i , p ) )
elif is_package_dir ( i ) :
pacs . append ( i )
else :
print >> sys . stderr , ' \' %s \' is neither a project working copy ' \
' nor a package working copy ' % i
2010-09-28 23:07:33 +02:00
for pdir in pacs :
2010-09-14 14:40:18 +02:00
try :
2010-09-28 23:07:33 +02:00
p = Package ( pdir )
except oscerr . WorkingCopyInconsistent , e :
2010-12-07 20:35:12 +01:00
if ' _apiurl ' in e . dirty_files and ( not apiurl or not opts . force_apiurl ) :
2010-10-10 21:40:31 +02:00
apiurl = get_apiurl ( apiurls )
2010-09-28 23:07:33 +02:00
p = Package ( pdir , wc_check = False )
p . wc_repair ( apiurl )
2010-09-14 14:48:10 +02:00
print ' done. Please check the state of the wc (via \' osc status %s \' ). ' % i
2010-09-14 14:40:18 +02:00
else :
2010-09-14 14:48:10 +02:00
print >> sys . stderr , ' osc: working copy \' %s \' is not inconsistent ' % i
2007-07-25 12:56:04 +02:00
# fini!
###############################################################################
2009-05-18 16:50:43 +02:00
2007-06-29 20:26:30 +02:00
# load subcommands plugged-in locally
2009-05-05 16:21:56 +02:00
plugin_dirs = [
2009-05-18 16:50:43 +02:00
' /usr/lib/osc-plugins ' ,
' /usr/local/lib/osc-plugins ' ,
2009-05-05 16:21:56 +02:00
' /var/lib/osc-plugins ' , # Kept for backward compatibility
os . path . expanduser ( ' ~/.osc-plugins ' ) ]
2007-06-29 20:26:30 +02:00
for plugin_dir in plugin_dirs :
if os . path . isdir ( plugin_dir ) :
for extfile in os . listdir ( plugin_dir ) :
if not extfile . endswith ( ' .py ' ) :
continue
2011-03-21 18:53:05 +01:00
try :
exec open ( os . path . join ( plugin_dir , extfile ) )
except SyntaxError , e :
if ( os . environ . get ( ' OSC_PLUGIN_FAIL_IGNORE ' ) ) :
print >> sys . stderr , " %s : %s \n " % ( plugin_dir , e )
else :
import traceback
traceback . print_exc ( file = sys . stderr )
print >> sys . stderr , ' \n %s : %s ' % ( plugin_dir , e )
print >> sys . stderr , " \n Try ' env OSC_PLUGIN_FAIL_IGNORE=1 osc ... ' "
sys . exit ( 1 )
2007-06-29 20:26:30 +02:00
2010-02-25 09:52:47 +01:00
# vim: sw=4 et