Index: vendor/trac/trac/env.py
===================================================================
--- vendor/trac/trac/env.py	(revision 7594)
+++ vendor/trac/trac/env.py	(working copy)
@@ -400,12 +400,29 @@
         import shutil
 
         db_str = self.config.get('trac', 'database')
-        if not db_str.startswith('sqlite:'):
-            raise TracError(_('Can only backup sqlite databases'))
-        db_name = os.path.join(self.path, db_str[7:])
-        if not dest:
-            dest = '%s.%i.bak' % (db_name, self.get_version())
-        shutil.copy (db_name, dest)
+        if db_str.startswith('sqlite:'):
+            db_name = os.path.join(self.path, db_str[7:])
+            if not dest:
+                dest = '%s.%i.bak' % (db_name, self.get_version())
+            shutil.copy (db_name, dest)
+        elif db_str.startswith('postgres:'):
+            db = self.get_db_cnx()
+            cursor = db.cursor()
+            db_schema = db.schema.encode('utf-8')
+            sql = "SELECT tablename FROM pg_tables WHERE schemaname='%s'" % db_schema
+            cursor.execute(sql)
+            tables = [row[0] for row in cursor]
+            bk_scheme = "%s-backup-%i" % (db_schema, self.get_version())
+            # XXX must have access rights to handle this
+            sql = 'CREATE SCHEMA "%s"' % bk_scheme
+            cursor.execute(sql)
+            db.commit()
+            for table in tables:
+                sql = 'SELECT * into "%s".%s from "%s".%s' %  (bk_scheme, table, db_schema, table)
+                cursor.execute(sql)
+                db.commit()
+        else:
+            raise TracError(_('Can only backup sqlite and postgres databases'))
 
     def needs_upgrade(self):
         """Return whether the environment needs to be upgraded."""

