#12593: "manage.py loaddata" exits with system exist status 0 when there are 
errors
---------------------------+------------------------------------------------
 Reporter:  bruce_s        |       Owner:  nobody    
   Status:  new            |   Milestone:            
Component:  Uncategorized  |     Version:  1.1       
 Keywords:                 |       Stage:  Unreviewed
Has_patch:  0              |  
---------------------------+------------------------------------------------
 "manage.py loaddata" returns with system exit status 0 on error. it should
 return nonzero on error,
 so that (for example) it plays nice with ant, make, expect, etc.

 Example:

 {{{
 % ./manage.py loaddata gamedata-test.json
 Installing json fixture 'gamedata-test' from absolute path.
 Problem installing fixture 'gamedata-test.json': Traceback (most recent
 call last):
   File "/usr/lib64/python2.6/site-
 packages/django/core/management/commands/loaddata.py", line 150, in handle
     for obj in objects:
   File "/usr/lib64/python2.6/site-
 packages/django/core/serializers/json.py", line 41, in Deserializer
     for obj in PythonDeserializer(simplejson.load(stream)):
   File "/usr/lib64/python2.6/json/__init__.py", line 267, in load
     parse_constant=parse_constant, **kw)
   File "/usr/lib64/python2.6/json/__init__.py", line 307, in loads
     return _default_decoder.decode(s)
   File "/usr/lib64/python2.6/json/decoder.py", line 319, in decode
     obj, end = self.raw_decode(s, idx=_w(s, 0).end())
   File "/usr/lib64/python2.6/json/decoder.py", line 336, in raw_decode
     obj, end = self._scanner.iterscan(s, **kw).next()
   File "/usr/lib64/python2.6/json/scanner.py", line 55, in iterscan
     rval, next_pos = action(m, context)
   File "/usr/lib64/python2.6/json/decoder.py", line 219, in JSONArray
     raise ValueError(errmsg("Expecting object", s, end))
 ValueError: Expecting object: line 2 column 5 (char 6)
 % echo $?
 0
 }}}

 The code at fault is in /django/core/management/commands/loaddata.py,
 around line 170 (and in several other places),
 where there are try/except blocks which return when they should either
 sys.exit(1) or raise, so that the outermost program
 knows to exit with error:


 {{{
 except Exception:
     import traceback
     fixture.close()
     transaction.rollback()
     transaction.leave_transaction_management()
     if show_traceback:
         traceback.print_exc()
     else:
         sys.stderr.write(
             self.style.ERROR("Problem installing fixture '%s': %s\n" %
                  (full_path,
 ''.join(traceback.format_exception(sys.exc_type,
                      sys.exc_value, sys.exc_traceback)))))
     return
 }}}

 That last "return" is the bug.   Replacing it with "raise" fixes the
 problem but makes the output quite a bit messier:

 {{{
 % ./manage.py loaddata gamedata-test.json
 Installing json fixture 'gamedata-test' from absolute path.
 Problem installing fixture 'gamedata-test.json': Traceback (most recent
 call last):
   File "/usr/lib64/python2.6/site-
 packages/django/core/management/commands/loaddata.py", line 150, in handle
     for obj in objects:
   File "/usr/lib64/python2.6/site-
 packages/django/core/serializers/json.py", line 41, in Deserializer
     for obj in PythonDeserializer(simplejson.load(stream)):
   File "/usr/lib64/python2.6/json/__init__.py", line 267, in load
     parse_constant=parse_constant, **kw)
   File "/usr/lib64/python2.6/json/__init__.py", line 307, in loads
     return _default_decoder.decode(s)
   File "/usr/lib64/python2.6/json/decoder.py", line 319, in decode
     obj, end = self.raw_decode(s, idx=_w(s, 0).end())
   File "/usr/lib64/python2.6/json/decoder.py", line 336, in raw_decode
     obj, end = self._scanner.iterscan(s, **kw).next()
   File "/usr/lib64/python2.6/json/scanner.py", line 55, in iterscan
     rval, next_pos = action(m, context)
   File "/usr/lib64/python2.6/json/decoder.py", line 219, in JSONArray
     raise ValueError(errmsg("Expecting object", s, end))
 ValueError: Expecting object: line 2 column 5 (char 6)

 Traceback (most recent call last):
   File "./manage.py", line 11, in <module>
     execute_manager(settings)
   File "/usr/lib64/python2.6/site-
 packages/django/core/management/__init__.py", line 439, in execute_manager
     utility.execute()
   File "/usr/lib64/python2.6/site-
 packages/django/core/management/__init__.py", line 380, in execute
     self.fetch_command(subcommand).run_from_argv(self.argv)
   File "/usr/lib64/python2.6/site-
 packages/django/core/management/base.py", line 195, in run_from_argv
     self.execute(*args, **options.__dict__)
   File "/usr/lib64/python2.6/site-
 packages/django/core/management/base.py", line 222, in execute
     output = self.handle(*args, **options)
   File "/usr/lib64/python2.6/site-
 packages/django/core/management/commands/loaddata.py", line 200, in handle
     transaction.leave_transaction_management()
   File "/usr/lib64/python2.6/site-packages/django/db/transaction.py", line
 74, in leave_transaction_management
     raise TransactionManagementError("This code isn't under transaction
 management")
 django.db.transaction.TransactionManagementError: This code isn't under
 transaction management
 % echo $?
 1

 }}}


 The other option is to change the return to sys.exit(1):

 {{{
 % ./manage.py loaddata gamedata-test.json
 Installing json fixture 'gamedata-test' from absolute path.
 Problem installing fixture 'gamedata-test.json': Traceback (most recent
 call last):
   File "/usr/lib64/python2.6/site-
 packages/django/core/management/commands/loaddata.py", line 150, in handle
     for obj in objects:
   File "/usr/lib64/python2.6/site-
 packages/django/core/serializers/json.py", line 41, in Deserializer
     for obj in PythonDeserializer(simplejson.load(stream)):
   File "/usr/lib64/python2.6/json/__init__.py", line 267, in load
     parse_constant=parse_constant, **kw)
   File "/usr/lib64/python2.6/json/__init__.py", line 307, in loads
     return _default_decoder.decode(s)
   File "/usr/lib64/python2.6/json/decoder.py", line 319, in decode
     obj, end = self.raw_decode(s, idx=_w(s, 0).end())
   File "/usr/lib64/python2.6/json/decoder.py", line 336, in raw_decode
     obj, end = self._scanner.iterscan(s, **kw).next()
   File "/usr/lib64/python2.6/json/scanner.py", line 55, in iterscan
     rval, next_pos = action(m, context)
   File "/usr/lib64/python2.6/json/decoder.py", line 219, in JSONArray
     raise ValueError(errmsg("Expecting object", s, end))
 ValueError: Expecting object: line 2 column 5 (char 6)

 % echo $?
 1


 }}}

-- 
Ticket URL: <http://code.djangoproject.com/ticket/12593>
Django <http://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to django-upda...@googlegroups.com.
To unsubscribe from this group, send email to 
django-updates+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.


Reply via email to