#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.