Index: core/management.py
===================================================================
--- core/management.py	(revision 3338)
+++ core/management.py	(working copy)
@@ -420,7 +420,7 @@
 get_sql_all.help_doc = "Prints the CREATE TABLE, initial-data and CREATE INDEX SQL statements for the given model module name(s)."
 get_sql_all.args = APP_ARGS
 
-def syncdb():
+def syncdb(verbosity=2, interactive=True):
     "Creates the database tables for all apps in INSTALLED_APPS whose tables haven't already been created."
     from django.db import connection, transaction, models, get_creation_module
     from django.db.models import signals
@@ -468,7 +468,8 @@
                 except KeyError:
                     pending_references[refto] = refs
             sql.extend(_get_sql_for_pending_references(model, pending_references))
-            print "Creating table %s" % model._meta.db_table
+            if verbosity >= 2:
+                print "Creating table %s" % model._meta.db_table
             for statement in sql:
                 cursor.execute(statement)
             table_list.append(model._meta.db_table)
@@ -477,7 +478,8 @@
             if model in created_models:
                 sql = _get_many_to_many_sql_for_model(model)
                 if sql:
-                    print "Creating many-to-many tables for %s model" % model.__name__
+                    if verbosity >= 2:
+                        print "Creating many-to-many tables for %s model" % model.__name__
                     for statement in sql:
                         cursor.execute(statement)
 
@@ -487,7 +489,8 @@
     # to do at this point.
     for app in models.get_apps():
         dispatcher.send(signal=signals.post_syncdb, sender=app,
-            app=app, created_models=created_models)
+            app=app, created_models=created_models, 
+            verbosity=verbosity, interactive=interactive)
 
         # Install initial data for the app (but only if this is a model we've
         # just created)
@@ -1135,6 +1138,24 @@
     runfastcgi(args)
 runfcgi.args = '[various KEY=val options, use `runfcgi help` for help]'
 
+def test(verbosity, app_labels):
+    "Runs the test suite for the specified applications"
+    from django.conf import settings
+    from django.db.models import get_app, get_apps
+
+    if len(app_labels) == 0:
+        app_list = get_apps()
+    else:
+        app_list = [get_app(app_label) for app_label in app_labels]
+    
+    test_module = __import__(settings.TEST_MODULE, [],[],'*')
+    test_runner = getattr(test_module, settings.TEST_RUNNER)
+    
+    test_runner(app_list, verbosity)
+    
+test.help_doc = 'Runs the test suite for the specified applications, or the entire site if no apps are specified'
+test.args = '[--verbosity] ' + APP_ARGS
+
 # Utilities for command-line script
 
 DEFAULT_ACTION_MAPPING = {
@@ -1159,6 +1180,7 @@
     'startproject': startproject,
     'syncdb': syncdb,
     'validate': validate,
+    'test':test,
 }
 
 NO_SQL_TRANSACTION = (
@@ -1209,6 +1231,10 @@
         help='Lets you manually add a directory the Python path, e.g. "/home/djangoprojects/myproject".')
     parser.add_option('--plain', action='store_true', dest='plain',
         help='Tells Django to use plain Python, not IPython, for "shell" command.')
+    parser.add_option('-v','--verbosity', action='store', dest='verbosity', default='1',
+        type='choice', choices=['0', '1', '2'],
+        help='Verbosity level; 0=minimal output, 1=normal output, 2=all output')
+        
     options, args = parser.parse_args(argv[1:])
 
     # Take care of options.
@@ -1235,8 +1261,10 @@
 
     if action == 'shell':
         action_mapping[action](options.plain is True)
-    elif action in ('syncdb', 'validate', 'diffsettings', 'dbshell'):
+    elif action in ('validate', 'diffsettings', 'dbshell'):
         action_mapping[action]()
+    elif action == 'syncdb':
+        action_mapping[action](int(options.verbosity))
     elif action == 'inspectdb':
         try:
             for line in action_mapping[action]():
@@ -1249,6 +1277,11 @@
             action_mapping[action](args[1])
         except IndexError:
             parser.print_usage_and_exit()
+    elif action == 'test':
+        try:
+            action_mapping[action](int(options.verbosity), args[1:])
+        except IndexError:
+            parser.print_usage_and_exit()
     elif action in ('startapp', 'startproject'):
         try:
             name = args[1]
