← Back to team overview

launchpad-reviewers team mailing list archive

[Merge] lp:~sinzui/launchpad/merge-karma-1 into lp:launchpad/devel

 

Curtis Hovey has proposed merging lp:~sinzui/launchpad/merge-karma-1 into lp:launchpad/devel.

Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)


This is my branch to fix karma left on merged accounts.

    lp:~sinzui/launchpad/merge-karma-1
    Diff size: 250
    Launchpad bug:
        https://bugs.launchpad.net/bugs/190242
        https://bugs.launchpad.net/bugs/3189
        https://bugs.launchpad.net/bugs/301750
    Test command: ./bin/test -vv -t TestPersonSetMerge
    Pre-implementation: Edwin
    Target release: 10.11


Fix karma left on merged accounts
---------------------------------

Merged profiles appear in the top contributors for a project because the
karma cache was not purged. The links are 404 errors (190242). User often
believe karma was lost by the merge because the karma total cache was not
updated by merge. User think they lost 1000's of karma points (3189). Users
are disappointed to see that the member since date is not updated when
merging an older profile with a younger one. (301750)


Rules
-----

    * Delete the KarmaCache and KarmaTotalCache for the merged profile
    * Add the karmaTotalcache from the merged profile so that the karma
      points look like they are combined. This is not accurate; the
      daily job will recalculate the KarmaTotalCache correctly with 24 hours.
    * Use the MIN/LEAST functions to choose the oldest date of the two
      profiles.


QA
--

On staging. Choose to merge an older profile with lots of karma that
also appears in a project top contributors list
    * Merge the profile.
    * Verify the merged profile does not appear in the top contributors
      list. (The preserved profile will not appear until karma is
      recalculated)
    * Verify that the preserved user has more karma points on its profile
      page.
    * Verify that the preserved user has the older date.

Lint
----

Linting changed files:
  database/schema/security.cfg
  lib/lp/registry/model/person.py
  lib/lp/registry/tests/test_person.py


Test
----

Added tests for the two karma merging conditions and the oldest datecreated
condition.
    * lib/lp/registry/tests/test_person.py


Implementation
--------------

Added a method to update/delete KarmaCache and KarmaTotalCache. Added
a method to merge the oldest datecreated.
    * lib/lp/registry/model/person.py

Allow the webapp to delete or update KarmaCache and KarmaTotalCache.
    * database/schema/security.cfg

-- 
__Curtis C. Hovey_________
http://launchpad.net/
-- 
The attached diff has been truncated due to its size.
https://code.launchpad.net/~sinzui/launchpad/merge-karma-1/+merge/39623
Your team Launchpad code reviewers is requested to review the proposed merge of lp:~sinzui/launchpad/merge-karma-1 into lp:launchpad/devel.
=== added file 'cronscripts/update-bugzilla-remote-components.py'
--- cronscripts/update-bugzilla-remote-components.py	1970-01-01 00:00:00 +0000
+++ cronscripts/update-bugzilla-remote-components.py	2010-10-29 12:36:22 +0000
@@ -0,0 +1,41 @@
+#!/usr/bin/python -S
+#
+# Copyright 2010 Canonical Ltd.  This software is licensed under the
+# GNU Affero General Public License version 3 (see the file LICENSE).
+
+# pylint: disable-msg=W0403
+import _pythonpath
+
+import time
+
+from canonical.config import config
+from lp.services.scripts.base import LaunchpadCronScript
+from canonical.launchpad.scripts.bzremotecomponentfinder import (
+    BugzillaRemoteComponentFinder,
+    )
+
+
+class UpdateRemoteComponentsFromBugzilla(LaunchpadCronScript):
+
+    def add_my_options(self):
+        self.parser.add_option(
+            "-b", "--bugtracker", dest="bugtracker",
+            help="Update only the bug tracker with this name in launchpad")
+
+    def main(self):
+        start_time = time.time()
+        finder = BugzillaRemoteComponentFinder(
+            self.logger)
+        finder.getRemoteProductsAndComponents(
+            bugtracker_name=self.options.bugtracker)
+
+        run_time = time.time() - start_time
+        print("Time for this run: %.3f seconds." % run_time)
+
+
+if __name__ == "__main__":
+
+    updater = UpdateRemoteComponentsFromBugzilla(
+        "updatebugzillaremotecomponents",
+        dbuser=config.updatebugzillaremotecomponents.dbuser)
+    updater.lock_and_run()

=== modified file 'cronscripts/update-remote-product.py'
--- cronscripts/update-remote-product.py	2010-04-27 19:48:39 +0000
+++ cronscripts/update-remote-product.py	2010-10-29 12:36:22 +0000
@@ -3,7 +3,11 @@
 # Copyright 2009 Canonical Ltd.  This software is licensed under the
 # GNU Affero General Public License version 3 (see the file LICENSE).
 
-"""Cron job to update Product.remote_product using bug watch information.  """
+"""Cron job to update Product.remote_product using bug watch information.
+
+This script sets the remote_product string value on Launchpad Products
+by looking it up from one of the product's bug watches.
+"""
 
 # pylint: disable-msg=W0403
 import _pythonpath

=== modified file 'database/sampledata/current-dev.sql'
--- database/sampledata/current-dev.sql	2010-10-07 22:46:08 +0000
+++ database/sampledata/current-dev.sql	2010-10-29 12:36:22 +0000
@@ -1,6 +1,6 @@
 -- Copyright 2010 Canonical Ltd.  This software is licensed under the
 -- GNU Affero General Public License version 3 (see the file LICENSE).
--- Created using pg_dump (PostgreSQL) 8.4.4
+-- Created using pg_dump (PostgreSQL) 8.4.3
 
 SET check_function_bodies = false;
 SET client_encoding = 'UTF8';
@@ -2958,53 +2958,53 @@
 ALTER TABLE bountysubscription ENABLE TRIGGER ALL;
 
 
-ALTER TABLE branchmergerobot DISABLE TRIGGER ALL;
-
-
-
-ALTER TABLE branchmergerobot ENABLE TRIGGER ALL;
+ALTER TABLE branchmergequeue DISABLE TRIGGER ALL;
+
+
+
+ALTER TABLE branchmergequeue ENABLE TRIGGER ALL;
 
 
 ALTER TABLE branch DISABLE TRIGGER ALL;
 
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (1, 'Mozilla Firefox Mainline', 'text', 12, 4, 12, 'main', NULL, 'http://bazaar.example.com/mozilla@xxxxxxxxxxxxxxx/mozilla--MAIN--0', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:42.98217', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.837773', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'firefox', '~name12/firefox/main', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (2, 'Mozilla Thunderbird Mainline', 'Bazaar import of the Mozilla Thunderbird CVS mainline.', 11, 8, 1, 'main', NULL, 'http://bazaar.example.com/thunderbird@xxxxxxxxxxxxxxx/thunderbird--MAIN--0', NULL, 30, NULL, '2006-04-08 01:40:15.816029', 1, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.042944', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.842033', 11, NULL, NULL, NULL, NULL, NULL, NULL, 'stevea', 'thunderbird', '~stevea/thunderbird/main', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (3, 'Python Twisted Trunk', 'Bazaar import of the Twisted SVN trunk.', 7, NULL, 3, 'trunk', NULL, 'http://bazaar.example.com/twisted@xxxxxxxxxxxxxxx/twisted--trunk--0', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.04419', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.843681', 7, NULL, NULL, NULL, NULL, NULL, NULL, 'spiv', NULL, '~spiv/+junk/trunk', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (4, 'Bugzila Mainline', 'text', 3, NULL, NULL, 'main', NULL, 'http://bazaar.example.com/bugzilla@xxxxxxxxxxxxxxx/bugzila--MAIN--0', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.045278', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.844341', 3, NULL, NULL, NULL, NULL, NULL, NULL, 'justdave', NULL, '~justdave/+junk/main', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (5, 'Arch Devel', 'text', 8, NULL, NULL, 'devel-1.0', NULL, 'http://bazaar.example.com/arch@xxxxxxxxxxxxxxx/arch--devel--1.0', NULL, 30, NULL, '2006-04-08 22:20:14.973705', 9, 'I do not like Arch, so I am pretending it failed to mirror.', NULL, NULL, NULL, '2006-10-16 18:31:43.046996', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.844975', 8, NULL, NULL, NULL, NULL, NULL, NULL, 'jblack', NULL, '~jblack/+junk/devel-1.0', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (6, 'Kiwi2 Mainline', 'text', 9, NULL, NULL, 'main', NULL, 'http://bazaar.example.com/kiwi2@xxxxxxxxxxxxxxx/kiwi2--MAIN--0', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.048164', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.84562', 9, NULL, NULL, NULL, NULL, NULL, NULL, 'kiko', NULL, '~kiko/+junk/main', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (7, 'Plone Trunk', 'text', 10, NULL, NULL, 'trunk', NULL, 'http://bazaar.example.com/plone@xxxxxxxxxxxxxxx/plone--trunk--0', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.049222', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.846258', 10, NULL, NULL, NULL, NULL, NULL, NULL, 'limi', NULL, '~limi/+junk/trunk', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (8, 'Evolution 2.0', 'text', 13, 5, NULL, '2.0', NULL, 'http://bazaar.example.com/gnome@xxxxxxxxxxxxxxx/gnome--evolution--2.0', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.050317', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.846899', 13, NULL, NULL, NULL, NULL, NULL, NULL, 'carlos', 'evolution', '~carlos/evolution/2.0', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (9, 'Iso-codes 0.35', 'text', 13, 7, NULL, '0.35', NULL, 'http://bazaar.example.com/iso-codes@xxxxxxxxxxxxxxx/iso-codes--iso-codes--0.35', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.051395', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.847595', 13, NULL, NULL, NULL, NULL, NULL, NULL, 'carlos', 'iso-codes', '~carlos/iso-codes/0.35', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (10, 'Mozilla Firefox 0.9.2', 'text', 1, 4, NULL, 'release-0.9.2', NULL, 'http://bazaar.example.com/mozilla@xxxxxxxxxxxxxxx/mozilla--release--0.9.2', NULL, 30, NULL, NULL, 0, NULL, NULL, 'mozilla@xxxxxxxxxxxxxxx/mozilla--release--0.9.2--base-0', NULL, '2006-10-16 18:31:43.052449', 1, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.848365', 1, NULL, NULL, NULL, NULL, NULL, NULL, 'mark', 'firefox', '~mark/firefox/release-0.9.2', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (11, 'Mozilla Firefox 0.9.1', 'text', 1, 4, NULL, 'release--0.9.1', NULL, 'http://bazaar.example.com/mozilla@xxxxxxxxxxxxxxx/mozilla--release--0.9.1', NULL, 30, NULL, NULL, 0, NULL, NULL, 'mozilla@xxxxxxxxxxxxxxx/mozilla--release--0.9.1--base-0', NULL, '2006-10-16 18:31:43.053511', 1, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.849077', 1, NULL, NULL, NULL, NULL, NULL, NULL, 'mark', 'firefox', '~mark/firefox/release--0.9.1', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (12, 'Mozilla Firefox 0.9', 'text', 1, 4, NULL, 'release-0.9', NULL, 'http://bazaar.example.com/mozilla@xxxxxxxxxxxxxxx/mozilla--release--0.9', NULL, 30, NULL, NULL, 0, NULL, NULL, 'mozilla@xxxxxxxxxxxxxxx/mozilla--release--0.9--base-0', NULL, '2006-10-16 18:31:43.054581', 1, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.84976', 1, NULL, NULL, NULL, NULL, NULL, NULL, 'mark', 'firefox', '~mark/firefox/release-0.9', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (13, 'Mozilla Firefox 0.8', 'text', 1, 4, NULL, 'release-0.8', NULL, 'http://bazaar.example.com/mozilla@xxxxxxxxxxxxxxx/mozilla--release--0.8', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.055661', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.850415', 1, NULL, NULL, NULL, NULL, NULL, NULL, 'mark', 'firefox', '~mark/firefox/release-0.8', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (14, NULL, NULL, 24, 5, NULL, 'main', NULL, NULL, NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.056714', 0, NULL, false, 3, NULL, NULL, 1, '2007-12-06 19:58:26.85103', 24, NULL, NULL, NULL, NULL, NULL, NULL, 'vcs-imports', 'evolution', '~vcs-imports/evolution/main', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (15, 'GNOME Terminal Mainline', 'Main branch of development for GNOME Terminal. Stable branches are based on that one.
-
-Home page: http://example.com/gnome-terminal', 12, 6, NULL, 'main', 'http://example.com/gnome-terminal', 'http://example.com/gnome-terminal/main', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.057682', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.851575', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/main', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (16, 'GNOME Terminal 2.6 Releases', 'Release branch of GNOME Terminal for the GNOME 2.6 environment.
-
-Home page: http://example.com/gnome-terminal/', 12, 6, NULL, '2.6', 'http://example.com/gnome-terminal/', 'http://example.com/gnome-terminal/2.6', NULL, 50, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.058953', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.852227', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/2.6', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (17, 'GNOME Terminal 2.4 Releases', 'Obsolete branch for GNOME 2.4 releases of GNOME Terminal.', 12, 6, NULL, '2.4', NULL, 'http://example.com/gnome-terminal/2.4', NULL, 80, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.060078', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.852889', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/2.4', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (18, 'Klingon support in GNOME Terminal', 'Experimental feature branch for developping and testing Klingon support in GNOME Terminal.
-
-Home page: http://trekkies.example.com/k12n', 12, 6, 12, 'klingon', 'http://trekkies.example.com/k12n', 'http://trekkies.example.com/gnome-terminal/klingon', NULL, 10, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.061162', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.85354', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/klingon', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (19, 'Slowing GNOME Terminal scrolling', 'Feature branch for slowing down the scrolling of text in GNOME Terminal.', 12, 6, 12, 'slowness', NULL, 'http://users.example.com/gnome-terminal/slowness', NULL, 70, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.062427', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.854214', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/slowness', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (20, 'Ubuntu Junk Code', 'Sample junk branch.', 12, NULL, 17, 'junk.dev', NULL, 'http://example.com/a', NULL, 10, NULL, NULL, 0, NULL, NULL, 'foo@localhost-20051031170357-1301ad6d387feb23', NULL, '2006-10-16 18:31:43.06351', 6, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.854821', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', NULL, '~name12/+junk/junk.dev', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (21, 'Junk Code Contributions', 'Contribute code to the junk branch.', 12, NULL, 12, 'junk.contrib', NULL, 'http://example.com/b', NULL, 30, NULL, NULL, 0, NULL, NULL, 'foo@localhost-20051031170357-1301ad6d387feb23', NULL, '2006-10-16 18:31:43.064578', 6, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.855432', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', NULL, '~name12/+junk/junk.contrib', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (22, 'Python twisted feature', 'Feature branch for twisted.', 7, NULL, 4, 'feature', NULL, 'http://not.launchpad.server.com/a-branch', NULL, 30, NULL, '2005-03-09 15:45:00', 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.065642', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.856045', 7, NULL, NULL, NULL, NULL, NULL, NULL, 'spiv', NULL, '~spiv/+junk/feature', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (23, 'Another Python twisted feature', 'Another Feature branch for twisted.', 7, NULL, 4, 'feature2', NULL, 'http://whynot.launchpad.server.com/another-branch', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.066804', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.856677', 7, NULL, NULL, NULL, NULL, NULL, NULL, 'spiv', NULL, '~spiv/+junk/feature2', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (24, 'Launchpad support for Gnome Terminal', 'Add Launchpad support to Gnome Terminal', 57, 6, 57, 'launchpad', NULL, 'http://users.example.com/gnome-terminal/launchpad', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.067922', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.857318', 16, NULL, NULL, NULL, NULL, NULL, NULL, 'launchpad', 'gnome-terminal', '~launchpad/gnome-terminal/launchpad', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (25, NULL, NULL, 12, 6, NULL, 'pushed', NULL, NULL, NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.06897', 0, NULL, false, 1, NULL, NULL, 1, '2007-12-06 19:58:26.857983', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/pushed', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (26, NULL, NULL, 12, 6, NULL, 'mirrored', NULL, NULL, NULL, 30, '2007-03-16 14:12:49.050332', NULL, 0, NULL, NULL, NULL, NULL, '2007-03-16 03:12:49.050332', 0, NULL, false, 1, NULL, NULL, 1, '2007-12-06 19:58:26.858547', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/mirrored', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (27, NULL, NULL, 12, 6, NULL, 'scanned', NULL, NULL, NULL, 30, '2007-03-16 14:14:29.935752', NULL, 0, NULL, '2007-03-16 14:14:29.935752', NULL, NULL, '2007-03-16 03:14:29.935752', 0, NULL, false, 1, NULL, NULL, 1, '2007-12-06 19:58:26.85913', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/scanned', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (28, NULL, NULL, 1, NULL, 1, 'testdoc', NULL, NULL, NULL, 30, NULL, NULL, 1, 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum', NULL, NULL, NULL, '2007-05-04 01:16:03.75446', 0, NULL, false, 1, NULL, NULL, 1, '2007-12-06 19:58:26.859847', 1, NULL, NULL, NULL, NULL, NULL, NULL, 'mark', NULL, '~mark/+junk/testdoc', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (29, 'Landscape trunk', NULL, 64, 16, 12, 'trunk', NULL, NULL, NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2007-05-28 02:37:07.814303', 0, NULL, true, 1, NULL, NULL, 1, '2007-12-06 19:58:26.860757', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'landscape-developers', 'landscape', '~landscape-developers/landscape/trunk', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (30, NULL, NULL, 12, 16, 12, 'feature-x', NULL, NULL, NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2007-05-28 02:37:07.814303', 0, NULL, true, 1, NULL, NULL, 1, '2007-12-06 19:58:26.861424', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'landscape', '~name12/landscape/feature-x', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (75, 'GNOME Terminal Import Branch', NULL, 24, 6, NULL, 'import', NULL, NULL, NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-06-25 20:04:03.9465', 0, NULL, false, 3, NULL, NULL, 1, '2007-12-06 19:58:26.862009', 24, NULL, NULL, NULL, NULL, NULL, NULL, 'vcs-imports', 'gnome-terminal', '~vcs-imports/gnome-terminal/import', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (76, 'Evolution Import Branch', NULL, 24, 5, NULL, 'import', NULL, NULL, NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-06-25 20:04:04.218451', 0, NULL, false, 3, NULL, NULL, 1, '2007-12-06 19:58:26.862857', 24, NULL, NULL, NULL, NULL, NULL, NULL, 'vcs-imports', 'evolution', '~vcs-imports/evolution/import', NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (1, 'Mozilla Firefox Mainline', 'text', 12, 4, 12, 'main', NULL, 'http://bazaar.example.com/mozilla@xxxxxxxxxxxxxxx/mozilla--MAIN--0', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:42.98217', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.837773', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'firefox', '~name12/firefox/main', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (2, 'Mozilla Thunderbird Mainline', 'Bazaar import of the Mozilla Thunderbird CVS mainline.', 11, 8, 1, 'main', NULL, 'http://bazaar.example.com/thunderbird@xxxxxxxxxxxxxxx/thunderbird--MAIN--0', NULL, 30, NULL, '2006-04-08 01:40:15.816029', 1, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.042944', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.842033', 11, NULL, NULL, NULL, NULL, NULL, NULL, 'stevea', 'thunderbird', '~stevea/thunderbird/main', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (3, 'Python Twisted Trunk', 'Bazaar import of the Twisted SVN trunk.', 7, NULL, 3, 'trunk', NULL, 'http://bazaar.example.com/twisted@xxxxxxxxxxxxxxx/twisted--trunk--0', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.04419', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.843681', 7, NULL, NULL, NULL, NULL, NULL, NULL, 'spiv', NULL, '~spiv/+junk/trunk', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (4, 'Bugzila Mainline', 'text', 3, NULL, NULL, 'main', NULL, 'http://bazaar.example.com/bugzilla@xxxxxxxxxxxxxxx/bugzila--MAIN--0', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.045278', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.844341', 3, NULL, NULL, NULL, NULL, NULL, NULL, 'justdave', NULL, '~justdave/+junk/main', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (5, 'Arch Devel', 'text', 8, NULL, NULL, 'devel-1.0', NULL, 'http://bazaar.example.com/arch@xxxxxxxxxxxxxxx/arch--devel--1.0', NULL, 30, NULL, '2006-04-08 22:20:14.973705', 9, 'I do not like Arch, so I am pretending it failed to mirror.', NULL, NULL, NULL, '2006-10-16 18:31:43.046996', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.844975', 8, NULL, NULL, NULL, NULL, NULL, NULL, 'jblack', NULL, '~jblack/+junk/devel-1.0', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (6, 'Kiwi2 Mainline', 'text', 9, NULL, NULL, 'main', NULL, 'http://bazaar.example.com/kiwi2@xxxxxxxxxxxxxxx/kiwi2--MAIN--0', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.048164', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.84562', 9, NULL, NULL, NULL, NULL, NULL, NULL, 'kiko', NULL, '~kiko/+junk/main', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (7, 'Plone Trunk', 'text', 10, NULL, NULL, 'trunk', NULL, 'http://bazaar.example.com/plone@xxxxxxxxxxxxxxx/plone--trunk--0', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.049222', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.846258', 10, NULL, NULL, NULL, NULL, NULL, NULL, 'limi', NULL, '~limi/+junk/trunk', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (8, 'Evolution 2.0', 'text', 13, 5, NULL, '2.0', NULL, 'http://bazaar.example.com/gnome@xxxxxxxxxxxxxxx/gnome--evolution--2.0', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.050317', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.846899', 13, NULL, NULL, NULL, NULL, NULL, NULL, 'carlos', 'evolution', '~carlos/evolution/2.0', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (9, 'Iso-codes 0.35', 'text', 13, 7, NULL, '0.35', NULL, 'http://bazaar.example.com/iso-codes@xxxxxxxxxxxxxxx/iso-codes--iso-codes--0.35', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.051395', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.847595', 13, NULL, NULL, NULL, NULL, NULL, NULL, 'carlos', 'iso-codes', '~carlos/iso-codes/0.35', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (10, 'Mozilla Firefox 0.9.2', 'text', 1, 4, NULL, 'release-0.9.2', NULL, 'http://bazaar.example.com/mozilla@xxxxxxxxxxxxxxx/mozilla--release--0.9.2', NULL, 30, NULL, NULL, 0, NULL, NULL, 'mozilla@xxxxxxxxxxxxxxx/mozilla--release--0.9.2--base-0', NULL, '2006-10-16 18:31:43.052449', 1, NULL, false, 2, NULL, '2007-12-06 19:58:26.848365', 1, NULL, NULL, NULL, NULL, NULL, NULL, 'mark', 'firefox', '~mark/firefox/release-0.9.2', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (11, 'Mozilla Firefox 0.9.1', 'text', 1, 4, NULL, 'release--0.9.1', NULL, 'http://bazaar.example.com/mozilla@xxxxxxxxxxxxxxx/mozilla--release--0.9.1', NULL, 30, NULL, NULL, 0, NULL, NULL, 'mozilla@xxxxxxxxxxxxxxx/mozilla--release--0.9.1--base-0', NULL, '2006-10-16 18:31:43.053511', 1, NULL, false, 2, NULL, '2007-12-06 19:58:26.849077', 1, NULL, NULL, NULL, NULL, NULL, NULL, 'mark', 'firefox', '~mark/firefox/release--0.9.1', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (12, 'Mozilla Firefox 0.9', 'text', 1, 4, NULL, 'release-0.9', NULL, 'http://bazaar.example.com/mozilla@xxxxxxxxxxxxxxx/mozilla--release--0.9', NULL, 30, NULL, NULL, 0, NULL, NULL, 'mozilla@xxxxxxxxxxxxxxx/mozilla--release--0.9--base-0', NULL, '2006-10-16 18:31:43.054581', 1, NULL, false, 2, NULL, '2007-12-06 19:58:26.84976', 1, NULL, NULL, NULL, NULL, NULL, NULL, 'mark', 'firefox', '~mark/firefox/release-0.9', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (13, 'Mozilla Firefox 0.8', 'text', 1, 4, NULL, 'release-0.8', NULL, 'http://bazaar.example.com/mozilla@xxxxxxxxxxxxxxx/mozilla--release--0.8', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.055661', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.850415', 1, NULL, NULL, NULL, NULL, NULL, NULL, 'mark', 'firefox', '~mark/firefox/release-0.8', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (14, NULL, NULL, 24, 5, NULL, 'main', NULL, NULL, NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.056714', 0, NULL, false, 3, NULL, '2007-12-06 19:58:26.85103', 24, NULL, NULL, NULL, NULL, NULL, NULL, 'vcs-imports', 'evolution', '~vcs-imports/evolution/main', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (15, 'GNOME Terminal Mainline', 'Main branch of development for GNOME Terminal. Stable branches are based on that one.
+
+Home page: http://example.com/gnome-terminal', 12, 6, NULL, 'main', 'http://example.com/gnome-terminal', 'http://example.com/gnome-terminal/main', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.057682', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.851575', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/main', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (16, 'GNOME Terminal 2.6 Releases', 'Release branch of GNOME Terminal for the GNOME 2.6 environment.
+
+Home page: http://example.com/gnome-terminal/', 12, 6, NULL, '2.6', 'http://example.com/gnome-terminal/', 'http://example.com/gnome-terminal/2.6', NULL, 50, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.058953', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.852227', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/2.6', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (17, 'GNOME Terminal 2.4 Releases', 'Obsolete branch for GNOME 2.4 releases of GNOME Terminal.', 12, 6, NULL, '2.4', NULL, 'http://example.com/gnome-terminal/2.4', NULL, 80, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.060078', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.852889', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/2.4', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (18, 'Klingon support in GNOME Terminal', 'Experimental feature branch for developping and testing Klingon support in GNOME Terminal.
+
+Home page: http://trekkies.example.com/k12n', 12, 6, 12, 'klingon', 'http://trekkies.example.com/k12n', 'http://trekkies.example.com/gnome-terminal/klingon', NULL, 10, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.061162', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.85354', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/klingon', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (19, 'Slowing GNOME Terminal scrolling', 'Feature branch for slowing down the scrolling of text in GNOME Terminal.', 12, 6, 12, 'slowness', NULL, 'http://users.example.com/gnome-terminal/slowness', NULL, 70, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.062427', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.854214', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/slowness', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (20, 'Ubuntu Junk Code', 'Sample junk branch.', 12, NULL, 17, 'junk.dev', NULL, 'http://example.com/a', NULL, 10, NULL, NULL, 0, NULL, NULL, 'foo@localhost-20051031170357-1301ad6d387feb23', NULL, '2006-10-16 18:31:43.06351', 6, NULL, false, 2, NULL, '2007-12-06 19:58:26.854821', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', NULL, '~name12/+junk/junk.dev', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (21, 'Junk Code Contributions', 'Contribute code to the junk branch.', 12, NULL, 12, 'junk.contrib', NULL, 'http://example.com/b', NULL, 30, NULL, NULL, 0, NULL, NULL, 'foo@localhost-20051031170357-1301ad6d387feb23', NULL, '2006-10-16 18:31:43.064578', 6, NULL, false, 2, NULL, '2007-12-06 19:58:26.855432', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', NULL, '~name12/+junk/junk.contrib', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (22, 'Python twisted feature', 'Feature branch for twisted.', 7, NULL, 4, 'feature', NULL, 'http://not.launchpad.server.com/a-branch', NULL, 30, NULL, '2005-03-09 15:45:00', 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.065642', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.856045', 7, NULL, NULL, NULL, NULL, NULL, NULL, 'spiv', NULL, '~spiv/+junk/feature', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (23, 'Another Python twisted feature', 'Another Feature branch for twisted.', 7, NULL, 4, 'feature2', NULL, 'http://whynot.launchpad.server.com/another-branch', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.066804', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.856677', 7, NULL, NULL, NULL, NULL, NULL, NULL, 'spiv', NULL, '~spiv/+junk/feature2', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (24, 'Launchpad support for Gnome Terminal', 'Add Launchpad support to Gnome Terminal', 57, 6, 57, 'launchpad', NULL, 'http://users.example.com/gnome-terminal/launchpad', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.067922', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.857318', 16, NULL, NULL, NULL, NULL, NULL, NULL, 'launchpad', 'gnome-terminal', '~launchpad/gnome-terminal/launchpad', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (25, NULL, NULL, 12, 6, NULL, 'pushed', NULL, NULL, NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.06897', 0, NULL, false, 1, NULL, '2007-12-06 19:58:26.857983', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/pushed', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (26, NULL, NULL, 12, 6, NULL, 'mirrored', NULL, NULL, NULL, 30, '2007-03-16 14:12:49.050332', NULL, 0, NULL, NULL, NULL, NULL, '2007-03-16 03:12:49.050332', 0, NULL, false, 1, NULL, '2007-12-06 19:58:26.858547', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/mirrored', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (27, NULL, NULL, 12, 6, NULL, 'scanned', NULL, NULL, NULL, 30, '2007-03-16 14:14:29.935752', NULL, 0, NULL, '2007-03-16 14:14:29.935752', NULL, NULL, '2007-03-16 03:14:29.935752', 0, NULL, false, 1, NULL, '2007-12-06 19:58:26.85913', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/scanned', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (28, NULL, NULL, 1, NULL, 1, 'testdoc', NULL, NULL, NULL, 30, NULL, NULL, 1, 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum', NULL, NULL, NULL, '2007-05-04 01:16:03.75446', 0, NULL, false, 1, NULL, '2007-12-06 19:58:26.859847', 1, NULL, NULL, NULL, NULL, NULL, NULL, 'mark', NULL, '~mark/+junk/testdoc', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (29, 'Landscape trunk', NULL, 64, 16, 12, 'trunk', NULL, NULL, NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2007-05-28 02:37:07.814303', 0, NULL, true, 1, NULL, '2007-12-06 19:58:26.860757', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'landscape-developers', 'landscape', '~landscape-developers/landscape/trunk', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (30, NULL, NULL, 12, 16, 12, 'feature-x', NULL, NULL, NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2007-05-28 02:37:07.814303', 0, NULL, true, 1, NULL, '2007-12-06 19:58:26.861424', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'landscape', '~name12/landscape/feature-x', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (75, 'GNOME Terminal Import Branch', NULL, 24, 6, NULL, 'import', NULL, NULL, NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-06-25 20:04:03.9465', 0, NULL, false, 3, NULL, '2007-12-06 19:58:26.862009', 24, NULL, NULL, NULL, NULL, NULL, NULL, 'vcs-imports', 'gnome-terminal', '~vcs-imports/gnome-terminal/import', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (76, 'Evolution Import Branch', NULL, 24, 5, NULL, 'import', NULL, NULL, NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-06-25 20:04:04.218451', 0, NULL, false, 3, NULL, '2007-12-06 19:58:26.862857', 24, NULL, NULL, NULL, NULL, NULL, NULL, 'vcs-imports', 'evolution', '~vcs-imports/evolution/import', NULL, NULL, NULL);
 
 
 ALTER TABLE branch ENABLE TRIGGER ALL;
@@ -4990,6 +4990,81 @@
 ALTER TABLE lp_account ENABLE TRIGGER ALL;
 
 
+ALTER TABLE lp_openididentifier DISABLE TRIGGER ALL;
+
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('6KHNEe3', 2436141, '2007-12-18 16:31:34.790641');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('6w7kmzC', 2436091, '2007-12-07 13:43:20.393704');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('CALDpFr', 2436171, '2008-03-06 09:55:27.289842');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('GMX7shE', 2436242, '2009-03-17 07:26:14.024613');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('MGWJnTL', 2436111, '2007-12-14 16:52:15.403833');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('R8FpwXd', 2436161, '2007-12-18 16:31:34.790641');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('WQPMHdf', 2436081, '2007-11-12 15:23:19.847132');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('andrelop_oid', 431, '2005-06-06 08:59:51.561685');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('barbier_oid', 421, '2005-06-06 08:59:51.560604');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('bug-importer_oid', 581, '2005-12-06 09:48:58.287679');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('bug-watch-updater_oid', 621, '2006-05-23 12:49:30.483464');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('cCGE3LA', 2436101, '2007-12-14 16:52:15.403833');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('cF4PNk3', 2436241, '2008-11-04 12:59:26.965843');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('callipeo_oid', 401, '2005-06-06 08:59:51.558429');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('carlos_oid', 131, '2005-06-06 08:59:51.615543');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('cprov_oid', 281, '2005-06-06 08:59:51.59705');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('daf_oid', 141, '2005-06-06 08:59:51.616666');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('danner_oid', 371, '2005-06-06 08:59:51.549651');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('ddaa_oid', 231, '2005-06-06 08:59:51.620823');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('debonzi_oid', 271, '2005-06-06 08:59:51.557224');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('edgar_oid', 331, '2005-06-06 08:59:51.621892');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('former-user_oid', 701, '2006-12-13 21:19:06.369142');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('jblack_oid', 81, '2005-06-06 08:59:51.601584');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('jdub_oid', 61, '2005-06-06 08:59:51.600523');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('jordi_oid', 561, '2005-10-07 14:17:51.593849');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('jorge-gonzalez-gonzalez_oid', 411, '2005-06-06 08:59:51.559519');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('justdave_oid', 31, '2005-06-06 08:59:51.610048');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('jvprat_oid', 341, '2005-06-06 08:59:51.622908');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('kYFxQYP', 2436243, '2009-08-04 10:50:39.383407');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('kamion_oid', 41, '2005-06-06 08:59:51.611185');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('karl_oid', 631, '2006-05-23 12:49:30.483464');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('kebil_oid', 491, '2005-06-06 08:59:51.568323');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('keybuk_oid', 51, '2005-06-06 08:59:51.608802');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('kiko_oid', 91, '2005-06-06 08:59:51.594941');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('kinnison_oid', 261, '2005-06-06 08:59:51.618722');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('kreutzm_oid', 511, '2005-06-06 08:59:51.570701');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('kurem_oid', 461, '2005-06-06 08:59:51.565033');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('launchpad-beta-owner_oid', 681, '2007-01-31 06:56:25.096519');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('launchpad-janitor_oid', 651, '2006-10-04 16:20:51.19954');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('lifeless_oid', 21, '2005-06-06 08:59:51.598107');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('limi_oid', 101, '2005-06-06 08:59:51.619713');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('luk-claes_oid', 451, '2005-06-06 08:59:51.563952');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('mTmeENb', 2436231, '2008-06-27 14:49:11.149508');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('marilize_oid', 551, '2005-06-06 08:59:51.593849');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('mark_oid', 11, '2005-06-06 08:59:51.591618');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('martin-pitt_oid', 381, '2005-06-06 08:59:51.555051');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('matsubara_oid', 661, '2006-12-13 21:19:06.369142');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('morten_oid', 471, '2005-06-06 08:59:51.56614');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('mpo_oid', 481, '2005-06-06 08:59:51.567224');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('name12_oid', 121, '2005-06-06 08:59:51.612277');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('name16_oid', 161, '2005-06-06 08:59:51.593849');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('neMCQNd', 2436061, '2007-08-09 21:25:37.832976');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('no-priv_oid', 521, '2005-06-06 08:59:51.593849');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('no-team-memberships_oid', 2436021, '2007-02-19 11:17:57.755666');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('nsv_oid', 391, '2005-06-06 08:59:51.556132');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('one-membership_oid', 2436031, '2007-02-21 10:53:59.700105');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('rPwGRk4', 2436221, '2008-05-12 17:38:38.798696');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('salgado_oid', 291, '2005-06-06 08:59:51.596025');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('sigurd-ubuntu_oid', 351, '2005-06-06 08:59:51.623962');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('skacel_oid', 361, '2005-06-06 08:59:51.5244');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('spiv_oid', 71, '2005-06-06 08:59:51.551196');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('stevea_oid', 111, '2005-06-06 08:59:51.599234');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('stub_oid', 221, '2005-06-06 08:59:51.59276');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('team-membership-janitor_oid', 671, '2006-10-04 16:20:51.19954');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('tsukimi_oid', 501, '2005-06-06 08:59:51.569518');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('valyag_oid', 441, '2005-06-06 08:59:51.562857');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('yEzBPbd', 2436151, '2007-12-18 16:31:34.790641');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('zRtPxw8', 243637, '2010-07-12 09:48:27.198885');
+
+
+ALTER TABLE lp_openididentifier ENABLE TRIGGER ALL;
+
+
 ALTER TABLE lp_person DISABLE TRIGGER ALL;
 
 INSERT INTO lp_person (id, displayname, teamowner, teamdescription, name, language, fti, defaultmembershipperiod, defaultrenewalperiod, subscriptionpolicy, merged, datecreated, addressline1, addressline2, organization, city, province, country, postcode, phone, homepage_content, icon, mugshot, hide_email_addresses, creation_rationale, creation_comment, registrant, logo, renewal_policy, personal_standing, personal_standing_reason, mail_resumption_date, mailing_list_auto_subscribe_policy, mailing_list_receive_duplicates, visibility, verbose_bugnotifications, account) VALUES (1, 'Mark Shuttleworth', NULL, NULL, 'mark', NULL, NULL, NULL, NULL, 1, NULL, '2005-06-06 08:59:51.591618', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, 8, NULL, NULL, NULL, 10, 0, NULL, NULL, 1, true, 1, false, 11);
@@ -5096,81 +5171,6 @@
 ALTER TABLE lp_person ENABLE TRIGGER ALL;
 
 
-ALTER TABLE lp_openididentifier DISABLE TRIGGER ALL;
-
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('6KHNEe3', 2436141, '2007-12-18 16:31:34.790641');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('6w7kmzC', 2436091, '2007-12-07 13:43:20.393704');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('CALDpFr', 2436171, '2008-03-06 09:55:27.289842');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('GMX7shE', 2436242, '2009-03-17 07:26:14.024613');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('MGWJnTL', 2436111, '2007-12-14 16:52:15.403833');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('R8FpwXd', 2436161, '2007-12-18 16:31:34.790641');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('WQPMHdf', 2436081, '2007-11-12 15:23:19.847132');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('andrelop_oid', 431, '2005-06-06 08:59:51.561685');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('barbier_oid', 421, '2005-06-06 08:59:51.560604');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('bug-importer_oid', 581, '2005-12-06 09:48:58.287679');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('bug-watch-updater_oid', 621, '2006-05-23 12:49:30.483464');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('cCGE3LA', 2436101, '2007-12-14 16:52:15.403833');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('cF4PNk3', 2436241, '2008-11-04 12:59:26.965843');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('callipeo_oid', 401, '2005-06-06 08:59:51.558429');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('carlos_oid', 131, '2005-06-06 08:59:51.615543');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('cprov_oid', 281, '2005-06-06 08:59:51.59705');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('daf_oid', 141, '2005-06-06 08:59:51.616666');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('danner_oid', 371, '2005-06-06 08:59:51.549651');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('ddaa_oid', 231, '2005-06-06 08:59:51.620823');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('debonzi_oid', 271, '2005-06-06 08:59:51.557224');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('edgar_oid', 331, '2005-06-06 08:59:51.621892');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('former-user_oid', 701, '2006-12-13 21:19:06.369142');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('jblack_oid', 81, '2005-06-06 08:59:51.601584');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('jdub_oid', 61, '2005-06-06 08:59:51.600523');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('jordi_oid', 561, '2005-10-07 14:17:51.593849');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('jorge-gonzalez-gonzalez_oid', 411, '2005-06-06 08:59:51.559519');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('justdave_oid', 31, '2005-06-06 08:59:51.610048');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('jvprat_oid', 341, '2005-06-06 08:59:51.622908');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('kYFxQYP', 2436243, '2009-08-04 10:50:39.383407');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('kamion_oid', 41, '2005-06-06 08:59:51.611185');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('karl_oid', 631, '2006-05-23 12:49:30.483464');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('kebil_oid', 491, '2005-06-06 08:59:51.568323');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('keybuk_oid', 51, '2005-06-06 08:59:51.608802');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('kiko_oid', 91, '2005-06-06 08:59:51.594941');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('kinnison_oid', 261, '2005-06-06 08:59:51.618722');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('kreutzm_oid', 511, '2005-06-06 08:59:51.570701');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('kurem_oid', 461, '2005-06-06 08:59:51.565033');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('launchpad-beta-owner_oid', 681, '2007-01-31 06:56:25.096519');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('launchpad-janitor_oid', 651, '2006-10-04 16:20:51.19954');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('lifeless_oid', 21, '2005-06-06 08:59:51.598107');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('limi_oid', 101, '2005-06-06 08:59:51.619713');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('luk-claes_oid', 451, '2005-06-06 08:59:51.563952');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('mTmeENb', 2436231, '2008-06-27 14:49:11.149508');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('marilize_oid', 551, '2005-06-06 08:59:51.593849');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('mark_oid', 11, '2005-06-06 08:59:51.591618');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('martin-pitt_oid', 381, '2005-06-06 08:59:51.555051');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('matsubara_oid', 661, '2006-12-13 21:19:06.369142');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('morten_oid', 471, '2005-06-06 08:59:51.56614');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('mpo_oid', 481, '2005-06-06 08:59:51.567224');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('name12_oid', 121, '2005-06-06 08:59:51.612277');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('name16_oid', 161, '2005-06-06 08:59:51.593849');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('neMCQNd', 2436061, '2007-08-09 21:25:37.832976');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('no-priv_oid', 521, '2005-06-06 08:59:51.593849');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('no-team-memberships_oid', 2436021, '2007-02-19 11:17:57.755666');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('nsv_oid', 391, '2005-06-06 08:59:51.556132');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('one-membership_oid', 2436031, '2007-02-21 10:53:59.700105');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('rPwGRk4', 2436221, '2008-05-12 17:38:38.798696');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('salgado_oid', 291, '2005-06-06 08:59:51.596025');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('sigurd-ubuntu_oid', 351, '2005-06-06 08:59:51.623962');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('skacel_oid', 361, '2005-06-06 08:59:51.5244');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('spiv_oid', 71, '2005-06-06 08:59:51.551196');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('stevea_oid', 111, '2005-06-06 08:59:51.599234');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('stub_oid', 221, '2005-06-06 08:59:51.59276');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('team-membership-janitor_oid', 671, '2006-10-04 16:20:51.19954');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('tsukimi_oid', 501, '2005-06-06 08:59:51.569518');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('valyag_oid', 441, '2005-06-06 08:59:51.562857');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('yEzBPbd', 2436151, '2007-12-18 16:31:34.790641');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('zRtPxw8', 243637, '2010-07-12 09:48:27.198885');
-
-
-ALTER TABLE lp_openididentifier ENABLE TRIGGER ALL;
-
-
 ALTER TABLE lp_personlocation DISABLE TRIGGER ALL;
 
 INSERT INTO lp_personlocation (id, date_created, person, latitude, longitude, time_zone, last_modified_by, date_last_modified, visible, locked) VALUES (1, '2007-06-05 18:34:52.127945', 12, NULL, NULL, 'Australia/Perth', 12, '2007-06-05 18:34:52.127945', true, false);

=== modified file 'database/sampledata/current.sql'
--- database/sampledata/current.sql	2010-10-07 22:46:08 +0000
+++ database/sampledata/current.sql	2010-10-29 12:36:22 +0000
@@ -1,6 +1,6 @@
 -- Copyright 2010 Canonical Ltd.  This software is licensed under the
 -- GNU Affero General Public License version 3 (see the file LICENSE).
--- Created using pg_dump (PostgreSQL) 8.4.4
+-- Created using pg_dump (PostgreSQL) 8.4.3
 
 SET check_function_bodies = false;
 SET client_encoding = 'UTF8';
@@ -2970,53 +2970,53 @@
 ALTER TABLE bountysubscription ENABLE TRIGGER ALL;
 
 
-ALTER TABLE branchmergerobot DISABLE TRIGGER ALL;
-
-
-
-ALTER TABLE branchmergerobot ENABLE TRIGGER ALL;
+ALTER TABLE branchmergequeue DISABLE TRIGGER ALL;
+
+
+
+ALTER TABLE branchmergequeue ENABLE TRIGGER ALL;
 
 
 ALTER TABLE branch DISABLE TRIGGER ALL;
 
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (1, 'Mozilla Firefox Mainline', 'text', 12, 4, 12, 'main', NULL, 'http://bazaar.example.com/mozilla@xxxxxxxxxxxxxxx/mozilla--MAIN--0', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:42.98217', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.837773', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'firefox', '~name12/firefox/main', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (2, 'Mozilla Thunderbird Mainline', 'Bazaar import of the Mozilla Thunderbird CVS mainline.', 11, 8, 1, 'main', NULL, 'http://bazaar.example.com/thunderbird@xxxxxxxxxxxxxxx/thunderbird--MAIN--0', NULL, 30, NULL, '2006-04-08 01:40:15.816029', 1, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.042944', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.842033', 11, NULL, NULL, NULL, NULL, NULL, NULL, 'stevea', 'thunderbird', '~stevea/thunderbird/main', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (3, 'Python Twisted Trunk', 'Bazaar import of the Twisted SVN trunk.', 7, NULL, 3, 'trunk', NULL, 'http://bazaar.example.com/twisted@xxxxxxxxxxxxxxx/twisted--trunk--0', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.04419', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.843681', 7, NULL, NULL, NULL, NULL, NULL, NULL, 'spiv', NULL, '~spiv/+junk/trunk', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (4, 'Bugzila Mainline', 'text', 3, NULL, NULL, 'main', NULL, 'http://bazaar.example.com/bugzilla@xxxxxxxxxxxxxxx/bugzila--MAIN--0', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.045278', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.844341', 3, NULL, NULL, NULL, NULL, NULL, NULL, 'justdave', NULL, '~justdave/+junk/main', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (5, 'Arch Devel', 'text', 8, NULL, NULL, 'devel-1.0', NULL, 'http://bazaar.example.com/arch@xxxxxxxxxxxxxxx/arch--devel--1.0', NULL, 30, NULL, '2006-04-08 22:20:14.973705', 9, 'I do not like Arch, so I am pretending it failed to mirror.', NULL, NULL, NULL, '2006-10-16 18:31:43.046996', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.844975', 8, NULL, NULL, NULL, NULL, NULL, NULL, 'jblack', NULL, '~jblack/+junk/devel-1.0', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (6, 'Kiwi2 Mainline', 'text', 9, NULL, NULL, 'main', NULL, 'http://bazaar.example.com/kiwi2@xxxxxxxxxxxxxxx/kiwi2--MAIN--0', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.048164', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.84562', 9, NULL, NULL, NULL, NULL, NULL, NULL, 'kiko', NULL, '~kiko/+junk/main', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (7, 'Plone Trunk', 'text', 10, NULL, NULL, 'trunk', NULL, 'http://bazaar.example.com/plone@xxxxxxxxxxxxxxx/plone--trunk--0', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.049222', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.846258', 10, NULL, NULL, NULL, NULL, NULL, NULL, 'limi', NULL, '~limi/+junk/trunk', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (8, 'Evolution 2.0', 'text', 13, 5, NULL, '2.0', NULL, 'http://bazaar.example.com/gnome@xxxxxxxxxxxxxxx/gnome--evolution--2.0', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.050317', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.846899', 13, NULL, NULL, NULL, NULL, NULL, NULL, 'carlos', 'evolution', '~carlos/evolution/2.0', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (9, 'Iso-codes 0.35', 'text', 13, 7, NULL, '0.35', NULL, 'http://bazaar.example.com/iso-codes@xxxxxxxxxxxxxxx/iso-codes--iso-codes--0.35', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.051395', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.847595', 13, NULL, NULL, NULL, NULL, NULL, NULL, 'carlos', 'iso-codes', '~carlos/iso-codes/0.35', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (10, 'Mozilla Firefox 0.9.2', 'text', 1, 4, NULL, 'release-0.9.2', NULL, 'http://bazaar.example.com/mozilla@xxxxxxxxxxxxxxx/mozilla--release--0.9.2', NULL, 30, NULL, NULL, 0, NULL, NULL, 'mozilla@xxxxxxxxxxxxxxx/mozilla--release--0.9.2--base-0', NULL, '2006-10-16 18:31:43.052449', 1, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.848365', 1, NULL, NULL, NULL, NULL, NULL, NULL, 'mark', 'firefox', '~mark/firefox/release-0.9.2', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (11, 'Mozilla Firefox 0.9.1', 'text', 1, 4, NULL, 'release--0.9.1', NULL, 'http://bazaar.example.com/mozilla@xxxxxxxxxxxxxxx/mozilla--release--0.9.1', NULL, 30, NULL, NULL, 0, NULL, NULL, 'mozilla@xxxxxxxxxxxxxxx/mozilla--release--0.9.1--base-0', NULL, '2006-10-16 18:31:43.053511', 1, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.849077', 1, NULL, NULL, NULL, NULL, NULL, NULL, 'mark', 'firefox', '~mark/firefox/release--0.9.1', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (12, 'Mozilla Firefox 0.9', 'text', 1, 4, NULL, 'release-0.9', NULL, 'http://bazaar.example.com/mozilla@xxxxxxxxxxxxxxx/mozilla--release--0.9', NULL, 30, NULL, NULL, 0, NULL, NULL, 'mozilla@xxxxxxxxxxxxxxx/mozilla--release--0.9--base-0', NULL, '2006-10-16 18:31:43.054581', 1, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.84976', 1, NULL, NULL, NULL, NULL, NULL, NULL, 'mark', 'firefox', '~mark/firefox/release-0.9', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (13, 'Mozilla Firefox 0.8', 'text', 1, 4, NULL, 'release-0.8', NULL, 'http://bazaar.example.com/mozilla@xxxxxxxxxxxxxxx/mozilla--release--0.8', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.055661', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.850415', 1, NULL, NULL, NULL, NULL, NULL, NULL, 'mark', 'firefox', '~mark/firefox/release-0.8', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (14, NULL, NULL, 24, 5, NULL, 'main', NULL, NULL, NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.056714', 0, NULL, false, 3, NULL, NULL, 1, '2007-12-06 19:58:26.85103', 24, NULL, NULL, NULL, NULL, NULL, NULL, 'vcs-imports', 'evolution', '~vcs-imports/evolution/main', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (15, 'GNOME Terminal Mainline', 'Main branch of development for GNOME Terminal. Stable branches are based on that one.
-
-Home page: http://example.com/gnome-terminal', 12, 6, NULL, 'main', 'http://example.com/gnome-terminal', 'http://example.com/gnome-terminal/main', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.057682', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.851575', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/main', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (16, 'GNOME Terminal 2.6 Releases', 'Release branch of GNOME Terminal for the GNOME 2.6 environment.
-
-Home page: http://example.com/gnome-terminal/', 12, 6, NULL, '2.6', 'http://example.com/gnome-terminal/', 'http://example.com/gnome-terminal/2.6', NULL, 50, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.058953', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.852227', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/2.6', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (17, 'GNOME Terminal 2.4 Releases', 'Obsolete branch for GNOME 2.4 releases of GNOME Terminal.', 12, 6, NULL, '2.4', NULL, 'http://example.com/gnome-terminal/2.4', NULL, 80, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.060078', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.852889', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/2.4', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (18, 'Klingon support in GNOME Terminal', 'Experimental feature branch for developping and testing Klingon support in GNOME Terminal.
-
-Home page: http://trekkies.example.com/k12n', 12, 6, 12, 'klingon', 'http://trekkies.example.com/k12n', 'http://trekkies.example.com/gnome-terminal/klingon', NULL, 10, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.061162', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.85354', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/klingon', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (19, 'Slowing GNOME Terminal scrolling', 'Feature branch for slowing down the scrolling of text in GNOME Terminal.', 12, 6, 12, 'slowness', NULL, 'http://users.example.com/gnome-terminal/slowness', NULL, 70, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.062427', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.854214', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/slowness', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (20, 'Ubuntu Junk Code', 'Sample junk branch.', 12, NULL, 17, 'junk.dev', NULL, 'http://example.com/a', NULL, 10, NULL, NULL, 0, NULL, NULL, 'foo@localhost-20051031170357-1301ad6d387feb23', NULL, '2006-10-16 18:31:43.06351', 6, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.854821', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', NULL, '~name12/+junk/junk.dev', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (21, 'Junk Code Contributions', 'Contribute code to the junk branch.', 12, NULL, 12, 'junk.contrib', NULL, 'http://example.com/b', NULL, 30, NULL, NULL, 0, NULL, NULL, 'foo@localhost-20051031170357-1301ad6d387feb23', NULL, '2006-10-16 18:31:43.064578', 6, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.855432', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', NULL, '~name12/+junk/junk.contrib', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (22, 'Python twisted feature', 'Feature branch for twisted.', 7, NULL, 4, 'feature', NULL, 'http://not.launchpad.server.com/a-branch', NULL, 30, NULL, '2005-03-09 15:45:00', 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.065642', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.856045', 7, NULL, NULL, NULL, NULL, NULL, NULL, 'spiv', NULL, '~spiv/+junk/feature', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (23, 'Another Python twisted feature', 'Another Feature branch for twisted.', 7, NULL, 4, 'feature2', NULL, 'http://whynot.launchpad.server.com/another-branch', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.066804', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.856677', 7, NULL, NULL, NULL, NULL, NULL, NULL, 'spiv', NULL, '~spiv/+junk/feature2', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (24, 'Launchpad support for Gnome Terminal', 'Add Launchpad support to Gnome Terminal', 57, 6, 57, 'launchpad', NULL, 'http://users.example.com/gnome-terminal/launchpad', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.067922', 0, NULL, false, 2, NULL, NULL, 1, '2007-12-06 19:58:26.857318', 16, NULL, NULL, NULL, NULL, NULL, NULL, 'launchpad', 'gnome-terminal', '~launchpad/gnome-terminal/launchpad', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (25, NULL, NULL, 12, 6, NULL, 'pushed', NULL, NULL, NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.06897', 0, NULL, false, 1, NULL, NULL, 1, '2007-12-06 19:58:26.857983', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/pushed', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (26, NULL, NULL, 12, 6, NULL, 'mirrored', NULL, NULL, NULL, 30, '2007-03-16 14:12:49.050332', NULL, 0, NULL, NULL, NULL, NULL, '2007-03-16 03:12:49.050332', 0, NULL, false, 1, NULL, NULL, 1, '2007-12-06 19:58:26.858547', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/mirrored', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (27, NULL, NULL, 12, 6, NULL, 'scanned', NULL, NULL, NULL, 30, '2007-03-16 14:14:29.935752', NULL, 0, NULL, '2007-03-16 14:14:29.935752', NULL, NULL, '2007-03-16 03:14:29.935752', 0, NULL, false, 1, NULL, NULL, 1, '2007-12-06 19:58:26.85913', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/scanned', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (28, NULL, NULL, 1, NULL, 1, 'testdoc', NULL, NULL, NULL, 30, NULL, NULL, 1, 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum', NULL, NULL, NULL, '2007-05-04 01:16:03.75446', 0, NULL, false, 1, NULL, NULL, 1, '2007-12-06 19:58:26.859847', 1, NULL, NULL, NULL, NULL, NULL, NULL, 'mark', NULL, '~mark/+junk/testdoc', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (29, 'Landscape trunk', NULL, 64, 16, 12, 'trunk', NULL, NULL, NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2007-05-28 02:37:07.814303', 0, NULL, true, 1, NULL, NULL, 1, '2007-12-06 19:58:26.860757', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'landscape-developers', 'landscape', '~landscape-developers/landscape/trunk', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (30, NULL, NULL, 12, 16, 12, 'feature-x', NULL, NULL, NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2007-05-28 02:37:07.814303', 0, NULL, true, 1, NULL, NULL, 1, '2007-12-06 19:58:26.861424', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'landscape', '~name12/landscape/feature-x', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (75, 'GNOME Terminal Import Branch', NULL, 24, 6, NULL, 'import', NULL, NULL, NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-06-25 20:04:03.9465', 0, NULL, false, 3, NULL, NULL, 1, '2007-12-06 19:58:26.862009', 24, NULL, NULL, NULL, NULL, NULL, NULL, 'vcs-imports', 'gnome-terminal', '~vcs-imports/gnome-terminal/import', NULL);
-INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, merge_robot, merge_control_status, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk) VALUES (76, 'Evolution Import Branch', NULL, 24, 5, NULL, 'import', NULL, NULL, NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-06-25 20:04:04.218451', 0, NULL, false, 3, NULL, NULL, 1, '2007-12-06 19:58:26.862857', 24, NULL, NULL, NULL, NULL, NULL, NULL, 'vcs-imports', 'evolution', '~vcs-imports/evolution/import', NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (1, 'Mozilla Firefox Mainline', 'text', 12, 4, 12, 'main', NULL, 'http://bazaar.example.com/mozilla@xxxxxxxxxxxxxxx/mozilla--MAIN--0', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:42.98217', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.837773', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'firefox', '~name12/firefox/main', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (2, 'Mozilla Thunderbird Mainline', 'Bazaar import of the Mozilla Thunderbird CVS mainline.', 11, 8, 1, 'main', NULL, 'http://bazaar.example.com/thunderbird@xxxxxxxxxxxxxxx/thunderbird--MAIN--0', NULL, 30, NULL, '2006-04-08 01:40:15.816029', 1, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.042944', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.842033', 11, NULL, NULL, NULL, NULL, NULL, NULL, 'stevea', 'thunderbird', '~stevea/thunderbird/main', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (3, 'Python Twisted Trunk', 'Bazaar import of the Twisted SVN trunk.', 7, NULL, 3, 'trunk', NULL, 'http://bazaar.example.com/twisted@xxxxxxxxxxxxxxx/twisted--trunk--0', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.04419', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.843681', 7, NULL, NULL, NULL, NULL, NULL, NULL, 'spiv', NULL, '~spiv/+junk/trunk', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (4, 'Bugzila Mainline', 'text', 3, NULL, NULL, 'main', NULL, 'http://bazaar.example.com/bugzilla@xxxxxxxxxxxxxxx/bugzila--MAIN--0', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.045278', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.844341', 3, NULL, NULL, NULL, NULL, NULL, NULL, 'justdave', NULL, '~justdave/+junk/main', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (5, 'Arch Devel', 'text', 8, NULL, NULL, 'devel-1.0', NULL, 'http://bazaar.example.com/arch@xxxxxxxxxxxxxxx/arch--devel--1.0', NULL, 30, NULL, '2006-04-08 22:20:14.973705', 9, 'I do not like Arch, so I am pretending it failed to mirror.', NULL, NULL, NULL, '2006-10-16 18:31:43.046996', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.844975', 8, NULL, NULL, NULL, NULL, NULL, NULL, 'jblack', NULL, '~jblack/+junk/devel-1.0', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (6, 'Kiwi2 Mainline', 'text', 9, NULL, NULL, 'main', NULL, 'http://bazaar.example.com/kiwi2@xxxxxxxxxxxxxxx/kiwi2--MAIN--0', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.048164', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.84562', 9, NULL, NULL, NULL, NULL, NULL, NULL, 'kiko', NULL, '~kiko/+junk/main', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (7, 'Plone Trunk', 'text', 10, NULL, NULL, 'trunk', NULL, 'http://bazaar.example.com/plone@xxxxxxxxxxxxxxx/plone--trunk--0', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.049222', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.846258', 10, NULL, NULL, NULL, NULL, NULL, NULL, 'limi', NULL, '~limi/+junk/trunk', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (8, 'Evolution 2.0', 'text', 13, 5, NULL, '2.0', NULL, 'http://bazaar.example.com/gnome@xxxxxxxxxxxxxxx/gnome--evolution--2.0', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.050317', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.846899', 13, NULL, NULL, NULL, NULL, NULL, NULL, 'carlos', 'evolution', '~carlos/evolution/2.0', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (9, 'Iso-codes 0.35', 'text', 13, 7, NULL, '0.35', NULL, 'http://bazaar.example.com/iso-codes@xxxxxxxxxxxxxxx/iso-codes--iso-codes--0.35', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.051395', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.847595', 13, NULL, NULL, NULL, NULL, NULL, NULL, 'carlos', 'iso-codes', '~carlos/iso-codes/0.35', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (10, 'Mozilla Firefox 0.9.2', 'text', 1, 4, NULL, 'release-0.9.2', NULL, 'http://bazaar.example.com/mozilla@xxxxxxxxxxxxxxx/mozilla--release--0.9.2', NULL, 30, NULL, NULL, 0, NULL, NULL, 'mozilla@xxxxxxxxxxxxxxx/mozilla--release--0.9.2--base-0', NULL, '2006-10-16 18:31:43.052449', 1, NULL, false, 2, NULL, '2007-12-06 19:58:26.848365', 1, NULL, NULL, NULL, NULL, NULL, NULL, 'mark', 'firefox', '~mark/firefox/release-0.9.2', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (11, 'Mozilla Firefox 0.9.1', 'text', 1, 4, NULL, 'release--0.9.1', NULL, 'http://bazaar.example.com/mozilla@xxxxxxxxxxxxxxx/mozilla--release--0.9.1', NULL, 30, NULL, NULL, 0, NULL, NULL, 'mozilla@xxxxxxxxxxxxxxx/mozilla--release--0.9.1--base-0', NULL, '2006-10-16 18:31:43.053511', 1, NULL, false, 2, NULL, '2007-12-06 19:58:26.849077', 1, NULL, NULL, NULL, NULL, NULL, NULL, 'mark', 'firefox', '~mark/firefox/release--0.9.1', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (12, 'Mozilla Firefox 0.9', 'text', 1, 4, NULL, 'release-0.9', NULL, 'http://bazaar.example.com/mozilla@xxxxxxxxxxxxxxx/mozilla--release--0.9', NULL, 30, NULL, NULL, 0, NULL, NULL, 'mozilla@xxxxxxxxxxxxxxx/mozilla--release--0.9--base-0', NULL, '2006-10-16 18:31:43.054581', 1, NULL, false, 2, NULL, '2007-12-06 19:58:26.84976', 1, NULL, NULL, NULL, NULL, NULL, NULL, 'mark', 'firefox', '~mark/firefox/release-0.9', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (13, 'Mozilla Firefox 0.8', 'text', 1, 4, NULL, 'release-0.8', NULL, 'http://bazaar.example.com/mozilla@xxxxxxxxxxxxxxx/mozilla--release--0.8', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.055661', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.850415', 1, NULL, NULL, NULL, NULL, NULL, NULL, 'mark', 'firefox', '~mark/firefox/release-0.8', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (14, NULL, NULL, 24, 5, NULL, 'main', NULL, NULL, NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.056714', 0, NULL, false, 3, NULL, '2007-12-06 19:58:26.85103', 24, NULL, NULL, NULL, NULL, NULL, NULL, 'vcs-imports', 'evolution', '~vcs-imports/evolution/main', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (15, 'GNOME Terminal Mainline', 'Main branch of development for GNOME Terminal. Stable branches are based on that one.
+
+Home page: http://example.com/gnome-terminal', 12, 6, NULL, 'main', 'http://example.com/gnome-terminal', 'http://example.com/gnome-terminal/main', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.057682', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.851575', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/main', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (16, 'GNOME Terminal 2.6 Releases', 'Release branch of GNOME Terminal for the GNOME 2.6 environment.
+
+Home page: http://example.com/gnome-terminal/', 12, 6, NULL, '2.6', 'http://example.com/gnome-terminal/', 'http://example.com/gnome-terminal/2.6', NULL, 50, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.058953', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.852227', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/2.6', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (17, 'GNOME Terminal 2.4 Releases', 'Obsolete branch for GNOME 2.4 releases of GNOME Terminal.', 12, 6, NULL, '2.4', NULL, 'http://example.com/gnome-terminal/2.4', NULL, 80, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.060078', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.852889', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/2.4', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (18, 'Klingon support in GNOME Terminal', 'Experimental feature branch for developping and testing Klingon support in GNOME Terminal.
+
+Home page: http://trekkies.example.com/k12n', 12, 6, 12, 'klingon', 'http://trekkies.example.com/k12n', 'http://trekkies.example.com/gnome-terminal/klingon', NULL, 10, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.061162', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.85354', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/klingon', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (19, 'Slowing GNOME Terminal scrolling', 'Feature branch for slowing down the scrolling of text in GNOME Terminal.', 12, 6, 12, 'slowness', NULL, 'http://users.example.com/gnome-terminal/slowness', NULL, 70, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.062427', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.854214', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/slowness', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (20, 'Ubuntu Junk Code', 'Sample junk branch.', 12, NULL, 17, 'junk.dev', NULL, 'http://example.com/a', NULL, 10, NULL, NULL, 0, NULL, NULL, 'foo@localhost-20051031170357-1301ad6d387feb23', NULL, '2006-10-16 18:31:43.06351', 6, NULL, false, 2, NULL, '2007-12-06 19:58:26.854821', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', NULL, '~name12/+junk/junk.dev', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (21, 'Junk Code Contributions', 'Contribute code to the junk branch.', 12, NULL, 12, 'junk.contrib', NULL, 'http://example.com/b', NULL, 30, NULL, NULL, 0, NULL, NULL, 'foo@localhost-20051031170357-1301ad6d387feb23', NULL, '2006-10-16 18:31:43.064578', 6, NULL, false, 2, NULL, '2007-12-06 19:58:26.855432', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', NULL, '~name12/+junk/junk.contrib', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (22, 'Python twisted feature', 'Feature branch for twisted.', 7, NULL, 4, 'feature', NULL, 'http://not.launchpad.server.com/a-branch', NULL, 30, NULL, '2005-03-09 15:45:00', 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.065642', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.856045', 7, NULL, NULL, NULL, NULL, NULL, NULL, 'spiv', NULL, '~spiv/+junk/feature', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (23, 'Another Python twisted feature', 'Another Feature branch for twisted.', 7, NULL, 4, 'feature2', NULL, 'http://whynot.launchpad.server.com/another-branch', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.066804', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.856677', 7, NULL, NULL, NULL, NULL, NULL, NULL, 'spiv', NULL, '~spiv/+junk/feature2', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (24, 'Launchpad support for Gnome Terminal', 'Add Launchpad support to Gnome Terminal', 57, 6, 57, 'launchpad', NULL, 'http://users.example.com/gnome-terminal/launchpad', NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.067922', 0, NULL, false, 2, NULL, '2007-12-06 19:58:26.857318', 16, NULL, NULL, NULL, NULL, NULL, NULL, 'launchpad', 'gnome-terminal', '~launchpad/gnome-terminal/launchpad', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (25, NULL, NULL, 12, 6, NULL, 'pushed', NULL, NULL, NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-10-16 18:31:43.06897', 0, NULL, false, 1, NULL, '2007-12-06 19:58:26.857983', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/pushed', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (26, NULL, NULL, 12, 6, NULL, 'mirrored', NULL, NULL, NULL, 30, '2007-03-16 14:12:49.050332', NULL, 0, NULL, NULL, NULL, NULL, '2007-03-16 03:12:49.050332', 0, NULL, false, 1, NULL, '2007-12-06 19:58:26.858547', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/mirrored', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (27, NULL, NULL, 12, 6, NULL, 'scanned', NULL, NULL, NULL, 30, '2007-03-16 14:14:29.935752', NULL, 0, NULL, '2007-03-16 14:14:29.935752', NULL, NULL, '2007-03-16 03:14:29.935752', 0, NULL, false, 1, NULL, '2007-12-06 19:58:26.85913', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'gnome-terminal', '~name12/gnome-terminal/scanned', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (28, NULL, NULL, 1, NULL, 1, 'testdoc', NULL, NULL, NULL, 30, NULL, NULL, 1, 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum', NULL, NULL, NULL, '2007-05-04 01:16:03.75446', 0, NULL, false, 1, NULL, '2007-12-06 19:58:26.859847', 1, NULL, NULL, NULL, NULL, NULL, NULL, 'mark', NULL, '~mark/+junk/testdoc', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (29, 'Landscape trunk', NULL, 64, 16, 12, 'trunk', NULL, NULL, NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2007-05-28 02:37:07.814303', 0, NULL, true, 1, NULL, '2007-12-06 19:58:26.860757', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'landscape-developers', 'landscape', '~landscape-developers/landscape/trunk', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (30, NULL, NULL, 12, 16, 12, 'feature-x', NULL, NULL, NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2007-05-28 02:37:07.814303', 0, NULL, true, 1, NULL, '2007-12-06 19:58:26.861424', 12, NULL, NULL, NULL, NULL, NULL, NULL, 'name12', 'landscape', '~name12/landscape/feature-x', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (75, 'GNOME Terminal Import Branch', NULL, 24, 6, NULL, 'import', NULL, NULL, NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-06-25 20:04:03.9465', 0, NULL, false, 3, NULL, '2007-12-06 19:58:26.862009', 24, NULL, NULL, NULL, NULL, NULL, NULL, 'vcs-imports', 'gnome-terminal', '~vcs-imports/gnome-terminal/import', NULL, NULL, NULL);
+INSERT INTO branch (id, title, summary, owner, product, author, name, home_page, url, whiteboard, lifecycle_status, last_mirrored, last_mirror_attempt, mirror_failures, mirror_status_message, last_scanned, last_scanned_id, last_mirrored_id, date_created, revision_count, next_mirror_time, private, branch_type, reviewer, date_last_modified, registrant, branch_format, repository_format, metadir_format, stacked_on, distroseries, sourcepackagename, owner_name, target_suffix, unique_name, size_on_disk, merge_queue, merge_queue_config) VALUES (76, 'Evolution Import Branch', NULL, 24, 5, NULL, 'import', NULL, NULL, NULL, 30, NULL, NULL, 0, NULL, NULL, NULL, NULL, '2006-06-25 20:04:04.218451', 0, NULL, false, 3, NULL, '2007-12-06 19:58:26.862857', 24, NULL, NULL, NULL, NULL, NULL, NULL, 'vcs-imports', 'evolution', '~vcs-imports/evolution/import', NULL, NULL, NULL);
 
 
 ALTER TABLE branch ENABLE TRIGGER ALL;
@@ -5002,6 +5002,81 @@
 ALTER TABLE lp_account ENABLE TRIGGER ALL;
 
 
+ALTER TABLE lp_openididentifier DISABLE TRIGGER ALL;
+
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('6KHNEe3', 2436141, '2007-12-18 16:31:34.790641');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('6w7kmzC', 2436091, '2007-12-07 13:43:20.393704');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('CALDpFr', 2436171, '2008-03-06 09:55:27.289842');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('GMX7shE', 2436242, '2009-03-17 07:26:14.024613');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('MGWJnTL', 2436111, '2007-12-14 16:52:15.403833');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('R8FpwXd', 2436161, '2007-12-18 16:31:34.790641');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('WQPMHdf', 2436081, '2007-11-12 15:23:19.847132');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('andrelop_oid', 431, '2005-06-06 08:59:51.561685');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('barbier_oid', 421, '2005-06-06 08:59:51.560604');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('bug-importer_oid', 581, '2005-12-06 09:48:58.287679');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('bug-watch-updater_oid', 621, '2006-05-23 12:49:30.483464');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('cCGE3LA', 2436101, '2007-12-14 16:52:15.403833');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('cF4PNk3', 2436241, '2008-11-04 12:59:26.965843');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('callipeo_oid', 401, '2005-06-06 08:59:51.558429');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('carlos_oid', 131, '2005-06-06 08:59:51.615543');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('cprov_oid', 281, '2005-06-06 08:59:51.59705');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('daf_oid', 141, '2005-06-06 08:59:51.616666');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('danner_oid', 371, '2005-06-06 08:59:51.549651');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('ddaa_oid', 231, '2005-06-06 08:59:51.620823');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('debonzi_oid', 271, '2005-06-06 08:59:51.557224');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('edgar_oid', 331, '2005-06-06 08:59:51.621892');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('former-user_oid', 701, '2006-12-13 21:19:06.369142');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('jblack_oid', 81, '2005-06-06 08:59:51.601584');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('jdub_oid', 61, '2005-06-06 08:59:51.600523');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('jordi_oid', 561, '2005-10-07 14:17:51.593849');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('jorge-gonzalez-gonzalez_oid', 411, '2005-06-06 08:59:51.559519');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('justdave_oid', 31, '2005-06-06 08:59:51.610048');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('jvprat_oid', 341, '2005-06-06 08:59:51.622908');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('kYFxQYP', 2436243, '2009-08-04 10:50:39.383407');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('kamion_oid', 41, '2005-06-06 08:59:51.611185');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('karl_oid', 631, '2006-05-23 12:49:30.483464');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('kebil_oid', 491, '2005-06-06 08:59:51.568323');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('keybuk_oid', 51, '2005-06-06 08:59:51.608802');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('kiko_oid', 91, '2005-06-06 08:59:51.594941');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('kinnison_oid', 261, '2005-06-06 08:59:51.618722');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('kreutzm_oid', 511, '2005-06-06 08:59:51.570701');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('kurem_oid', 461, '2005-06-06 08:59:51.565033');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('launchpad-beta-owner_oid', 681, '2007-01-31 06:56:25.096519');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('launchpad-janitor_oid', 651, '2006-10-04 16:20:51.19954');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('lifeless_oid', 21, '2005-06-06 08:59:51.598107');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('limi_oid', 101, '2005-06-06 08:59:51.619713');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('luk-claes_oid', 451, '2005-06-06 08:59:51.563952');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('mTmeENb', 2436231, '2008-06-27 14:49:11.149508');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('marilize_oid', 551, '2005-06-06 08:59:51.593849');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('mark_oid', 11, '2005-06-06 08:59:51.591618');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('martin-pitt_oid', 381, '2005-06-06 08:59:51.555051');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('matsubara_oid', 661, '2006-12-13 21:19:06.369142');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('morten_oid', 471, '2005-06-06 08:59:51.56614');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('mpo_oid', 481, '2005-06-06 08:59:51.567224');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('name12_oid', 121, '2005-06-06 08:59:51.612277');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('name16_oid', 161, '2005-06-06 08:59:51.593849');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('neMCQNd', 2436061, '2007-08-09 21:25:37.832976');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('no-priv_oid', 521, '2005-06-06 08:59:51.593849');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('no-team-memberships_oid', 2436021, '2007-02-19 11:17:57.755666');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('nsv_oid', 391, '2005-06-06 08:59:51.556132');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('one-membership_oid', 2436031, '2007-02-21 10:53:59.700105');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('rPwGRk4', 2436221, '2008-05-12 17:38:38.798696');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('salgado_oid', 291, '2005-06-06 08:59:51.596025');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('sigurd-ubuntu_oid', 351, '2005-06-06 08:59:51.623962');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('skacel_oid', 361, '2005-06-06 08:59:51.5244');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('spiv_oid', 71, '2005-06-06 08:59:51.551196');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('stevea_oid', 111, '2005-06-06 08:59:51.599234');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('stub_oid', 221, '2005-06-06 08:59:51.59276');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('team-membership-janitor_oid', 671, '2006-10-04 16:20:51.19954');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('tsukimi_oid', 501, '2005-06-06 08:59:51.569518');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('valyag_oid', 441, '2005-06-06 08:59:51.562857');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('yEzBPbd', 2436151, '2007-12-18 16:31:34.790641');
+INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('zRtPxw8', 243637, '2010-07-12 09:48:27.198885');
+
+
+ALTER TABLE lp_openididentifier ENABLE TRIGGER ALL;
+
+
 ALTER TABLE lp_person DISABLE TRIGGER ALL;
 
 INSERT INTO lp_person (id, displayname, teamowner, teamdescription, name, language, fti, defaultmembershipperiod, defaultrenewalperiod, subscriptionpolicy, merged, datecreated, addressline1, addressline2, organization, city, province, country, postcode, phone, homepage_content, icon, mugshot, hide_email_addresses, creation_rationale, creation_comment, registrant, logo, renewal_policy, personal_standing, personal_standing_reason, mail_resumption_date, mailing_list_auto_subscribe_policy, mailing_list_receive_duplicates, visibility, verbose_bugnotifications, account) VALUES (1, 'Mark Shuttleworth', NULL, NULL, 'mark', NULL, NULL, NULL, NULL, 1, NULL, '2005-06-06 08:59:51.591618', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, false, 8, NULL, NULL, NULL, 10, 0, NULL, NULL, 1, true, 1, false, 11);
@@ -5108,81 +5183,6 @@
 ALTER TABLE lp_person ENABLE TRIGGER ALL;
 
 
-ALTER TABLE lp_openididentifier DISABLE TRIGGER ALL;
-
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('6KHNEe3', 2436141, '2007-12-18 16:31:34.790641');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('6w7kmzC', 2436091, '2007-12-07 13:43:20.393704');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('CALDpFr', 2436171, '2008-03-06 09:55:27.289842');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('GMX7shE', 2436242, '2009-03-17 07:26:14.024613');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('MGWJnTL', 2436111, '2007-12-14 16:52:15.403833');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('R8FpwXd', 2436161, '2007-12-18 16:31:34.790641');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('WQPMHdf', 2436081, '2007-11-12 15:23:19.847132');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('andrelop_oid', 431, '2005-06-06 08:59:51.561685');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('barbier_oid', 421, '2005-06-06 08:59:51.560604');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('bug-importer_oid', 581, '2005-12-06 09:48:58.287679');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('bug-watch-updater_oid', 621, '2006-05-23 12:49:30.483464');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('cCGE3LA', 2436101, '2007-12-14 16:52:15.403833');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('cF4PNk3', 2436241, '2008-11-04 12:59:26.965843');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('callipeo_oid', 401, '2005-06-06 08:59:51.558429');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('carlos_oid', 131, '2005-06-06 08:59:51.615543');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('cprov_oid', 281, '2005-06-06 08:59:51.59705');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('daf_oid', 141, '2005-06-06 08:59:51.616666');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('danner_oid', 371, '2005-06-06 08:59:51.549651');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('ddaa_oid', 231, '2005-06-06 08:59:51.620823');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('debonzi_oid', 271, '2005-06-06 08:59:51.557224');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('edgar_oid', 331, '2005-06-06 08:59:51.621892');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('former-user_oid', 701, '2006-12-13 21:19:06.369142');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('jblack_oid', 81, '2005-06-06 08:59:51.601584');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('jdub_oid', 61, '2005-06-06 08:59:51.600523');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('jordi_oid', 561, '2005-10-07 14:17:51.593849');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('jorge-gonzalez-gonzalez_oid', 411, '2005-06-06 08:59:51.559519');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('justdave_oid', 31, '2005-06-06 08:59:51.610048');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('jvprat_oid', 341, '2005-06-06 08:59:51.622908');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('kYFxQYP', 2436243, '2009-08-04 10:50:39.383407');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('kamion_oid', 41, '2005-06-06 08:59:51.611185');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('karl_oid', 631, '2006-05-23 12:49:30.483464');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('kebil_oid', 491, '2005-06-06 08:59:51.568323');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('keybuk_oid', 51, '2005-06-06 08:59:51.608802');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('kiko_oid', 91, '2005-06-06 08:59:51.594941');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('kinnison_oid', 261, '2005-06-06 08:59:51.618722');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('kreutzm_oid', 511, '2005-06-06 08:59:51.570701');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('kurem_oid', 461, '2005-06-06 08:59:51.565033');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('launchpad-beta-owner_oid', 681, '2007-01-31 06:56:25.096519');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('launchpad-janitor_oid', 651, '2006-10-04 16:20:51.19954');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('lifeless_oid', 21, '2005-06-06 08:59:51.598107');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('limi_oid', 101, '2005-06-06 08:59:51.619713');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('luk-claes_oid', 451, '2005-06-06 08:59:51.563952');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('mTmeENb', 2436231, '2008-06-27 14:49:11.149508');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('marilize_oid', 551, '2005-06-06 08:59:51.593849');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('mark_oid', 11, '2005-06-06 08:59:51.591618');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('martin-pitt_oid', 381, '2005-06-06 08:59:51.555051');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('matsubara_oid', 661, '2006-12-13 21:19:06.369142');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('morten_oid', 471, '2005-06-06 08:59:51.56614');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('mpo_oid', 481, '2005-06-06 08:59:51.567224');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('name12_oid', 121, '2005-06-06 08:59:51.612277');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('name16_oid', 161, '2005-06-06 08:59:51.593849');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('neMCQNd', 2436061, '2007-08-09 21:25:37.832976');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('no-priv_oid', 521, '2005-06-06 08:59:51.593849');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('no-team-memberships_oid', 2436021, '2007-02-19 11:17:57.755666');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('nsv_oid', 391, '2005-06-06 08:59:51.556132');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('one-membership_oid', 2436031, '2007-02-21 10:53:59.700105');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('rPwGRk4', 2436221, '2008-05-12 17:38:38.798696');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('salgado_oid', 291, '2005-06-06 08:59:51.596025');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('sigurd-ubuntu_oid', 351, '2005-06-06 08:59:51.623962');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('skacel_oid', 361, '2005-06-06 08:59:51.5244');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('spiv_oid', 71, '2005-06-06 08:59:51.551196');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('stevea_oid', 111, '2005-06-06 08:59:51.599234');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('stub_oid', 221, '2005-06-06 08:59:51.59276');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('team-membership-janitor_oid', 671, '2006-10-04 16:20:51.19954');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('tsukimi_oid', 501, '2005-06-06 08:59:51.569518');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('valyag_oid', 441, '2005-06-06 08:59:51.562857');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('yEzBPbd', 2436151, '2007-12-18 16:31:34.790641');
-INSERT INTO lp_openididentifier (identifier, account, date_created) VALUES ('zRtPxw8', 243637, '2010-07-12 09:48:27.198885');
-
-
-ALTER TABLE lp_openididentifier ENABLE TRIGGER ALL;
-
-
 ALTER TABLE lp_personlocation DISABLE TRIGGER ALL;
 
 INSERT INTO lp_personlocation (id, date_created, person, latitude, longitude, time_zone, last_modified_by, date_last_modified, visible, locked) VALUES (1, '2007-06-05 18:34:52.127945', 12, NULL, NULL, 'Australia/Perth', 12, '2007-06-05 18:34:52.127945', true, false);

=== modified file 'database/schema/comments.sql'
--- database/schema/comments.sql	2010-10-07 18:54:00 +0000
+++ database/schema/comments.sql	2010-10-29 12:36:22 +0000
@@ -54,8 +54,6 @@
 COMMENT ON COLUMN Branch.private IS 'If the branch is private, then only the owner and subscribers of the branch can see it.';
 COMMENT ON COLUMN Branch.date_last_modified IS 'A branch is modified any time a user updates something using a view, a new revision for the branch is scanned, or the branch is linked to a bug, blueprint or merge proposal.';
 COMMENT ON COLUMN Branch.reviewer IS 'The reviewer (person or) team are able to transition merge proposals targetted at the branch throught the CODE_APPROVED state.';
-COMMENT ON COLUMN Branch.merge_robot IS 'The robot that controls the automatic landing onto this branch.';
-COMMENT ON COLUMN Branch.merge_control_status IS 'When there is no merge_robot set, the merge_control_status must be set to Manual.  If a merge_robot is set, then the branch merge_control_status can be set to Automatic which means that the merge robot will start merging the branches.';
 COMMENT ON COLUMN Branch.home_page IS 'This column is deprecated and to be removed soon.';
 COMMENT ON COLUMN Branch.branch_format IS 'The bzr branch format';
 COMMENT ON COLUMN Branch.repository_format IS 'The bzr repository format';
@@ -64,6 +62,20 @@
 COMMENT ON COLUMN Branch.distroseries IS 'The distribution series that the branch belongs to.';
 COMMENT ON COLUMN Branch.sourcepackagename IS 'The source package this is a branch of.';
 COMMENT ON COLUMN Branch.size_on_disk IS 'The size in bytes of this branch in the mirrored area.';
+COMMENT ON COLUMN Branch.merge_queue IS 'A reference to the BranchMergeQueue record that manages merges.';
+COMMENT ON COLUMN Branch.merge_queue_config IS 'A JSON string of configuration values that can be read by a merge queue script.';
+
+
+-- BranchMergeQueue
+COMMENT ON TABLE BranchMergeQueue IS 'Queue for managing the merge workflow for branches.';
+COMMENT ON COLUMN BranchMergeQueue.id IS 'The id of the merge queue.';
+COMMENT ON COLUMN BranchMergeQueue.registrant IS 'A reference to the person who created the merge queue.';
+COMMENT ON COLUMN BranchMergeQueue.owner IS 'A reference to the person who owns the merge queue.';
+COMMENT ON COLUMN BranchMergeQueue.name IS 'The name of the queue.';
+COMMENT ON COLUMN BranchMergeQueue.description IS 'A description of the queue.';
+COMMENT ON COLUMN BranchMergeQueue.configuration IS 'A JSON string of configuration data to be read by the merging script.';
+COMMENT ON COLUMN BranchMergeQueue.date_created IS 'The date the queue was created.';
+
 
 -- BranchJob
 
@@ -114,15 +126,6 @@
 COMMENT ON COLUMN BranchMergeProposalJob.job_type IS 'The type of job, like new proposal, review comment, or new review requested.';
 COMMENT ON COLUMN BranchMergeProposalJob.json_data IS 'Data that is specific to the type of job, normally references to code review messages and or votes.';
 
--- BranchMergeRobot
-
-COMMENT ON TABLE BranchMergeRobot IS 'In order to have a single merge robot be able to control landings on multiple branches, we need some robot entity.';
-COMMENT ON COLUMN BranchMergeRobot.registrant IS 'The person that created the merge robot.';
-COMMENT ON COLUMN BranchMergeRobot.owner IS 'The person or team that is able to update the robot and manage the landing queue.';
-COMMENT ON COLUMN BranchMergeRobot.name IS 'The name of the robot.  This is unique for the owner.';
-COMMENT ON COLUMN BranchMergeRobot.whiteboard IS 'Any interesting comments about the robot itself.';
-COMMENT ON COLUMN BranchMergeRobot.date_created IS 'When this robot was created.';
-
 -- SeriesSourcePackageBranch
 
 COMMENT ON TABLE SeriesSourcePackageBranch IS 'Link between branches and distribution suite.';
@@ -150,13 +153,6 @@
 COMMENT ON COLUMN BranchVisibilityPolicy.team IS 'Refers to the team that the policy applies to.  NULL is used to indicate ALL people, as there is no team defined for *everybody*.';
 COMMENT ON COLUMN BranchVisibilityPolicy.policy IS 'An enumerated type, one of PUBLIC or PRIVATE.  PUBLIC is the default value.';
 
--- BranchWithSortKeys
-
-COMMENT ON VIEW BranchWithSortKeys IS 'A hack to allow the sorting of queries to Branch by human-meaningful keys in the face of limitations in SQLObject.  Will go away when we start using Storm.  This view has all the columns of Branch with three extra names joined on to it.';
-COMMENT ON COLUMN BranchWithSortKeys.product_name IS 'Branch.product.name';
-COMMENT ON COLUMN BranchWithSortKeys.author_name IS 'Branch.author.displayname';
-COMMENT ON COLUMN BranchWithSortKeys.owner_name IS 'Branch.owner.displayname';
-
 -- Bug
 
 COMMENT ON TABLE Bug IS 'A software bug that requires fixing. This particular bug may be linked to one or more products or source packages to identify the location(s) that this bug is found.';

=== added file 'database/schema/patch-2208-22-0.sql'
--- database/schema/patch-2208-22-0.sql	1970-01-01 00:00:00 +0000
+++ database/schema/patch-2208-22-0.sql	2010-10-29 12:36:22 +0000
@@ -0,0 +1,30 @@
+-- Copyright 2010 Canonical Ltd.  This software is licensed under the
+-- GNU Affero General Public License version 3 (see the file LICENSE).
+SET client_min_messages=ERROR;
+
+ALTER TABLE Branch DROP COLUMN merge_robot CASCADE;
+ALTER TABLE Branch DROP COLUMN merge_control_status;
+
+CREATE TABLE BranchMergeQueue (
+    id serial NOT NULL PRIMARY KEY,
+    registrant integer NOT NULL REFERENCES Person,
+    owner integer NOT NULL REFERENCES Person,
+    name TEXT NOT NULL,
+    description TEXT,
+    configuration TEXT,
+    date_created timestamp without time zone
+        DEFAULT timezone('UTC'::text, now()) NOT NULL,
+    CONSTRAINT owner_name UNIQUE (owner, name),
+    CONSTRAINT valid_name CHECK (valid_name(name))
+);
+CREATE INDEX branchmergequeue__registrant__idx ON BranchMergeQueue(registrant);
+
+ALTER TABLE Branch ADD COLUMN merge_queue integer REFERENCES BranchMergeQueue;
+ALTER TABLE Branch ADD COLUMN merge_queue_config TEXT;
+CREATE INDEX branch__merge_queue__idx ON Branch(merge_queue);
+
+ALTER TABLE BranchMergeRobot DROP CONSTRAINT "branchmergerobot_registrant_fkey";
+ALTER TABLE BranchMergeRobot DROP CONSTRAINT "branchmergerobot_owner_fkey";
+ALTER TABLE BranchMergeRobot SET SCHEMA todrop;
+
+INSERT INTO LaunchpadDatabaseRevision VALUES (2208, 22, 0);

=== modified file 'database/schema/security.cfg'
--- database/schema/security.cfg	2010-10-25 20:34:14 +0000
+++ database/schema/security.cfg	2010-10-29 12:36:22 +0000
@@ -105,10 +105,10 @@
 public.branchjob                        = SELECT, INSERT, UPDATE, DELETE
 public.branchmergeproposal              = SELECT, INSERT, UPDATE, DELETE
 public.branchmergeproposaljob           = SELECT, INSERT, UPDATE, DELETE
-public.branchmergerobot                 = SELECT, INSERT, UPDATE, DELETE
+public.todrop_branchmergerobot          = SELECT, INSERT, UPDATE, DELETE
+public.branchmergequeue                 = SELECT, INSERT, UPDATE, DELETE
 public.branchsubscription               = SELECT, INSERT, UPDATE, DELETE
 public.branchvisibilitypolicy           = SELECT, INSERT, UPDATE, DELETE
-public.branchwithsortkeys               = SELECT
 public.bugaffectsperson                 = SELECT, INSERT, UPDATE, DELETE
 public.bugattachment                    = SELECT, INSERT, UPDATE, DELETE
 public.bugbranch                        = SELECT, INSERT, UPDATE, DELETE
@@ -124,6 +124,7 @@
 public.bugtrackercomponent              = SELECT, INSERT, UPDATE
 public.bugtrackercomponentgroup         = SELECT, INSERT, UPDATE
 public.bugwatchactivity                 = SELECT, INSERT, UPDATE
+public.buildfarmjob                     = DELETE
 public.codeimport                       = SELECT, INSERT, UPDATE, DELETE
 public.codeimportevent                  = SELECT, INSERT, UPDATE
 public.codeimporteventdata              = SELECT, INSERT
@@ -174,9 +175,9 @@
 public.hwvendorname                     = SELECT
 public.incrementaldiff                  = SELECT, INSERT, UPDATE, DELETE
 public.job                              = SELECT, INSERT, UPDATE, DELETE
-public.karmacache                       = SELECT
+public.karmacache                       = SELECT, DELETE
 public.karmacategory                    = SELECT
-public.karmatotalcache                  = SELECT
+public.karmatotalcache                  = SELECT, DELETE, UPDATE
 public.language                         = SELECT
 public.languagepack                     = SELECT, INSERT, UPDATE
 public.launchpadstatistic               = SELECT
@@ -207,6 +208,7 @@
 public.openidrpconfig                   = SELECT, INSERT, UPDATE, DELETE
 public.packagebugsupervisor             = SELECT, INSERT, UPDATE, DELETE
 public.packagecopyrequest               = SELECT, INSERT, UPDATE
+public.packagebuild                     = DELETE
 public.packagediff                      = SELECT, INSERT, UPDATE, DELETE
 public.packagediff                      = SELECT, INSERT, UPDATE, DELETE
 public.packageset                       = SELECT, INSERT, UPDATE, DELETE
@@ -552,8 +554,6 @@
 public.bugtag                           = SELECT
 public.bugtask                          = SELECT, INSERT, UPDATE
 public.bugtracker                       = SELECT, INSERT
-public.bugtrackercomponent              = SELECT, INSERT, UPDATE, DELETE
-public.bugtrackercomponentgroup         = SELECT, INSERT, UPDATE, DELETE
 public.bugtrackeralias                  = SELECT
 public.bugtrackerperson                 = SELECT, INSERT
 public.bugwatch                         = SELECT, INSERT, UPDATE
@@ -1922,6 +1922,14 @@
 public.product                          = SELECT, UPDATE
 public.bugtracker                       = SELECT
 
+[updatebugzillaremotecomponents]
+# Retrieves/updates BugTracker component info from Bugzillas
+type=user
+groups=script
+public.bugtracker                       = SELECT, UPDATE
+public.bugtrackercomponent              = SELECT, INSERT, UPDATE, DELETE
+public.bugtrackercomponentgroup         = SELECT, INSERT, UPDATE, DELETE
+
 [process-job-source-groups]
 # Does not need access to tables.
 type=user

=== modified file 'lib/canonical/buildd/buildrecipe'
--- lib/canonical/buildd/buildrecipe	2010-09-09 14:12:02 +0000
+++ lib/canonical/buildd/buildrecipe	2010-10-29 12:36:22 +0000
@@ -7,10 +7,12 @@
 __metaclass__ = type
 
 
+import errno
 import os
 import pwd
+import re
 import socket
-from subprocess import call
+from subprocess import call, Popen, PIPE
 import sys
 
 
@@ -21,6 +23,26 @@
 RETCODE_FAILURE_BUILD_SOURCE_PACKAGE = 203
 
 
+class NotVirtualized(Exception):
+    """Exception raised when not running in a virtualized environment."""
+
+
+class NoXenDetect(NotVirtualized):
+    """xen-detect not installed."""
+
+    def __init__(self):
+        NotVirtualized.__init__(self, 'xen-detect is not installed.')
+
+
+class BadXenDetect(NotVirtualized):
+    """xen-detect's output not not indicate that we are virtualized."""
+
+    def __init__(self, xen_detect_output):
+        NotVirtualized.__init__(
+            self, 'Bad xen-detect output: %s' % xen_detect_output)
+        self.xen_detect_output = xen_detect_output
+
+
 class RecipeBuilder:
     """Builds a package from a recipe."""
 
@@ -64,6 +86,12 @@
         As a side-effect, sets self.source_dir_relative.
         :return: a retcode from `bzr dailydeb`.
         """
+        try:
+            ensure_virtualized()
+        except NotVirtualized, e:
+            sys.stderr.write('Aborting on failed virtualization check:\n')
+            sys.stderr.write(str(e))
+            return 1
         assert not os.path.exists(self.tree_path)
         recipe_path = os.path.join(self.work_dir, 'recipe')
         manifest_path = os.path.join(self.tree_path, 'manifest')
@@ -159,6 +187,24 @@
     return os.path.join(
         os.environ["HOME"], "build-" + build_id, *extra)
 
+
+def ensure_virtualized():
+    """Raise an exception if not running in a virtualized environment.
+
+    Raises if unsure, or if not running under Xen.
+    """
+    try:
+        proc = Popen(['xen-detect'], stdout=PIPE)
+    except OSError, e:
+        if e.errno != errno.ENOENT:
+            raise
+        raise NoXenDetect()
+    status_code = proc.wait()
+    output = proc.stdout.read()
+    if not re.match('Running in .* context on Xen', output):
+        raise BadXenDetect(output)
+
+
 if __name__ == '__main__':
     builder = RecipeBuilder(*sys.argv[1:])
     if builder.buildTree() != 0:

=== modified file 'lib/canonical/buildd/debian/changelog'
--- lib/canonical/buildd/debian/changelog	2010-08-25 20:04:40 +0000
+++ lib/canonical/buildd/debian/changelog	2010-10-29 12:36:22 +0000
@@ -1,3 +1,16 @@
+launchpad-buildd (72) hardy-cat; urgency=low
+
+  * break out readyservice.py from tachandler.py. LP#663828
+
+ -- LaMont Jones <lamont@xxxxxxxxxxxxx>  Wed, 20 Oct 2010 13:03:23 -0600
+
+launchpad-buildd (71) hardy-cat; urgency=low
+
+  * Detect ppa hosts for build recipes.  LP#662664
+  * Better recipe builds. LP#599100, 627119, 479705
+
+ -- LaMont Jones <lamont@xxxxxxxxxxxxx>  Tue, 19 Oct 2010 13:48:33 -0600
+
 launchpad-buildd (70) hardy-cat; urgency=low
 
   [ LaMont Jones ]

=== modified file 'lib/canonical/config/__init__.py'
--- lib/canonical/config/__init__.py	2010-10-20 01:23:52 +0000
+++ lib/canonical/config/__init__.py	2010-10-29 12:36:22 +0000
@@ -58,8 +58,7 @@
 # The directories containing instances configuration directories.
 CONFIG_ROOT_DIRS = [
     os.path.join(TREE_ROOT, 'configs'),
-    os.path.join(TREE_ROOT, 'production-configs')
-    ]
+    os.path.join(TREE_ROOT, 'production-configs')]
 
 
 def find_instance_name():
@@ -100,6 +99,7 @@
     is thread safe (not that this will be a problem if we stick with
     simple configuration).
     """
+
     def __init__(self, instance_name=None, process_name=None):
         """Create a new instance of CanonicalConfig.
 
@@ -251,6 +251,15 @@
                 </configure>""" % self.config_dir
         loader.close()
 
+    def appserver_root_url(self, facet='mainsite', ensureSlash=False):
+        """Return the correct app server root url for the given facet."""
+        root_url = str(getattr(self.vhost, facet).rooturl)
+        if not ensureSlash:
+            return root_url.rstrip('/')
+        if not root_url.endswith('/'):
+            return root_url+'/'
+        return root_url
+
     def __getattr__(self, name):
         self._getConfig()
         # Check first if it's not one of the name added directly
@@ -289,6 +298,7 @@
     value = urlunparse(bits)
     return value
 
+
 def urlbase(value):
     """ZConfig validator for url bases
 

=== modified file 'lib/canonical/config/schema-lazr.conf'
--- lib/canonical/config/schema-lazr.conf	2010-10-25 13:16:10 +0000
+++ lib/canonical/config/schema-lazr.conf	2010-10-29 12:36:22 +0000
@@ -1918,6 +1918,14 @@
 storm_cache_size: 500
 
 
+[updatebugzillaremotecomponents]
+# The database user to run this process as.
+# datatype: string
+dbuser: updatebugzillaremotecomponents
+storm_cache: generational
+storm_cache_size: 500
+
+
 ##
 ## TODO: delete update_preview_diffs section after 10.04 rollout.
 ##

=== modified file 'lib/canonical/launchpad/doc/launchpadlib.txt'
--- lib/canonical/launchpad/doc/launchpadlib.txt	2009-10-22 13:02:12 +0000
+++ lib/canonical/launchpad/doc/launchpadlib.txt	2010-10-29 12:36:22 +0000
@@ -4,20 +4,26 @@
 if a specific user exists...
 
     >>> browser = Browser('foo.bar@xxxxxxxxxxxxx:test')
-    >>> browser.open('http://launchpad.dev:8085/')
-    >>> browser.url
-    'http://launchpad.dev:8085/'
+    >>> from canonical.testing.layers import BaseLayer
+    >>> root_url = BaseLayer.appserver_root_url()
+    >>> browser.open(root_url)
+    >>> browser.vhost
+    'http://launchpad.dev'
+    >>> browser.urlpath
+    '/'
 
-    >>> browser.open('http://launchpad.dev:8085/~stimpy')
+    >>> browser.open('%s/~stimpy' % root_url)
     Traceback (most recent call last):
     ...
     HTTPError: HTTP Error 404: Not Found
 
 ...and when he doesn't, create him.
 
-    >>> browser.open('http://launchpad.dev:8085/people/+newteam')
+    >>> browser.open('%s/people/+newteam' % root_url)
     >>> browser.getControl(name='field.name').value = 'stimpy'
     >>> browser.getControl('Display Name').value = 'Stimpson J. Cat'
     >>> browser.getControl('Create').click()
-    >>> browser.url
-    'http://launchpad.dev:8085/~stimpy'
+    >>> browser.vhost
+    'http://launchpad.dev'
+    >>> browser.urlpath
+    '/~stimpy'

=== modified file 'lib/canonical/launchpad/interfaces/_schema_circular_imports.py'
--- lib/canonical/launchpad/interfaces/_schema_circular_imports.py	2010-10-21 12:50:05 +0000
+++ lib/canonical/launchpad/interfaces/_schema_circular_imports.py	2010-10-29 12:36:22 +0000
@@ -46,7 +46,11 @@
     IHasBugs,
     )
 from lp.bugs.interfaces.bugtask import IBugTask
-from lp.bugs.interfaces.bugtracker import IBugTracker
+from lp.bugs.interfaces.bugtracker import (
+    IBugTracker,
+    IBugTrackerComponent,
+    IBugTrackerComponentGroup,
+    )
 from lp.bugs.interfaces.bugwatch import IBugWatch
 from lp.buildmaster.enums import BuildStatus
 from lp.buildmaster.interfaces.buildfarmjob import IBuildFarmJob
@@ -471,6 +475,17 @@
 
 # IBugTracker
 patch_reference_property(IBugTracker, 'owner', IPerson)
+patch_entry_return_type(
+    IBugTracker, 'getRemoteComponentGroup', IBugTrackerComponentGroup)
+patch_entry_return_type(
+    IBugTracker, 'addRemoteComponentGroup', IBugTrackerComponentGroup)
+patch_collection_return_type(
+    IBugTracker, 'getAllRemoteComponentGroups', IBugTrackerComponentGroup)
+
+## IBugTrackerComponent
+patch_reference_property(
+    IBugTrackerComponent, "distro_source_package",
+    IDistributionSourcePackage)
 
 # IPOTemplate
 patch_collection_property(IPOTemplate, 'pofiles', IPOFile)
@@ -485,7 +500,7 @@
 
 # IPerson
 patch_collection_return_type(
-        IPerson, 'getBugSubscriberPackages', IDistributionSourcePackage)
+    IPerson, 'getBugSubscriberPackages', IDistributionSourcePackage)
 
 # IProductSeries
 patch_reference_property(IProductSeries, 'product', IProduct)

=== added file 'lib/canonical/launchpad/scripts/bzremotecomponentfinder.py'
--- lib/canonical/launchpad/scripts/bzremotecomponentfinder.py	1970-01-01 00:00:00 +0000
+++ lib/canonical/launchpad/scripts/bzremotecomponentfinder.py	2010-10-29 12:36:22 +0000
@@ -0,0 +1,205 @@
+# Copyright 2009 Canonical Ltd.  This software is licensed under the
+# GNU Affero General Public License version 3 (see the file LICENSE).
+
+"""Utilities for the update-bugzilla-remote-components cronscript"""
+
+__metaclass__ = type
+__all__ = [
+    'BugzillaRemoteComponentFinder',
+    'BugzillaRemoteComponentScraper',
+    ]
+
+import re
+from urllib2 import (
+    HTTPError,
+    urlopen,
+    )
+from BeautifulSoup import BeautifulSoup
+from canonical.launchpad.scripts.logger import log as default_log
+from zope.component import getUtility
+from lp.bugs.interfaces.bugtracker import (
+    BugTrackerType,
+    IBugTrackerSet,
+    )
+from lp.bugs.model.bugtracker import (
+    BugTrackerComponent,
+    )
+from canonical.launchpad.interfaces.lpstorm import IStore
+
+
+def dictFromCSV(line):
+    items_dict = {}
+    for item in line.split(","):
+        item = item.strip()
+        item = item.replace("'", "")
+        item = item.replace("\\", "")
+        items_dict[item] = {
+            'name': item,
+            }
+    return items_dict
+
+
+class BugzillaRemoteComponentScraper:
+    """Scrapes Bugzilla query.cgi page for lists of products and components"""
+
+    re_cpts = re.compile(r'cpts\[(\d+)\] = \[(.*)\]')
+    re_vers = re.compile(r'vers\[(\d+)\] = \[(.*)\]')
+
+    def __init__(self, base_url=None):
+        self.base_url = re.sub(r'/$', '', base_url)
+        self.url = "%s/query.cgi?format=advanced" %(self.base_url)
+        self.products = {}
+
+    def getPage(self):
+        return urlopen(self.url).read()
+
+    def parsePage(self, page_text):
+        soup = BeautifulSoup(page_text)
+        if soup is None:
+            return None
+
+        # Load products into a list since Bugzilla references them
+        # by index number
+        products = []
+        for product in soup.find(
+            name='select',
+            onchange="doOnSelectProduct(2);").contents:
+            if product.string != "\n":
+                products.append({
+                    'name': product.string,
+                    'components': {},
+                    'versions': None,
+                    })
+
+        for script_text in soup.findAll(name="script"):
+            if script_text is None or script_text.string is None:
+                continue
+            for line in script_text.string.split(";"):
+                m = self.re_cpts.search(line)
+                if m:
+                    num = int(m.group(1))
+                    products[num]['components'] = dictFromCSV(m.group(2))
+
+                m = self.re_vers.search(line)
+                if m:
+                    num = int(m.group(1))
+                    products[num]['versions'] = dictFromCSV(m.group(2))
+
+        # Re-map list into dict for easier lookups
+        for product in products:
+            product_name = product['name']
+            self.products[product_name] = product
+
+        return True
+
+
+class BugzillaRemoteComponentFinder:
+    """Updates remote components for all Bugzillas registered in Launchpad"""
+
+    # Names of bug trackers we should not pull data from
+    _BLACKLIST = [
+        u"ubuntu-bugzilla",
+        u"mozilla.org",
+        ]
+
+    def __init__(self, logger=None, static_bugzilla_text=None):
+        """Instantiates object, without performing any parsing.
+
+        :param logger: A logger object such as QuietFakeLogger or FakeLogger
+        :param static_bugzilla_text: Instead of retrieving the remote
+         web page for a bug tracker, act as if this static text was
+         returned.  This is intended for testing purposes to avoid
+         needing to make remote web connections.
+        """
+        self.logger = logger
+        if logger is None:
+            self.logger = default_log
+        self.static_bugzilla_text = static_bugzilla_text
+
+    def getRemoteProductsAndComponents(self, bugtracker_name=None):
+        """"""
+        lp_bugtrackers = getUtility(IBugTrackerSet)
+        if bugtracker_name is not None:
+            lp_bugtrackers = [
+                lp_bugtrackers.getByName(bugtracker_name),
+                ]
+            if not lp_bugtrackers or len(lp_bugtrackers) != 1:
+                self.logger.warning(
+                    "Could not find specified bug tracker %s",
+                    bugtracker_name)
+        for lp_bugtracker in lp_bugtrackers:
+            if lp_bugtracker.bugtrackertype != BugTrackerType.BUGZILLA:
+                continue
+            if lp_bugtracker.name in self._BLACKLIST:
+                continue
+
+            self.logger.info("%s: %s" %(
+                lp_bugtracker.name, lp_bugtracker.baseurl))
+            bz_bugtracker = BugzillaRemoteComponentScraper(
+                base_url = lp_bugtracker.baseurl)
+
+            if self.static_bugzilla_text is not None:
+                self.logger.debug("Using static bugzilla text")
+                page_text = self.static_bugzilla_text
+
+            else:
+                try:
+                    self.logger.debug("...Fetching page")
+                    page_text = bz_bugtracker.getPage()
+                except HTTPError, error:
+                    self.logger.error("Error fetching %s: %s" % (
+                        lp_bugtracker.baseurl, error))
+                    continue
+
+            self.logger.debug("...Parsing html")
+            bz_bugtracker.parsePage(page_text)
+
+            self.logger.debug("...Storing new data to Launchpad")
+            self.storeRemoteProductsAndComponents(
+                bz_bugtracker, lp_bugtracker)
+
+    def storeRemoteProductsAndComponents(self, bz_bugtracker, lp_bugtracker):
+        components_to_add = []
+        for product in bz_bugtracker.products.itervalues():
+            # Look up the component group id from Launchpad for the product
+            # if it already exists.  Otherwise, add it.
+            lp_component_group = lp_bugtracker.getRemoteComponentGroup(
+                product['name'])
+            if lp_component_group is None:
+                lp_component_group = lp_bugtracker.addRemoteComponentGroup(
+                    product['name'])
+                if lp_component_group is None:
+                    self.logger.warning("Failed to add new component group")
+                    continue
+            else:
+                for component in lp_component_group.components:
+                    if (component.name in product['components'] or
+                        component.is_visible == False or
+                        component.is_custom == True):
+                        # We already know something about this component,
+                        # or a user has configured it, so ignore it
+                        del product['components'][component.name]
+                    else:
+                        # Component is now missing from Bugzilla,
+                        # so drop it here too
+                        component.remove()
+
+            # The remaining components in the collection will need to be
+            # added to launchpad.  Record them for now.
+            for component in product['components'].values():
+                components_to_add.append(
+                    "('%s', %d, 'True', 'False')" %(
+                        component['name'], lp_component_group.id))
+
+        if len(components_to_add)>0:
+            sqltext = """
+            INSERT INTO BugTrackerComponent
+            (name, component_group, is_visible, is_custom)
+            VALUES %s""" % ",\n ".join(components_to_add)
+
+            self.logger.debug("...Inserting components into database")
+            store = IStore(BugTrackerComponent)
+            store.execute(sqltext)
+            store.commit()
+            store.flush()
+            self.logger.debug("...Done")

=== modified file 'lib/canonical/launchpad/scripts/updateremoteproduct.py'
--- lib/canonical/launchpad/scripts/updateremoteproduct.py	2010-08-20 20:31:18 +0000
+++ lib/canonical/launchpad/scripts/updateremoteproduct.py	2010-10-29 12:36:22 +0000
@@ -1,7 +1,12 @@
 # Copyright 2009 Canonical Ltd.  This software is licensed under the
 # GNU Affero General Public License version 3 (see the file LICENSE).
 
-"""Update Product.remote_product using BugWatch information."""
+"""Update Product.remote_product using BugWatch information.
+
+This script updates the Launchpad Product's remote_product string value
+from the upstream bug tracker.  It only updates multi-product bug
+trackers, not single-product bug trackers or email-only bug trackers.
+"""
 
 __metaclass__ = type
 __all__ = ['RemoteProductUpdater']

=== modified file 'lib/canonical/launchpad/security.py'
--- lib/canonical/launchpad/security.py	2010-10-21 01:42:14 +0000
+++ lib/canonical/launchpad/security.py	2010-10-29 12:36:22 +0000
@@ -67,6 +67,7 @@
     user_has_special_branch_access,
     )
 from lp.code.interfaces.branchmergeproposal import IBranchMergeProposal
+from lp.code.interfaces.branchmergequeue import IBranchMergeQueue
 from lp.code.interfaces.codeimport import ICodeImport
 from lp.code.interfaces.codeimportjob import (
     ICodeImportJobSet,
@@ -1162,6 +1163,18 @@
         return user.in_bazaar_experts or user.in_buildd_admin
 
 
+class EditBranchMergeQueue(AuthorizationBase):
+    """Control who can edit a BranchMergeQueue.
+
+    Access is granted only to the owner of the queue.
+    """
+    permission = 'launchpad.Edit'
+    usedfor = IBranchMergeQueue
+
+    def checkAuthenticated(self, user):
+        return user.isOwner(self.obj)
+
+
 class AdminDistributionTranslations(AuthorizationBase):
     """Class for deciding who can administer distribution translations.
 

=== modified file 'lib/canonical/launchpad/testing/browser.py'
--- lib/canonical/launchpad/testing/browser.py	2010-10-24 21:00:11 +0000
+++ lib/canonical/launchpad/testing/browser.py	2010-10-29 12:36:22 +0000
@@ -14,6 +14,7 @@
 latter prevents open socket leaks even when the doctest doesn't explicitly
 close or delete the browser instance.
 """
+from lazr.uri._uri import URI
 
 __metaclass__ = type
 __all__ = [
@@ -121,6 +122,21 @@
             raise
         self._stop_timer()
 
+    @property
+    def vhost(self):
+        uri = URI(self.url)
+        return '%s://%s' % (uri.scheme, uri.host)
+
+    @property
+    def rooturl(self):
+        uri = URI(self.url)
+        return '%s://%s:%s' % (uri.scheme, uri.host, uri.port)
+
+    @property
+    def urlpath(self):
+        uri = URI(self.url)
+        return uri.path
+
 
 def setUp(test):
     """Set up appserver tests."""

=== modified file 'lib/canonical/launchpad/webapp/batching.py'
--- lib/canonical/launchpad/webapp/batching.py	2010-10-03 15:30:06 +0000
+++ lib/canonical/launchpad/webapp/batching.py	2010-10-29 12:36:22 +0000
@@ -32,6 +32,24 @@
         return self.context.count()
 
 
+class BoundReferenceSetAdapter:
+    """Adaptor for `BoundReferenceSet` implementations in Storm."""
+
+    implements(IFiniteSequence)
+
+    def __init__(self, context):
+        self.context = context
+
+    def __getitem__(self, ix):
+        return self.context.find()[ix]
+
+    def __iter__(self):
+        return iter(self.context)
+
+    def __len__(self):
+        return self.context.count()
+
+
 class UpperBatchNavigationView(LaunchpadView):
     """Only render navigation links if there is a batch."""
 

=== modified file 'lib/canonical/launchpad/webapp/configure.zcml'
--- lib/canonical/launchpad/webapp/configure.zcml	2010-10-03 15:30:06 +0000
+++ lib/canonical/launchpad/webapp/configure.zcml	2010-10-29 12:36:22 +0000
@@ -67,6 +67,14 @@
         factory='.batching.FiniteSequenceAdapter'
         for='storm.zope.interfaces.ISQLObjectResultSet' />
 
+    <adapter
+        factory='.batching.BoundReferenceSetAdapter'
+        for='storm.references.BoundReferenceSet' />
+
+    <adapter
+        factory='.batching.BoundReferenceSetAdapter'
+        for='storm.references.BoundIndirectReferenceSet' />
+
     <!-- links -->
     <class class="canonical.launchpad.webapp.menu.LinkData">
         <allow interface="canonical.launchpad.webapp.interfaces.ILinkData" />

=== modified file 'lib/canonical/launchpad/webapp/tests/cookie-authentication.txt'
--- lib/canonical/launchpad/webapp/tests/cookie-authentication.txt	2010-08-16 11:36:08 +0000
+++ lib/canonical/launchpad/webapp/tests/cookie-authentication.txt	2010-10-29 12:36:22 +0000
@@ -2,16 +2,21 @@
 on http instead of https, it cannot read the secure cookie on https,
 so it cannot tell that it will end up overwriting the existing cookie.
 
-    >>> browser.open('http://feeds.launchpad.dev:8085/announcements.atom')
-    >>> browser.url
-    'http://feeds.launchpad.dev:8085/announcements.atom'
+    >>> from canonical.testing.layers import BaseLayer
+    >>> feeds_root_url = BaseLayer.appserver_root_url('feeds')
+    >>> browser.open('%s/announcements.atom' % feeds_root_url)
+    >>> browser.vhost
+    'http://feeds.launchpad.dev'
+    >>> browser.urlpath
+    '/announcements.atom'
     >>> len(browser.cookies)
     0
 
 Our cookies need to have their domain attribute set to ensure that they
 are sent to other vhosts in the same domain.
 
-    >>> browser.open('http://blueprints.launchpad.dev:8085/+login')
+    >>> blueprints_root_url = BaseLayer.appserver_root_url('blueprints')
+    >>> browser.open('%s/+login' % blueprints_root_url)
 
     # On a browser with JS support, this page would've been automatically
     # submitted (thanks to the onload handler), but testbrowser doesn't support
@@ -28,7 +33,7 @@
 
     # Open a page again so that we see the cookie for a launchpad.dev request
     # and not a testopenid.dev request (as above).
-    >>> browser.open('http://blueprints.launchpad.dev:8085')
+    >>> browser.open(blueprints_root_url)
     >>> len(browser.cookies)
     1
     >>> browser.cookies.keys()
@@ -39,9 +44,12 @@
 
 If we visit another vhost in the domain, we remain logged in.
 
-    >>> browser.open('http://launchpad.dev:8085/')
-    >>> browser.url
-    'http://launchpad.dev:8085/'
+    >>> root_url = BaseLayer.appserver_root_url()
+    >>> browser.open(root_url)
+    >>> browser.vhost
+    'http://launchpad.dev'
+    >>> browser.urlpath
+    '/'
     >>> print extract_text(find_tag_by_id(browser.contents, 'logincontrol'))
     name16...
     >>> browser.cookies.getinfo(session_cookie_name)['domain']
@@ -49,9 +57,11 @@
 
 Even if the browser passes in a cookie, the feeds vhost should not set one.
 
-    >>> browser.open('http://feeds.launchpad.dev:8085/announcements.atom')
-    >>> browser.url
-    'http://feeds.launchpad.dev:8085/announcements.atom'
+    >>> browser.open('%s/announcements.atom' % feeds_root_url)
+    >>> browser.vhost
+    'http://feeds.launchpad.dev'
+    >>> browser.urlpath
+    '/announcements.atom'
     >>> print browser.headers.get('Set-Cookie')
     None
 

=== modified file 'lib/canonical/launchpad/webapp/tests/login.txt'
--- lib/canonical/launchpad/webapp/tests/login.txt	2010-02-25 10:50:31 +0000
+++ lib/canonical/launchpad/webapp/tests/login.txt	2010-10-29 12:36:22 +0000
@@ -8,10 +8,12 @@
 
     # Set handleErrors to True so that the Unauthorized exception is handled
     # by the publisher and we get redirected to the +login page.
+    >>> from canonical.testing.layers import BaseLayer
+    >>> root_url = BaseLayer.appserver_root_url()
     >>> browser = Browser()
     >>> browser.handleErrors = True
     >>> browser.open(
-    ...     'http://launchpad.dev:8085/people/?name=foo&searchfor=all')
+    ...     '%s/people/?name=foo&searchfor=all' % root_url)
     >>> browser.getLink('Log in / Register').click()
 
     # On a browser with JS support, this page would've been automatically
@@ -32,16 +34,17 @@
 Once authenticated, we're redirected back to the page where we started, with
 the query args preserved.
 
-    >>> url = browser.url
-    >>> print url
-    http://launchpad.dev:8085/people?...
+    >>> browser.vhost
+    'http://launchpad.dev'
+    >>> browser.urlpath
+    '/people'
     >>> import re
-    >>> print sorted(re.sub('.*\?', '', url).split('&'))
+    >>> print sorted(re.sub('.*\?', '', browser.url).split('&'))
     ['name=foo', 'searchfor=all']
 
 If we load the +login page while already logged in, it will say we're already
 logged in and ask us to log out if we're somebody else.
 
-    >>> browser.open('http://launchpad.dev:8085/+login')
+    >>> browser.open('%s/+login' % root_url)
     >>> print extract_text(find_main_content(browser.contents))
     You are already logged in...

=== modified file 'lib/canonical/launchpad/webapp/tests/no-anonymous-session-cookies.txt'
--- lib/canonical/launchpad/webapp/tests/no-anonymous-session-cookies.txt	2010-08-13 10:06:42 +0000
+++ lib/canonical/launchpad/webapp/tests/no-anonymous-session-cookies.txt	2010-10-29 12:36:22 +0000
@@ -5,7 +5,9 @@
 
 When we go to launchpad as an anonymous user, the browser has no cookies.
 
-    >>> browser.open('http://launchpad.dev:8085')
+    >>> from canonical.testing.layers import BaseLayer
+    >>> root_url = BaseLayer.appserver_root_url()
+    >>> browser.open(root_url)
     >>> len(browser.cookies)
     0
 
@@ -16,7 +18,7 @@
     >>> now = datetime.datetime.now(pytz.UTC).replace(microsecond=0)
     >>> year_from_now = now + datetime.timedelta(days=365)
     >>> year_plus_from_now = year_from_now + datetime.timedelta(minutes=1)
-    >>> browser.open('http://launchpad.dev:8085/+login')
+    >>> browser.open('%s/+login' % root_url)
 
     # On a browser with JS support, this page would've been automatically
     # submitted (thanks to the onload handler), but testbrowser doesn't support
@@ -33,7 +35,7 @@
 
     # Open a page again so that we see the cookie for a launchpad.dev request
     # and not a testopenid.dev request (as above).
-    >>> browser.open('http://launchpad.dev:8085')
+    >>> browser.open(root_url)
 
     >>> len(browser.cookies)
     1
@@ -61,7 +63,7 @@
 After ensuring the browser has not left the launchpad.dev domain, the
 single cookie is shown to have the ten minute expiration.
 
-    >>> browser.open('http://launchpad.dev:8085')
+    >>> browser.open(root_url)
     >>> len(browser.cookies)
     1
     >>> expires = browser.cookies.getinfo('launchpad_tests')['expires']

=== modified file 'lib/canonical/launchpad/webapp/tests/test_login.py'
--- lib/canonical/launchpad/webapp/tests/test_login.py	2010-10-26 15:47:24 +0000
+++ lib/canonical/launchpad/webapp/tests/test_login.py	2010-10-29 12:36:22 +0000
@@ -547,7 +547,7 @@
 
     def test_replay_attacks_do_not_succeed(self):
         browser = Browser(mech_browser=MyMechanizeBrowser())
-        browser.open('http://launchpad.dev:8085/+login')
+        browser.open('%s/+login' % self.layer.appserver_root_url())
         # On a JS-enabled browser this page would've been auto-submitted
         # (thanks to the onload handler), but here we have to do it manually.
         self.assertIn('body onload', browser.contents)
@@ -648,20 +648,21 @@
 
     def test_realm_for_mainsite(self):
         browser = Browser()
-        browser.open('http://launchpad.dev:8085/+login')
+        browser.open('%s/+login' % self.layer.appserver_root_url())
         # At this point browser.contents contains a hidden form which would've
         # been auto-submitted if we had in-browser JS support, but since we
         # don't we can easily inspect what's in the form.
-        self.assertEquals('http://launchpad.dev:8085/',
+        self.assertEquals('%s/' % browser.rooturl,
                           browser.getControl(name='openid.realm').value)
 
     def test_realm_for_vhosts(self):
         browser = Browser()
-        browser.open('http://bugs.launchpad.dev:8085/+login')
+        browser.open('%s/+login' % self.layer.appserver_root_url('bugs'))
         # At this point browser.contents contains a hidden form which would've
         # been auto-submitted if we had in-browser JS support, but since we
         # don't we can easily inspect what's in the form.
-        self.assertEquals('http://launchpad.dev:8085/',
+        self.assertEquals('%s'
+                          % self.layer.appserver_root_url(ensureSlash=True),
                           browser.getControl(name='openid.realm').value)
 
 

=== modified file 'lib/canonical/testing/__init__.py'
--- lib/canonical/testing/__init__.py	2010-05-06 15:36:19 +0000
+++ lib/canonical/testing/__init__.py	2010-10-29 12:36:22 +0000
@@ -64,6 +64,7 @@
     Logging(Runner()).global_setup()
 
 
+
 # This import registers the 'doctest' Unicode codec.
 import canonical.testing.doctestcodec
 

=== modified file 'lib/canonical/testing/layers.py'
--- lib/canonical/testing/layers.py	2010-10-27 04:23:52 +0000
+++ lib/canonical/testing/layers.py	2010-10-29 12:36:22 +0000
@@ -274,6 +274,9 @@
     @classmethod
     @profiled
     def setUp(cls):
+        # Set the default appserver config instance name.
+        # May be changed as required eg when running parallel tests.
+        cls.appserver_config_name = 'testrunner-appserver'
         BaseLayer.isSetUp = True
         cls.fixture = Fixture()
         cls.fixture.setUp()
@@ -511,6 +514,17 @@
         finally:
             del frame # As per no-leak stack inspection in Python reference.
 
+    @classmethod
+    def appserver_config(cls):
+        """Return a config suitable for AppServer tests."""
+        return CanonicalConfig(cls.appserver_config_name)
+
+    @classmethod
+    def appserver_root_url(cls, facet='mainsite', ensureSlash=False):
+        """Return the correct app server root url for the given facet."""
+        return cls.appserver_config().appserver_root_url(
+                facet, ensureSlash)
+
 
 class MemcachedLayer(BaseLayer):
     """Provides tests access to a memcached.
@@ -1946,15 +1960,10 @@
 
         # Patch the config to provide the port number and not use https.
         sites = (
-            ('vhost.mainsite', 'rooturl: http://launchpad.dev:8085/'),
-            ('vhost.answers', 'rooturl: http://answers.launchpad.dev:8085/'),
-            ('vhost.blueprints',
-                'rooturl: http://blueprints.launchpad.dev:8085/'),
-            ('vhost.bugs', 'rooturl: http://bugs.launchpad.dev:8085/'),
-            ('vhost.code', 'rooturl: http://code.launchpad.dev:8085/'),
-            ('vhost.testopenid', 'rooturl: http://testopenid.dev:8085/'),
-            ('vhost.translations',
-                'rooturl: http://translations.launchpad.dev:8085/'))
+            (('vhost.%s' % sitename,
+            'rooturl: %s/' % cls.appserver_root_url(sitename))
+            for sitename in ['mainsite', 'answers', 'blueprints', 'bugs',
+                            'code', 'testopenid', 'translations']))
         for site in sites:
             config.push('windmillsettings', "\n[%s]\n%s\n" % site)
         allvhosts.reload()
@@ -2025,7 +2034,7 @@
         # driver from out here.
         config_text = dedent("""\
             START_FIREFOX = True
-            TEST_URL = '%s'
+            TEST_URL = '%s/'
             CONSOLE_LOG_LEVEL = %d
             """ % (cls.base_url, logging.NOTSET))
         cls.config_file = tempfile.NamedTemporaryFile(suffix='.py')

=== modified file 'lib/lp/bugs/browser/bugtracker.py'
--- lib/lp/bugs/browser/bugtracker.py	2010-10-03 15:30:06 +0000
+++ lib/lp/bugs/browser/bugtracker.py	2010-10-29 12:36:22 +0000
@@ -8,6 +8,7 @@
 __all__ = [
     'BugTrackerAddView',
     'BugTrackerBreadcrumb',
+    'BugTrackerComponentGroupNavigation',
     'BugTrackerEditView',
     'BugTrackerNavigation',
     'BugTrackerNavigationMenu',
@@ -27,7 +28,6 @@
 from zope.interface import implements
 from zope.schema import Choice
 from zope.schema.vocabulary import SimpleVocabulary
-from zope.security.interfaces import Unauthorized
 
 from canonical.database.sqlbase import flush_database_updates
 from canonical.launchpad import _
@@ -51,6 +51,7 @@
     Link,
     Navigation,
     redirection,
+    stepthrough,
     structured,
     )
 from canonical.launchpad.webapp.authorization import check_permission
@@ -71,6 +72,7 @@
     IBugTracker,
     IBugTrackerSet,
     IRemoteBug,
+    IBugTrackerComponentGroup,
     )
 from lp.services.propertycache import cachedproperty
 
@@ -444,6 +446,18 @@
             # else list the watching bugs
             return RemoteBug(self.context, remotebug, bugs)
 
+    @stepthrough("+components")
+    def component_groups(self, name):
+        return self.context.getRemoteComponentGroup(name)
+
+
+class BugTrackerComponentGroupNavigation(Navigation):
+
+    usedfor = IBugTrackerComponentGroup
+
+    def traverse(self, name):
+        return self.context.getComponent(name)
+
 
 class BugTrackerSetBreadcrumb(Breadcrumb):
     """Builds a breadcrumb for the `IBugTrackerSet`."""

=== modified file 'lib/lp/bugs/browser/configure.zcml'
--- lib/lp/bugs/browser/configure.zcml	2010-10-20 14:58:01 +0000
+++ lib/lp/bugs/browser/configure.zcml	2010-10-29 12:36:22 +0000
@@ -791,7 +791,8 @@
             module="lp.bugs.browser.bugtracker"
             classes="
                 BugTrackerNavigation
-                BugTrackerSetNavigation"/>
+                BugTrackerSetNavigation
+                BugTrackerComponentGroupNavigation"/>
         <browser:defaultView
             for="lp.bugs.interfaces.bugtracker.IBugTracker"
             name="+index"/>
@@ -800,6 +801,16 @@
             path_expression="string:${name}"
             parent_utility="lp.bugs.interfaces.bugtracker.IBugTrackerSet"
             rootsite="bugs"/>
+        <browser:url
+            for="lp.bugs.interfaces.bugtracker.IBugTrackerComponentGroup"
+            path_expression="string:+components/${name}"
+            attribute_to_parent="bug_tracker"
+            rootsite="bugs"/>
+        <browser:url
+            for="lp.bugs.interfaces.bugtracker.IBugTrackerComponent"
+            path_expression="name"
+            attribute_to_parent="component_group"
+            rootsite="bugs"/>
         <browser:pages
             for="lp.bugs.interfaces.bugtracker.IBugTracker"
             class="lp.bugs.browser.bugtracker.BugTrackerView"

=== modified file 'lib/lp/bugs/configure.zcml'
--- lib/lp/bugs/configure.zcml	2010-10-25 13:02:15 +0000
+++ lib/lp/bugs/configure.zcml	2010-10-29 12:36:22 +0000
@@ -369,7 +369,6 @@
                     baseurl
                     bugtrackertype
                     componentForDistroSourcePackage
-                    component_groups
                     contactdetails
                     getAllRemoteComponentGroups
                     getBugFilingAndSearchLinks
@@ -395,10 +394,10 @@
             <require
                 permission="launchpad.Edit"
                 attributes="
+                    addRemoteComponentGroup
                     destroySelf
                     ensurePersonForSelf
                     linkPersonToSelf
-                    addRemoteComponentGroup
                     "
                 set_attributes="
                     aliases
@@ -477,12 +476,15 @@
                     name
                     is_visible
                     is_custom
+                    distro_source_package
+                    component_group
                     "/>
             <require
                 permission="launchpad.AnyPerson"
                 set_attributes="
                     is_visible
                     is_custom
+                    distro_source_package
                     "/>
             <implements
                 interface="lp.bugs.interfaces.bugtracker.IBugTrackerComponent"/>

=== modified file 'lib/lp/bugs/interfaces/bugtracker.py'
--- lib/lp/bugs/interfaces/bugtracker.py	2010-09-29 21:18:47 +0000
+++ lib/lp/bugs/interfaces/bugtracker.py	2010-10-29 12:36:22 +0000
@@ -34,6 +34,7 @@
     export_write_operation,
     exported,
     operation_parameters,
+    operation_returns_collection_of,
     operation_returns_entry,
     rename_parameters_as,
     REQUEST_USER,
@@ -59,6 +60,7 @@
 from zope.schema.interfaces import IObject
 
 from canonical.launchpad import _
+from canonical.launchpad.components.apihelpers import patch_reference_property
 from canonical.launchpad.validators import LaunchpadValidationError
 from canonical.launchpad.validators.name import name_validator
 from lp.services.fields import (
@@ -359,16 +361,20 @@
     @operation_parameters(
         component_group_name=TextLine(
             title=u"The name of the remote component group", required=True))
+    @operation_returns_entry(Interface)
     @export_write_operation()
     def addRemoteComponentGroup(component_group_name):
         """Adds a new component group to the bug tracker"""
 
+    @export_read_operation()
+    @operation_returns_collection_of(Interface)
     def getAllRemoteComponentGroups():
         """Return collection of all component groups for this bug tracker"""
 
     @operation_parameters(
         component_group_name=TextLine(
             title=u"The name of the remote component group", required=True))
+    @operation_returns_entry(Interface)
     @export_read_operation()
     def getRemoteComponentGroup(component_group_name):
         """Retrieve a given component group registered with the bug tracker.
@@ -498,11 +504,11 @@
     export_as_webservice_entry()
 
     id = Int(title=_('ID'), required=True, readonly=True)
-    is_visible = Bool(
+    is_visible = exported(Bool(
         title=_('Is Visible?'),
         description=_("Should the component be shown in "
                       "the Launchpad web interface?"),
-        readonly=True)
+        ))
     is_custom = Bool(
         title=_('Is Custom?'),
         description=_("Was the component added locally in "
@@ -513,17 +519,19 @@
     name = exported(
         Text(
             title=_('Name'),
-            constraint=name_validator,
-            description=_('The name of a software component'
-                          'in a remote bug tracker')))
-
-# XXX: Bug 644794 will implement this link
-#    distro_source_package = exported(
-#        Reference(
-#            title=_('Distribution Source Package'),
-#            schema=Interface,
-#            description=_('The distribution source package for this '
-#                          'component, if one has been defined.')))
+            description=_("The name of a software component "
+                          "as shown in Launchpad.")))
+
+    distro_source_package = exported(
+        Reference(
+            Interface,
+            title=_("Distribution Source Package"),
+            description=_("The distribution source package object that "
+                          "should be linked to this component."),
+            required=False))
+
+    component_group = exported(
+        Reference(title=_('Component Group'), schema=Interface))
 
 
 class IBugTrackerComponentGroup(Interface):
@@ -538,10 +546,11 @@
     name = exported(
         Text(
             title=_('Name'),
-            constraint=name_validator,
             description=_('The name of the bug tracker product.')))
     components = exported(
-        Reference(title=_('Components'), schema=IBugTrackerComponent))
+        CollectionField(
+            title=_('Components.'),
+            value_type=Reference(schema=IBugTrackerComponent)))
     bug_tracker = exported(
         Reference(title=_('BugTracker'), schema=IBugTracker))
 
@@ -554,6 +563,12 @@
         """Adds a component to be tracked as part of this component group"""
 
 
+# Patch in a mutual reference between IBugTrackerComponent and
+# IBugTrackerComponentGroup.
+patch_reference_property(
+    IBugTrackerComponent, "component_group", IBugTrackerComponentGroup)
+
+
 class IRemoteBug(Interface):
     """A remote bug for a given bug tracker."""
 

=== modified file 'lib/lp/bugs/model/bugtracker.py'
--- lib/lp/bugs/model/bugtracker.py	2010-10-06 17:09:42 +0000
+++ lib/lp/bugs/model/bugtracker.py	2010-10-29 12:36:22 +0000
@@ -175,6 +175,121 @@
         return base_uri.host + base_uri.path
 
 
+class BugTrackerComponent(Storm):
+    """The software component in the remote bug tracker.
+
+    Most bug trackers organize bug reports by the software 'component'
+    they affect.  This class provides a mapping of this upstream component
+    to the corresponding source package in the distro.
+    """
+    implements(IBugTrackerComponent)
+    __storm_table__ = 'BugTrackerComponent'
+
+    id = Int(primary=True)
+    name = Unicode(allow_none=False)
+
+    component_group_id = Int('component_group')
+    component_group = Reference(
+        component_group_id,
+        'BugTrackerComponentGroup.id')
+
+    is_visible = Bool(allow_none=False)
+    is_custom = Bool(allow_none=False)
+
+    distribution_id = Int('distribution')
+    distribution = Reference(
+        distribution_id,
+        'Distribution.id')
+
+    source_package_name_id = Int('source_package_name')
+    source_package_name = Reference(
+        source_package_name_id,
+        'SourcePackageName.id')
+
+    def _get_distro_source_package(self):
+        """Retrieves the corresponding source package"""
+        if self.distribution is None or self.source_package_name is None:
+            return None
+        return self.distribution.getSourcePackage(
+            self.source_package_name)
+
+    def _set_distro_source_package(self, dsp):
+        """Links this component to its corresponding source package"""
+        if dsp is None:
+            self.distribution = None
+            self.source_package_name = None
+        else:
+            self.distribution = dsp.distribution
+            self.source_package_name = dsp.sourcepackagename
+
+    distro_source_package = property(
+        _get_distro_source_package,
+        _set_distro_source_package,
+        None,
+        """The distribution's source package for this component""")
+
+
+class BugTrackerComponentGroup(Storm):
+    """A collection of components in a remote bug tracker.
+
+    Some bug trackers organize sets of components into higher level
+    groups, such as Bugzilla's 'product'.
+    """
+    implements(IBugTrackerComponentGroup)
+    __storm_table__ = 'BugTrackerComponentGroup'
+
+    id = Int(primary=True)
+    name = Unicode(allow_none=False)
+    bug_tracker_id = Int('bug_tracker')
+    bug_tracker = Reference(bug_tracker_id, 'BugTracker.id')
+    components = ReferenceSet(
+        id,
+        BugTrackerComponent.component_group_id,
+        order_by=BugTrackerComponent.name)
+
+    def addComponent(self, component_name):
+        """Adds a component that is synced from a remote bug tracker"""
+
+        component = BugTrackerComponent()
+        component.name = component_name
+        component.component_group = self
+
+        store = IStore(BugTrackerComponent)
+        store.add(component)
+        store.flush()
+
+        return component
+
+    def getComponent(self, component_name):
+        """Retrieves a component by the given name.
+
+        None is returned if there is no component by that name in the
+        group.
+        """
+
+        if component_name is None:
+            return None
+        else:
+            return Store.of(self).find(
+                BugTrackerComponent,
+                (BugTrackerComponent.name == component_name)).one()
+
+    def addCustomComponent(self, component_name):
+        """Adds a component locally that isn't synced from a remote tracker
+        """
+
+        component = BugTrackerComponent()
+        component.name = component_name
+        component.component_group = self
+        component.is_custom = True
+
+        store = IStore(BugTrackerComponent)
+        store.add(component)
+        store.flush()
+
+        return component
+
+
 class BugTracker(SQLBase):
     """A class to access the BugTracker table in the database.
 
@@ -716,86 +831,3 @@
     def queryByBugTracker(self, bugtracker):
         """See IBugTrackerSet."""
         return self.table.selectBy(bugtracker=bugtracker.id)
-
-
-class BugTrackerComponent(Storm):
-    """The software component in the remote bug tracker.
-
-    Most bug trackers organize bug reports by the software 'component'
-    they affect.  This class provides a mapping of this upstream component
-    to the corresponding source package in the distro.
-    """
-    implements(IBugTrackerComponent)
-    __storm_table__ = 'BugTrackerComponent'
-
-    id = Int(primary=True)
-    name = Unicode(allow_none=False)
-
-    component_group_id = Int('component_group')
-    component_group = Reference(
-        component_group_id,
-        'BugTrackerComponentGroup.id')
-
-    is_visible = Bool(allow_none=False)
-    is_custom = Bool(allow_none=False)
-
-
-class BugTrackerComponentGroup(Storm):
-    """A collection of components in a remote bug tracker.
-
-    Some bug trackers organize sets of components into higher level groups,
-    such as Bugzilla's 'product'.
-    """
-    implements(IBugTrackerComponentGroup)
-    __storm_table__ = 'BugTrackerComponentGroup'
-
-    id = Int(primary=True)
-    name = Unicode(allow_none=False)
-    bug_tracker_id = Int('bug_tracker')
-    bug_tracker = Reference(bug_tracker_id, 'BugTracker.id')
-    components = ReferenceSet(
-        id,
-        BugTrackerComponent.component_group_id,
-        order_by=BugTrackerComponent.name)
-
-    def addComponent(self, component_name):
-        """Adds a component that is synced from a remote bug tracker"""
-
-        component = BugTrackerComponent()
-        component.name = component_name
-        component.component_group = self
-
-        store = IStore(BugTrackerComponent)
-        store.add(component)
-        store.flush()
-
-        return component
-
-    def getComponent(self, component_name):
-        """Retrieves a component by the given name.
-
-        None is returned if there is no component by that name in the
-        group.
-        """
-
-        if component_name is None:
-            return None
-        else:
-            return Store.of(self).find(
-                BugTrackerComponent,
-                (BugTrackerComponent.name == component_name)).one()
-
-    def addCustomComponent(self, component_name):
-        """Adds a component locally that isn't synced from a remote tracker
-        """
-
-        component = BugTrackerComponent()
-        component.name = component_name
-        component.component_group = self
-        component.is_custom = True
-
-        store = IStore(BugTrackerComponent)
-        store.add(component)
-        store.flush()
-
-        return component

=== modified file 'lib/lp/bugs/tests/test_bugtracker_components.py'
--- lib/lp/bugs/tests/test_bugtracker_components.py	2010-09-28 21:27:22 +0000
+++ lib/lp/bugs/tests/test_bugtracker_components.py	2010-10-29 12:36:22 +0000
@@ -8,10 +8,18 @@
 __all__ = []
 
 import unittest
+import transaction
 
 from canonical.launchpad.ftests import login_person
-from canonical.testing import DatabaseFunctionalLayer
-from lp.testing import TestCaseWithFactory
+from canonical.testing import (
+    AppServerLayer,
+    DatabaseFunctionalLayer,
+    )
+from lp.testing import (
+    TestCaseWithFactory,
+    ws_object,
+    )
+
 
 class TestBugTrackerComponent(TestCaseWithFactory):
 
@@ -33,7 +41,7 @@
         """Verify a component can be created"""
         component = self.factory.makeBugTrackerComponent(
             u'example', self.comp_group)
-        self.assertTrue(component is not None)
+        self.assertIsNot(None, component)
         self.assertEqual(component.name, u'example')
 
     def test_set_visibility(self):
@@ -62,7 +70,7 @@
         the omissions."""
         custom_component = self.factory.makeBugTrackerComponent(
             u'example', self.comp_group, custom=True)
-        self.assertTrue(custom_component != None)
+        self.assertIsNot(None, custom_component)
         self.assertEqual(custom_component.is_custom, True)
 
     def test_multiple_component_creation(self):
@@ -74,9 +82,20 @@
         comp_c = self.factory.makeBugTrackerComponent(
             u'example-c', self.comp_group, True)
 
-        self.assertTrue(comp_a is not None)
-        self.assertTrue(comp_b is not None)
-        self.assertTrue(comp_c is not None)
+        self.assertIsNot(None, comp_a)
+        self.assertIsNot(None, comp_b)
+        self.assertIsNot(None, comp_c)
+
+    def test_link_distro_source_package(self):
+        """Check that a link can be set to a distro source package"""
+        component = self.factory.makeBugTrackerComponent(
+            u'example', self.comp_group)
+        package = self.factory.makeDistributionSourcePackage()
+        self.assertIs(None, component.distro_source_package)
+
+        # Set the source package on the component
+        component.distro_source_package = package
+        self.assertIsNot(None, component.distro_source_package)
 
 
 class TestBugTrackerWithComponents(TestCaseWithFactory):
@@ -169,6 +188,111 @@
         self.assertEqual(comp.name, u'example-b')
 
 
+class TestWebservice(TestCaseWithFactory):
+
+    layer = AppServerLayer
+
+    def setUp(self):
+        super(TestWebservice, self).setUp()
+
+        regular_user = self.factory.makePerson()
+        login_person(regular_user)
+
+        self.bug_tracker = self.factory.makeBugTracker()
+        self.launchpad = self.factory.makeLaunchpadService()
+
+    def test_get_bug_tracker(self):
+        """Check that bug tracker can be retrieved"""
+        bug_tracker = ws_object(self.launchpad, self.bug_tracker)
+        self.assertIsNot(None, bug_tracker)
+
+    def test_bug_tracker_with_no_component_groups(self):
+        """Initially, the bug tracker has no component groups"""
+        bug_tracker = ws_object(self.launchpad, self.bug_tracker)
+        comp_groups = bug_tracker.getAllRemoteComponentGroups()
+        self.assertEqual(0, len(list(comp_groups)))
+
+    def test_retrieve_component_group_from_bug_tracker(self):
+        """Looks up specific component group in bug tracker"""
+        self.bug_tracker.addRemoteComponentGroup(u'alpha')
+
+        bug_tracker = ws_object(self.launchpad, self.bug_tracker)
+        comp_group = bug_tracker.getRemoteComponentGroup(
+            component_group_name=u'alpha')
+        self.assertIsNot(None, comp_group)
+
+    def test_list_component_groups_for_bug_tracker(self):
+        """Retrieve the component groups for a bug tracker"""
+        self.bug_tracker.addRemoteComponentGroup(u'alpha')
+        self.bug_tracker.addRemoteComponentGroup(u'beta')
+
+        bug_tracker = ws_object(self.launchpad, self.bug_tracker)
+        comp_groups = bug_tracker.getAllRemoteComponentGroups()
+        self.assertEqual(2, len(list(comp_groups)))
+
+    def test_list_components_for_component_group(self):
+        """Retrieve the components for a given group"""
+        db_comp_group_alpha = self.bug_tracker.addRemoteComponentGroup(
+            u'alpha')
+        db_comp_group_alpha.addComponent(u'1')
+        db_comp_group_alpha.addComponent(u'2')
+        transaction.commit()
+
+        comp_group = ws_object(self.launchpad, db_comp_group_alpha)
+        self.assertEqual(2, len(comp_group.components))
+
+    def test_add_component(self):
+        """Add a custom (local) component to the component group"""
+        db_comp_group = self.bug_tracker.addRemoteComponentGroup(
+            u'alpha')
+        comp_group = ws_object(self.launchpad, db_comp_group)
+        comp_group.addComponent(component_name=u'c')
+        self.assertEqual(1, len(comp_group.components))
+
+    def test_remove_component(self):
+        """Make a component not visible in the UI"""
+        db_comp = self.factory.makeBugTrackerComponent()
+        transaction.commit()
+
+        comp = ws_object(self.launchpad, db_comp)
+        self.assertTrue(comp.is_visible)
+        comp.is_visible = False
+        self.assertFalse(comp.is_visible)
+
+    def test_get_linked_source_package(self):
+        """Already linked source packages can be seen from the component"""
+        db_src_pkg = self.factory.makeDistributionSourcePackage()
+        db_comp = self.factory.makeBugTrackerComponent()
+        db_comp.distro_source_package = db_src_pkg
+        transaction.commit()
+
+        comp = ws_object(self.launchpad, db_comp)
+        self.assertIsNot(None, comp.distro_source_package)
+
+    def test_link_source_package(self):
+        """Link a component to a given source package"""
+        db_src_pkg = self.factory.makeDistributionSourcePackage()
+        db_comp = self.factory.makeBugTrackerComponent()
+        transaction.commit()
+
+        comp = ws_object(self.launchpad, db_comp)
+        src_pkg = ws_object(self.launchpad, db_src_pkg)
+        self.assertIs(None, comp.distro_source_package)
+        comp.distro_source_package = src_pkg
+        self.assertIsNot(None, comp.distro_source_package)
+
+    def test_relink_same_source_package(self):
+        """Attempts to re-link the same source package should not error"""
+        db_src_pkg = self.factory.makeDistributionSourcePackage()
+        db_comp = self.factory.makeBugTrackerComponent()
+        db_comp.distro_source_package = db_src_pkg
+        transaction.commit()
+
+        component = ws_object(self.launchpad, db_comp)
+        package = ws_object(self.launchpad, db_src_pkg)
+        component.distro_source_package = package
+
+
 def test_suite():
     suite = unittest.TestSuite()
     suite.addTest(unittest.TestLoader().loadTestsFromName(__name__))

=== added file 'lib/lp/bugs/tests/test_bzremotecomponentfinder.py'
--- lib/lp/bugs/tests/test_bzremotecomponentfinder.py	1970-01-01 00:00:00 +0000
+++ lib/lp/bugs/tests/test_bzremotecomponentfinder.py	2010-10-29 12:36:22 +0000
@@ -0,0 +1,190 @@
+# Copyright 2010 Canonical Ltd.  This software is licensed under the
+# GNU Affero General Public License version 3 (see the file LICENSE).
+
+"""Tests cronscript for retriving components from remote Bugzillas"""
+
+__metaclass__ = type
+
+__all__ = []
+
+import os
+import unittest
+import transaction
+
+from canonical.testing import DatabaseFunctionalLayer
+from canonical.launchpad.ftests import (
+    login,
+    )
+from canonical.launchpad.scripts import QuietFakeLogger
+from canonical.launchpad.scripts.bzremotecomponentfinder import (
+    BugzillaRemoteComponentFinder,
+    BugzillaRemoteComponentScraper,
+    dictFromCSV,
+    )
+from lp.testing import TestCaseWithFactory
+from lp.testing.sampledata import (
+    ADMIN_EMAIL,
+    )
+
+
+def read_test_file(name):
+    """Return the contents of the test file named :name:
+
+    Test files are located in lib/canonical/launchpad/ftests/testfiles
+    """
+    file_path = os.path.join(os.path.dirname(__file__), 'testfiles', name)
+    test_file = open(file_path, 'r')
+    return test_file.read()
+
+
+class TestBugzillaRemoteComponentScraper(TestCaseWithFactory):
+
+    layer = DatabaseFunctionalLayer
+
+    def setUp(self):
+        super(TestBugzillaRemoteComponentScraper, self).setUp()
+
+    def test_url_correction(self):
+        scraper = BugzillaRemoteComponentScraper(
+            base_url="http://bugzilla.sample.com/";)
+
+        # Trailing slashes are stripped from the URL
+        self.assertEqual(
+            scraper.base_url,
+            "http://bugzilla.sample.com";)
+
+        # Query cgi string is generated from the base_url
+        self.assertEqual(
+            scraper.url,
+            "http://bugzilla.sample.com/query.cgi?format=advanced";)
+
+    def test_dict_from_csv(self):
+        """Test conversion of various CSV strings parse correctly"""
+
+        data = [
+            ("'foo'",        {'foo':     {'name': 'foo'}}),
+            ("'B_A_R'",      {'B_A_R':   {'name': 'B_A_R'}}),
+            ("'b@z'",        {'b@z':     {'name': 'b@z'}}),
+            ("'b\\!ah'",     {'b!ah':    {'name': 'b!ah'}}),
+            ("42",           {'42':      {'name': '42'}}),
+            ("''",           {'':        {'name': ''}}),
+            (u"uni",         {'uni':     {'name': 'uni'}}),
+            ("'a', 'b','c'", {'a':       {'name': 'a'},
+                              'b':       {'name': 'b'},
+                              'c':       {'name': 'c'},
+                              }),
+            ]
+        for test_case in data:
+            (key, truth_dict) = test_case
+            test_dict = dictFromCSV(key)
+            self.assertEqual(test_dict, truth_dict)
+
+    def test_parse_page(self):
+        """Verify parsing a static html bugzilla page"""
+        self.scraper = BugzillaRemoteComponentScraper(
+            base_url="http://bugs.wine.org";)
+        page_text = read_test_file("bugzilla-wine-advanced-query.html")
+        self.scraper.parsePage(page_text)
+        self.assertTrue(u'Wine' in self.scraper.products)
+        xorg = self.scraper.products['Wine']
+        self.assertTrue(u'ole' in xorg['components'])
+
+
+class TestBugzillaRemoteComponentFinder(TestCaseWithFactory):
+
+    layer = DatabaseFunctionalLayer
+
+    def setUp(self):
+        super(TestBugzillaRemoteComponentFinder, self).setUp()
+        login(ADMIN_EMAIL)
+
+    def test_store(self):
+        """Check that already-parsed data gets stored to database"""
+        lp_bugtracker = self.factory.makeBugTracker()
+        transaction.commit()
+
+        # Set up remote bug tracker with synthetic data
+        bz_bugtracker = BugzillaRemoteComponentScraper(
+            base_url = "http://bugzilla.example.org";)
+        bz_bugtracker.products = {
+            u'alpha': {
+                'name': u'alpha',
+                'components': {
+                    u'1': {'name': u'1', },
+                    u'2': {'name': u'2', },
+                    u'3': {'name': u'3', },
+                    },
+                'versions': None,
+                },
+            u'beta': {
+                'name': u'beta',
+                'components': {
+                    u'4': {'name': u'4', },
+                    },
+                'versions': None,
+                }
+            }
+        finder = BugzillaRemoteComponentFinder(
+            logger=QuietFakeLogger())
+        finder.storeRemoteProductsAndComponents(
+            bz_bugtracker, lp_bugtracker)
+
+        # Verify the data got stored properly
+        comp_groups = lp_bugtracker.getAllRemoteComponentGroups()
+        self.assertEqual(2, len(list(comp_groups)))
+        comp_group = lp_bugtracker.getRemoteComponentGroup(u'alpha')
+        self.assertEqual(3, len(list(comp_group.components)))
+        comp_group = lp_bugtracker.getRemoteComponentGroup(u'beta')
+        self.assertEqual(1, len(list(comp_group.components)))
+        comp = comp_group.getComponent(u'non-existant')
+        self.assertIs(None, comp)
+        comp = comp_group.getComponent(u'4')
+        self.assertEqual(u'4', comp.name)
+
+    def test_get_remote_products_and_components(self):
+        """Does a full retrieve and storing of data."""
+        lp_bugtracker = self.factory.makeBugTracker(
+            title="fdo-example",
+            name="fdo-example")
+        transaction.commit()
+        bz_bugtracker = BugzillaRemoteComponentScraper(
+            base_url = "http://bugzilla.example.org";)
+
+        page_text = read_test_file("bugzilla-fdo-advanced-query.html")
+        finder = BugzillaRemoteComponentFinder(
+            logger=QuietFakeLogger(),
+            static_bugzilla_text=page_text)
+        finder.getRemoteProductsAndComponents(bugtracker_name="fdo-example")
+
+        self.assertEqual(
+            109, len(list(lp_bugtracker.getAllRemoteComponentGroups())))
+        comp_group = lp_bugtracker.getRemoteComponentGroup(u'xorg')
+        self.assertIsNot(None, comp_group)
+        self.assertEqual(146, len(list(comp_group.components)))
+        comp = comp_group.getComponent(u'Driver/Radeon')
+        self.assertIsNot(None, comp)
+        self.assertEqual(u'Driver/Radeon', comp.name)
+
+# FIXME: This takes ~9 sec to run, but mars says new testsuites need to compete in 2
+#    def test_cronjob(self):
+#        """Runs the cron job to verify it executes without error"""
+#        import subprocess
+#        process = subprocess.Popen(
+#            ['cronscripts/update-sourceforge-remote-products.py', '-v'],
+#            stdin=subprocess.PIPE, stdout=subprocess.PIPE,
+#            stderr=subprocess.PIPE)
+#        (out, err) = process.communicate()
+#
+#        self.assertEqual(out, '')
+#        self.assertEqual(process.returncode, 0)
+#        self.assertTrue('Creating lockfile' in err)
+#        self.assertTrue('Removing lock file' in err)
+#        self.assertTrue('ERROR' not in err)
+#        self.assertTrue('CRITICAL' not in err)
+#        self.assertTrue('Exception raised' not in err)
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(unittest.TestLoader().loadTestsFromName(__name__))
+
+    return suite

=== added file 'lib/lp/bugs/tests/testfiles/bugzilla-fdo-advanced-query.html'
--- lib/lp/bugs/tests/testfiles/bugzilla-fdo-advanced-query.html	1970-01-01 00:00:00 +0000
+++ lib/lp/bugs/tests/testfiles/bugzilla-fdo-advanced-query.html	2010-10-29 12:36:22 +0000
@@ -0,0 +1,2629 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
+<html><head>
+<meta http-equiv="content-type" content="text/html; charset=UTF-8">
+
+  
+    <title>Search for bugs</title>
+
+
+<link rel="Top" href="http://bugs.freedesktop.org/";>
+
+
+    
+
+    
+      <link href="fdo_adv_query_files/global_003.css" rel="stylesheet" type="text/css">
+      <link href="fdo_adv_query_files/help_002.css" rel="stylesheet" type="text/css">
+    <!--[if lte IE 7]>
+      
+      <link href="skins/standard/IE-fixes.css"
+            rel="stylesheet"
+            type="text/css">
+    <![endif]-->
+
+    
+        <link href="fdo_adv_query_files/global_003.css" rel="stylesheet" title="Classic" type="text/css">
+        <link href="fdo_adv_query_files/help_002.css" rel="stylesheet" title="Classic" type="text/css">
+      <!--[if lte IE 7]>
+      
+        <link href="skins/standard/IE-fixes.css"
+              rel="stylesheet"
+              title="Classic"
+              type="text/css">
+      <![endif]-->
+
+    
+        
+            <link href="fdo_adv_query_files/global.css" rel="alternate stylesheet" title="Dusk" type="text/css">
+            <link href="fdo_adv_query_files/help_003.css" rel="alternate stylesheet" title="Dusk" type="text/css">
+        <!--[if lte IE 7]>
+          
+          <link href="skins/contrib/Dusk/IE-fixes.css"
+                rel="alternate stylesheet"
+                title="Dusk"
+                type="text/css">
+        <![endif]-->
+
+    
+      <style type="text/css">dl.bug_changes dt {
+                 margin-top: 15px;
+               }
+      </style>
+
+    
+        <link href="fdo_adv_query_files/global_002.css" rel="stylesheet" type="text/css">
+        <link href="fdo_adv_query_files/help.css" rel="stylesheet" type="text/css">
+    <!--[if lte IE 7]>
+      
+      <link href="skins/custom/IE-fixes.css"
+            rel="stylesheet"
+            type="text/css">
+    <![endif]-->
+
+    <script src="fdo_adv_query_files/yahoo-dom-event.js" type="text/javascript"></script>
+    <script src="fdo_adv_query_files/global.js" type="text/javascript"></script>
+    <script type="text/javascript">
+    <!--
+        YAHOO.namespace('bugzilla');
+        if (YAHOO.env.ua.gecko) {
+            YAHOO.util.Event._simpleRemove(window, "unload", 
+                                           YAHOO.util.Event._unload);
+        }
+        
+        var BUGZILLA = {
+            param: {
+                cookiepath: '\/'
+            }
+        };
+var queryform = "queryform"
+    // -->
+    </script>
+
+        <script src="fdo_adv_query_files/productform.js" type="text/javascript"></script>
+        <script src="fdo_adv_query_files/util.js" type="text/javascript"></script>
+        <script src="fdo_adv_query_files/help.js" type="text/javascript"></script>
+
+    
+
+    
+    <link rel="search" type="application/opensearchdescription+xml" title="FreeDesktop Bugzilla" href="https://bugzilla.freedesktop.org/search_plugin.cgi";>
+    <link rel="shortcut icon" href="https://bugzilla.freedesktop.org/images/favicon.ico";>
+  </head><body onload="doOnSelectProduct(0); enableHelp();" class="bugs-freedesktop-org">
+
+
+
+<div id="header">
+<div id="banner">
+  </div>
+
+<table id="titles" border="0" cellpadding="0" cellspacing="0">
+<tbody><tr>
+    <td id="title">
+      <p>FreeDesktop Bugzilla – Search for bugs</p>
+    </td>
+
+
+</tr>
+</tbody></table>
+<ul class="links">
+  <li><a href="https://bugzilla.freedesktop.org/";>Home</a></li>
+  <li><span class="separator">| </span><a href="https://bugzilla.freedesktop.org/enter_bug.cgi";>New</a></li>
+  <li><span class="separator">| </span><a href="https://bugzilla.freedesktop.org/query.cgi";>Search</a></li>
+
+  <li class="form">
+    <span class="separator">| </span>
+    <form action="buglist.cgi" method="get" onsubmit="if (this.quicksearch.value == '')
+                  { alert('Please enter one or more search terms first.');
+                    return false; } return true;">
+    <input class="txt" id="quicksearch_top" name="quicksearch" type="text">
+    <input class="btn" value="Find" id="find_top" type="submit"></form></li>
+
+  <li><span class="separator">| </span><a href="https://bugzilla.freedesktop.org/report.cgi";>Reports</a></li>
+
+  <li>
+      <span class="separator">| </span>
+        <a href="https://bugzilla.freedesktop.org/request.cgi";>Requests</a></li>
+
+
+  <li>
+        <span class="separator">| </span>
+        <a href="https://bugzilla.freedesktop.org/docs/html/query.html"; target="_blank">Help</a>
+      </li>
+    
+      <li id="new_account_container_top">
+        <span class="separator">| </span>
+        <a href="https://bugzilla.freedesktop.org/createaccount.cgi";>New&nbsp;Account</a>
+      </li>
+
+    <li id="mini_login_container_top">
+  <span class="separator">| </span>
+  <a id="login_link_top" href="https://bugzilla.freedesktop.org/query.cgi?GoAheadAndLogIn=1"; onclick="return show_mini_login_form('_top')">Log In</a>
+  <form action="https://bugs.freedesktop.org/query.cgi?format=advanced&amp;field0-0-0=xyzzy"; method="POST" class="mini_login bz_default_hidden" id="mini_login_top" onsubmit="return check_mini_login_fields( '_top' );">
+    <input value="login" id="Bugzilla_login_top" class="bz_login bz_mini_login_help" name="Bugzilla_login" onfocus="mini_login_on_focus('_top')">
+    <input class="bz_password bz_default_hidden" id="Bugzilla_password_top" name="Bugzilla_password" type="password">
+    <input class="bz_password bz_mini_login_help" id="Bugzilla_password_dummy_top" value="password" onfocus="mini_login_on_focus('_top')" type="text">
+    <input name="GoAheadAndLogIn" value="Log in" id="log_in_top" type="submit">
+    <script type="text/javascript">
+      mini_login_constants = {
+          "login" : "login",
+          "warning" : "You must set the login and password before logging in."
+      };
+      
+      if (YAHOO.env.ua.gecko || YAHOO.env.ua.ie || YAHOO.env.ua.opera) {
+          YAHOO.util.Event.onDOMReady(function() {
+              init_mini_login_form('_top');
+          });
+      }
+      else {
+          YAHOO.util.Event.on(window, 'load', function () {
+              window.setTimeout(function() {
+                  init_mini_login_form('_top');
+              }, 200);
+          });
+    }
+    </script>
+    <a href="#" onclick="return hide_mini_login_form('_top')">[x]</a>
+  </form>
+</li>
+<li id="forgot_container_top">
+  <span class="separator">| </span>
+  <a id="forgot_link_top" href="https://bugzilla.freedesktop.org/query.cgi?GoAheadAndLogIn=1#forgot"; onclick="return show_forgot_form('_top')">Forgot Password</a>
+  <form action="token.cgi" method="post" id="forgot_form_top" class="mini_forgot bz_default_hidden">
+    <label>Login: <input name="loginname" size="20" type="text"></label>
+    <input id="forgot_button_top" value="Reset Password" type="submit">
+    <input name="a" value="reqpw" type="hidden">
+    <a href="#" onclick="return hide_forgot_form('_top')">[x]</a>
+  </form>
+</li>
+</ul>
+
+</div>
+
+<div id="bugzilla-body">
+<div class="tabbed">
+  <table class="tabs" width="100%" border="0" cellpadding="10" cellspacing="0">
+    <tbody><tr>
+      <td class="spacer">&nbsp;</td>
+
+          <td class="clickable_area" onclick="document.location='query.cgi?format=specific'"><a href="https://bugzilla.freedesktop.org/query.cgi?format=specific";>Find a Specific Bug</a></td>
+          <td class="selected">Advanced Search</td>
+
+      <td class="spacer">&nbsp;</td>
+    </tr>
+  </tbody></table>
+
+  <div class="tabbody">
+
+
+
+
+<script type="text/javascript"> <!--
+  document.write("<p><a href='query.cgi?help=1&amp;format=advanced'>Give me some help<\/a> (reloads page).<\/p>");
+// -->
+</script><p><a href="https://bugzilla.freedesktop.org/query.cgi?help=1&amp;format=advanced";>Give me some help</a> (reloads page).</p>
+
+<form method="post" action="buglist.cgi" name="queryform">
+<script type="text/javascript">
+
+var first_load = true;         
+var last_sel = new Array();    
+
+var useclassification = false;
+var cpts = new Array();
+var vers = new Array();
+
+
+
+
+
+
+  cpts[0] = ['general' ];
+  vers[0] = ['unspecified' ];
+  cpts[1] = ['Desktop daemon', 'Policy API', 'SPI', 'Templates' ];
+  vers[1] = ['unspecified' ];
+  cpts[2] = ['atk', 'core' ];
+  vers[2] = ['unspecified' ];
+  cpts[3] = ['avahi-daemon', 'libavahi', 'libavahi-core' ];
+  vers[3] = ['unspecified' ];
+  cpts[4] = ['General' ];
+  vers[4] = ['unspecified' ];
+  cpts[5] = ['beos backend', 'directfb backend', 'freetype font backend', 'general', 'gl backend', 'image backend', 'pdf backend', 'png functions', 'postscript backend', 'qt backend', 'quartz backend', 'quartz font backend', 'svg backend', 'win32 backend', 'xcb backend', 'xlib backend' ];
+  vers[5] = ['0.2.0', '0.9.3', '1.0.0', '1.0.1', '1.1.1', '1.0.2', '1.0.3', '1.1.2', '1.1.3', '1.0.4', '1.1.4', '1.1.5', '1.1.6', '1.1.7', '1.1.8', '1.1.9', '1.1.10', '1.1.11', '1.2.0', '1.2.1', '1.2.2', '1.2.3', '1.2.4', '1.2.5', '1.2.6', '1.2.7', '1.3.2', '1.3.4', '1.3.5', '1.3.6', '1.3.7', '1.3.8', '1.3.9', '1.3.10', '1.3.11', '1.3.12', '1.3.13', '1.3.14', '1.3.15', '1.3.16', '1.3.17', '1.4.0', '1.4.1', '1.4.2', '1.4.3', '1.4.4', '1.4.5', '1.4.6', '1.4.7', '1.4.8', '1.4.9', '1.4.10', '1.5.1', '1.5.2', '1.5.3', '1.4.12', '1.4.13', '1.5.4', '1.5.5', '1.4.14', '1.4.15', '1.5.6', '1.5.7', '1.5.8', '1.5.9', '1.5.10', '1.5.11', '1.5.12', '1.5.13', '1.5.14', '1.5.15', '1.5.16', '1.5.17', '1.5.18', '1.5.19', '1.5.20', '1.5.21', '1.6.0', '1.6.1', '1.6.2', '1.6.3', '1.6.4', '1.6.5', '1.7.2', '1.7.3', '1.7.4', '1.7.5', '1.7.6', '1.7.7', '1.8.0', '1.8.1', '1.8.2', '1.8.3', '1.9.1', '1.8.4', '1.8.5', '1.8.6', '1.9.2', '1.9.3', '1.8.8', '1.9.4', '1.9.5', '1.8.10', '1.8.11', '1.9.6', '1.9.7', '1.9.8', '1.9.9', '1.9.10', '1.9.11', '1.9.12', '1.9.13', '1.9.14', '1.9.15', '1.10.0', '1.10.1' ];
+  cpts[6] = ['general' ];
+  vers[6] = ['unspecified' ];
+  cpts[7] = ['Build', 'Documentation', 'General' ];
+  vers[7] = ['unspecified', '1.0.x', '0.9.x', 'CVS HEAD' ];
+  cpts[8] = ['general' ];
+  vers[8] = ['unspecified' ];
+  cpts[9] = ['Daemon', 'libck-connector', 'PAM module' ];
+  vers[9] = ['unspecified' ];
+  cpts[10] = ['website' ];
+  vers[10] = ['unspecified' ];
+  cpts[11] = ['General' ];
+  vers[11] = ['unspecified' ];
+  cpts[12] = ['core', 'doc', 'GLib', 'java', 'perl', 'python', 'Qt' ];
+  vers[12] = ['unspecified', '1.0.x', '1.2.x', '1.3.x (devel)', '1.4.x' ];
+  cpts[13] = ['Core', 'Driver \/ ATI', 'Driver \/ TDFX', 'Input \/ Keyboard', 'Input \/ Mouse' ];
+  vers[13] = ['unspecified' ];
+  cpts[14] = ['Experimental fonts', 'General', 'Mono Sans', 'Sans', 'Serif' ];
+  vers[14] = ['unspecified' ];
+  cpts[15] = ['general' ];
+  vers[15] = ['unspecified' ];
+  cpts[16] = ['DeviceKit', 'DeviceKit-disks', 'DeviceKit-power' ];
+  vers[16] = ['unspecified' ];
+  cpts[17] = ['general' ];
+  vers[17] = ['unspecified' ];
+  cpts[18] = ['DRM\/Intel', 'DRM\/other', 'DRM\/Radeon', 'DRM\/Via', 'General', 'libdrm', 'libGL', 'libglx' ];
+  vers[18] = ['unspecified', 'XFree86 4.4.0', 'XFree86 CVS', 'XOrg 6.7.0', 'XOrg CVS', 'DRI CVS' ];
+  cpts[19] = ['Problems' ];
+  vers[19] = ['unspecified' ];
+  cpts[20] = ['Core', 'GStreamer Elements', 'libjingle transmitter', 'Raw UDP transmitter', 'RTP Plugin' ];
+  vers[20] = ['unspecified' ];
+  cpts[21] = ['conf', 'doc', 'fc-cache', 'fc-cat', 'fc-list', 'fc-match', 'library', 'orth' ];
+  vers[21] = ['2.1', '2.0', '2_1', '2.2', '2.3', '2.4', '2.5', '2.6', '2.7', '2.8' ];
+  cpts[22] = ['Account Modification Requests', 'Administration', 'Bugzilla', 'CVS', 'Mailing lists', 'New Accounts', 'Project Creation Requests', 'Tinderbox', 'Website', 'Wiki' ];
+  vers[22] = ['unspecified' ];
+  cpts[23] = ['freedrtools' ];
+  vers[23] = ['unspecified' ];
+  cpts[24] = ['general' ];
+  vers[24] = ['unspecified' ];
+  cpts[25] = ['bidi', 'cmdline', 'datatables', 'docs', 'general', 'joining', 'shaping', 'website' ];
+  vers[25] = ['unspecified', '0.10.4' ];
+  cpts[26] = ['eds-feed', 'gaim-galago', 'galago-daemon', 'galago-gtk-sharp', 'galago-sharp', 'gnome-presence-applet', 'libgalago', 'libgalago-gtk', 'libnotify', 'notification-daemon', 'web' ];
+  vers[26] = ['unspecified' ];
+  cpts[27] = ['Backends', 'General', 'Language Bindings', 'Master Server' ];
+  vers[27] = ['unspecified' ];
+  cpts[28] = ['general', 'spec', 'www' ];
+  vers[28] = ['unspecified' ];
+  cpts[29] = ['build infrastructure', 'core library' ];
+  vers[29] = ['unspecified' ];
+  cpts[30] = ['account' ];
+  vers[30] = ['unspecified' ];
+  cpts[31] = ['GTK-Qt' ];
+  vers[31] = ['unspecified' ];
+  cpts[32] = ['Docs', 'General' ];
+  vers[32] = ['unspecified' ];
+  cpts[33] = ['General' ];
+  vers[33] = ['unspecified' ];
+  cpts[34] = ['build', 'hald', 'hal-info', 'libhal', 'misc', 'spec' ];
+  vers[34] = ['unspecified' ];
+  cpts[35] = ['src' ];
+  vers[35] = ['unspecified' ];
+  cpts[36] = ['Devices', 'Fonts', 'General' ];
+  vers[36] = ['unspecified' ];
+  cpts[37] = ['hicolor' ];
+  vers[37] = ['ALL' ];
+  cpts[38] = ['A11y test suite', 'appmap', 'Editor', 'General', 'LDTP', 'ldtprecord', 'ldtprunner', 'PyLDTP', 'Python CLI' ];
+  vers[38] = ['unspecified' ];
+  cpts[39] = ['general' ];
+  vers[39] = ['unspecified' ];
+  cpts[40] = ['library' ];
+  vers[40] = ['unspecified' ];
+  cpts[41] = ['libbsd' ];
+  vers[41] = ['unspecified' ];
+  cpts[42] = ['Unspecified' ];
+  vers[42] = ['unspecified' ];
+  cpts[43] = ['Library' ];
+  vers[43] = ['unspecified' ];
+  cpts[44] = ['fprintd', 'libfprint' ];
+  vers[44] = ['unspecified' ];
+  cpts[45] = ['libjpeg', 'libjpeg-progs' ];
+  vers[45] = ['unspecified', '6b', '6c' ];
+  cpts[46] = ['unknown' ];
+  vers[46] = ['unspecified', '0.3.5', 'HEAD' ];
+  cpts[47] = ['General' ];
+  vers[47] = ['unspecified' ];
+  cpts[48] = ['contrib', 'libreoffice' ];
+  vers[48] = ['unspecified' ];
+  cpts[49] = ['general' ];
+  vers[49] = ['unspecified' ];
+  cpts[50] = ['Documentation', 'General' ];
+  vers[50] = ['unspecified' ];
+  cpts[51] = ['Installer', 'local devices', 'ltspcfg', 'LTSP Core' ];
+  vers[51] = ['unspecified' ];
+  cpts[52] = ['General', 'New device' ];
+  vers[52] = ['unspecified' ];
+  cpts[53] = ['Demos', 'Drivers\/DRI\/FFB', 'Drivers\/DRI\/Gamma', 'Drivers\/DRI\/i810', 'Drivers\/DRI\/i830', 'Drivers\/DRI\/i915', 'Drivers\/DRI\/i965', 'Drivers\/DRI\/Mach64', 'Drivers\/DRI\/MGA', 'Drivers\/DRI\/nouveau', 'Drivers\/DRI\/r128', 'Drivers\/DRI\/r200', 'Drivers\/DRI\/r300', 'Drivers\/DRI\/R600', 'Drivers\/DRI\/Radeon', 'Drivers\/DRI\/S3V', 'Drivers\/DRI\/Savage', 'Drivers\/DRI\/SiS', 'Drivers\/DRI\/TDFX', 'Drivers\/DRI\/Trident', 'Drivers\/DRI\/Unichrome', 'Drivers\/Gallium\/i915g', 'Drivers\/Gallium\/r300', 'Drivers\/Gallium\/r600', 'Drivers\/Glide', 'Drivers\/X11', 'GLU', 'GLUT', 'GLX', 'Mesa core', 'Other' ];
+  vers[53] = ['unspecified', '6.0.1', '5.1', '5.0.2', '6.1', '6.2', '6.2.1', '6.3.1', '6.3.2', '6.4', '6.5', '7.0', '7.0.3', '7.1', '7.2', '7.3', '7.4', '7.5', 'git', '7.6' ];
+  cpts[54] = ['General' ];
+  vers[54] = ['unspecified' ];
+  cpts[55] = ['C code', 'doc', 'Nickle code' ];
+  vers[55] = ['2.2' ];
+  cpts[56] = ['General' ];
+  vers[56] = ['unspecified' ];
+  cpts[57] = ['clipart', 'dms', 'tools', 'website' ];
+  vers[57] = ['unspecified' ];
+  cpts[58] = ['website' ];
+  vers[58] = ['unspecified' ];
+  cpts[59] = ['Orc' ];
+  vers[59] = ['unspecified' ];
+  cpts[60] = ['backend-apt', 'backend-conary', 'backend-yum', 'backend-zypp', 'client-library', 'core', 'General', 'packagekit-qt', 'packagekit-sharp' ];
+  vers[60] = ['unspecified' ];
+  cpts[61] = ['general' ];
+  vers[61] = ['unspecified', 'git master' ];
+  cpts[62] = ['infrastructure', 'tests' ];
+  vers[62] = ['unspecified' ];
+  cpts[63] = ['libpixman' ];
+  vers[63] = ['0.1.3', 'git master', 'other', '0.14.0', '0.16.x', '0.18.x' ];
+  cpts[64] = ['src' ];
+  vers[64] = ['unspecified' ];
+  cpts[65] = ['general', 'script plugin' ];
+  vers[65] = ['unspecified' ];
+  cpts[66] = ['General' ];
+  vers[66] = ['unspecified' ];
+  cpts[67] = ['daemon', 'libpolkit' ];
+  vers[67] = ['unspecified' ];
+  cpts[68] = ['arthur backend', 'cairo backend', 'cpp frontend', 'general', 'glib frontend', 'qt4 frontend', 'qt frontend', 'splash backend' ];
+  vers[68] = ['unspecified' ];
+  cpts[69] = ['DAPI', 'Portland', 'test-report', 'xdg-utils' ];
+  vers[69] = ['unspecified', 'beta1', 'beta2', 'beta3', 'beta4', '1.0', 'TP', '1.1.0 rc1', '1.1.0 rc2', '1.1.0 rc3', '1.1.0' ];
+  cpts[70] = ['general' ];
+  vers[70] = ['unspecified' ];
+  cpts[71] = ['base' ];
+  vers[71] = ['unspecified' ];
+  cpts[72] = ['PyXDG' ];
+  vers[72] = ['unspecified' ];
+  cpts[73] = ['General' ];
+  vers[73] = ['unspecified' ];
+  cpts[74] = ['general' ];
+  vers[74] = ['unspecified' ];
+  cpts[75] = ['Build config', 'Core: libscim', 'Core: Other', 'Documentation', 'FrontEnd: Core', 'FrontEnd: GTK IMModule', 'FrontEnd: Other', 'FrontEnd: QT IMModule', 'FrontEnd: XIM', 'IMEngine: Core', 'IMEngine: Generic Table', 'IMEngine: M17N', 'IMEngine: Other', 'IMEngine: Smart Pinyin', 'IMEngine: UIM', 'Other', 'Panel: Core', 'Panel: scim-panel-gtk', 'Panel: scim-panel-kde (skim)' ];
+  vers[75] = ['unspecified' ];
+  cpts[76] = ['generic', 'libsb2', 'mappings' ];
+  vers[76] = ['unspecified', '1.99.0.x' ];
+  cpts[77] = ['misc', 'nao', 'ncal', 'nco', 'ndo', 'new-ontology', 'nexif', 'nfo', 'nid3', 'nie', 'nmm', 'nmo', 'nrl', 'nso', 'nuao', 'pimo' ];
+  vers[77] = ['unspecified' ];
+  cpts[78] = ['freedesktop.org.xml', 'general' ];
+  vers[78] = ['unspecified' ];
+  cpts[79] = ['Two' ];
+  vers[79] = ['unspecified' ];
+  cpts[80] = ['desktop-entry', 'General', 'trash' ];
+  vers[80] = ['unspecified' ];
+  cpts[81] = ['canvas', 'client', 'protocol', 'server', 'win32 qxl', 'win32 vd_agent', 'win32 vdi_port' ];
+  vers[81] = ['unspecified' ];
+  cpts[82] = ['Documentation', 'Other', 'ST: Applications', 'ST: Build config', 'ST: Drop-in Objects', 'ST: Font Server', 'ST: Libraries (libST.so and libstsf.so)', 'ST: Other', 'XST: Applications', 'XST: Build config', 'XST: Other', 'XST: X Client Library', 'XST: Xft bridge', 'XST: XLFD bridge', 'XST: X Server Extension' ];
+  vers[82] = ['unspecified', 'ST-HEAD', 'XST-HEAD', 'XST-XORG-RELEASE-1-STSF' ];
+  cpts[83] = ['library', 'plugin' ];
+  vers[83] = ['unspecified', '0.4.5', '0.5.0', '0.5.1', '0.5.2', '0.5.3', '0.5.4', '0.5.5', 'git', '0.6.6', '0.6.4', '0.6.2', '0.6.0', '0.7.x' ];
+  cpts[84] = ['init', 'network', 'shares', 'time', 'users' ];
+  vers[84] = ['unspecified' ];
+  cpts[85] = ['general' ];
+  vers[85] = ['unspecified' ];
+  cpts[86] = ['default', 'icon theme' ];
+  vers[86] = ['CVS' ];
+  cpts[87] = ['butterfly', 'cohoba', 'echobot', 'fargo', 'gabble', 'general', 'haze', 'idle', 'libtelepathy', 'logger', 'm5-account-plugins', 'mission-control', 'papyon', 'pymsn', 'ring', 'salut', 'sofiasip', 'ssh-contact', 'stream-engine', 'sunshine', 'tp-doc', 'tp-farsight', 'tp-glib', 'tp-inspector', 'tp-python', 'tp-qt4', 'tp-spec', 'wilde', 'yafono' ];
+  vers[87] = ['unspecified', 'git master', '0.8', '0.9', '0.10', '0.11', '0.4', '0.6', '5.4', '5.5', '0.12', '0.13', '5.6', '5.7' ];
+  cpts[88] = ['tinderclient', 'tinderserver', 'trees' ];
+  vers[88] = ['unspecified' ];
+  cpts[89] = ['detection', 'general', 'linux-md', 'luks', 'operations' ];
+  vers[89] = ['unspecified' ];
+  cpts[90] = ['bridge: fep', 'bridge: GTK+', 'bridge: Qt', 'bridge: XIM', 'doc', 'generic Scheme codes', 'helper: Candidate window', 'helper: dict', 'helper: others', 'helper: pref', 'helper: toolbar', 'IM: Other IMs', 'libuim', 'libuim: Scheme interpreter', 'Other' ];
+  vers[90] = ['unspecified' ];
+  cpts[91] = ['General' ];
+  vers[91] = ['unspecified', '0.0.1', 'git master', '0.8' ];
+  cpts[92] = ['appres', 'bdftopcf', 'editres', 'fdclock', 'fslsfonts', 'fstobdf', 'iceauth', 'imake', 'listres', 'luit', 'mkcfm', 'mkfontdir', 'mkfontscale', 'setxkbmap', 'showfont', 'smproxy', 'transset', 'twm', 'viewres', 'wininfo', 'x11perf', 'xauth', 'xcmsdb', 'xcompmgr', 'xcursorgen', 'xdm', 'xdpyinfo', 'xev', 'xfd', 'xfontsel', 'xfs', 'xfsinfo', 'xgamma', 'xhost', 'xinit', 'xkbcomp', 'xkbprint', 'xkbutils', 'xkill', 'xlsatoms', 'xlsclients', 'xlsfonts', 'xmodmap', 'xping', 'xprop', 'xrandr', 'xrdb', 'xrefresh', 'xset', 'xsetmode', 'xsetpointer', 'xsetroot', 'xsm', 'xterm', 'xvidtune', 'xvinfo', 'xwininfo' ];
+  vers[92] = ['unspecified' ];
+  cpts[93] = ['Demos', 'Library', 'Misc', 'Protocol', 'Utils' ];
+  vers[93] = ['unspecified', '0.9', '0.9.91 (1.0-RC1)', '1.0', '0.9.92 (1.0-RC2)', '0.9.93 (1.0-RC3)', '1.1' ];
+  cpts[94] = ['doc', 'library' ];
+  vers[94] = ['1.0' ];
+  cpts[95] = ['handhelds', 'redglass', 'whiteglass', 'xcursorgen' ];
+  vers[95] = ['1.0' ];
+  cpts[96] = ['General' ];
+  vers[96] = ['unspecified' ];
+  cpts[97] = ['General' ];
+  vers[97] = ['unspecified' ];
+  cpts[98] = ['xdgmime' ];
+  vers[98] = ['unspecified' ];
+  cpts[99] = ['Glib', 'Metadata Storage Specification', 'Ontology', 'QT', 'Search Specification', 'Shared Tools' ];
+  vers[99] = ['unspecified' ];
+  cpts[100] = ['Build', 'doc', 'library' ];
+  vers[100] = ['2.0', '2.1' ];
+  cpts[101] = ['doc', 'General', 'Translation' ];
+  vers[101] = ['unspecified' ];
+  cpts[102] = ['libICE', 'libSM', 'libX11', 'libXau', 'libXaw', 'libXcomposite', 'libXcursor', 'libXdamage', 'libXdmcp', 'libXext', 'libXfixes', 'libXfont', 'libXi', 'libXmu', 'libXpm', 'libXrandr', 'libXrender', 'libXRes', 'libXt', 'libXtrans', 'libXv', 'libXvMC' ];
+  vers[102] = ['unspecified' ];
+  cpts[103] = ['Acceleration\/EXA', 'Acceleration\/XAA', 'Acceleration\/XGL', 'App\/appres', 'App\/bdftopcf', 'App\/compiz', 'App\/glxgears', 'App\/glxinfo', 'App\/lbxproxy', 'App\/other', 'App\/twm', 'App\/xdm', 'App\/xedit', 'App\/xkbcomp', 'App\/xman', 'App\/xoo', 'App\/xorgcfg', 'App\/xorgconfig', 'App\/xrandr', 'App\/xresponse', 'App\/xset', 'App\/xterm', 'cvs', 'DDX\/cygwin', 'DDX\/darwin', 'DDX\/dmx', 'DDX\/vfb', 'DDX\/xnest', 'DDX\/xorg', 'Docs\/other', 'Documentation', 'Driver\/apm', 'Driver\/ark', 'Driver\/ASpeed', 'Driver\/avivo', 'Driver\/chips', 'Driver\/cirrus', 'Driver\/cyrix', 'Driver\/fbdev', 'Driver\/fglrx', 'Driver\/geode', 'Driver\/glide', 'Driver\/glint', 'Driver\/i128', 'Driver\/i740', 'Driver\/imstt', 'Driver\/intel', 'Driver\/mach64', 'Driver\/mga', 'Driver\/Neomagic', 'Driver\/newport', 'Driver\/nouveau', 'Driver\/nsc', 'Driver\/nVidia (open)', 'Driver\/nVidia (proprietary)', 'Driver\/other', 'Driver\/p690', 'Driver\/Radeon', 'Driver\/radeonhd', 'Driver\/rage128', 'Driver\/rendition', 'Driver\/s3', 'Driver\/s3virge', 'Driver\/savage', 'Driver\/siliconmotion', 'Driver\/SiS', 'Driver\/tdfx', 'Driver\/tga', 'Driver\/Trident', 'Driver\/Tseng Labs', 'Driver\/Vesa', 'Driver\/VGA', 'Driver\/Via', 'Driver\/VMWare', 'Driver\/Voodoo', 'Driver\/XGI', 'Extensions\/DRI', 'Fonts\/BDF', 'Fonts\/doc', 'Fonts\/other', 'Font\/XFS', 'I18N', 'imake', 'Input\/acecad', 'Input\/aiptek', 'Input\/calcomp', 'Input\/Citron', 'Input\/Core', 'Input\/digitaledge', 'Input\/dmc', 'Input\/dynapro', 'Input\/elo2300', 'Input\/elographics', 'Input\/evdev', 'Input\/fpit', 'Input\/hyperpen', 'Input\/jamstudio', 'Input\/joystick', 'Input\/Keyboard', 'Input\/magellan', 'Input\/magictouch', 'Input\/microtouch', 'Input\/Mouse', 'Input\/mutouch', 'Input\/other', 'Input\/palmax', 'Input\/penmount', 'Input\/sample', 'Input\/spaceorb', 'Input\/summa', 'Input\/synaptics', 'Input\/tek4957', 'Input\/ur98', 'Input\/void', 'Input\/wacom', 'Input\/XKB', 'Lib\/font', 'Lib\/Freetype2', 'Lib\/GLX', 'Lib\/ICE', 'Lib\/other', 'libpciaccess', 'Lib\/Xau', 'Lib\/Xaw', 'Lib\/Xcursor', 'Lib\/Xext', 'Lib\/Xft', 'Lib\/Xi', 'Lib\/Xlib', 'Lib\/Xlib (data)', 'Lib\/Xmu', 'Lib\/Xpm', 'Lib\/Xrender', 'Lib\/Xt', 'Lib\/xtrans', 'Lib\/zlib', 'Loader \/ dlloader', 'Loader \/ elfloader', 'Modular build system', 'Monolithic build system', '* Other', 'Protocol\/Core', 'Release', 'Security', 'Server\/general', 'Xephyr' ];
+  vers[103] = ['git', 'unspecified', '6.7.0', '6.8.0', '6.8.1', '6.8.2', '6.8.99.1', '6.8.99.2', '6.8.99.3', '6.8.99.4', '6.8.99.5', '6.8.99.6', '6.8.99.7', '6.8.99.8', '6.8.99.9', '6.8.99.10', '6.8.99.11', '6.8.99.12', '6.8.99.13', '6.8.99.901 (6.9 RC1)', '6.8.99.900 (6.9 RC0)', '6.8.99.902 (6.9 RC2)', '6.8.99.903 (6.9 RC3)', '6.99.99.900 (7.0 RC0)', '6.99.99.901 (7.0 RC1)', '6.99.99.902 (7.0 RC2)', '6.99.99.903 (7.0 RC3)', '6.8.99.14', '6.8.99.15', '6.8.99.16', '6.9.0', '7.0.0', '6.99.99.904 (7.0 RC4)', '6.8.99.904 (6.9 RC4)', '7.0', '7.0.99.901 (7.1RC1)', '7.0.99.902 (7.1RC2)', '7.0.99.903 (7.1RC3)', '7.1', '7.2', '7.3', '7.4', '7.5' ];
+  cpts[104] = ['Application support: Eclipse', 'Application support: GTK+\/Gnome', 'Application support: JAVA', 'Application support: Mozilla', 'Application support: Other', 'Application support: Qt\/KDE', 'Application support: Xt\/Athena', 'Application support: Xt\/Motif\/CDE', 'Build config', 'Client library: Other', 'Client library: XpExtension library', 'Client library: XprintUtil library', 'Documentation: FAQ', 'Documentation: Manual pages (manpages)', 'Documentation: Other', 'Fonts: Other', 'Other', 'Server: Config: model-configs', 'Server: Config: other', 'Server: Config: startup scripts', 'Server: DDX: other', 'Server: DDX: PCL', 'Server: DDX: PCL-mono', 'Server: DDX: PDF', 'Server: DDX: PostScript', 'Server: DDX: Raster', 'Server: DDX: SVG', 'Server: DDX: Windows', 'Server: Extensions: Other', 'Server: Extensions: XpExtension', 'Server: Font engine: FreeType', 'Server: Font engine: Other', 'Server: Font engine: PMF', 'Server: Font engine: PS Type1', 'Server: Font engine: STSF', 'Server: Font engine: TrueType', 'Server: Other', 'Server: Spooler support: CUPS', 'Server: Spooler support: LPRng', 'Server: Spooler support: Other', 'Site: Other', 'Site: xprint.freedesktop.org WWW pages', 'Site: xprint.mozdev.org WWW pages', 'Tools: Other', 'Tools: xphelloworld', 'Tools: xplsprinters', 'Tools: xpppdtomodelconfig', 'Tools: xptest', 'Tracking' ];
+  vers[104] = ['unspecified' ];
+  cpts[105] = ['Build', 'Documentation', 'Library', 'Protocol headers' ];
+  vers[105] = ['unspecified' ];
+  cpts[106] = ['all-but-hw', 'kdrive' ];
+  vers[106] = ['unspecified' ];
+  cpts[107] = ['BDF', 'BigReq', 'DBE', 'FontService', 'ICCCM', 'ICE', 'KeySyms', 'LBX', 'PEX', 'Protocol', 'RandR', 'Record', 'Render', 'Security', 'Session', 'Shape', 'Sync', 'XC-MISC', 'XDMCP', 'XIE', 'XInput', 'XKB', 'XLFD', 'XLib', 'Xt', 'XTEST' ];
+  vers[107] = ['X11R6.6' ];
+  cpts[108] = ['General', 'XTS' ];
+  vers[108] = ['unspecified' ];
+
+/*
+ * doOnSelectProduct determines which selection should get updated 
+ *
+ * - selectmode = 0  - init
+ *   selectmode = 1  - classification selected
+ *   selectmode = 2  - product selected
+ *
+ * globals:
+ *   queryform - string holding the name of the selection form
+ */
+function doOnSelectProduct(selectmode) {
+    var f = document.forms[queryform];
+    var milestone = (typeof(f.target_milestone) == "undefined" ? 
+                                               null : f.target_milestone);
+    if (selectmode == 0) {
+        // If there is no classification selected, give us a chance to fill
+        // the select fields with values from the possibly selected product.
+        if (useclassification && f.classification.selectedIndex > -1) {
+            selectClassification(f.classification, f.product, f.component, f.version, milestone);
+        } else {
+            selectProduct(f.product, f.component, f.version, milestone, null);
+        }
+    } else if (selectmode == 1) {
+        selectClassification(f.classification, f.product, f.component, f.version, milestone);
+    } else {
+        selectProduct(f.product, f.component, f.version, milestone, null);
+    }
+}
+
+</script>
+
+
+
+<input name="query_format" value="advanced" type="hidden">
+
+
+
+<table>
+  <tbody><tr>
+    <th align="right">
+      <label for="short_desc" accesskey="s"><u>S</u>ummary</label>:
+    </th>
+    <td><select name="short_desc_type">
+    <option selected="selected" value="allwordssubstr">contains all of the strings</option>
+    <option value="anywordssubstr">contains any of the strings</option>
+    <option value="substring">contains the string</option>
+    <option value="casesubstring">contains the string (exact case)</option>
+    <option value="allwords">contains all of the words</option>
+    <option value="anywords">contains any of the words</option>
+    <option value="regexp">matches regular expression</option>
+    <option value="notregexp">does not match regular expression</option>
+</select>
+    </td>
+    <td>
+      <input name="short_desc" id="short_desc" size="40">
+      <script type="text/javascript"> <!--
+          document.forms[queryform].short_desc.focus(); 
+      // -->
+      </script>
+    </td>
+    <td>
+        <input id="Search_top" value="Search" type="submit">
+    </td>
+  </tr>
+
+
+  <tr>
+    <td colspan="4">
+      <table>
+        <tbody><tr>
+          <td valign="top">
+            <table>
+              <tbody><tr valign="bottom">
+                <th align="left">
+                  <label for="product" accesskey="p"><u>P</u>roduct</label>:
+                </th>
+              </tr>
+              <tr valign="top">
+                
+                <td align="left">
+                  <select name="product" multiple="multiple" size="5" id="product" onchange="doOnSelectProduct(2);">
+                      <option value="accountsservice">accountsservice</option>
+                      <option value="apoc">apoc</option>
+                      <option value="at-spi2">at-spi2</option>
+                      <option value="avahi">avahi</option>
+                      <option value="burn">burn</option>
+                      <option value="cairo">cairo</option>
+                      <option value="cairo-java">cairo-java</option>
+                      <option value="cairomm">cairomm</option>
+                      <option value="ccss">ccss</option>
+                      <option value="ConsoleKit">ConsoleKit</option>
+                      <option value="create">create</option>
+                      <option value="cups-pk-helper">cups-pk-helper</option>
+                      <option value="dbus">dbus</option>
+                      <option value="Debrix">Debrix</option>
+                      <option value="DejaVu">DejaVu</option>
+                      <option value="desktop-file-utils">desktop-file-utils</option>
+                      <option value="DeviceKit">DeviceKit</option>
+                      <option value="dolt">dolt</option>
+                      <option value="DRI">DRI</option>
+                      <option value="exempi">exempi</option>
+                      <option value="Farsight">Farsight</option>
+                      <option value="fontconfig">fontconfig</option>
+                      <option value="freedesktop.org">freedesktop.org</option>
+                      <option value="freedrtools">freedrtools</option>
+                      <option value="freetype">freetype</option>
+                      <option value="FriBidi">FriBidi</option>
+                      <option value="Galago">Galago</option>
+                      <option value="GeoClue">GeoClue</option>
+                      <option value="ghns">ghns</option>
+                      <option value="GLU3">GLU3</option>
+                      <option value="gstreamer">gstreamer</option>
+                      <option value="GTK-Qt Engine">GTK-Qt Engine</option>
+                      <option value="guile-cairo">guile-cairo</option>
+                      <option value="Gypsy">Gypsy</option>
+                      <option value="hal">hal</option>
+                      <option value="HarfBuzz">HarfBuzz</option>
+                      <option value="Hieroglyph">Hieroglyph</option>
+                      <option value="Icon theme">Icon theme</option>
+                      <option value="LDTP">LDTP</option>
+                      <option value="libasyncns">libasyncns</option>
+                      <option value="libatasmart">libatasmart</option>
+                      <option value="libbsd">libbsd</option>
+                      <option value="libcanberra">libcanberra</option>
+                      <option value="libdlo">libdlo</option>
+                      <option value="libfprint">libfprint</option>
+                      <option value="libjpeg">libjpeg</option>
+                      <option value="liboil">liboil</option>
+                      <option value="libopenraw">libopenraw</option>
+                      <option value="LibreOffice">LibreOffice</option>
+                      <option value="libspectre">libspectre</option>
+                      <option value="libxklavier">libxklavier</option>
+                      <option value="LTSP">LTSP</option>
+                      <option value="media-player-info">media-player-info</option>
+                      <option value="Mesa">Mesa</option>
+                      <option value="nice">nice</option>
+                      <option value="nickle">nickle</option>
+                      <option value="OHM">OHM</option>
+                      <option value="openclipart.org">openclipart.org</option>
+                      <option value="openfontlibrary">openfontlibrary</option>
+                      <option value="Orc">Orc</option>
+                      <option value="PackageKit">PackageKit</option>
+                      <option value="papyon">papyon</option>
+                      <option value="piglit">piglit</option>
+                      <option value="pixman">pixman</option>
+                      <option value="pkg-config">pkg-config</option>
+                      <option value="plymouth">plymouth</option>
+                      <option value="pm-utils">pm-utils</option>
+                      <option value="PolicyKit">PolicyKit</option>
+                      <option value="poppler">poppler</option>
+                      <option value="Portland">Portland</option>
+                      <option value="pycairo">pycairo</option>
+                      <option value="python-geoclue">python-geoclue</option>
+                      <option value="PyXDG">PyXDG</option>
+                      <option value="Rarian">Rarian</option>
+                      <option value="roadster">roadster</option>
+                      <option value="scim">scim</option>
+                      <option value="Scratchbox 2">Scratchbox 2</option>
+                      <option value="shared-desktop-ontologies">shared-desktop-ontologies</option>
+                      <option value="shared-mime-info">shared-mime-info</option>
+                      <option value="Spam">Spam</option>
+                      <option value="Specifications">Specifications</option>
+                      <option value="Spice">Spice</option>
+                      <option value="STSF">STSF</option>
+                      <option value="swfdec">swfdec</option>
+                      <option value="system-tools-backends">system-tools-backends</option>
+                      <option value="systemd">systemd</option>
+                      <option value="tango">tango</option>
+                      <option value="Telepathy">Telepathy</option>
+                      <option value="tinderbox">tinderbox</option>
+                      <option value="udisks">udisks</option>
+                      <option value="UIM">UIM</option>
+                      <option value="Wocky">Wocky</option>
+                      <option value="xapps">xapps</option>
+                      <option value="XCB">XCB</option>
+                      <option value="Xcursor">Xcursor</option>
+                      <option value="xcursorgen">xcursorgen</option>
+                      <option value="xdg-sound-theme">xdg-sound-theme</option>
+                      <option value="xdg-user-dirs">xdg-user-dirs</option>
+                      <option value="xdgmime">xdgmime</option>
+                      <option value="xesam">xesam</option>
+                      <option value="Xft">Xft</option>
+                      <option value="xkeyboard-config">xkeyboard-config</option>
+                      <option value="xlibs">xlibs</option>
+                      <option value="xorg">xorg</option>
+                      <option value="xprint">xprint</option>
+                      <option value="Xrender">Xrender</option>
+                      <option value="xserver">xserver</option>
+                      <option value="XStandards">XStandards</option>
+                      <option value="Xtests">Xtests</option>
+                  </select>
+                </td>
+              </tr>
+            </tbody></table>
+          </td>
+          <td valign="top">
+            <table>
+              <tbody><tr valign="bottom">
+                <th align="left">
+                  <label for="component" accesskey="m"><a href="https://bugzilla.freedesktop.org/describecomponents.cgi";>Co<u>m</u>ponent</a></label>:
+                </th>
+              </tr>
+              <tr valign="top">
+                
+                <td align="left">
+                  <select name="component" id="component" multiple="multiple" size="5">
+                      <option value="* Other">* Other</option>
+                      <option value="A11y test suite">A11y test suite</option>
+                      <option value="Acceleration/EXA">Acceleration/EXA</option>
+                      <option value="Acceleration/XAA">Acceleration/XAA</option>
+                      <option value="Acceleration/XGL">Acceleration/XGL</option>
+                      <option value="Account Modification Requests">Account Modification Requests</option>
+                      <option value="Administration">Administration</option>
+                      <option value="App/appres">App/appres</option>
+                      <option value="App/bdftopcf">App/bdftopcf</option>
+                      <option value="App/compiz">App/compiz</option>
+                      <option value="App/glxgears">App/glxgears</option>
+                      <option value="App/glxinfo">App/glxinfo</option>
+                      <option value="App/lbxproxy">App/lbxproxy</option>
+                      <option value="App/other">App/other</option>
+                      <option value="App/twm">App/twm</option>
+                      <option value="App/xdm">App/xdm</option>
+                      <option value="App/xedit">App/xedit</option>
+                      <option value="App/xkbcomp">App/xkbcomp</option>
+                      <option value="App/xman">App/xman</option>
+                      <option value="App/xoo">App/xoo</option>
+                      <option value="App/xorgcfg">App/xorgcfg</option>
+                      <option value="App/xorgconfig">App/xorgconfig</option>
+                      <option value="App/xrandr">App/xrandr</option>
+                      <option value="App/xresponse">App/xresponse</option>
+                      <option value="App/xset">App/xset</option>
+                      <option value="App/xterm">App/xterm</option>
+                      <option value="Application support: Eclipse">Application support: Eclipse</option>
+                      <option value="Application support: GTK+/Gnome">Application support: GTK+/Gnome</option>
+                      <option value="Application support: JAVA">Application support: JAVA</option>
+                      <option value="Application support: Mozilla">Application support: Mozilla</option>
+                      <option value="Application support: Other">Application support: Other</option>
+                      <option value="Application support: Qt/KDE">Application support: Qt/KDE</option>
+                      <option value="Application support: Xt/Athena">Application support: Xt/Athena</option>
+                      <option value="Application support: Xt/Motif/CDE">Application support: Xt/Motif/CDE</option>
+                      <option value="BDF">BDF</option>
+                      <option value="Backends">Backends</option>
+                      <option value="BigReq">BigReq</option>
+                      <option value="Bugzilla">Bugzilla</option>
+                      <option value="Build">Build</option>
+                      <option value="Build config">Build config</option>
+                      <option value="C code">C code</option>
+                      <option value="CVS">CVS</option>
+                      <option value="Client library: Other">Client library: Other</option>
+                      <option value="Client library: XpExtension library">Client library: XpExtension library</option>
+                      <option value="Client library: XprintUtil library">Client library: XprintUtil library</option>
+                      <option value="Core">Core</option>
+                      <option value="Core: Other">Core: Other</option>
+                      <option value="Core: libscim">Core: libscim</option>
+                      <option value="DAPI">DAPI</option>
+                      <option value="DBE">DBE</option>
+                      <option value="DDX/cygwin">DDX/cygwin</option>
+                      <option value="DDX/darwin">DDX/darwin</option>
+                      <option value="DDX/dmx">DDX/dmx</option>
+                      <option value="DDX/vfb">DDX/vfb</option>
+                      <option value="DDX/xnest">DDX/xnest</option>
+                      <option value="DDX/xorg">DDX/xorg</option>
+                      <option value="DRM/Intel">DRM/Intel</option>
+                      <option value="DRM/Radeon">DRM/Radeon</option>
+                      <option value="DRM/Via">DRM/Via</option>
+                      <option value="DRM/other">DRM/other</option>
+                      <option value="Daemon">Daemon</option>
+                      <option value="Demos">Demos</option>
+                      <option value="Desktop daemon">Desktop daemon</option>
+                      <option value="DeviceKit">DeviceKit</option>
+                      <option value="DeviceKit-disks">DeviceKit-disks</option>
+                      <option value="DeviceKit-power">DeviceKit-power</option>
+                      <option value="Devices">Devices</option>
+                      <option value="Docs">Docs</option>
+                      <option value="Docs/other">Docs/other</option>
+                      <option value="Documentation">Documentation</option>
+                      <option value="Documentation: FAQ">Documentation: FAQ</option>
+                      <option value="Documentation: Manual pages (manpages)">Documentation: Manual pages (manpages)</option>
+                      <option value="Documentation: Other">Documentation: Other</option>
+                      <option value="Driver / ATI">Driver / ATI</option>
+                      <option value="Driver / TDFX">Driver / TDFX</option>
+                      <option value="Driver/ASpeed">Driver/ASpeed</option>
+                      <option value="Driver/Neomagic">Driver/Neomagic</option>
+                      <option value="Driver/Radeon">Driver/Radeon</option>
+                      <option value="Driver/SiS">Driver/SiS</option>
+                      <option value="Driver/Trident">Driver/Trident</option>
+                      <option value="Driver/Tseng Labs">Driver/Tseng Labs</option>
+                      <option value="Driver/VGA">Driver/VGA</option>
+                      <option value="Driver/VMWare">Driver/VMWare</option>
+                      <option value="Driver/Vesa">Driver/Vesa</option>
+                      <option value="Driver/Via">Driver/Via</option>
+                      <option value="Driver/Voodoo">Driver/Voodoo</option>
+                      <option value="Driver/XGI">Driver/XGI</option>
+                      <option value="Driver/apm">Driver/apm</option>
+                      <option value="Driver/ark">Driver/ark</option>
+                      <option value="Driver/avivo">Driver/avivo</option>
+                      <option value="Driver/chips">Driver/chips</option>
+                      <option value="Driver/cirrus">Driver/cirrus</option>
+                      <option value="Driver/cyrix">Driver/cyrix</option>
+                      <option value="Driver/fbdev">Driver/fbdev</option>
+                      <option value="Driver/fglrx">Driver/fglrx</option>
+                      <option value="Driver/geode">Driver/geode</option>
+                      <option value="Driver/glide">Driver/glide</option>
+                      <option value="Driver/glint">Driver/glint</option>
+                      <option value="Driver/i128">Driver/i128</option>
+                      <option value="Driver/i740">Driver/i740</option>
+                      <option value="Driver/imstt">Driver/imstt</option>
+                      <option value="Driver/intel">Driver/intel</option>
+                      <option value="Driver/mach64">Driver/mach64</option>
+                      <option value="Driver/mga">Driver/mga</option>
+                      <option value="Driver/nVidia (open)">Driver/nVidia (open)</option>
+                      <option value="Driver/nVidia (proprietary)">Driver/nVidia (proprietary)</option>
+                      <option value="Driver/newport">Driver/newport</option>
+                      <option value="Driver/nouveau">Driver/nouveau</option>
+                      <option value="Driver/nsc">Driver/nsc</option>
+                      <option value="Driver/other">Driver/other</option>
+                      <option value="Driver/p690">Driver/p690</option>
+                      <option value="Driver/radeonhd">Driver/radeonhd</option>
+                      <option value="Driver/rage128">Driver/rage128</option>
+                      <option value="Driver/rendition">Driver/rendition</option>
+                      <option value="Driver/s3">Driver/s3</option>
+                      <option value="Driver/s3virge">Driver/s3virge</option>
+                      <option value="Driver/savage">Driver/savage</option>
+                      <option value="Driver/siliconmotion">Driver/siliconmotion</option>
+                      <option value="Driver/tdfx">Driver/tdfx</option>
+                      <option value="Driver/tga">Driver/tga</option>
+                      <option value="Drivers/DRI/FFB">Drivers/DRI/FFB</option>
+                      <option value="Drivers/DRI/Gamma">Drivers/DRI/Gamma</option>
+                      <option value="Drivers/DRI/MGA">Drivers/DRI/MGA</option>
+                      <option value="Drivers/DRI/Mach64">Drivers/DRI/Mach64</option>
+                      <option value="Drivers/DRI/R600">Drivers/DRI/R600</option>
+                      <option value="Drivers/DRI/Radeon">Drivers/DRI/Radeon</option>
+                      <option value="Drivers/DRI/S3V">Drivers/DRI/S3V</option>
+                      <option value="Drivers/DRI/Savage">Drivers/DRI/Savage</option>
+                      <option value="Drivers/DRI/SiS">Drivers/DRI/SiS</option>
+                      <option value="Drivers/DRI/TDFX">Drivers/DRI/TDFX</option>
+                      <option value="Drivers/DRI/Trident">Drivers/DRI/Trident</option>
+                      <option value="Drivers/DRI/Unichrome">Drivers/DRI/Unichrome</option>
+                      <option value="Drivers/DRI/i810">Drivers/DRI/i810</option>
+                      <option value="Drivers/DRI/i830">Drivers/DRI/i830</option>
+                      <option value="Drivers/DRI/i915">Drivers/DRI/i915</option>
+                      <option value="Drivers/DRI/i965">Drivers/DRI/i965</option>
+                      <option value="Drivers/DRI/nouveau">Drivers/DRI/nouveau</option>
+                      <option value="Drivers/DRI/r128">Drivers/DRI/r128</option>
+                      <option value="Drivers/DRI/r200">Drivers/DRI/r200</option>
+                      <option value="Drivers/DRI/r300">Drivers/DRI/r300</option>
+                      <option value="Drivers/Gallium/i915g">Drivers/Gallium/i915g</option>
+                      <option value="Drivers/Gallium/r300">Drivers/Gallium/r300</option>
+                      <option value="Drivers/Gallium/r600">Drivers/Gallium/r600</option>
+                      <option value="Drivers/Glide">Drivers/Glide</option>
+                      <option value="Drivers/X11">Drivers/X11</option>
+                      <option value="Editor">Editor</option>
+                      <option value="Experimental fonts">Experimental fonts</option>
+                      <option value="Extensions/DRI">Extensions/DRI</option>
+                      <option value="Font/XFS">Font/XFS</option>
+                      <option value="FontService">FontService</option>
+                      <option value="Fonts">Fonts</option>
+                      <option value="Fonts/BDF">Fonts/BDF</option>
+                      <option value="Fonts/doc">Fonts/doc</option>
+                      <option value="Fonts/other">Fonts/other</option>
+                      <option value="Fonts: Other">Fonts: Other</option>
+                      <option value="FrontEnd: Core">FrontEnd: Core</option>
+                      <option value="FrontEnd: GTK IMModule">FrontEnd: GTK IMModule</option>
+                      <option value="FrontEnd: Other">FrontEnd: Other</option>
+                      <option value="FrontEnd: QT IMModule">FrontEnd: QT IMModule</option>
+                      <option value="FrontEnd: XIM">FrontEnd: XIM</option>
+                      <option value="GLU">GLU</option>
+                      <option value="GLUT">GLUT</option>
+                      <option value="GLX">GLX</option>
+                      <option value="GLib">GLib</option>
+                      <option value="GStreamer Elements">GStreamer Elements</option>
+                      <option value="GTK-Qt">GTK-Qt</option>
+                      <option value="General">General</option>
+                      <option value="Glib">Glib</option>
+                      <option value="I18N">I18N</option>
+                      <option value="ICCCM">ICCCM</option>
+                      <option value="ICE">ICE</option>
+                      <option value="IM: Other IMs">IM: Other IMs</option>
+                      <option value="IMEngine: Core">IMEngine: Core</option>
+                      <option value="IMEngine: Generic Table">IMEngine: Generic Table</option>
+                      <option value="IMEngine: M17N">IMEngine: M17N</option>
+                      <option value="IMEngine: Other">IMEngine: Other</option>
+                      <option value="IMEngine: Smart Pinyin">IMEngine: Smart Pinyin</option>
+                      <option value="IMEngine: UIM">IMEngine: UIM</option>
+                      <option value="Input / Keyboard">Input / Keyboard</option>
+                      <option value="Input / Mouse">Input / Mouse</option>
+                      <option value="Input/Citron">Input/Citron</option>
+                      <option value="Input/Core">Input/Core</option>
+                      <option value="Input/Keyboard">Input/Keyboard</option>
+                      <option value="Input/Mouse">Input/Mouse</option>
+                      <option value="Input/XKB">Input/XKB</option>
+                      <option value="Input/acecad">Input/acecad</option>
+                      <option value="Input/aiptek">Input/aiptek</option>
+                      <option value="Input/calcomp">Input/calcomp</option>
+                      <option value="Input/digitaledge">Input/digitaledge</option>
+                      <option value="Input/dmc">Input/dmc</option>
+                      <option value="Input/dynapro">Input/dynapro</option>
+                      <option value="Input/elo2300">Input/elo2300</option>
+                      <option value="Input/elographics">Input/elographics</option>
+                      <option value="Input/evdev">Input/evdev</option>
+                      <option value="Input/fpit">Input/fpit</option>
+                      <option value="Input/hyperpen">Input/hyperpen</option>
+                      <option value="Input/jamstudio">Input/jamstudio</option>
+                      <option value="Input/joystick">Input/joystick</option>
+                      <option value="Input/magellan">Input/magellan</option>
+                      <option value="Input/magictouch">Input/magictouch</option>
+                      <option value="Input/microtouch">Input/microtouch</option>
+                      <option value="Input/mutouch">Input/mutouch</option>
+                      <option value="Input/other">Input/other</option>
+                      <option value="Input/palmax">Input/palmax</option>
+                      <option value="Input/penmount">Input/penmount</option>
+                      <option value="Input/sample">Input/sample</option>
+                      <option value="Input/spaceorb">Input/spaceorb</option>
+                      <option value="Input/summa">Input/summa</option>
+                      <option value="Input/synaptics">Input/synaptics</option>
+                      <option value="Input/tek4957">Input/tek4957</option>
+                      <option value="Input/ur98">Input/ur98</option>
+                      <option value="Input/void">Input/void</option>
+                      <option value="Input/wacom">Input/wacom</option>
+                      <option value="Installer">Installer</option>
+                      <option value="KeySyms">KeySyms</option>
+                      <option value="LBX">LBX</option>
+                      <option value="LDTP">LDTP</option>
+                      <option value="LTSP Core">LTSP Core</option>
+                      <option value="Language Bindings">Language Bindings</option>
+                      <option value="Lib/Freetype2">Lib/Freetype2</option>
+                      <option value="Lib/GLX">Lib/GLX</option>
+                      <option value="Lib/ICE">Lib/ICE</option>
+                      <option value="Lib/Xau">Lib/Xau</option>
+                      <option value="Lib/Xaw">Lib/Xaw</option>
+                      <option value="Lib/Xcursor">Lib/Xcursor</option>
+                      <option value="Lib/Xext">Lib/Xext</option>
+                      <option value="Lib/Xft">Lib/Xft</option>
+                      <option value="Lib/Xi">Lib/Xi</option>
+                      <option value="Lib/Xlib">Lib/Xlib</option>
+                      <option value="Lib/Xlib (data)">Lib/Xlib (data)</option>
+                      <option value="Lib/Xmu">Lib/Xmu</option>
+                      <option value="Lib/Xpm">Lib/Xpm</option>
+                      <option value="Lib/Xrender">Lib/Xrender</option>
+                      <option value="Lib/Xt">Lib/Xt</option>
+                      <option value="Lib/font">Lib/font</option>
+                      <option value="Lib/other">Lib/other</option>
+                      <option value="Lib/xtrans">Lib/xtrans</option>
+                      <option value="Lib/zlib">Lib/zlib</option>
+                      <option value="Library">Library</option>
+                      <option value="Loader / dlloader">Loader / dlloader</option>
+                      <option value="Loader / elfloader">Loader / elfloader</option>
+                      <option value="Mailing lists">Mailing lists</option>
+                      <option value="Master Server">Master Server</option>
+                      <option value="Mesa core">Mesa core</option>
+                      <option value="Metadata Storage Specification">Metadata Storage Specification</option>
+                      <option value="Misc">Misc</option>
+                      <option value="Modular build system">Modular build system</option>
+                      <option value="Mono Sans">Mono Sans</option>
+                      <option value="Monolithic build system">Monolithic build system</option>
+                      <option value="New Accounts">New Accounts</option>
+                      <option value="New device">New device</option>
+                      <option value="Nickle code">Nickle code</option>
+                      <option value="Ontology">Ontology</option>
+                      <option value="Orc">Orc</option>
+                      <option value="Other">Other</option>
+                      <option value="PAM module">PAM module</option>
+                      <option value="PEX">PEX</option>
+                      <option value="Panel: Core">Panel: Core</option>
+                      <option value="Panel: scim-panel-gtk">Panel: scim-panel-gtk</option>
+                      <option value="Panel: scim-panel-kde (skim)">Panel: scim-panel-kde (skim)</option>
+                      <option value="Policy API">Policy API</option>
+                      <option value="Portland">Portland</option>
+                      <option value="Problems">Problems</option>
+                      <option value="Project Creation Requests">Project Creation Requests</option>
+                      <option value="Protocol">Protocol</option>
+                      <option value="Protocol headers">Protocol headers</option>
+                      <option value="Protocol/Core">Protocol/Core</option>
+                      <option value="PyLDTP">PyLDTP</option>
+                      <option value="PyXDG">PyXDG</option>
+                      <option value="Python CLI">Python CLI</option>
+                      <option value="QT">QT</option>
+                      <option value="Qt">Qt</option>
+                      <option value="RTP Plugin">RTP Plugin</option>
+                      <option value="RandR">RandR</option>
+                      <option value="Raw UDP transmitter">Raw UDP transmitter</option>
+                      <option value="Record">Record</option>
+                      <option value="Release">Release</option>
+                      <option value="Render">Render</option>
+                      <option value="SPI">SPI</option>
+                      <option value="ST: Applications">ST: Applications</option>
+                      <option value="ST: Build config">ST: Build config</option>
+                      <option value="ST: Drop-in Objects">ST: Drop-in Objects</option>
+                      <option value="ST: Font Server">ST: Font Server</option>
+                      <option value="ST: Libraries (libST.so and libstsf.so)">ST: Libraries (libST.so and libstsf.so)</option>
+                      <option value="ST: Other">ST: Other</option>
+                      <option value="Sans">Sans</option>
+                      <option value="Search Specification">Search Specification</option>
+                      <option value="Security">Security</option>
+                      <option value="Serif">Serif</option>
+                      <option value="Server/general">Server/general</option>
+                      <option value="Server: Config: model-configs">Server: Config: model-configs</option>
+                      <option value="Server: Config: other">Server: Config: other</option>
+                      <option value="Server: Config: startup scripts">Server: Config: startup scripts</option>
+                      <option value="Server: DDX: PCL">Server: DDX: PCL</option>
+                      <option value="Server: DDX: PCL-mono">Server: DDX: PCL-mono</option>
+                      <option value="Server: DDX: PDF">Server: DDX: PDF</option>
+                      <option value="Server: DDX: PostScript">Server: DDX: PostScript</option>
+                      <option value="Server: DDX: Raster">Server: DDX: Raster</option>
+                      <option value="Server: DDX: SVG">Server: DDX: SVG</option>
+                      <option value="Server: DDX: Windows">Server: DDX: Windows</option>
+                      <option value="Server: DDX: other">Server: DDX: other</option>
+                      <option value="Server: Extensions: Other">Server: Extensions: Other</option>
+                      <option value="Server: Extensions: XpExtension">Server: Extensions: XpExtension</option>
+                      <option value="Server: Font engine: FreeType">Server: Font engine: FreeType</option>
+                      <option value="Server: Font engine: Other">Server: Font engine: Other</option>
+                      <option value="Server: Font engine: PMF">Server: Font engine: PMF</option>
+                      <option value="Server: Font engine: PS Type1">Server: Font engine: PS Type1</option>
+                      <option value="Server: Font engine: STSF">Server: Font engine: STSF</option>
+                      <option value="Server: Font engine: TrueType">Server: Font engine: TrueType</option>
+                      <option value="Server: Other">Server: Other</option>
+                      <option value="Server: Spooler support: CUPS">Server: Spooler support: CUPS</option>
+                      <option value="Server: Spooler support: LPRng">Server: Spooler support: LPRng</option>
+                      <option value="Server: Spooler support: Other">Server: Spooler support: Other</option>
+                      <option value="Session">Session</option>
+                      <option value="Shape">Shape</option>
+                      <option value="Shared Tools">Shared Tools</option>
+                      <option value="Site: Other">Site: Other</option>
+                      <option value="Site: xprint.freedesktop.org WWW pages">Site: xprint.freedesktop.org WWW pages</option>
+                      <option value="Site: xprint.mozdev.org WWW pages">Site: xprint.mozdev.org WWW pages</option>
+                      <option value="Sync">Sync</option>
+                      <option value="Templates">Templates</option>
+                      <option value="Tinderbox">Tinderbox</option>
+                      <option value="Tools: Other">Tools: Other</option>
+                      <option value="Tools: xphelloworld">Tools: xphelloworld</option>
+                      <option value="Tools: xplsprinters">Tools: xplsprinters</option>
+                      <option value="Tools: xpppdtomodelconfig">Tools: xpppdtomodelconfig</option>
+                      <option value="Tools: xptest">Tools: xptest</option>
+                      <option value="Tracking">Tracking</option>
+                      <option value="Translation">Translation</option>
+                      <option value="Two">Two</option>
+                      <option value="Unspecified">Unspecified</option>
+                      <option value="Utils">Utils</option>
+                      <option value="Website">Website</option>
+                      <option value="Wiki">Wiki</option>
+                      <option value="XC-MISC">XC-MISC</option>
+                      <option value="XDMCP">XDMCP</option>
+                      <option value="XIE">XIE</option>
+                      <option value="XInput">XInput</option>
+                      <option value="XKB">XKB</option>
+                      <option value="XLFD">XLFD</option>
+                      <option value="XLib">XLib</option>
+                      <option value="XST: Applications">XST: Applications</option>
+                      <option value="XST: Build config">XST: Build config</option>
+                      <option value="XST: Other">XST: Other</option>
+                      <option value="XST: X Client Library">XST: X Client Library</option>
+                      <option value="XST: X Server Extension">XST: X Server Extension</option>
+                      <option value="XST: XLFD bridge">XST: XLFD bridge</option>
+                      <option value="XST: Xft bridge">XST: Xft bridge</option>
+                      <option value="XTEST">XTEST</option>
+                      <option value="XTS">XTS</option>
+                      <option value="Xephyr">Xephyr</option>
+                      <option value="Xt">Xt</option>
+                      <option value="account">account</option>
+                      <option value="all-but-hw">all-but-hw</option>
+                      <option value="appmap">appmap</option>
+                      <option value="appres">appres</option>
+                      <option value="arthur backend">arthur backend</option>
+                      <option value="atk">atk</option>
+                      <option value="avahi-daemon">avahi-daemon</option>
+                      <option value="backend-apt">backend-apt</option>
+                      <option value="backend-conary">backend-conary</option>
+                      <option value="backend-yum">backend-yum</option>
+                      <option value="backend-zypp">backend-zypp</option>
+                      <option value="base">base</option>
+                      <option value="bdftopcf">bdftopcf</option>
+                      <option value="beos backend">beos backend</option>
+                      <option value="bidi">bidi</option>
+                      <option value="bridge: GTK+">bridge: GTK+</option>
+                      <option value="bridge: Qt">bridge: Qt</option>
+                      <option value="bridge: XIM">bridge: XIM</option>
+                      <option value="bridge: fep">bridge: fep</option>
+                      <option value="build">build</option>
+                      <option value="build infrastructure">build infrastructure</option>
+                      <option value="butterfly">butterfly</option>
+                      <option value="cairo backend">cairo backend</option>
+                      <option value="canvas">canvas</option>
+                      <option value="client">client</option>
+                      <option value="client-library">client-library</option>
+                      <option value="clipart">clipart</option>
+                      <option value="cmdline">cmdline</option>
+                      <option value="cohoba">cohoba</option>
+                      <option value="conf">conf</option>
+                      <option value="contrib">contrib</option>
+                      <option value="core">core</option>
+                      <option value="core library">core library</option>
+                      <option value="cpp frontend">cpp frontend</option>
+                      <option value="cvs">cvs</option>
+                      <option value="daemon">daemon</option>
+                      <option value="datatables">datatables</option>
+                      <option value="default">default</option>
+                      <option value="desktop-entry">desktop-entry</option>
+                      <option value="detection">detection</option>
+                      <option value="directfb backend">directfb backend</option>
+                      <option value="dms">dms</option>
+                      <option value="doc">doc</option>
+                      <option value="docs">docs</option>
+                      <option value="echobot">echobot</option>
+                      <option value="editres">editres</option>
+                      <option value="eds-feed">eds-feed</option>
+                      <option value="fargo">fargo</option>
+                      <option value="fc-cache">fc-cache</option>
+                      <option value="fc-cat">fc-cat</option>
+                      <option value="fc-list">fc-list</option>
+                      <option value="fc-match">fc-match</option>
+                      <option value="fdclock">fdclock</option>
+                      <option value="fprintd">fprintd</option>
+                      <option value="freedesktop.org.xml">freedesktop.org.xml</option>
+                      <option value="freedrtools">freedrtools</option>
+                      <option value="freetype font backend">freetype font backend</option>
+                      <option value="fslsfonts">fslsfonts</option>
+                      <option value="fstobdf">fstobdf</option>
+                      <option value="gabble">gabble</option>
+                      <option value="gaim-galago">gaim-galago</option>
+                      <option value="galago-daemon">galago-daemon</option>
+                      <option value="galago-gtk-sharp">galago-gtk-sharp</option>
+                      <option value="galago-sharp">galago-sharp</option>
+                      <option value="general">general</option>
+                      <option value="generic">generic</option>
+                      <option value="generic Scheme codes">generic Scheme codes</option>
+                      <option value="gl backend">gl backend</option>
+                      <option value="glib frontend">glib frontend</option>
+                      <option value="gnome-presence-applet">gnome-presence-applet</option>
+                      <option value="hal-info">hal-info</option>
+                      <option value="hald">hald</option>
+                      <option value="handhelds">handhelds</option>
+                      <option value="haze">haze</option>
+                      <option value="helper: Candidate window">helper: Candidate window</option>
+                      <option value="helper: dict">helper: dict</option>
+                      <option value="helper: others">helper: others</option>
+                      <option value="helper: pref">helper: pref</option>
+                      <option value="helper: toolbar">helper: toolbar</option>
+                      <option value="hicolor">hicolor</option>
+                      <option value="iceauth">iceauth</option>
+                      <option value="icon theme">icon theme</option>
+                      <option value="idle">idle</option>
+                      <option value="image backend">image backend</option>
+                      <option value="imake">imake</option>
+                      <option value="infrastructure">infrastructure</option>
+                      <option value="init">init</option>
+                      <option value="java">java</option>
+                      <option value="joining">joining</option>
+                      <option value="kdrive">kdrive</option>
+                      <option value="ldtprecord">ldtprecord</option>
+                      <option value="ldtprunner">ldtprunner</option>
+                      <option value="libGL">libGL</option>
+                      <option value="libICE">libICE</option>
+                      <option value="libSM">libSM</option>
+                      <option value="libX11">libX11</option>
+                      <option value="libXRes">libXRes</option>
+                      <option value="libXau">libXau</option>
+                      <option value="libXaw">libXaw</option>
+                      <option value="libXcomposite">libXcomposite</option>
+                      <option value="libXcursor">libXcursor</option>
+                      <option value="libXdamage">libXdamage</option>
+                      <option value="libXdmcp">libXdmcp</option>
+                      <option value="libXext">libXext</option>
+                      <option value="libXfixes">libXfixes</option>
+                      <option value="libXfont">libXfont</option>
+                      <option value="libXi">libXi</option>
+                      <option value="libXmu">libXmu</option>
+                      <option value="libXpm">libXpm</option>
+                      <option value="libXrandr">libXrandr</option>
+                      <option value="libXrender">libXrender</option>
+                      <option value="libXt">libXt</option>
+                      <option value="libXtrans">libXtrans</option>
+                      <option value="libXv">libXv</option>
+                      <option value="libXvMC">libXvMC</option>
+                      <option value="libavahi">libavahi</option>
+                      <option value="libavahi-core">libavahi-core</option>
+                      <option value="libbsd">libbsd</option>
+                      <option value="libck-connector">libck-connector</option>
+                      <option value="libdrm">libdrm</option>
+                      <option value="libfprint">libfprint</option>
+                      <option value="libgalago">libgalago</option>
+                      <option value="libgalago-gtk">libgalago-gtk</option>
+                      <option value="libglx">libglx</option>
+                      <option value="libhal">libhal</option>
+                      <option value="libjingle transmitter">libjingle transmitter</option>
+                      <option value="libjpeg">libjpeg</option>
+                      <option value="libjpeg-progs">libjpeg-progs</option>
+                      <option value="libnotify">libnotify</option>
+                      <option value="libpciaccess">libpciaccess</option>
+                      <option value="libpixman">libpixman</option>
+                      <option value="libpolkit">libpolkit</option>
+                      <option value="library">library</option>
+                      <option value="libreoffice">libreoffice</option>
+                      <option value="libsb2">libsb2</option>
+                      <option value="libtelepathy">libtelepathy</option>
+                      <option value="libuim">libuim</option>
+                      <option value="libuim: Scheme interpreter">libuim: Scheme interpreter</option>
+                      <option value="linux-md">linux-md</option>
+                      <option value="listres">listres</option>
+                      <option value="local devices">local devices</option>
+                      <option value="logger">logger</option>
+                      <option value="ltspcfg">ltspcfg</option>
+                      <option value="luit">luit</option>
+                      <option value="luks">luks</option>
+                      <option value="m5-account-plugins">m5-account-plugins</option>
+                      <option value="mappings">mappings</option>
+                      <option value="misc">misc</option>
+                      <option value="mission-control">mission-control</option>
+                      <option value="mkcfm">mkcfm</option>
+                      <option value="mkfontdir">mkfontdir</option>
+                      <option value="mkfontscale">mkfontscale</option>
+                      <option value="nao">nao</option>
+                      <option value="ncal">ncal</option>
+                      <option value="nco">nco</option>
+                      <option value="ndo">ndo</option>
+                      <option value="network">network</option>
+                      <option value="new-ontology">new-ontology</option>
+                      <option value="nexif">nexif</option>
+                      <option value="nfo">nfo</option>
+                      <option value="nid3">nid3</option>
+                      <option value="nie">nie</option>
+                      <option value="nmm">nmm</option>
+                      <option value="nmo">nmo</option>
+                      <option value="notification-daemon">notification-daemon</option>
+                      <option value="nrl">nrl</option>
+                      <option value="nso">nso</option>
+                      <option value="nuao">nuao</option>
+                      <option value="operations">operations</option>
+                      <option value="orth">orth</option>
+                      <option value="packagekit-qt">packagekit-qt</option>
+                      <option value="packagekit-sharp">packagekit-sharp</option>
+                      <option value="papyon">papyon</option>
+                      <option value="pdf backend">pdf backend</option>
+                      <option value="perl">perl</option>
+                      <option value="pimo">pimo</option>
+                      <option value="plugin">plugin</option>
+                      <option value="png functions">png functions</option>
+                      <option value="postscript backend">postscript backend</option>
+                      <option value="protocol">protocol</option>
+                      <option value="pymsn">pymsn</option>
+                      <option value="python">python</option>
+                      <option value="qt backend">qt backend</option>
+                      <option value="qt frontend">qt frontend</option>
+                      <option value="qt4 frontend">qt4 frontend</option>
+                      <option value="quartz backend">quartz backend</option>
+                      <option value="quartz font backend">quartz font backend</option>
+                      <option value="redglass">redglass</option>
+                      <option value="ring">ring</option>
+                      <option value="salut">salut</option>
+                      <option value="script plugin">script plugin</option>
+                      <option value="server">server</option>
+                      <option value="setxkbmap">setxkbmap</option>
+                      <option value="shaping">shaping</option>
+                      <option value="shares">shares</option>
+                      <option value="showfont">showfont</option>
+                      <option value="smproxy">smproxy</option>
+                      <option value="sofiasip">sofiasip</option>
+                      <option value="spec">spec</option>
+                      <option value="splash backend">splash backend</option>
+                      <option value="src">src</option>
+                      <option value="ssh-contact">ssh-contact</option>
+                      <option value="stream-engine">stream-engine</option>
+                      <option value="sunshine">sunshine</option>
+                      <option value="svg backend">svg backend</option>
+                      <option value="test-report">test-report</option>
+                      <option value="tests">tests</option>
+                      <option value="time">time</option>
+                      <option value="tinderclient">tinderclient</option>
+                      <option value="tinderserver">tinderserver</option>
+                      <option value="tools">tools</option>
+                      <option value="tp-doc">tp-doc</option>
+                      <option value="tp-farsight">tp-farsight</option>
+                      <option value="tp-glib">tp-glib</option>
+                      <option value="tp-inspector">tp-inspector</option>
+                      <option value="tp-python">tp-python</option>
+                      <option value="tp-qt4">tp-qt4</option>
+                      <option value="tp-spec">tp-spec</option>
+                      <option value="transset">transset</option>
+                      <option value="trash">trash</option>
+                      <option value="trees">trees</option>
+                      <option value="twm">twm</option>
+                      <option value="unknown">unknown</option>
+                      <option value="users">users</option>
+                      <option value="viewres">viewres</option>
+                      <option value="web">web</option>
+                      <option value="website">website</option>
+                      <option value="whiteglass">whiteglass</option>
+                      <option value="wilde">wilde</option>
+                      <option value="win32 backend">win32 backend</option>
+                      <option value="win32 qxl">win32 qxl</option>
+                      <option value="win32 vd_agent">win32 vd_agent</option>
+                      <option value="win32 vdi_port">win32 vdi_port</option>
+                      <option value="wininfo">wininfo</option>
+                      <option value="www">www</option>
+                      <option value="x11perf">x11perf</option>
+                      <option value="xauth">xauth</option>
+                      <option value="xcb backend">xcb backend</option>
+                      <option value="xcmsdb">xcmsdb</option>
+                      <option value="xcompmgr">xcompmgr</option>
+                      <option value="xcursorgen">xcursorgen</option>
+                      <option value="xdg-utils">xdg-utils</option>
+                      <option value="xdgmime">xdgmime</option>
+                      <option value="xdm">xdm</option>
+                      <option value="xdpyinfo">xdpyinfo</option>
+                      <option value="xev">xev</option>
+                      <option value="xfd">xfd</option>
+                      <option value="xfontsel">xfontsel</option>
+                      <option value="xfs">xfs</option>
+                      <option value="xfsinfo">xfsinfo</option>
+                      <option value="xgamma">xgamma</option>
+                      <option value="xhost">xhost</option>
+                      <option value="xinit">xinit</option>
+                      <option value="xkbcomp">xkbcomp</option>
+                      <option value="xkbprint">xkbprint</option>
+                      <option value="xkbutils">xkbutils</option>
+                      <option value="xkill">xkill</option>
+                      <option value="xlib backend">xlib backend</option>
+                      <option value="xlsatoms">xlsatoms</option>
+                      <option value="xlsclients">xlsclients</option>
+                      <option value="xlsfonts">xlsfonts</option>
+                      <option value="xmodmap">xmodmap</option>
+                      <option value="xping">xping</option>
+                      <option value="xprop">xprop</option>
+                      <option value="xrandr">xrandr</option>
+                      <option value="xrdb">xrdb</option>
+                      <option value="xrefresh">xrefresh</option>
+                      <option value="xset">xset</option>
+                      <option value="xsetmode">xsetmode</option>
+                      <option value="xsetpointer">xsetpointer</option>
+                      <option value="xsetroot">xsetroot</option>
+                      <option value="xsm">xsm</option>
+                      <option value="xterm">xterm</option>
+                      <option value="xvidtune">xvidtune</option>
+                      <option value="xvinfo">xvinfo</option>
+                      <option value="xwininfo">xwininfo</option>
+                      <option value="yafono">yafono</option>
+                  </select>
+                </td>
+              </tr>
+            </tbody></table>
+          </td>
+          <td valign="top">
+            <table>
+              <tbody><tr valign="bottom">
+                <th align="left">
+                  <label for="version">Version</label>:
+                </th>
+              </tr>
+              <tr valign="top"><td align="left">
+    <select name="version" id="version" multiple="multiple" size="5">
+        <option value="0.0.1">0.0.1
+        </option>
+        <option value="0.1.3">0.1.3
+        </option>
+        <option value="0.2.0">0.2.0
+        </option>
+        <option value="0.3.5">0.3.5
+        </option>
+        <option value="0.4">0.4
+        </option>
+        <option value="0.4.5">0.4.5
+        </option>
+        <option value="0.5.0">0.5.0
+        </option>
+        <option value="0.5.1">0.5.1
+        </option>
+        <option value="0.5.2">0.5.2
+        </option>
+        <option value="0.5.3">0.5.3
+        </option>
+        <option value="0.5.4">0.5.4
+        </option>
+        <option value="0.5.5">0.5.5
+        </option>
+        <option value="0.6">0.6
+        </option>
+        <option value="0.6.0">0.6.0
+        </option>
+        <option value="0.6.2">0.6.2
+        </option>
+        <option value="0.6.4">0.6.4
+        </option>
+        <option value="0.6.6">0.6.6
+        </option>
+        <option value="0.7.x">0.7.x
+        </option>
+        <option value="0.8">0.8
+        </option>
+        <option value="0.9">0.9
+        </option>
+        <option value="0.9.3">0.9.3
+        </option>
+        <option value="0.9.91 (1.0-RC1)">0.9.91 (1.0-RC1)
+        </option>
+        <option value="0.9.92 (1.0-RC2)">0.9.92 (1.0-RC2)
+        </option>
+        <option value="0.9.93 (1.0-RC3)">0.9.93 (1.0-RC3)
+        </option>
+        <option value="0.9.x">0.9.x
+        </option>
+        <option value="0.10">0.10
+        </option>
+        <option value="0.10.4">0.10.4
+        </option>
+        <option value="0.11">0.11
+        </option>
+        <option value="0.12">0.12
+        </option>
+        <option value="0.13">0.13
+        </option>
+        <option value="0.14.0">0.14.0
+        </option>
+        <option value="0.16.x">0.16.x
+        </option>
+        <option value="0.18.x">0.18.x
+        </option>
+        <option value="1.0">1.0
+        </option>
+        <option value="1.0.0">1.0.0
+        </option>
+        <option value="1.0.1">1.0.1
+        </option>
+        <option value="1.0.2">1.0.2
+        </option>
+        <option value="1.0.3">1.0.3
+        </option>
+        <option value="1.0.4">1.0.4
+        </option>
+        <option value="1.0.x">1.0.x
+        </option>
+        <option value="1.1">1.1
+        </option>
+        <option value="1.1.0">1.1.0
+        </option>
+        <option value="1.1.0 rc1">1.1.0 rc1
+        </option>
+        <option value="1.1.0 rc2">1.1.0 rc2
+        </option>
+        <option value="1.1.0 rc3">1.1.0 rc3
+        </option>
+        <option value="1.1.1">1.1.1
+        </option>
+        <option value="1.1.2">1.1.2
+        </option>
+        <option value="1.1.3">1.1.3
+        </option>
+        <option value="1.1.4">1.1.4
+        </option>
+        <option value="1.1.5">1.1.5
+        </option>
+        <option value="1.1.6">1.1.6
+        </option>
+        <option value="1.1.7">1.1.7
+        </option>
+        <option value="1.1.8">1.1.8
+        </option>
+        <option value="1.1.9">1.1.9
+        </option>
+        <option value="1.1.10">1.1.10
+        </option>
+        <option value="1.1.11">1.1.11
+        </option>
+        <option value="1.2.0">1.2.0
+        </option>
+        <option value="1.2.1">1.2.1
+        </option>
+        <option value="1.2.2">1.2.2
+        </option>
+        <option value="1.2.3">1.2.3
+        </option>
+        <option value="1.2.4">1.2.4
+        </option>
+        <option value="1.2.5">1.2.5
+        </option>
+        <option value="1.2.6">1.2.6
+        </option>
+        <option value="1.2.7">1.2.7
+        </option>
+        <option value="1.2.x">1.2.x
+        </option>
+        <option value="1.3.2">1.3.2
+        </option>
+        <option value="1.3.4">1.3.4
+        </option>
+        <option value="1.3.5">1.3.5
+        </option>
+        <option value="1.3.6">1.3.6
+        </option>
+        <option value="1.3.7">1.3.7
+        </option>
+        <option value="1.3.8">1.3.8
+        </option>
+        <option value="1.3.9">1.3.9
+        </option>
+        <option value="1.3.10">1.3.10
+        </option>
+        <option value="1.3.11">1.3.11
+        </option>
+        <option value="1.3.12">1.3.12
+        </option>
+        <option value="1.3.13">1.3.13
+        </option>
+        <option value="1.3.14">1.3.14
+        </option>
+        <option value="1.3.15">1.3.15
+        </option>
+        <option value="1.3.16">1.3.16
+        </option>
+        <option value="1.3.17">1.3.17
+        </option>
+        <option value="1.3.x (devel)">1.3.x (devel)
+        </option>
+        <option value="1.4.0">1.4.0
+        </option>
+        <option value="1.4.1">1.4.1
+        </option>
+        <option value="1.4.2">1.4.2
+        </option>
+        <option value="1.4.3">1.4.3
+        </option>
+        <option value="1.4.4">1.4.4
+        </option>
+        <option value="1.4.5">1.4.5
+        </option>
+        <option value="1.4.6">1.4.6
+        </option>
+        <option value="1.4.7">1.4.7
+        </option>
+        <option value="1.4.8">1.4.8
+        </option>
+        <option value="1.4.9">1.4.9
+        </option>
+        <option value="1.4.10">1.4.10
+        </option>
+        <option value="1.4.12">1.4.12
+        </option>
+        <option value="1.4.13">1.4.13
+        </option>
+        <option value="1.4.14">1.4.14
+        </option>
+        <option value="1.4.15">1.4.15
+        </option>
+        <option value="1.4.x">1.4.x
+        </option>
+        <option value="1.5.1">1.5.1
+        </option>
+        <option value="1.5.2">1.5.2
+        </option>
+        <option value="1.5.3">1.5.3
+        </option>
+        <option value="1.5.4">1.5.4
+        </option>
+        <option value="1.5.5">1.5.5
+        </option>
+        <option value="1.5.6">1.5.6
+        </option>
+        <option value="1.5.7">1.5.7
+        </option>
+        <option value="1.5.8">1.5.8
+        </option>
+        <option value="1.5.9">1.5.9
+        </option>
+        <option value="1.5.10">1.5.10
+        </option>
+        <option value="1.5.11">1.5.11
+        </option>
+        <option value="1.5.12">1.5.12
+        </option>
+        <option value="1.5.13">1.5.13
+        </option>
+        <option value="1.5.14">1.5.14
+        </option>
+        <option value="1.5.15">1.5.15
+        </option>
+        <option value="1.5.16">1.5.16
+        </option>
+        <option value="1.5.17">1.5.17
+        </option>
+        <option value="1.5.18">1.5.18
+        </option>
+        <option value="1.5.19">1.5.19
+        </option>
+        <option value="1.5.20">1.5.20
+        </option>
+        <option value="1.5.21">1.5.21
+        </option>
+        <option value="1.6.0">1.6.0
+        </option>
+        <option value="1.6.1">1.6.1
+        </option>
+        <option value="1.6.2">1.6.2
+        </option>
+        <option value="1.6.3">1.6.3
+        </option>
+        <option value="1.6.4">1.6.4
+        </option>
+        <option value="1.6.5">1.6.5
+        </option>
+        <option value="1.7.2">1.7.2
+        </option>
+        <option value="1.7.3">1.7.3
+        </option>
+        <option value="1.7.4">1.7.4
+        </option>
+        <option value="1.7.5">1.7.5
+        </option>
+        <option value="1.7.6">1.7.6
+        </option>
+        <option value="1.7.7">1.7.7
+        </option>
+        <option value="1.8.0">1.8.0
+        </option>
+        <option value="1.8.1">1.8.1
+        </option>
+        <option value="1.8.2">1.8.2
+        </option>
+        <option value="1.8.3">1.8.3
+        </option>
+        <option value="1.8.4">1.8.4
+        </option>
+        <option value="1.8.5">1.8.5
+        </option>
+        <option value="1.8.6">1.8.6
+        </option>
+        <option value="1.8.8">1.8.8
+        </option>
+        <option value="1.8.10">1.8.10
+        </option>
+        <option value="1.8.11">1.8.11
+        </option>
+        <option value="1.9.1">1.9.1
+        </option>
+        <option value="1.9.2">1.9.2
+        </option>
+        <option value="1.9.3">1.9.3
+        </option>
+        <option value="1.9.4">1.9.4
+        </option>
+        <option value="1.9.5">1.9.5
+        </option>
+        <option value="1.9.6">1.9.6
+        </option>
+        <option value="1.9.7">1.9.7
+        </option>
+        <option value="1.9.8">1.9.8
+        </option>
+        <option value="1.9.9">1.9.9
+        </option>
+        <option value="1.9.10">1.9.10
+        </option>
+        <option value="1.9.11">1.9.11
+        </option>
+        <option value="1.9.12">1.9.12
+        </option>
+        <option value="1.9.13">1.9.13
+        </option>
+        <option value="1.9.14">1.9.14
+        </option>
+        <option value="1.9.15">1.9.15
+        </option>
+        <option value="1.10.0">1.10.0
+        </option>
+        <option value="1.10.1">1.10.1
+        </option>
+        <option value="1.99.0.x">1.99.0.x
+        </option>
+        <option value="2.0">2.0
+        </option>
+        <option value="2.1">2.1
+        </option>
+        <option value="2.2">2.2
+        </option>
+        <option value="2.3">2.3
+        </option>
+        <option value="2.4">2.4
+        </option>
+        <option value="2.5">2.5
+        </option>
+        <option value="2.6">2.6
+        </option>
+        <option value="2.7">2.7
+        </option>
+        <option value="2.8">2.8
+        </option>
+        <option value="2_1">2_1
+        </option>
+        <option value="5.0.2">5.0.2
+        </option>
+        <option value="5.1">5.1
+        </option>
+        <option value="5.4">5.4
+        </option>
+        <option value="5.5">5.5
+        </option>
+        <option value="5.6">5.6
+        </option>
+        <option value="5.7">5.7
+        </option>
+        <option value="6.0.1">6.0.1
+        </option>
+        <option value="6.1">6.1
+        </option>
+        <option value="6.2">6.2
+        </option>
+        <option value="6.2.1">6.2.1
+        </option>
+        <option value="6.3.1">6.3.1
+        </option>
+        <option value="6.3.2">6.3.2
+        </option>
+        <option value="6.4">6.4
+        </option>
+        <option value="6.5">6.5
+        </option>
+        <option value="6.7.0">6.7.0
+        </option>
+        <option value="6.8.0">6.8.0
+        </option>
+        <option value="6.8.1">6.8.1
+        </option>
+        <option value="6.8.2">6.8.2
+        </option>
+        <option value="6.8.99.1">6.8.99.1
+        </option>
+        <option value="6.8.99.2">6.8.99.2
+        </option>
+        <option value="6.8.99.3">6.8.99.3
+        </option>
+        <option value="6.8.99.4">6.8.99.4
+        </option>
+        <option value="6.8.99.5">6.8.99.5
+        </option>
+        <option value="6.8.99.6">6.8.99.6
+        </option>
+        <option value="6.8.99.7">6.8.99.7
+        </option>
+        <option value="6.8.99.8">6.8.99.8
+        </option>
+        <option value="6.8.99.9">6.8.99.9
+        </option>
+        <option value="6.8.99.10">6.8.99.10
+        </option>
+        <option value="6.8.99.11">6.8.99.11
+        </option>
+        <option value="6.8.99.12">6.8.99.12
+        </option>
+        <option value="6.8.99.13">6.8.99.13
+        </option>
+        <option value="6.8.99.14">6.8.99.14
+        </option>
+        <option value="6.8.99.15">6.8.99.15
+        </option>
+        <option value="6.8.99.16">6.8.99.16
+        </option>
+        <option value="6.8.99.900 (6.9 RC0)">6.8.99.900 (6.9 RC0)
+        </option>
+        <option value="6.8.99.901 (6.9 RC1)">6.8.99.901 (6.9 RC1)
+        </option>
+        <option value="6.8.99.902 (6.9 RC2)">6.8.99.902 (6.9 RC2)
+        </option>
+        <option value="6.8.99.903 (6.9 RC3)">6.8.99.903 (6.9 RC3)
+        </option>
+        <option value="6.8.99.904 (6.9 RC4)">6.8.99.904 (6.9 RC4)
+        </option>
+        <option value="6.9.0">6.9.0
+        </option>
+        <option value="6.99.99.900 (7.0 RC0)">6.99.99.900 (7.0 RC0)
+        </option>
+        <option value="6.99.99.901 (7.0 RC1)">6.99.99.901 (7.0 RC1)
+        </option>
+        <option value="6.99.99.902 (7.0 RC2)">6.99.99.902 (7.0 RC2)
+        </option>
+        <option value="6.99.99.903 (7.0 RC3)">6.99.99.903 (7.0 RC3)
+        </option>
+        <option value="6.99.99.904 (7.0 RC4)">6.99.99.904 (7.0 RC4)
+        </option>
+        <option value="6b">6b
+        </option>
+        <option value="6c">6c
+        </option>
+        <option value="7.0">7.0
+        </option>
+        <option value="7.0.0">7.0.0
+        </option>
+        <option value="7.0.3">7.0.3
+        </option>
+        <option value="7.0.99.901 (7.1RC1)">7.0.99.901 (7.1RC1)
+        </option>
+        <option value="7.0.99.902 (7.1RC2)">7.0.99.902 (7.1RC2)
+        </option>
+        <option value="7.0.99.903 (7.1RC3)">7.0.99.903 (7.1RC3)
+        </option>
+        <option value="7.1">7.1
+        </option>
+        <option value="7.2">7.2
+        </option>
+        <option value="7.3">7.3
+        </option>
+        <option value="7.4">7.4
+        </option>
+        <option value="7.5">7.5
+        </option>
+        <option value="7.6">7.6
+        </option>
+        <option value="ALL">ALL
+        </option>
+        <option value="beta1">beta1
+        </option>
+        <option value="beta2">beta2
+        </option>
+        <option value="beta3">beta3
+        </option>
+        <option value="beta4">beta4
+        </option>
+        <option value="CVS">CVS
+        </option>
+        <option value="CVS HEAD">CVS HEAD
+        </option>
+        <option value="DRI CVS">DRI CVS
+        </option>
+        <option value="git">git
+        </option>
+        <option value="git master">git master
+        </option>
+        <option value="HEAD">HEAD
+        </option>
+        <option value="other">other
+        </option>
+        <option value="ST-HEAD">ST-HEAD
+        </option>
+        <option value="TP">TP
+        </option>
+        <option value="unspecified">unspecified
+        </option>
+        <option value="X11R6.6">X11R6.6
+        </option>
+        <option value="XFree86 4.4.0">XFree86 4.4.0
+        </option>
+        <option value="XFree86 CVS">XFree86 CVS
+        </option>
+        <option value="XOrg 6.7.0">XOrg 6.7.0
+        </option>
+        <option value="XOrg CVS">XOrg CVS
+        </option>
+        <option value="XST-HEAD">XST-HEAD
+        </option>
+        <option value="XST-XORG-RELEASE-1-STSF">XST-XORG-RELEASE-1-STSF
+        </option>
+    </select>
+  </td>
+              </tr>
+            </tbody></table>
+          </td>
+        </tr>
+      </tbody></table>
+    </td>
+  </tr>
+
+
+
+
+    <tr>
+      <th align="right">
+        <label for="longdesc" accesskey="c">A&nbsp;<u>C</u>omment</label>:
+      </th>
+      <td><select name="longdesc_type">
+    <option selected="selected" value="allwordssubstr">contains all of the strings</option>
+    <option value="anywordssubstr">contains any of the strings</option>
+    <option value="substring">contains the string</option>
+    <option value="casesubstring">contains the string (exact case)</option>
+    <option value="allwords">contains all of the words</option>
+    <option value="anywords">contains any of the words</option>
+    <option value="regexp">matches regular expression</option>
+    <option value="notregexp">does not match regular expression</option>
+</select>
+      </td>
+      <td><input name="longdesc" id="longdesc" size="40">
+      </td>
+      <td></td>
+    </tr>
+
+    <tr>
+      <th align="right">
+        <label for="bug_file_loc" accesskey="u">The&nbsp;<u>U</u>RL</label>:
+      </th>
+      <td><select name="bug_file_loc_type">
+    <option selected="selected" value="allwordssubstr">contains all of the strings</option>
+    <option value="anywordssubstr">contains any of the strings</option>
+    <option value="substring">contains the string</option>
+    <option value="casesubstring">contains the string (exact case)</option>
+    <option value="allwords">contains all of the words</option>
+    <option value="anywords">contains any of the words</option>
+    <option value="regexp">matches regular expression</option>
+    <option value="notregexp">does not match regular expression</option>
+</select>
+      </td>
+      <td><input name="bug_file_loc" id="bug_file_loc" size="40">
+      </td>
+      <td></td>
+    </tr>
+
+    <tr>
+      <th align="right">
+        <label for="status_whiteboard" accesskey="w"><u>W</u>hiteboard</label>:
+      </th>
+      <td><select name="status_whiteboard_type">
+    <option selected="selected" value="allwordssubstr">contains all of the strings</option>
+    <option value="anywordssubstr">contains any of the strings</option>
+    <option value="substring">contains the string</option>
+    <option value="casesubstring">contains the string (exact case)</option>
+    <option value="allwords">contains all of the words</option>
+    <option value="anywords">contains any of the words</option>
+    <option value="regexp">matches regular expression</option>
+    <option value="notregexp">does not match regular expression</option>
+</select>
+      </td>
+      <td><input name="status_whiteboard" id="status_whiteboard" size="40">
+      </td>
+      <td></td>
+    </tr>
+
+    <tr>
+      <th align="right">
+        <label for="keywords" accesskey="k"><a href="https://bugzilla.freedesktop.org/describekeywords.cgi";><u>K</u>eywords</a></label>:
+      </th>
+      <td><select name="keywords_type">
+    <option selected="selected" value="allwords">contains all of the words</option>
+    <option value="anywords">contains any of the words</option>
+    <option value="nowords">contains none of the words</option>
+</select>
+      </td>
+      <td>
+        <input name="keywords" id="keywords" size="40">
+      </td>
+    </tr>
+
+  
+  
+</tbody></table>
+
+<hr>
+
+
+
+<table>
+  <tbody><tr>
+    <td>
+      <table>
+        <tbody><tr>
+          <th align="left">
+            <label for="bug_status" accesskey="a">St<u>a</u>tus</label>:
+          </th>
+        </tr>
+        <tr valign="top"><td align="left">
+    <select name="bug_status" id="bug_status" multiple="multiple" size="7">
+        <option value="UNCONFIRMED">UNCONFIRMED
+        </option>
+        <option value="NEW" selected="selected">NEW
+        </option>
+        <option value="ASSIGNED" selected="selected">ASSIGNED
+        </option>
+        <option value="REOPENED" selected="selected">REOPENED
+        </option>
+        <option value="RESOLVED">RESOLVED
+        </option>
+        <option value="VERIFIED">VERIFIED
+        </option>
+        <option value="CLOSED">CLOSED
+        </option>
+        <option value="NEEDINFO">NEEDINFO
+        </option>
+        <option value="PLEASETEST">PLEASETEST
+        </option>
+    </select>
+  </td>
+        </tr>
+      </tbody></table>
+    </td>
+    <td>
+      <table>
+        <tbody><tr>
+          <th align="left">
+            <label for="resolution" accesskey="r"><u>R</u>esolution</label>:
+          </th>
+        </tr>
+        <tr valign="top"><td align="left">
+    <select name="resolution" id="resolution" multiple="multiple" size="7">
+        <option value="FIXED">FIXED
+        </option>
+        <option value="INVALID">INVALID
+        </option>
+        <option value="WONTFIX">WONTFIX
+        </option>
+        <option value="DUPLICATE">DUPLICATE
+        </option>
+        <option value="WORKSFORME">WORKSFORME
+        </option>
+        <option value="MOVED">MOVED
+        </option>
+        <option value="NOTABUG">NOTABUG
+        </option>
+        <option value="NOTOURBUG">NOTOURBUG
+        </option>
+        <option value="---">---
+        </option>
+    </select>
+  </td>
+        </tr>
+      </tbody></table>
+    </td>
+    <td>
+      <table>
+        <tbody><tr>
+          <th align="left">
+            <label for="bug_severity">Severity</label>:
+          </th>
+        </tr>
+        <tr valign="top"><td align="left">
+    <select name="bug_severity" id="bug_severity" multiple="multiple" size="7">
+        <option value="blocker">blocker
+        </option>
+        <option value="critical">critical
+        </option>
+        <option value="major">major
+        </option>
+        <option value="normal">normal
+        </option>
+        <option value="minor">minor
+        </option>
+        <option value="trivial">trivial
+        </option>
+        <option value="enhancement">enhancement
+        </option>
+    </select>
+  </td>
+        </tr>
+      </tbody></table>
+    </td>
+    <td>
+      <table>
+        <tbody><tr>
+          <th align="left">
+            <label for="priority" accesskey="i">Pr<u>i</u>ority</label>:
+          </th>
+        </tr>
+        <tr valign="top"><td align="left">
+    <select name="priority" id="priority" multiple="multiple" size="7">
+        <option value="highest">highest
+        </option>
+        <option value="high">high
+        </option>
+        <option value="medium">medium
+        </option>
+        <option value="low">low
+        </option>
+        <option value="lowest">lowest
+        </option>
+    </select>
+  </td>
+        </tr>
+      </tbody></table>
+    </td>
+    <td>
+      <table>
+        <tbody><tr>
+          <th align="left">
+            <label for="rep_platform" accesskey="h"><u>H</u>ardware</label>:
+          </th>
+        </tr>
+        <tr valign="top"><td align="left">
+    <select name="rep_platform" id="rep_platform" multiple="multiple" size="7">
+        <option value="All">All
+        </option>
+        <option value="x86 (IA32)">x86 (IA32)
+        </option>
+        <option value="x86-64 (AMD64)">x86-64 (AMD64)
+        </option>
+        <option value="PowerPC">PowerPC
+        </option>
+        <option value="IA64 (Itanium)">IA64 (Itanium)
+        </option>
+        <option value="SPARC">SPARC
+        </option>
+        <option value="ARM">ARM
+        </option>
+        <option value="Alpha">Alpha
+        </option>
+        <option value="PA-RISC (HP)">PA-RISC (HP)
+        </option>
+        <option value="SGI">SGI
+        </option>
+        <option value="Other">Other
+        </option>
+    </select>
+  </td>
+        </tr>
+      </tbody></table>
+    </td>
+    <td>
+      <table>
+        <tbody><tr>
+          <th align="left">
+            <label for="op_sys" accesskey="o"><u>O</u>S</label>:
+          </th>
+        </tr>
+        <tr valign="top"><td align="left">
+    <select name="op_sys" id="op_sys" multiple="multiple" size="7">
+        <option value="All">All
+        </option>
+        <option value="Linux (All)">Linux (All)
+        </option>
+        <option value="FreeBSD">FreeBSD
+        </option>
+        <option value="NetBSD">NetBSD
+        </option>
+        <option value="OpenBSD">OpenBSD
+        </option>
+        <option value="BSD (Others)">BSD (Others)
+        </option>
+        <option value="Mac OS X (All)">Mac OS X (All)
+        </option>
+        <option value="Solaris">Solaris
+        </option>
+        <option value="Windows (All)">Windows (All)
+        </option>
+        <option value="Cygwin">Cygwin
+        </option>
+        <option value="AIX">AIX
+        </option>
+        <option value="HP-UX">HP-UX
+        </option>
+        <option value="IRIX">IRIX
+        </option>
+        <option value="Interix">Interix
+        </option>
+        <option value="other">other
+        </option>
+    </select>
+  </td>
+        </tr>
+      </tbody></table>
+    </td>
+  </tr>
+</tbody></table>
+
+
+
+<table>
+  <tbody><tr>
+    <td>
+      <fieldset>
+        <legend>
+          <strong>
+              Email Addresses and Bug Numbers
+          </strong>
+        </legend>
+
+
+<table>
+  <tbody><tr>
+    <td>
+
+
+<table cellpadding="0" cellspacing="0">
+  <tbody><tr>
+    <td>
+      Any of:
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <input name="emailassigned_to1" id="emailassigned_to1" value="1" checked="checked" type="checkbox">
+      <label for="emailassigned_to1">
+        the bug assignee
+      </label>
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <input name="emailreporter1" id="emailreporter1" value="1" type="checkbox">
+      <label for="emailreporter1">
+        the reporter
+      </label>
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <input name="emailqa_contact1" id="emailqa_contact1" value="1" type="checkbox">
+      <label for="emailqa_contact1">
+        the QA contact
+      </label>
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <input name="emailcc1" id="emailcc1" value="1" type="checkbox">
+      <label for="emailcc1">
+        a CC list member
+      </label>
+    </td>
+  </tr>
+  <tr>
+    <td>
+        <input name="emaillongdesc1" id="emaillongdesc1" value="1" type="checkbox">
+      <label for="emaillongdesc1">
+        a commenter
+      </label>
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <select name="emailtype1">
+
+        <option selected="selected" value="substring">contains</option>
+
+        <option value="exact">is</option>
+
+        <option value="notequals">is not</option>
+
+        <option value="regexp">matches regexp</option>
+
+        <option value="notregexp">doesn't match regexp</option>
+      </select>
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <input name="email1" size="25">
+    </td>
+  </tr>
+</tbody></table>
+
+
+    </td>
+    <td>
+
+
+<table cellpadding="0" cellspacing="0">
+  <tbody><tr>
+    <td>
+      Any of:
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <input name="emailassigned_to2" id="emailassigned_to2" value="1" checked="checked" type="checkbox">
+      <label for="emailassigned_to2">
+        the bug assignee
+      </label>
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <input name="emailreporter2" id="emailreporter2" value="1" checked="checked" type="checkbox">
+      <label for="emailreporter2">
+        the reporter
+      </label>
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <input name="emailqa_contact2" id="emailqa_contact2" value="1" checked="checked" type="checkbox">
+      <label for="emailqa_contact2">
+        the QA contact
+      </label>
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <input name="emailcc2" id="emailcc2" value="1" checked="checked" type="checkbox">
+      <label for="emailcc2">
+        a CC list member
+      </label>
+    </td>
+  </tr>
+  <tr>
+    <td>
+        <input name="emaillongdesc2" id="emaillongdesc2" value="1" type="checkbox">
+      <label for="emaillongdesc2">
+        a commenter
+      </label>
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <select name="emailtype2">
+
+        <option selected="selected" value="substring">contains</option>
+
+        <option value="exact">is</option>
+
+        <option value="notequals">is not</option>
+
+        <option value="regexp">matches regexp</option>
+
+        <option value="notregexp">doesn't match regexp</option>
+      </select>
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <input name="email2" size="25">
+    </td>
+  </tr>
+</tbody></table>
+
+
+    </td>
+  </tr>
+</tbody></table>
+<hr>
+<table>
+  <tbody><tr>
+    <td>
+      <select name="bugidtype">
+        <option selected="selected" value="include">Only include</option>
+        <option value="exclude">Exclude</option>
+      </select>
+      <label for="bug_id">bugs numbered</label>:
+    </td>
+    <td>
+      <input name="bug_id" id="bug_id" size="20" type="text">
+    </td>
+  </tr>
+  <tr>
+    <td></td>
+    <td>(comma-separated list)</td>
+  </tr>
+</tbody></table>
+
+
+      </fieldset>
+    </td>
+   
+
+
+    <td valign="top">
+      <fieldset>
+        <legend><strong>Bug Changes</strong></legend>
+
+
+<dl class="bug_changes">
+  <dt>
+    <label for="chfieldfrom">Only bugs changed between</label>:
+  </dt>
+  <dd>
+    <input name="chfieldfrom" id="chfieldfrom" size="10">
+    and <input name="chfieldto" size="10" value="Now">
+    <br>(YYYY-MM-DD or relative dates)
+  </dd>
+  <dt>
+    <label for="chfield">where one or more of the following changed</label>:
+  </dt>
+  <dd>
+    
+
+    <select name="chfield" id="chfield" multiple="multiple" size="4">
+      <option value="[Bug creation]">[Bug creation]</option>
+      <option value="alias">Alias</option>
+      <option value="assigned_to">Assignee</option>
+      <option value="cclist_accessible">CC list accessible</option>
+      <option value="component">Component</option>
+      <option value="deadline">Deadline</option>
+      <option value="everconfirmed">Ever confirmed</option>
+      <option value="rep_platform">Hardware</option>
+      <option value="keywords">Keywords</option>
+      <option value="op_sys">OS</option>
+      <option value="priority">Priority</option>
+      <option value="product">Product</option>
+      <option value="qa_contact">QA Contact</option>
+      <option value="reporter_accessible">Reporter accessible</option>
+      <option value="resolution">Resolution</option>
+      <option value="bug_severity">Severity</option>
+      <option value="bug_status">Status</option>
+      <option value="short_desc">Summary</option>
+      <option value="target_milestone">Target Milestone</option>
+      <option value="bug_file_loc">URL</option>
+      <option value="version">Version</option>
+      <option value="votes">Votes</option>
+      <option value="status_whiteboard">Whiteboard</option>
+    </select>
+  </dd>
+  <dt>and <label for="chfieldvalue">the new value was</label>:</dt>
+  <dd>
+    <input name="chfieldvalue" id="chfieldvalue" size="20">
+  </dd>
+</dl>
+
+       </fieldset>
+     </td>
+  </tr>
+</tbody></table>
+<input name="cmdtype" value="doit" type="hidden">
+
+<p>
+  <label for="order">Sort results by</label>:
+  <select name="order" id="order">
+    <option value="Reuse same sort as last time" selected="selected">Reuse same sort as last time</option>
+    <option value="Bug Number">Bug Number</option>
+    <option value="Importance">Importance</option>
+    <option value="Assignee">Assignee</option>
+    <option value="Last Changed">Last Changed</option>
+  </select>
+</p>
+
+<p>  
+  <input id="Search" value="Search" type="submit">
+  
+</p>
+
+<p>
+  &nbsp;&nbsp;&nbsp;
+  <input id="remasdefault" name="remtype" value="asdefault" type="checkbox">
+  <label for="remasdefault">
+    and remember these as my default search options
+  </label>
+</p>
+
+<hr>
+<p>
+    <strong>
+      <a name="chart">Advanced Searching Using Boolean Charts</a>:
+    </strong>
+  </p>
+
+
+
+
+  <table>
+    <tbody><tr>
+      <td>
+        <input id="negate0" name="negate0" value="1" type="checkbox">
+        <label for="negate0">
+          Not (negate this whole chart)
+        </label>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <select name="field0-0-0">
+            <option selected="selected" value="noop">---
+            </option>
+            <option value="alias">Alias
+            </option>
+            <option value="assigned_to">Assignee
+            </option>
+            <option value="attachments.submitter">Attachment creator
+            </option>
+            <option value="attach_data.thedata">Attachment data
+            </option>
+            <option value="attachments.description">Attachment description
+            </option>
+            <option value="attachments.filename">Attachment filename
+            </option>
+            <option value="attachments.isurl">Attachment is a URL
+            </option>
+            <option value="attachments.isobsolete">Attachment is obsolete
+            </option>
+            <option value="attachments.ispatch">Attachment is patch
+            </option>
+            <option value="attachments.isprivate">Attachment is private
+            </option>
+            <option value="attachments.mimetype">Attachment mime type
+            </option>
+            <option value="blocked">Blocks
+            </option>
+            <option value="bug_id">Bug ID
+            </option>
+            <option value="cc">CC
+            </option>
+            <option value="cclist_accessible">CC list accessible
+            </option>
+            <option value="classification">Classification
+            </option>
+            <option value="longdesc">Comment
+            </option>
+            <option value="longdescs.isprivate">Comment is private
+            </option>
+            <option value="commenter">Commenter
+            </option>
+            <option value="component">Component
+            </option>
+            <option value="content">Content
+            </option>
+            <option value="creation_ts">Creation date
+            </option>
+            <option value="days_elapsed">Days since bug changed
+            </option>
+            <option value="dependson">Depends on
+            </option>
+            <option value="everconfirmed">Ever confirmed
+            </option>
+            <option value="flagtypes.name">Flag
+            </option>
+            <option value="requestees.login_name">Flag Requestee
+            </option>
+            <option value="setters.login_name">Flag Setter
+            </option>
+            <option value="bug_group">Group
+            </option>
+            <option value="keywords">Keywords
+            </option>
+            <option value="delta_ts">Changed
+            </option>
+            <option value="op_sys">OS
+            </option>
+            <option value="rep_platform">Hardware
+            </option>
+            <option value="priority">Priority
+            </option>
+            <option value="product">Product
+            </option>
+            <option value="qa_contact">QA Contact
+            </option>
+            <option value="reporter">Reporter
+            </option>
+            <option value="reporter_accessible">Reporter accessible
+            </option>
+            <option value="resolution">Resolution
+            </option>
+            <option value="see_also">See Also
+            </option>
+            <option value="bug_severity">Severity
+            </option>
+            <option value="bug_status">Status
+            </option>
+            <option value="status_whiteboard">Whiteboard
+            </option>
+            <option value="short_desc">Summary
+            </option>
+            <option value="target_milestone">Target Milestone
+            </option>
+            <option value="owner_idle_time">Time Since Assignee Touched
+            </option>
+            <option value="bug_file_loc">URL
+            </option>
+            <option value="version">Version
+            </option>
+            <option value="votes">Votes
+            </option>
+        </select>
+<select name="type0-0-0">
+    <option value="noop" selected="selected">---</option>
+    <option value="equals">is equal to</option>
+    <option value="notequals">is not equal to</option>
+    <option value="anyexact">is equal to any of the strings</option>
+    <option value="substring">contains the string</option>
+    <option value="casesubstring">contains the string (exact case)</option>
+    <option value="notsubstring">does not contain the string</option>
+    <option value="anywordssubstr">contains any of the strings</option>
+    <option value="allwordssubstr">contains all of the strings</option>
+    <option value="nowordssubstr">contains none of the strings</option>
+    <option value="regexp">matches regular expression</option>
+    <option value="notregexp">does not match regular expression</option>
+    <option value="lessthan">is less than</option>
+    <option value="greaterthan">is greater than</option>
+    <option value="anywords">contains any of the words</option>
+    <option value="allwords">contains all of the words</option>
+    <option value="nowords">contains none of the words</option>
+    <option value="changedbefore">changed before</option>
+    <option value="changedafter">changed after</option>
+    <option value="changedfrom">changed from</option>
+    <option value="changedto">changed to</option>
+    <option value="changedby">changed by</option>
+    <option value="matches">matches</option>
+</select>
+
+        <input name="value0-0-0"> 
+      </td>
+      
+        <td>
+          <input value="Or" onclick="this.form.action='query.cgi#chart'; this.form.method='POST'; return 1;" name="cmd-add0-0-1" id="cmd-add0-0-1" type="submit">
+        </td>
+      
+    </tr>
+    
+    <tr>
+      <td>
+        <input value="And" onclick="this.form.action='query.cgi#chart'; this.form.method='POST'; return 1;" name="cmd-add0-1-0" id="cmd-add0-1-0" type="submit">
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+        <input value="Add another boolean chart" onclick="this.form.action='query.cgi#chart'; this.form.method='POST'; return 1;" name="cmd-add1-0-0" id="cmd-add1-0-0" type="submit">
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+      </td>
+    </tr>   
+    
+  </tbody></table>
+  <hr>
+
+</form>
+
+
+
+  </div>
+
+</div>
+</div>
+
+
+
+<div id="footer">
+  <div class="intro"></div>
+
+
+
+
+<ul id="useful-links">
+  <li id="links-actions"><ul class="links">
+  <li><a href="https://bugzilla.freedesktop.org/";>Home</a></li>
+  <li><span class="separator">| </span><a href="https://bugzilla.freedesktop.org/enter_bug.cgi";>New</a></li>
+  <li><span class="separator">| </span><a href="https://bugzilla.freedesktop.org/query.cgi";>Search</a></li>
+
+  <li class="form">
+    <span class="separator">| </span>
+    <form action="buglist.cgi" method="get" onsubmit="if (this.quicksearch.value == '')
+                  { alert('Please enter one or more search terms first.');
+                    return false; } return true;">
+    <input class="txt" id="quicksearch_bottom" name="quicksearch" type="text">
+    <input class="btn" value="Find" id="find_bottom" type="submit"></form></li>
+
+  <li><span class="separator">| </span><a href="https://bugzilla.freedesktop.org/report.cgi";>Reports</a></li>
+
+  <li>
+      <span class="separator">| </span>
+        <a href="https://bugzilla.freedesktop.org/request.cgi";>Requests</a></li>
+
+
+  <li>
+        <span class="separator">| </span>
+        <a href="https://bugzilla.freedesktop.org/docs/html/query.html"; target="_blank">Help</a>
+      </li>
+    
+      <li id="new_account_container_bottom">
+        <span class="separator">| </span>
+        <a href="https://bugzilla.freedesktop.org/createaccount.cgi";>New&nbsp;Account</a>
+      </li>
+
+    <li id="mini_login_container_bottom">
+  <span class="separator">| </span>
+  <a id="login_link_bottom" href="https://bugzilla.freedesktop.org/query.cgi?GoAheadAndLogIn=1"; onclick="return show_mini_login_form('_bottom')">Log In</a>
+  <form action="https://bugs.freedesktop.org/query.cgi?format=advanced&amp;field0-0-0=xyzzy"; method="POST" class="mini_login bz_default_hidden" id="mini_login_bottom" onsubmit="return check_mini_login_fields( '_bottom' );">
+    <input value="login" id="Bugzilla_login_bottom" class="bz_login bz_mini_login_help" name="Bugzilla_login" onfocus="mini_login_on_focus('_bottom')">
+    <input class="bz_password bz_default_hidden" id="Bugzilla_password_bottom" name="Bugzilla_password" type="password">
+    <input class="bz_password bz_mini_login_help" id="Bugzilla_password_dummy_bottom" value="password" onfocus="mini_login_on_focus('_bottom')" type="text">
+    <input name="GoAheadAndLogIn" value="Log in" id="log_in_bottom" type="submit">
+    <script type="text/javascript">
+      mini_login_constants = {
+          "login" : "login",
+          "warning" : "You must set the login and password before logging in."
+      };
+      
+      if (YAHOO.env.ua.gecko || YAHOO.env.ua.ie || YAHOO.env.ua.opera) {
+          YAHOO.util.Event.onDOMReady(function() {
+              init_mini_login_form('_bottom');
+          });
+      }
+      else {
+          YAHOO.util.Event.on(window, 'load', function () {
+              window.setTimeout(function() {
+                  init_mini_login_form('_bottom');
+              }, 200);
+          });
+    }
+    </script>
+    <a href="#" onclick="return hide_mini_login_form('_bottom')">[x]</a>
+  </form>
+</li>
+<li id="forgot_container_bottom">
+  <span class="separator">| </span>
+  <a id="forgot_link_bottom" href="https://bugzilla.freedesktop.org/query.cgi?GoAheadAndLogIn=1#forgot"; onclick="return show_forgot_form('_bottom')">Forgot Password</a>
+  <form action="token.cgi" method="post" id="forgot_form_bottom" class="mini_forgot bz_default_hidden">
+    <label>Login: <input name="loginname" size="20" type="text"></label>
+    <input id="forgot_button_bottom" value="Reset Password" type="submit">
+    <input name="a" value="reqpw" type="hidden">
+    <a href="#" onclick="return hide_forgot_form('_bottom')">[x]</a>
+  </form>
+</li>
+</ul>
+  </li>
+
+  
+    
+
+  
+
+
+  
+</ul>
+
+  <div class="outro"></div>
+</div>
+
+</body></html>
\ No newline at end of file

=== added file 'lib/lp/bugs/tests/testfiles/bugzilla-wine-advanced-query.html'
--- lib/lp/bugs/tests/testfiles/bugzilla-wine-advanced-query.html	1970-01-01 00:00:00 +0000
+++ lib/lp/bugs/tests/testfiles/bugzilla-wine-advanced-query.html	2010-10-29 12:36:22 +0000
@@ -0,0 +1,1787 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
+<html><head>
+<meta http-equiv="content-type" content="text/html; charset=UTF-8">
+
+  
+    <title>WineHQ Bugzilla – Search for bugs</title>
+
+
+<link rel="Top" href="http://bugs.winehq.org/";>
+
+
+    
+
+    
+      <link href="bugzilla-wine-advanced-query_files/global_003.css" rel="stylesheet" type="text/css">
+      <link href="bugzilla-wine-advanced-query_files/help_002.css" rel="stylesheet" type="text/css">
+    <!--[if lte IE 7]>
+      
+      <link href="skins/standard/IE-fixes.css"
+            rel="stylesheet"
+            type="text/css">
+    <![endif]-->
+
+    
+        <link href="bugzilla-wine-advanced-query_files/global_003.css" rel="stylesheet" title="Classic" type="text/css">
+        <link href="bugzilla-wine-advanced-query_files/help_002.css" rel="stylesheet" title="Classic" type="text/css">
+      <!--[if lte IE 7]>
+      
+        <link href="skins/standard/IE-fixes.css"
+              rel="stylesheet"
+              title="Classic"
+              type="text/css">
+      <![endif]-->
+
+    
+        
+            <link href="bugzilla-wine-advanced-query_files/global_002.css" rel="alternate stylesheet" title="Dusk" type="text/css">
+            <link href="bugzilla-wine-advanced-query_files/help_003.css" rel="alternate stylesheet" title="Dusk" type="text/css">
+        <!--[if lte IE 7]>
+          
+          <link href="skins/contrib/Dusk/IE-fixes.css"
+                rel="alternate stylesheet"
+                title="Dusk"
+                type="text/css">
+        <![endif]-->
+
+    
+      <style type="text/css">dl.bug_changes dt {
+                 margin-top: 15px;
+               }
+      </style>
+
+    
+        <link href="bugzilla-wine-advanced-query_files/global.css" rel="stylesheet" type="text/css">
+        <link href="bugzilla-wine-advanced-query_files/help.css" rel="stylesheet" type="text/css">
+    <!--[if lte IE 7]>
+      
+      <link href="skins/custom/IE-fixes.css"
+            rel="stylesheet"
+            type="text/css">
+    <![endif]-->
+
+    <script src="bugzilla-wine-advanced-query_files/yahoo-dom-event.js" type="text/javascript"></script>
+    <script src="bugzilla-wine-advanced-query_files/global.js" type="text/javascript"></script>
+    <script type="text/javascript">
+    <!--
+        YAHOO.namespace('bugzilla');
+        if (YAHOO.env.ua.gecko) {
+            YAHOO.util.Event._simpleRemove(window, "unload", 
+                                           YAHOO.util.Event._unload);
+        }
+        
+        var BUGZILLA = {
+            param: {
+                cookiepath: '\/'
+            }
+        };
+var queryform = "queryform"
+    // -->
+    </script>
+
+        <script src="bugzilla-wine-advanced-query_files/productform.js" type="text/javascript"></script>
+        <script src="bugzilla-wine-advanced-query_files/util.js" type="text/javascript"></script>
+        <script src="bugzilla-wine-advanced-query_files/help.js" type="text/javascript"></script>
+
+    
+
+    
+    <link rel="search" type="application/opensearchdescription+xml" title="Bugzilla" href="http://bugs.winehq.org/search_plugin.cgi";>
+    <link rel="stylesheet" href="bugzilla-wine-advanced-query_files/styles.css" type="text/css" media="screen">
+    <script language="JavaScript" src="bugzilla-wine-advanced-query_files/jquery_002.js" type="text/javascript"></script>
+    <script language="JavaScript" src="bugzilla-wine-advanced-query_files/utils.js" type="text/javascript"></script><script src="bugzilla-wine-advanced-query_files/jquery.js" type="text/javascript" language="javascript"></script>
+    <link rel="icon" type="image/png" href="http://bugs.winehq.org/images/winehq_logo_16.png";>
+    <link rel="shortcut icon" type="image/png" href="http://bugs.winehq.org/images/winehq_logo_16.png";>
+  </head><body onload="doOnSelectProduct(0); enableHelp();" class="bugs-winehq-org">
+
+
+<!-- <div id="banner"></div> -->
+
+<div id="logo_glass"><a href="http://bugs.winehq.org/";><img src="bugzilla-wine-advanced-query_files/winehq_logo_glass_sm.png" alt=""></a></div>
+<div id="logo_text"><a href="http://bugs.winehq.org/";><img src="bugzilla-wine-advanced-query_files/winehq_logo_text.png" alt="WineHQ" title="WineHQ"></a></div>
+
+<div id="logo_blurb">
+  Bug Tracking Database – Search for bugs
+</div>
+
+<div id="search_box">
+  <form action="http://www.winehq.org/search"; id="cse-search-box" style="margin: 0pt; padding: 0pt;">
+    <input name="cx" value="partner-pub-0971840239976722:w9sqbcsxtyf" type="hidden">
+    <input name="cof" value="FORID:10" type="hidden">
+    <input name="ie" value="UTF-8" type="hidden">
+    <span style="color: rgb(255, 255, 255);">Search:</span> <input style="background: url(&quot;http://www.google.com/cse/intl/en/images/google_custom_search_watermark.gif&quot;) no-repeat scroll left center rgb(255, 255, 255);" name="q" size="20" type="text">
+  <input value="bugs.winehq.org/query.cgi?format=advanced" name="siteurl" type="hidden"></form>
+  <script type="text/javascript" src="bugzilla-wine-advanced-query_files/brand"></script>
+</div>
+
+<div id="tabs">
+    <ul>
+        <li><a href="http://www.winehq.org/";>WineHQ</a></li>
+        <li><a href="http://wiki.winehq.org/";>Wiki</a></li>
+        <li><a href="http://appdb.winehq.org/";>AppDB</a></li>
+        <li class="s"><a href="http://bugs.winehq.org/";>Bugzilla</a></li>
+        <li><a href="http://forums.winehq.org/";>Forums</a></li>
+    </ul>
+</div>
+
+<!-- Start SideBar -->
+<div id="sidebar"><!--<ul>
+        <li class="top"><p>Bugzilla Menu</p></li>
+        <li><p><a href="index.cgi">Intro</a></p></li>
+        <li><p><a href="enter_bug.cgi">Enter Bug</a></p></li>
+        <li><p><a href="query.cgi">Query Bugs</a></p></li>
+        <li><p><a href="report.cgi">Reports</a></p></li><li class="bot"></li>
+    </ul>
+<ul>
+        <li class="top"><p>
+    <a class="menu_title_link" 
+       href="page.cgi?id=quicksearch.html">Find Bugs</a></p></li>
+        <li><p><form class="quicksearch" action="buglist.cgi" method="get"
+        onsubmit="if (this.quicksearch.value == '')
+                  { alert('Please enter one or more search terms first.');
+                    return false; } return true;">
+    <input class="txt" size="8"
+           type="text" id="quicksearch" name="quicksearch">
+    <input class="btn" type="submit" value="Find" id="find"></form>
+        </p></li><li class="bot"></li>
+    </ul>
+-->
+<ul>
+        <li class="top"><p>Task Lists</p></li>
+    <li><p><a href="http://bugs.winehq.org/buglist.cgi?bug_status=UNCONFIRMED&amp;bug_status=NEW&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;product=Wine&amp;target_milestone=1.2.0&amp;order=bugs.bug_severity";>Wine 1.2</a></p></li>
+    <li><p><a href="http://bugs.winehq.org/buglist.cgi?bug_status=UNCONFIRMED&amp;bug_status=NEW&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;product=Wine&amp;keywords=regression&amp;keywords_type=anywords";>Regressions</a></p></li>
+    <li><p><a href="http://bugs.winehq.org/buglist.cgi?bug_status=UNCONFIRMED&amp;bug_status=NEW&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;product=Wine&amp;keywords=download&amp;keywords_type=anywords";>With download</a></p></li><li class="bot"></li>
+    </ul>
+
+<ul>
+        <li class="top"><p>Bug Lists</p></li> 
+    <li><p><a href="http://bugs.winehq.org/buglist.cgi?bug_status=UNCONFIRMED&amp;bug_status=NEW&amp;bug_status=REOPENED&amp;cmdtype=doit&amp;order=Bug+Number"; class="menuItem">Available</a></p></li>
+    <li><p><a href="http://bugs.winehq.org/buglist.cgi?bug_status=UNCONFIRMED"; class="menuItem">Unconfirmed</a></p></li>
+    <li><p><a href="http://bugs.winehq.org/buglist.cgi?bug_status=NEW"; class="menuItem">New</a></p></li>
+    <li><p><a href="http://bugs.winehq.org/buglist.cgi?bug_status=ASSIGNED"; class="menuItem">Assigned</a></p></li>
+    <li><p><a href="http://bugs.winehq.org/buglist.cgi?bug_status=RESOLVED"; class="menuItem">Resolved</a></p></li>
+    <li><p><a href="http://bugs.winehq.org/buglist.cgi?bug_status=VERIFIED"; class="menuItem">Verified</a></p></li>
+    <li><p><a href="http://bugs.winehq.org/buglist.cgi?bug_status=CLOSED"; class="menuItem">Closed</a></p></li><li class="bot"></li>
+    </ul>
+</div>
+<!-- End SideBar -->
+
+<div id="main_content">
+
+  <div class="rbox">
+  <b class="rtop"><b class="r1"></b><b class="r2"></b><b class="r3"></b><b class="r4"></b></b>
+    <div class="content" style="padding: 20px 20px 10px 80px;">
+    <!-- Start Content -->
+
+<table id="titles" style="background-color: maroon; margin-top: 10px;" border="0" cellpadding="0" cellspacing="0">
+<tbody><tr>
+    <td id="title">
+      <p>
+        &nbsp;Bugzilla
+      </p>
+    </td>
+
+    <td id="subtitle">
+      <p class="subheader">
+        &nbsp;
+      </p>
+    </td>
+
+</tr>
+</tbody></table>
+
+<div id="header"><ul class="links">
+  <li><a href="http://bugs.winehq.org/";>Intro</a></li>
+  <li><span class="separator">| </span><a href="http://bugs.winehq.org/enter_bug.cgi";>New</a></li>
+  <li><span class="separator">| </span><a href="http://bugs.winehq.org/query.cgi";>Search</a></li>
+
+  <li class="form">
+    <span class="separator">| </span><form class="quicksearch" action="buglist.cgi" method="get" onsubmit="if (this.quicksearch.value == '')
+                  { alert('Please enter one or more search terms first.');
+                    return false; } return true;">
+    <input class="txt" id="quicksearch_top" name="quicksearch" type="text">
+    <input class="btn" value="Find" id="find_top" type="submit"></form></li>
+
+  <li><span class="separator">| </span><a href="http://bugs.winehq.org/report.cgi";>Reports</a></li>
+
+  <li></li>
+
+
+  <li>
+        <span class="separator">| </span>
+        <a href="http://bugs.winehq.org/docs/html/query.html"; target="_blank">Help</a>
+      </li>
+    
+      <li id="new_account_container_top">
+        <span class="separator">| </span>
+        <a href="http://bugs.winehq.org/createaccount.cgi";>New&nbsp;Account</a>
+      </li>
+
+    <li id="mini_login_container_top">
+  <span class="separator">| </span>
+  <a id="login_link_top" href="http://bugs.winehq.org/query.cgi?GoAheadAndLogIn=1"; onclick="return show_mini_login_form('_top')">Log In</a>
+  <form action="http://bugs.winehq.org/query.cgi?format=advanced&amp;field0-0-0=xyzzy"; method="POST" class="mini_login bz_default_hidden" id="mini_login_top" onsubmit="return check_mini_login_fields( '_top' );">
+    <input value="login" id="Bugzilla_login_top" class="bz_login bz_mini_login_help" name="Bugzilla_login" onfocus="mini_login_on_focus('_top')">
+    <input class="bz_password bz_default_hidden" id="Bugzilla_password_top" name="Bugzilla_password" type="password">
+    <input class="bz_password bz_mini_login_help" id="Bugzilla_password_dummy_top" value="password" onfocus="mini_login_on_focus('_top')" type="text">
+      <input id="Bugzilla_remember_top" name="Bugzilla_remember" value="on" class="bz_remember" checked="checked" type="checkbox">
+      <label for="Bugzilla_remember_top">Remember</label>
+    <input name="GoAheadAndLogIn" value="Log in" id="log_in_top" type="submit">
+    <script type="text/javascript">
+      mini_login_constants = {
+          "login" : "login",
+          "warning" : "You must set the login and password before logging in."
+      };
+      
+      if (YAHOO.env.ua.gecko || YAHOO.env.ua.ie || YAHOO.env.ua.opera) {
+          YAHOO.util.Event.onDOMReady(function() {
+              init_mini_login_form('_top');
+          });
+      }
+      else {
+          YAHOO.util.Event.on(window, 'load', function () {
+              window.setTimeout(function() {
+                  init_mini_login_form('_top');
+              }, 200);
+          });
+    }
+    </script>
+    <a href="#" onclick="return hide_mini_login_form('_top')">[x]</a>
+  </form>
+</li>
+<li id="forgot_container_top">
+  <span class="separator">| </span>
+  <a id="forgot_link_top" href="http://bugs.winehq.org/query.cgi?GoAheadAndLogIn=1#forgot"; onclick="return show_forgot_form('_top')">Forgot Password</a>
+  <form action="token.cgi" method="post" id="forgot_form_top" class="mini_forgot bz_default_hidden">
+    <label>Login: <input name="loginname" size="20" type="text"></label>
+    <input id="forgot_button_top" value="Reset Password" type="submit">
+    <input name="a" value="reqpw" type="hidden">
+    <a href="#" onclick="return hide_forgot_form('_top')">[x]</a>
+  </form>
+</li>
+</ul>
+
+</div>
+
+
+<div id="bugzilla-body">
+<div class="tabbed">
+  <table class="tabs" width="100%" border="0" cellpadding="10" cellspacing="0">
+    <tbody><tr>
+      <td class="spacer">&nbsp;</td>
+
+          <td class="clickable_area" onclick="document.location='query.cgi?format=specific'"><a href="http://bugs.winehq.org/query.cgi?format=specific";>Find a Specific Bug</a></td>
+          <td class="selected">Advanced Search</td>
+
+      <td class="spacer">&nbsp;</td>
+    </tr>
+  </tbody></table>
+
+  <div class="tabbody">
+
+
+
+
+<script type="text/javascript"> <!--
+  document.write("<p><a href='query.cgi?help=1&amp;format=advanced'>Give me some help<\/a> (reloads page).<\/p>");
+// -->
+</script><p><a href="http://bugs.winehq.org/query.cgi?help=1&amp;format=advanced";>Give me some help</a> (reloads page).</p>
+
+<form method="post" action="buglist.cgi" name="queryform">
+<script type="text/javascript">
+
+var first_load = true;         
+var last_sel = new Array();    
+
+var useclassification = false;
+var cpts = new Array();
+var vers = new Array();
+var tms = new Array();
+
+
+
+
+
+
+  cpts[0] = ['-unknown', 'advapi32', 'advpack', 'amstream', 'atl', 'build-env', 'cmd', 'comctl32', 'comdlg32', 'crypt32', 'dbghelp', 'directx-d3d', 'directx-d3dx10', 'directx-d3dx9', 'directx-ddraw', 'directx-dinput', 'directx-dmusic', 'directx-dplay', 'directx-dsound', 'documentation', 'dos', 'fonts', 'gameux', 'gdi32', 'gdiplus', 'hhctrl.ocx', 'iccvid', 'imagehlp', 'inkobj', 'jscript', 'kernel32', 'loader', 'mlang', 'mmdevapi', 'mountmgr.sys', 'msacm32', 'msadp32', 'mscoree', 'mshtml', 'msi', 'mstask', 'msvcp', 'msvcrt', 'msvfw32', 'msxml3', 'msxml4', 'ntdll', 'ntoskrnl', 'odbc', 'ole', 'ole32', 'oleaut32', 'openal32', 'opengl', 'pdh', 'programs', 'qmgr', 'quartz', 'rasapi32', 'richedit', 'rpc', 'rsaenh', 'secur32', 'setupapi', 'shdocvw', 'shell32', 'shlwapi', 'spooler', 'tapi32', 'testcases', 'tools', 'urlmon', 'user32', 'usp10', 'windowscodecs', 'winedbg', 'winemp3.acm', 'wineps.drv', 'wineserver', 'winex11.drv', 'winhttp', 'wininet', 'winmm&mci', 'winsock', 'wintab32', 'wintrust', 'wldap32', 'wmi&wbemprox' ];
+  vers[0] = ['unspecified', '20010305', '20010216', '20010112', '20010326', '20010418', '20020509', '20010510', '20010629', '20010824', '20011004', '20011108', '20020228', '20020310', '20020411', '20020605', '20020710', '20020804', '20020904', '20021007', '20021031', '20021125', '20021219', '20030115', '20030219', '20030318', '20030408', '20030508', '20030618', '20030709', '20030813', '20030911', '20031016', '20031118', '20031212', '20040121', '20040213', '20040309', '20040408', '20040505', '20040615', '20040716', '20040813', '20040914', '20041019', '20041201', '20050111', '20050211', '20050310', '20050419', '20050524', '20050628', '20050725', '20050830', '20050930', '0.9', '0.9.1.', '0.9.2.', '0.9.3.', '0.9.4.', '0.9.5.', '0.9.6.', '0.9.7.', '0.9.8.', '0.9.9.', '0.9.10.', '0.9.11.', '0.9.12.', '0.9.13.', '0.9.14.', '0.9.15.', '0.9.16.', '0.9.17.', '0.9.18.', '0.9.19.', '0.9.20.', '0.9.21.', '0.9.22.', '0.9.23.', '0.9.24.', '0.9.25.', '0.9.26.', '0.9.27.', '0.9.28.', '0.9.29.', '0.9.30.', '0.9.31.', '0.9.32.', '0.9.33.', '0.9.34.', '0.9.35.', '0.9.36.', '0.9.37.', '0.9.38.', '0.9.39.', '0.9.40.', '0.9.41.', '0.9.42.', '0.9.43.', '0.9.44.', '0.9.45.', '0.9.46.', '0.9.47.', '0.9.48.', '0.9.49.', '0.9.50.', '0.9.51.', '0.9.52.', '0.9.53.', '0.9.54.', '0.9.55.', '0.9.56.', '0.9.57.', '0.9.58.', '0.9.59.', '0.9.60', '0.9.61.', '1.0-rc1', '1.0-rc2', '1.0-rc3', '1.0-rc4', '1.0-rc5', '1.0.0', '1.1.0', '1.1.1', '1.1.2', '1.1.3', '1.1.4', '1.1.5', '1.1.6', '1.0.1', '1.1.7', '1.1.8', '1.1.9', '1.1.10', '1.1.11', '1.1.12', '1.1.13', '1.1.14', '1.1.15', '1.1.16', '1.1.17', '1.1.18', '1.1.19', '1.1.20', '1.1.21', '1.1.22', '1.1.23', '1.1.24', '1.1.25', '1.1.26', '1.1.27', '1.1.28', '1.1.29', '1.1.30', '1.1.31', '1.1.32', '1.1.33', '1.1.34', '1.1.35', '1.1.36', '1.1.37', '1.1.38', '1.1.39', '1.1.40', '1.1.41', '1.1.42', '1.1.43', '1.1.44', '1.2-rc1', '1.2-rc2', '1.2-rc3', '1.2-rc4', '1.2-rc5', '1.2-rc6', '1.2-rc7', '1.2', '1.3.0', '1.3.1', '1.3.2', '1.3.3', '1.3.4', '1.2.1', '1.3.5' ];
+  tms[0]  = ['---', '0.9.0', '1.0.0', '1.0.1', '1.2.0', '1.2.x', '1.4.0' ];
+  cpts[1] = ['appdb-unknown' ];
+  vers[1] = ['unspecified' ];
+  tms[1]  = ['---' ];
+  cpts[2] = ['bugzilla-unknown' ];
+  vers[2] = ['unspecified', '2.11', '2.14.2', '3.0.2', '3.2.3' ];
+  tms[2]  = ['---' ];
+  cpts[3] = ['www-unknown' ];
+  vers[3] = ['unspecified' ];
+  tms[3]  = ['---' ];
+
+/*
+ * doOnSelectProduct determines which selection should get updated 
+ *
+ * - selectmode = 0  - init
+ *   selectmode = 1  - classification selected
+ *   selectmode = 2  - product selected
+ *
+ * globals:
+ *   queryform - string holding the name of the selection form
+ */
+function doOnSelectProduct(selectmode) {
+    var f = document.forms[queryform];
+    var milestone = (typeof(f.target_milestone) == "undefined" ? 
+                                               null : f.target_milestone);
+    if (selectmode == 0) {
+        // If there is no classification selected, give us a chance to fill
+        // the select fields with values from the possibly selected product.
+        if (useclassification && f.classification.selectedIndex > -1) {
+            selectClassification(f.classification, f.product, f.component, f.version, milestone);
+        } else {
+            selectProduct(f.product, f.component, f.version, milestone, null);
+        }
+    } else if (selectmode == 1) {
+        selectClassification(f.classification, f.product, f.component, f.version, milestone);
+    } else {
+        selectProduct(f.product, f.component, f.version, milestone, null);
+    }
+}
+
+</script>
+
+
+
+<input name="query_format" value="advanced" type="hidden">
+
+
+
+<table>
+  <tbody><tr>
+    <th align="right">
+      <label for="short_desc" accesskey="s"><u>S</u>ummary</label>:
+    </th>
+    <td><select name="short_desc_type">
+    <option selected="selected" value="allwordssubstr">contains all of the strings</option>
+    <option value="anywordssubstr">contains any of the strings</option>
+    <option value="substring">contains the string</option>
+    <option value="casesubstring">contains the string (exact case)</option>
+    <option value="allwords">contains all of the words</option>
+    <option value="anywords">contains any of the words</option>
+    <option value="regexp">matches regular expression</option>
+    <option value="notregexp">does not match regular expression</option>
+</select>
+    </td>
+    <td>
+      <input name="short_desc" id="short_desc" size="40">
+      <script type="text/javascript"> <!--
+          document.forms[queryform].short_desc.focus(); 
+      // -->
+      </script>
+    </td>
+    <td>
+        <input id="Search_top" value="Search" type="submit">
+    </td>
+  </tr>
+
+
+  <tr>
+    <td colspan="4">
+      <table>
+        <tbody><tr>
+          <td valign="top">
+            <table>
+              <tbody><tr valign="bottom">
+                <th align="left">
+                  <label for="product" accesskey="p"><u>P</u>roduct</label>:
+                </th>
+              </tr>
+              <tr valign="top">
+                
+                <td align="left">
+                  <select name="product" multiple="multiple" size="5" id="product" onchange="doOnSelectProduct(2);">
+                      <option value="Wine">Wine</option>
+                      <option value="WineHQ Apps Database">WineHQ Apps Database</option>
+                      <option value="WineHQ Bugzilla">WineHQ Bugzilla</option>
+                      <option value="WineHQ.org">WineHQ.org</option>
+                  </select>
+                </td>
+              </tr>
+            </tbody></table>
+          </td>
+          <td valign="top">
+            <table>
+              <tbody><tr valign="bottom">
+                <th align="left">
+                  <label for="component" accesskey="m"><a href="http://bugs.winehq.org/describecomponents.cgi";>Co<u>m</u>ponent</a></label>:
+                </th>
+              </tr>
+              <tr valign="top">
+                
+                <td align="left">
+                  <select name="component" id="component" multiple="multiple" size="5">
+                      <option value="-unknown">-unknown</option>
+                      <option value="advapi32">advapi32</option>
+                      <option value="advpack">advpack</option>
+                      <option value="amstream">amstream</option>
+                      <option value="appdb-unknown">appdb-unknown</option>
+                      <option value="atl">atl</option>
+                      <option value="bugzilla-unknown">bugzilla-unknown</option>
+                      <option value="build-env">build-env</option>
+                      <option value="cmd">cmd</option>
+                      <option value="comctl32">comctl32</option>
+                      <option value="comdlg32">comdlg32</option>
+                      <option value="crypt32">crypt32</option>
+                      <option value="dbghelp">dbghelp</option>
+                      <option value="directx-d3d">directx-d3d</option>
+                      <option value="directx-d3dx10">directx-d3dx10</option>
+                      <option value="directx-d3dx9">directx-d3dx9</option>
+                      <option value="directx-ddraw">directx-ddraw</option>
+                      <option value="directx-dinput">directx-dinput</option>
+                      <option value="directx-dmusic">directx-dmusic</option>
+                      <option value="directx-dplay">directx-dplay</option>
+                      <option value="directx-dsound">directx-dsound</option>
+                      <option value="documentation">documentation</option>
+                      <option value="dos">dos</option>
+                      <option value="fonts">fonts</option>
+                      <option value="gameux">gameux</option>
+                      <option value="gdi32">gdi32</option>
+                      <option value="gdiplus">gdiplus</option>
+                      <option value="hhctrl.ocx">hhctrl.ocx</option>
+                      <option value="iccvid">iccvid</option>
+                      <option value="imagehlp">imagehlp</option>
+                      <option value="inkobj">inkobj</option>
+                      <option value="jscript">jscript</option>
+                      <option value="kernel32">kernel32</option>
+                      <option value="loader">loader</option>
+                      <option value="mlang">mlang</option>
+                      <option value="mmdevapi">mmdevapi</option>
+                      <option value="mountmgr.sys">mountmgr.sys</option>
+                      <option value="msacm32">msacm32</option>
+                      <option value="msadp32">msadp32</option>
+                      <option value="mscoree">mscoree</option>
+                      <option value="mshtml">mshtml</option>
+                      <option value="msi">msi</option>
+                      <option value="mstask">mstask</option>
+                      <option value="msvcp">msvcp</option>
+                      <option value="msvcrt">msvcrt</option>
+                      <option value="msvfw32">msvfw32</option>
+                      <option value="msxml3">msxml3</option>
+                      <option value="msxml4">msxml4</option>
+                      <option value="ntdll">ntdll</option>
+                      <option value="ntoskrnl">ntoskrnl</option>
+                      <option value="odbc">odbc</option>
+                      <option value="ole">ole</option>
+                      <option value="ole32">ole32</option>
+                      <option value="oleaut32">oleaut32</option>
+                      <option value="openal32">openal32</option>
+                      <option value="opengl">opengl</option>
+                      <option value="pdh">pdh</option>
+                      <option value="programs">programs</option>
+                      <option value="qmgr">qmgr</option>
+                      <option value="quartz">quartz</option>
+                      <option value="rasapi32">rasapi32</option>
+                      <option value="richedit">richedit</option>
+                      <option value="rpc">rpc</option>
+                      <option value="rsaenh">rsaenh</option>
+                      <option value="secur32">secur32</option>
+                      <option value="setupapi">setupapi</option>
+                      <option value="shdocvw">shdocvw</option>
+                      <option value="shell32">shell32</option>
+                      <option value="shlwapi">shlwapi</option>
+                      <option value="spooler">spooler</option>
+                      <option value="tapi32">tapi32</option>
+                      <option value="testcases">testcases</option>
+                      <option value="tools">tools</option>
+                      <option value="urlmon">urlmon</option>
+                      <option value="user32">user32</option>
+                      <option value="usp10">usp10</option>
+                      <option value="windowscodecs">windowscodecs</option>
+                      <option value="winedbg">winedbg</option>
+                      <option value="winemp3.acm">winemp3.acm</option>
+                      <option value="wineps.drv">wineps.drv</option>
+                      <option value="wineserver">wineserver</option>
+                      <option value="winex11.drv">winex11.drv</option>
+                      <option value="winhttp">winhttp</option>
+                      <option value="wininet">wininet</option>
+                      <option value="winmm&amp;mci">winmm&amp;mci</option>
+                      <option value="winsock">winsock</option>
+                      <option value="wintab32">wintab32</option>
+                      <option value="wintrust">wintrust</option>
+                      <option value="wldap32">wldap32</option>
+                      <option value="wmi&amp;wbemprox">wmi&amp;wbemprox</option>
+                      <option value="www-unknown">www-unknown</option>
+                  </select>
+                </td>
+              </tr>
+            </tbody></table>
+          </td>
+          <td valign="top">
+            <table>
+              <tbody><tr valign="bottom">
+                <th align="left">
+                  <label for="version">Version</label>:
+                </th>
+              </tr>
+              <tr valign="top"><td align="left">
+    <select name="version" id="version" multiple="multiple" size="5">
+        <option value="0.9">0.9
+        </option>
+        <option value="0.9.1.">0.9.1.
+        </option>
+        <option value="0.9.2.">0.9.2.
+        </option>
+        <option value="0.9.3.">0.9.3.
+        </option>
+        <option value="0.9.4.">0.9.4.
+        </option>
+        <option value="0.9.5.">0.9.5.
+        </option>
+        <option value="0.9.6.">0.9.6.
+        </option>
+        <option value="0.9.7.">0.9.7.
+        </option>
+        <option value="0.9.8.">0.9.8.
+        </option>
+        <option value="0.9.9.">0.9.9.
+        </option>
+        <option value="0.9.10.">0.9.10.
+        </option>
+        <option value="0.9.11.">0.9.11.
+        </option>
+        <option value="0.9.12.">0.9.12.
+        </option>
+        <option value="0.9.13.">0.9.13.
+        </option>
+        <option value="0.9.14.">0.9.14.
+        </option>
+        <option value="0.9.15.">0.9.15.
+        </option>
+        <option value="0.9.16.">0.9.16.
+        </option>
+        <option value="0.9.17.">0.9.17.
+        </option>
+        <option value="0.9.18.">0.9.18.
+        </option>
+        <option value="0.9.19.">0.9.19.
+        </option>
+        <option value="0.9.20.">0.9.20.
+        </option>
+        <option value="0.9.21.">0.9.21.
+        </option>
+        <option value="0.9.22.">0.9.22.
+        </option>
+        <option value="0.9.23.">0.9.23.
+        </option>
+        <option value="0.9.24.">0.9.24.
+        </option>
+        <option value="0.9.25.">0.9.25.
+        </option>
+        <option value="0.9.26.">0.9.26.
+        </option>
+        <option value="0.9.27.">0.9.27.
+        </option>
+        <option value="0.9.28.">0.9.28.
+        </option>
+        <option value="0.9.29.">0.9.29.
+        </option>
+        <option value="0.9.30.">0.9.30.
+        </option>
+        <option value="0.9.31.">0.9.31.
+        </option>
+        <option value="0.9.32.">0.9.32.
+        </option>
+        <option value="0.9.33.">0.9.33.
+        </option>
+        <option value="0.9.34.">0.9.34.
+        </option>
+        <option value="0.9.35.">0.9.35.
+        </option>
+        <option value="0.9.36.">0.9.36.
+        </option>
+        <option value="0.9.37.">0.9.37.
+        </option>
+        <option value="0.9.38.">0.9.38.
+        </option>
+        <option value="0.9.39.">0.9.39.
+        </option>
+        <option value="0.9.40.">0.9.40.
+        </option>
+        <option value="0.9.41.">0.9.41.
+        </option>
+        <option value="0.9.42.">0.9.42.
+        </option>
+        <option value="0.9.43.">0.9.43.
+        </option>
+        <option value="0.9.44.">0.9.44.
+        </option>
+        <option value="0.9.45.">0.9.45.
+        </option>
+        <option value="0.9.46.">0.9.46.
+        </option>
+        <option value="0.9.47.">0.9.47.
+        </option>
+        <option value="0.9.48.">0.9.48.
+        </option>
+        <option value="0.9.49.">0.9.49.
+        </option>
+        <option value="0.9.50.">0.9.50.
+        </option>
+        <option value="0.9.51.">0.9.51.
+        </option>
+        <option value="0.9.52.">0.9.52.
+        </option>
+        <option value="0.9.53.">0.9.53.
+        </option>
+        <option value="0.9.54.">0.9.54.
+        </option>
+        <option value="0.9.55.">0.9.55.
+        </option>
+        <option value="0.9.56.">0.9.56.
+        </option>
+        <option value="0.9.57.">0.9.57.
+        </option>
+        <option value="0.9.58.">0.9.58.
+        </option>
+        <option value="0.9.59.">0.9.59.
+        </option>
+        <option value="0.9.60">0.9.60
+        </option>
+        <option value="0.9.61.">0.9.61.
+        </option>
+        <option value="1.0-rc1">1.0-rc1
+        </option>
+        <option value="1.0-rc2">1.0-rc2
+        </option>
+        <option value="1.0-rc3">1.0-rc3
+        </option>
+        <option value="1.0-rc4">1.0-rc4
+        </option>
+        <option value="1.0-rc5">1.0-rc5
+        </option>
+        <option value="1.0.0">1.0.0
+        </option>
+        <option value="1.0.1">1.0.1
+        </option>
+        <option value="1.1.0">1.1.0
+        </option>
+        <option value="1.1.1">1.1.1
+        </option>
+        <option value="1.1.2">1.1.2
+        </option>
+        <option value="1.1.3">1.1.3
+        </option>
+        <option value="1.1.4">1.1.4
+        </option>
+        <option value="1.1.5">1.1.5
+        </option>
+        <option value="1.1.6">1.1.6
+        </option>
+        <option value="1.1.7">1.1.7
+        </option>
+        <option value="1.1.8">1.1.8
+        </option>
+        <option value="1.1.9">1.1.9
+        </option>
+        <option value="1.1.10">1.1.10
+        </option>
+        <option value="1.1.11">1.1.11
+        </option>
+        <option value="1.1.12">1.1.12
+        </option>
+        <option value="1.1.13">1.1.13
+        </option>
+        <option value="1.1.14">1.1.14
+        </option>
+        <option value="1.1.15">1.1.15
+        </option>
+        <option value="1.1.16">1.1.16
+        </option>
+        <option value="1.1.17">1.1.17
+        </option>
+        <option value="1.1.18">1.1.18
+        </option>
+        <option value="1.1.19">1.1.19
+        </option>
+        <option value="1.1.20">1.1.20
+        </option>
+        <option value="1.1.21">1.1.21
+        </option>
+        <option value="1.1.22">1.1.22
+        </option>
+        <option value="1.1.23">1.1.23
+        </option>
+        <option value="1.1.24">1.1.24
+        </option>
+        <option value="1.1.25">1.1.25
+        </option>
+        <option value="1.1.26">1.1.26
+        </option>
+        <option value="1.1.27">1.1.27
+        </option>
+        <option value="1.1.28">1.1.28
+        </option>
+        <option value="1.1.29">1.1.29
+        </option>
+        <option value="1.1.30">1.1.30
+        </option>
+        <option value="1.1.31">1.1.31
+        </option>
+        <option value="1.1.32">1.1.32
+        </option>
+        <option value="1.1.33">1.1.33
+        </option>
+        <option value="1.1.34">1.1.34
+        </option>
+        <option value="1.1.35">1.1.35
+        </option>
+        <option value="1.1.36">1.1.36
+        </option>
+        <option value="1.1.37">1.1.37
+        </option>
+        <option value="1.1.38">1.1.38
+        </option>
+        <option value="1.1.39">1.1.39
+        </option>
+        <option value="1.1.40">1.1.40
+        </option>
+        <option value="1.1.41">1.1.41
+        </option>
+        <option value="1.1.42">1.1.42
+        </option>
+        <option value="1.1.43">1.1.43
+        </option>
+        <option value="1.1.44">1.1.44
+        </option>
+        <option value="1.2">1.2
+        </option>
+        <option value="1.2-rc1">1.2-rc1
+        </option>
+        <option value="1.2-rc2">1.2-rc2
+        </option>
+        <option value="1.2-rc3">1.2-rc3
+        </option>
+        <option value="1.2-rc4">1.2-rc4
+        </option>
+        <option value="1.2-rc5">1.2-rc5
+        </option>
+        <option value="1.2-rc6">1.2-rc6
+        </option>
+        <option value="1.2-rc7">1.2-rc7
+        </option>
+        <option value="1.2.1">1.2.1
+        </option>
+        <option value="1.3.0">1.3.0
+        </option>
+        <option value="1.3.1">1.3.1
+        </option>
+        <option value="1.3.2">1.3.2
+        </option>
+        <option value="1.3.3">1.3.3
+        </option>
+        <option value="1.3.4">1.3.4
+        </option>
+        <option value="1.3.5">1.3.5
+        </option>
+        <option value="2.11">2.11
+        </option>
+        <option value="2.14.2">2.14.2
+        </option>
+        <option value="3.0.2">3.0.2
+        </option>
+        <option value="3.2.3">3.2.3
+        </option>
+        <option value="20010112">20010112
+        </option>
+        <option value="20010216">20010216
+        </option>
+        <option value="20010305">20010305
+        </option>
+        <option value="20010326">20010326
+        </option>
+        <option value="20010418">20010418
+        </option>
+        <option value="20010510">20010510
+        </option>
+        <option value="20010629">20010629
+        </option>
+        <option value="20010824">20010824
+        </option>
+        <option value="20011004">20011004
+        </option>
+        <option value="20011108">20011108
+        </option>
+        <option value="20020228">20020228
+        </option>
+        <option value="20020310">20020310
+        </option>
+        <option value="20020411">20020411
+        </option>
+        <option value="20020509">20020509
+        </option>
+        <option value="20020605">20020605
+        </option>
+        <option value="20020710">20020710
+        </option>
+        <option value="20020804">20020804
+        </option>
+        <option value="20020904">20020904
+        </option>
+        <option value="20021007">20021007
+        </option>
+        <option value="20021031">20021031
+        </option>
+        <option value="20021125">20021125
+        </option>
+        <option value="20021219">20021219
+        </option>
+        <option value="20030115">20030115
+        </option>
+        <option value="20030219">20030219
+        </option>
+        <option value="20030318">20030318
+        </option>
+        <option value="20030408">20030408
+        </option>
+        <option value="20030508">20030508
+        </option>
+        <option value="20030618">20030618
+        </option>
+        <option value="20030709">20030709
+        </option>
+        <option value="20030813">20030813
+        </option>
+        <option value="20030911">20030911
+        </option>
+        <option value="20031016">20031016
+        </option>
+        <option value="20031118">20031118
+        </option>
+        <option value="20031212">20031212
+        </option>
+        <option value="20040121">20040121
+        </option>
+        <option value="20040213">20040213
+        </option>
+        <option value="20040309">20040309
+        </option>
+        <option value="20040408">20040408
+        </option>
+        <option value="20040505">20040505
+        </option>
+        <option value="20040615">20040615
+        </option>
+        <option value="20040716">20040716
+        </option>
+        <option value="20040813">20040813
+        </option>
+        <option value="20040914">20040914
+        </option>
+        <option value="20041019">20041019
+        </option>
+        <option value="20041201">20041201
+        </option>
+        <option value="20050111">20050111
+        </option>
+        <option value="20050211">20050211
+        </option>
+        <option value="20050310">20050310
+        </option>
+        <option value="20050419">20050419
+        </option>
+        <option value="20050524">20050524
+        </option>
+        <option value="20050628">20050628
+        </option>
+        <option value="20050725">20050725
+        </option>
+        <option value="20050830">20050830
+        </option>
+        <option value="20050930">20050930
+        </option>
+        <option value="unspecified">unspecified
+        </option>
+    </select>
+  </td>
+              </tr>
+            </tbody></table>
+          </td>
+          <td valign="top">
+            <table>
+              <tbody><tr valign="bottom">
+                <th align="left">
+                  <label for="target_milestone">Target</label>:
+                </th>
+              </tr>
+              <tr valign="top"><td align="left">
+    <select name="target_milestone" id="target_milestone" multiple="multiple" size="5">
+        <option value="---">---
+        </option>
+        <option value="0.9.0">0.9.0
+        </option>
+        <option value="1.0.0">1.0.0
+        </option>
+        <option value="1.0.1">1.0.1
+        </option>
+        <option value="1.2.0">1.2.0
+        </option>
+        <option value="1.2.x">1.2.x
+        </option>
+        <option value="1.4.0">1.4.0
+        </option>
+    </select>
+  </td>
+              </tr>
+            </tbody></table>
+          </td>
+        </tr>
+      </tbody></table>
+    </td>
+  </tr>
+
+
+
+
+    <tr>
+      <th align="right">
+        <label for="longdesc" accesskey="c">A&nbsp;<u>C</u>omment</label>:
+      </th>
+      <td><select name="longdesc_type">
+    <option selected="selected" value="allwordssubstr">contains all of the strings</option>
+    <option value="anywordssubstr">contains any of the strings</option>
+    <option value="substring">contains the string</option>
+    <option value="casesubstring">contains the string (exact case)</option>
+    <option value="allwords">contains all of the words</option>
+    <option value="anywords">contains any of the words</option>
+    <option value="regexp">matches regular expression</option>
+    <option value="notregexp">does not match regular expression</option>
+</select>
+      </td>
+      <td><input name="longdesc" id="longdesc" size="40">
+      </td>
+      <td></td>
+    </tr>
+
+    <tr>
+      <th align="right">
+        <label for="bug_file_loc" accesskey="u">The&nbsp;<u>U</u>RL</label>:
+      </th>
+      <td><select name="bug_file_loc_type">
+    <option selected="selected" value="allwordssubstr">contains all of the strings</option>
+    <option value="anywordssubstr">contains any of the strings</option>
+    <option value="substring">contains the string</option>
+    <option value="casesubstring">contains the string (exact case)</option>
+    <option value="allwords">contains all of the words</option>
+    <option value="anywords">contains any of the words</option>
+    <option value="regexp">matches regular expression</option>
+    <option value="notregexp">does not match regular expression</option>
+</select>
+      </td>
+      <td><input name="bug_file_loc" id="bug_file_loc" size="40">
+      </td>
+      <td></td>
+    </tr>
+
+    <tr>
+      <th align="right">
+        <label for="status_whiteboard" accesskey="w"><u>W</u>hiteboard</label>:
+      </th>
+      <td><select name="status_whiteboard_type">
+    <option selected="selected" value="allwordssubstr">contains all of the strings</option>
+    <option value="anywordssubstr">contains any of the strings</option>
+    <option value="substring">contains the string</option>
+    <option value="casesubstring">contains the string (exact case)</option>
+    <option value="allwords">contains all of the words</option>
+    <option value="anywords">contains any of the words</option>
+    <option value="regexp">matches regular expression</option>
+    <option value="notregexp">does not match regular expression</option>
+</select>
+      </td>
+      <td><input name="status_whiteboard" id="status_whiteboard" size="40">
+      </td>
+      <td></td>
+    </tr>
+
+    <tr>
+      <th align="right">
+        <label for="keywords" accesskey="k"><a href="http://bugs.winehq.org/describekeywords.cgi";><u>K</u>eywords</a></label>:
+      </th>
+      <td><select name="keywords_type">
+    <option selected="selected" value="allwords">contains all of the words</option>
+    <option value="anywords">contains any of the words</option>
+    <option value="nowords">contains none of the words</option>
+</select>
+      </td>
+      <td>
+        <input name="keywords" id="keywords" size="40">
+      </td>
+    </tr>
+
+  
+  
+</tbody></table>
+
+<hr>
+
+
+
+<table>
+  <tbody><tr>
+    <td>
+      <table>
+        <tbody><tr>
+          <th align="left">
+            <label for="bug_status" accesskey="a">St<u>a</u>tus</label>:
+          </th>
+        </tr>
+        <tr valign="top"><td align="left">
+    <select name="bug_status" id="bug_status" multiple="multiple" size="7">
+        <option value="UNCONFIRMED" selected="selected">UNCONFIRMED
+        </option>
+        <option value="NEW" selected="selected">NEW
+        </option>
+        <option value="ASSIGNED" selected="selected">ASSIGNED
+        </option>
+        <option value="REOPENED" selected="selected">REOPENED
+        </option>
+        <option value="RESOLVED" selected="selected">RESOLVED
+        </option>
+        <option value="VERIFIED">VERIFIED
+        </option>
+        <option value="CLOSED">CLOSED
+        </option>
+    </select>
+  </td>
+        </tr>
+      </tbody></table>
+    </td>
+    <td>
+      <table>
+        <tbody><tr>
+          <th align="left">
+            <label for="resolution" accesskey="r"><u>R</u>esolution</label>:
+          </th>
+        </tr>
+        <tr valign="top"><td align="left">
+    <select name="resolution" id="resolution" multiple="multiple" size="7">
+        <option value="FIXED">FIXED
+        </option>
+        <option value="INVALID">INVALID
+        </option>
+        <option value="WONTFIX">WONTFIX
+        </option>
+        <option value="DUPLICATE">DUPLICATE
+        </option>
+        <option value="WORKSFORME">WORKSFORME
+        </option>
+        <option value="MOVED">MOVED
+        </option>
+        <option value="ABANDONED">ABANDONED
+        </option>
+        <option value="---">---
+        </option>
+    </select>
+  </td>
+        </tr>
+      </tbody></table>
+    </td>
+    <td>
+      <table>
+        <tbody><tr>
+          <th align="left">
+            <label for="bug_severity">Severity</label>:
+          </th>
+        </tr>
+        <tr valign="top"><td align="left">
+    <select name="bug_severity" id="bug_severity" multiple="multiple" size="7">
+        <option value="blocker">blocker
+        </option>
+        <option value="critical">critical
+        </option>
+        <option value="major">major
+        </option>
+        <option value="normal">normal
+        </option>
+        <option value="minor">minor
+        </option>
+        <option value="trivial">trivial
+        </option>
+        <option value="enhancement">enhancement
+        </option>
+    </select>
+  </td>
+        </tr>
+      </tbody></table>
+    </td>
+    <td>
+      <table>
+        <tbody><tr>
+          <th align="left">
+            <label for="priority" accesskey="i">Pr<u>i</u>ority</label>:
+          </th>
+        </tr>
+        <tr valign="top"><td align="left">
+    <select name="priority" id="priority" multiple="multiple" size="7">
+        <option value="P1">P1
+        </option>
+        <option value="P2">P2
+        </option>
+        <option value="P3">P3
+        </option>
+        <option value="P4">P4
+        </option>
+        <option value="P5">P5
+        </option>
+    </select>
+  </td>
+        </tr>
+      </tbody></table>
+    </td>
+    <td>
+      <table>
+        <tbody><tr>
+          <th align="left">
+            <label for="rep_platform" accesskey="h"><u>H</u>ardware</label>:
+          </th>
+        </tr>
+        <tr valign="top"><td align="left">
+    <select name="rep_platform" id="rep_platform" multiple="multiple" size="7">
+        <option value="All">All
+        </option>
+        <option value="arm">arm
+        </option>
+        <option value="ppc32">ppc32
+        </option>
+        <option value="x86">x86
+        </option>
+        <option value="x86-64">x86-64
+        </option>
+        <option value="sparc">sparc
+        </option>
+        <option value="Other">Other
+        </option>
+    </select>
+  </td>
+        </tr>
+      </tbody></table>
+    </td>
+    <td>
+      <table>
+        <tbody><tr>
+          <th align="left">
+            <label for="op_sys" accesskey="o"><u>O</u>S</label>:
+          </th>
+        </tr>
+        <tr valign="top"><td align="left">
+    <select name="op_sys" id="op_sys" multiple="multiple" size="7">
+        <option value="All">All
+        </option>
+        <option value="Windows 3.1">Windows 3.1
+        </option>
+        <option value="Windows 95">Windows 95
+        </option>
+        <option value="Windows 98">Windows 98
+        </option>
+        <option value="Windows ME">Windows ME
+        </option>
+        <option value="Windows 2000">Windows 2000
+        </option>
+        <option value="Windows NT">Windows NT
+        </option>
+        <option value="Windows XP">Windows XP
+        </option>
+        <option value="Windows Vista">Windows Vista
+        </option>
+        <option value="Mac OS X 10.2">Mac OS X 10.2
+        </option>
+        <option value="Mac OS X 10.3">Mac OS X 10.3
+        </option>
+        <option value="Mac OS X 10.4">Mac OS X 10.4
+        </option>
+        <option value="Mac OS X 10.5">Mac OS X 10.5
+        </option>
+        <option value="Mac OS X 10.6">Mac OS X 10.6
+        </option>
+        <option value="Linux">Linux
+        </option>
+        <option value="BSDI">BSDI
+        </option>
+        <option value="FreeBSD">FreeBSD
+        </option>
+        <option value="NetBSD">NetBSD
+        </option>
+        <option value="OpenBSD">OpenBSD
+        </option>
+        <option value="AIX">AIX
+        </option>
+        <option value="Solaris">Solaris
+        </option>
+        <option value="other">other
+        </option>
+    </select>
+  </td>
+        </tr>
+      </tbody></table>
+    </td>
+  </tr>
+</tbody></table>
+
+
+
+<table>
+  <tbody><tr>
+    <td>
+      <fieldset>
+        <legend>
+          <strong>
+              Email Addresses, Bug Numbers, and Votes
+          </strong>
+        </legend>
+
+
+<table>
+  <tbody><tr>
+    <td>
+
+
+<table cellpadding="0" cellspacing="0">
+  <tbody><tr>
+    <td>
+      Any of:
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <input name="emailassigned_to1" id="emailassigned_to1" value="1" checked="checked" type="checkbox">
+      <label for="emailassigned_to1">
+        the bug assignee
+      </label>
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <input name="emailreporter1" id="emailreporter1" value="1" type="checkbox">
+      <label for="emailreporter1">
+        the reporter
+      </label>
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <input name="emailcc1" id="emailcc1" value="1" type="checkbox">
+      <label for="emailcc1">
+        a CC list member
+      </label>
+    </td>
+  </tr>
+  <tr>
+    <td>
+        <input name="emaillongdesc1" id="emaillongdesc1" value="1" type="checkbox">
+      <label for="emaillongdesc1">
+        a commenter
+      </label>
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <select name="emailtype1">
+
+        <option selected="selected" value="substring">contains</option>
+
+        <option value="exact">is</option>
+
+        <option value="notequals">is not</option>
+
+        <option value="regexp">matches regexp</option>
+
+        <option value="notregexp">doesn't match regexp</option>
+      </select>
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <input name="email1" size="25">
+    </td>
+  </tr>
+</tbody></table>
+
+
+    </td>
+    <td>
+
+
+<table cellpadding="0" cellspacing="0">
+  <tbody><tr>
+    <td>
+      Any of:
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <input name="emailassigned_to2" id="emailassigned_to2" value="1" checked="checked" type="checkbox">
+      <label for="emailassigned_to2">
+        the bug assignee
+      </label>
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <input name="emailreporter2" id="emailreporter2" value="1" checked="checked" type="checkbox">
+      <label for="emailreporter2">
+        the reporter
+      </label>
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <input name="emailcc2" id="emailcc2" value="1" checked="checked" type="checkbox">
+      <label for="emailcc2">
+        a CC list member
+      </label>
+    </td>
+  </tr>
+  <tr>
+    <td>
+        <input name="emaillongdesc2" id="emaillongdesc2" value="1" type="checkbox">
+      <label for="emaillongdesc2">
+        a commenter
+      </label>
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <select name="emailtype2">
+
+        <option selected="selected" value="substring">contains</option>
+
+        <option value="exact">is</option>
+
+        <option value="notequals">is not</option>
+
+        <option value="regexp">matches regexp</option>
+
+        <option value="notregexp">doesn't match regexp</option>
+      </select>
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <input name="email2" size="25">
+    </td>
+  </tr>
+</tbody></table>
+
+
+    </td>
+  </tr>
+</tbody></table>
+<hr>
+<table>
+  <tbody><tr>
+    <td>
+      <select name="bugidtype">
+        <option selected="selected" value="include">Only include</option>
+        <option value="exclude">Exclude</option>
+      </select>
+      <label for="bug_id">bugs numbered</label>:
+    </td>
+    <td>
+      <input name="bug_id" id="bug_id" size="20" type="text">
+    </td>
+  </tr>
+  <tr>
+    <td></td>
+    <td>(comma-separated list)</td>
+  </tr>
+    <tr>
+      <td align="right">
+        <label for="votes">Only bugs with at least</label>:
+      </td>
+      <td>
+        <input name="votes" id="votes" size="3">
+        votes
+      </td>
+    </tr>
+</tbody></table>
+
+
+      </fieldset>
+    </td>
+   
+
+
+    <td valign="top">
+      <fieldset>
+        <legend><strong>Bug Changes</strong></legend>
+
+
+<dl class="bug_changes">
+  <dt>
+    <label for="chfieldfrom">Only bugs changed between</label>:
+  </dt>
+  <dd>
+    <input name="chfieldfrom" id="chfieldfrom" size="10">
+    and <input name="chfieldto" size="10" value="Now">
+    <br>(YYYY-MM-DD or relative dates)
+  </dd>
+  <dt>
+    <label for="chfield">where one or more of the following changed</label>:
+  </dt>
+  <dd>
+    
+
+    <select name="chfield" id="chfield" multiple="multiple" size="4">
+      <option value="[Bug creation]">[Bug creation]</option>
+      <option value="alias">Alias</option>
+      <option value="assigned_to">Assignee</option>
+      <option value="cclist_accessible">CC list accessible</option>
+      <option value="component">Component</option>
+      <option value="deadline">Deadline</option>
+      <option value="cf_difficulty">Difficulty</option>
+      <option value="environment">Environment</option>
+      <option value="everconfirmed">Ever confirmed</option>
+      <option value="rep_platform">Hardware</option>
+      <option value="keywords">Keywords</option>
+      <option value="op_sys">OS</option>
+      <option value="priority">Priority</option>
+      <option value="product">Product</option>
+      <option value="qa_contact">QA Contact</option>
+      <option value="reporter_accessible">Reporter accessible</option>
+      <option value="resolution">Resolution</option>
+      <option value="bug_severity">Severity</option>
+      <option value="bug_status">Status</option>
+      <option value="short_desc">Summary</option>
+      <option value="target_milestone">Target Milestone</option>
+      <option value="bug_file_loc">URL</option>
+      <option value="version">Version</option>
+      <option value="votes">Votes</option>
+      <option value="status_whiteboard">Whiteboard</option>
+    </select>
+  </dd>
+  <dt>and <label for="chfieldvalue">the new value was</label>:</dt>
+  <dd>
+    <input name="chfieldvalue" id="chfieldvalue" size="20">
+  </dd>
+</dl>
+
+       </fieldset>
+     </td>
+  </tr>
+</tbody></table>
+<input name="cmdtype" value="doit" type="hidden">
+
+<p>
+  <label for="order">Sort results by</label>:
+  <select name="order" id="order">
+    <option value="Reuse same sort as last time" selected="selected">Reuse same sort as last time</option>
+    <option value="Bug Number">Bug Number</option>
+    <option value="Importance">Importance</option>
+    <option value="Assignee">Assignee</option>
+    <option value="Last Changed">Last Changed</option>
+  </select>
+</p>
+
+<p>  
+  <input id="Search" value="Search" type="submit">
+  
+</p>
+
+<p>
+  &nbsp;&nbsp;&nbsp;
+  <input id="remasdefault" name="remtype" value="asdefault" type="checkbox">
+  <label for="remasdefault">
+    and remember these as my default search options
+  </label>
+</p>
+
+<hr>
+<p>
+    <strong>
+      <a name="chart">Advanced Searching Using Boolean Charts</a>:
+    </strong>
+  </p>
+
+
+
+
+  <table>
+    <tbody><tr>
+      <td>
+        <input id="negate0" name="negate0" value="1" type="checkbox">
+        <label for="negate0">
+          Not (negate this whole chart)
+        </label>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <select name="field0-0-0">
+            <option selected="selected" value="noop">---
+            </option>
+            <option value="%5BBug+creation%5D">%5BBug+creation%5D
+            </option>
+            <option value="alias">Alias
+            </option>
+            <option value="assigned_to">Assignee
+            </option>
+            <option value="attachments.submitter">Attachment creator
+            </option>
+            <option value="attach_data.thedata">Attachment data
+            </option>
+            <option value="attachments.description">Attachment description
+            </option>
+            <option value="attachments.filename">Attachment filename
+            </option>
+            <option value="attachments.isurl">Attachment is a URL
+            </option>
+            <option value="attachments.isobsolete">Attachment is obsolete
+            </option>
+            <option value="attachments.ispatch">Attachment is patch
+            </option>
+            <option value="attachments.isprivate">Attachment is private
+            </option>
+            <option value="attachments.mimetype">Attachment mime type
+            </option>
+            <option value="blocked">Blocks
+            </option>
+            <option value="bug_id">Bug ID
+            </option>
+            <option value="cc">CC
+            </option>
+            <option value="cclist_accessible">CC list accessible
+            </option>
+            <option value="classification">Classification
+            </option>
+            <option value="longdesc">Comment
+            </option>
+            <option value="longdescs.isprivate">Comment is private
+            </option>
+            <option value="commenter">Commenter
+            </option>
+            <option value="component">Component
+            </option>
+            <option value="content">Content
+            </option>
+            <option value="creation_ts">Creation date
+            </option>
+            <option value="days_elapsed">Days since bug changed
+            </option>
+            <option value="dependson">Depends on
+            </option>
+            <option value="cf_difficulty">Difficulty
+            </option>
+            <option value="environment">Environment
+            </option>
+            <option value="everconfirmed">Ever confirmed
+            </option>
+            <option value="flagtypes.name">Flag
+            </option>
+            <option value="requestees.login_name">Flag Requestee
+            </option>
+            <option value="setters.login_name">Flag Setter
+            </option>
+            <option value="bug_group">Group
+            </option>
+            <option value="keywords">Keywords
+            </option>
+            <option value="delta_ts">Changed
+            </option>
+            <option value="op_sys">OS
+            </option>
+            <option value="rep_platform">Hardware
+            </option>
+            <option value="priority">Priority
+            </option>
+            <option value="product">Product
+            </option>
+            <option value="qa_contact">QA Contact
+            </option>
+            <option value="reporter">Reporter
+            </option>
+            <option value="reporter_accessible">Reporter accessible
+            </option>
+            <option value="resolution">Resolution
+            </option>
+            <option value="see_also">See Also
+            </option>
+            <option value="bug_severity">Severity
+            </option>
+            <option value="bug_status">Status
+            </option>
+            <option value="status_whiteboard">Whiteboard
+            </option>
+            <option value="short_desc">Summary
+            </option>
+            <option value="target_milestone">Target Milestone
+            </option>
+            <option value="owner_idle_time">Time Since Assignee Touched
+            </option>
+            <option value="bug_file_loc">URL
+            </option>
+            <option value="version">Version
+            </option>
+            <option value="votes">Votes
+            </option>
+        </select>
+<select name="type0-0-0">
+    <option value="noop" selected="selected">---</option>
+    <option value="equals">is equal to</option>
+    <option value="notequals">is not equal to</option>
+    <option value="anyexact">is equal to any of the strings</option>
+    <option value="substring">contains the string</option>
+    <option value="casesubstring">contains the string (exact case)</option>
+    <option value="notsubstring">does not contain the string</option>
+    <option value="anywordssubstr">contains any of the strings</option>
+    <option value="allwordssubstr">contains all of the strings</option>
+    <option value="nowordssubstr">contains none of the strings</option>
+    <option value="regexp">matches regular expression</option>
+    <option value="notregexp">does not match regular expression</option>
+    <option value="lessthan">is less than</option>
+    <option value="greaterthan">is greater than</option>
+    <option value="anywords">contains any of the words</option>
+    <option value="allwords">contains all of the words</option>
+    <option value="nowords">contains none of the words</option>
+    <option value="changedbefore">changed before</option>
+    <option value="changedafter">changed after</option>
+    <option value="changedfrom">changed from</option>
+    <option value="changedto">changed to</option>
+    <option value="changedby">changed by</option>
+    <option value="matches">matches</option>
+</select>
+
+        <input name="value0-0-0"> 
+      </td>
+      
+        <td>
+          <input value="Or" onclick="this.form.action='query.cgi#chart'; this.form.method='POST'; return 1;" name="cmd-add0-0-1" id="cmd-add0-0-1" type="submit">
+        </td>
+      
+    </tr>
+    
+    <tr>
+      <td>
+        <input value="And" onclick="this.form.action='query.cgi#chart'; this.form.method='POST'; return 1;" name="cmd-add0-1-0" id="cmd-add0-1-0" type="submit">
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+        <input value="Add another boolean chart" onclick="this.form.action='query.cgi#chart'; this.form.method='POST'; return 1;" name="cmd-add1-0-0" id="cmd-add1-0-0" type="submit">
+        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+      </td>
+    </tr>   
+    
+  </tbody></table>
+  <hr>
+
+</form>
+
+
+
+  </div>
+
+</div>
+</div>
+
+
+
+<div id="footer">
+  <div class="intro"></div>
+
+
+
+
+<ul id="useful-links">
+  <li id="links-actions"><ul class="links">
+  <li><a href="http://bugs.winehq.org/";>Intro</a></li>
+  <li><span class="separator">| </span><a href="http://bugs.winehq.org/enter_bug.cgi";>New</a></li>
+  <li><span class="separator">| </span><a href="http://bugs.winehq.org/query.cgi";>Search</a></li>
+
+  <li class="form">
+    <span class="separator">| </span><form class="quicksearch" action="buglist.cgi" method="get" onsubmit="if (this.quicksearch.value == '')
+                  { alert('Please enter one or more search terms first.');
+                    return false; } return true;">
+    <input class="txt" id="quicksearch_bottom" name="quicksearch" type="text">
+    <input class="btn" value="Find" id="find_bottom" type="submit"></form></li>
+
+  <li><span class="separator">| </span><a href="http://bugs.winehq.org/report.cgi";>Reports</a></li>
+
+  <li></li>
+
+
+  <li>
+        <span class="separator">| </span>
+        <a href="http://bugs.winehq.org/docs/html/query.html"; target="_blank">Help</a>
+      </li>
+    
+      <li id="new_account_container_bottom">
+        <span class="separator">| </span>
+        <a href="http://bugs.winehq.org/createaccount.cgi";>New&nbsp;Account</a>
+      </li>
+
+    <li id="mini_login_container_bottom">
+  <span class="separator">| </span>
+  <a id="login_link_bottom" href="http://bugs.winehq.org/query.cgi?GoAheadAndLogIn=1"; onclick="return show_mini_login_form('_bottom')">Log In</a>
+  <form action="http://bugs.winehq.org/query.cgi?format=advanced&amp;field0-0-0=xyzzy"; method="POST" class="mini_login bz_default_hidden" id="mini_login_bottom" onsubmit="return check_mini_login_fields( '_bottom' );">
+    <input value="login" id="Bugzilla_login_bottom" class="bz_login bz_mini_login_help" name="Bugzilla_login" onfocus="mini_login_on_focus('_bottom')">
+    <input class="bz_password bz_default_hidden" id="Bugzilla_password_bottom" name="Bugzilla_password" type="password">
+    <input class="bz_password bz_mini_login_help" id="Bugzilla_password_dummy_bottom" value="password" onfocus="mini_login_on_focus('_bottom')" type="text">
+      <input id="Bugzilla_remember_bottom" name="Bugzilla_remember" value="on" class="bz_remember" checked="checked" type="checkbox">
+      <label for="Bugzilla_remember_bottom">Remember</label>
+    <input name="GoAheadAndLogIn" value="Log in" id="log_in_bottom" type="submit">
+    <script type="text/javascript">
+      mini_login_constants = {
+          "login" : "login",
+          "warning" : "You must set the login and password before logging in."
+      };
+      
+      if (YAHOO.env.ua.gecko || YAHOO.env.ua.ie || YAHOO.env.ua.opera) {
+          YAHOO.util.Event.onDOMReady(function() {
+              init_mini_login_form('_bottom');
+          });
+      }
+      else {
+          YAHOO.util.Event.on(window, 'load', function () {
+              window.setTimeout(function() {
+                  init_mini_login_form('_bottom');
+              }, 200);
+          });
+    }
+    </script>
+    <a href="#" onclick="return hide_mini_login_form('_bottom')">[x]</a>
+  </form>
+</li>
+<li id="forgot_container_bottom">
+  <span class="separator">| </span>
+  <a id="forgot_link_bottom" href="http://bugs.winehq.org/query.cgi?GoAheadAndLogIn=1#forgot"; onclick="return show_forgot_form('_bottom')">Forgot Password</a>
+  <form action="token.cgi" method="post" id="forgot_form_bottom" class="mini_forgot bz_default_hidden">
+    <label>Login: <input name="loginname" size="20" type="text"></label>
+    <input id="forgot_button_bottom" value="Reset Password" type="submit">
+    <input name="a" value="reqpw" type="hidden">
+    <a href="#" onclick="return hide_forgot_form('_bottom')">[x]</a>
+  </form>
+</li>
+</ul>
+  </li>
+
+<!--    
+  
+    
+-->
+
+  
+
+
+  
+</ul>
+
+  <div class="outro"></div>
+</div>
+
+
+    <!-- End Content -->
+    </div>
+  <b class="rbottom"><b class="r4"></b><b class="r3"></b><b class="r2"></b><b class="r1"></b></b>
+  </div>
+
+</div>
+
+<div id="cwfooter">
+    Hosted By
+    <a href="http://www.codeweavers.com/";><img src="bugzilla-wine-advanced-query_files/cw_logo_sm.png" alt="CodeWeavers" title="CodeWeavers - Run Windows applications and games on Mac and Linux"></a>
+</div>
+
+</body></html>
\ No newline at end of file

=== modified file 'lib/lp/bugs/windmill/testing.py'
--- lib/lp/bugs/windmill/testing.py	2009-09-15 08:58:30 +0000
+++ lib/lp/bugs/windmill/testing.py	2010-10-29 12:36:22 +0000
@@ -15,4 +15,8 @@
 class BugsWindmillLayer(BaseWindmillLayer):
     """Layer for Bugs Windmill tests."""
 
-    base_url = 'http://bugs.launchpad.dev:8085/'
+    @classmethod
+    def setUp(cls):
+        cls.base_url = cls.appserver_root_url('bugs')
+        super(BugsWindmillLayer, cls).setUp()
+

=== modified file 'lib/lp/bugs/windmill/tests/test_bug_also_affects_new_upstream.py'
--- lib/lp/bugs/windmill/tests/test_bug_also_affects_new_upstream.py	2010-08-20 20:31:18 +0000
+++ lib/lp/bugs/windmill/tests/test_bug_also_affects_new_upstream.py	2010-10-29 12:36:22 +0000
@@ -15,21 +15,27 @@
 from lp.testing import WindmillTestCase
 
 
-CHOOSE_AFFECTED_URL = ('http://bugs.launchpad.dev:8085/tomcat/+bug/3/'
-                       '+choose-affected-product')
-
 class TestBugAlsoAffects(WindmillTestCase):
 
     layer = BugsWindmillLayer
     suite_name = 'test_bug_also_affects_register_link'
 
-    test_bug_also_affects_picker = FormPickerWidgetTest(
-        name='test_bug_also_affects',
-        url=CHOOSE_AFFECTED_URL,
-        short_field_name='product',
-        search_text='firefox',
-        result_index=1,
-        new_value='firefox')
+    def setUp(self):
+        WindmillTestCase.setUp(self)
+        lpuser.SAMPLE_PERSON.ensure_login(self.client)
+        self.choose_affected_url = (
+                            '%s/tomcat/+bug/3/+choose-affected-product'
+                            % BugsWindmillLayer.base_url)
+
+    def test_bug_also_affects_picker(self):
+        test_bug_also_affects_picker = FormPickerWidgetTest(
+            name='test_bug_also_affects',
+            url=self.choose_affected_url,
+            short_field_name='product',
+            search_text='firefox',
+            result_index=1,
+            new_value='firefox')
+        test_bug_also_affects_picker()
 
     def test_bug_also_affects_register_link(self):
         """Test that picker shows "Register it" link.
@@ -44,9 +50,8 @@
         client = self.client
 
         # Open a bug page and wait for it to finish loading.
-        client.open(url=CHOOSE_AFFECTED_URL)
+        client.open(url=self.choose_affected_url)
         client.waits.forPageLoad(timeout=constants.PAGE_LOAD)
-        lpuser.SAMPLE_PERSON.ensure_login(client)
 
         client.waits.forElement(
             id=choose_link_id, timeout=constants.FOR_ELEMENT)
@@ -55,5 +60,6 @@
         client.waits.forElement(
             link=u'Register it', timeout=constants.FOR_ELEMENT)
 
+
 def test_suite():
     return unittest.TestLoader().loadTestsFromName(__name__)

=== modified file 'lib/lp/bugs/windmill/tests/test_bug_commenting.py'
--- lib/lp/bugs/windmill/tests/test_bug_commenting.py	2010-10-27 04:27:31 +0000
+++ lib/lp/bugs/windmill/tests/test_bug_commenting.py	2010-10-29 12:36:22 +0000
@@ -31,7 +31,7 @@
         client = self.client
         lpuser.NO_PRIV.ensure_login(client)
 
-        client.open(url='http://bugs.launchpad.dev:8085/bugs/1')
+        client.open(url='%s/bugs/1' % BugsWindmillLayer.base_url)
         client.waits.forPageLoad(timeout=WAIT_PAGELOAD)
         client.waits.forElement(xpath=ADD_COMMENT_BUTTON)
 

=== modified file 'lib/lp/bugs/windmill/tests/test_bug_inline_subscriber.py'
--- lib/lp/bugs/windmill/tests/test_bug_inline_subscriber.py	2010-08-20 20:31:18 +0000
+++ lib/lp/bugs/windmill/tests/test_bug_inline_subscriber.py	2010-10-29 12:36:22 +0000
@@ -13,10 +13,10 @@
 from lp.testing import WindmillTestCase
 
 
-BUG_URL = u'http://bugs.launchpad.dev:8085/bugs/%s'
 SUBSCRIPTION_LINK = u'//div[@id="portlet-subscribers"]/div/div/a'
 PERSON_LINK = u'//div[@id="subscribers-links"]/div/a[@name="%s"]'
 
+
 class TestInlineSubscribing(WindmillTestCase):
 
     layer = BugsWindmillLayer
@@ -31,8 +31,9 @@
         """
         client = self.client
 
+        bug_url = u'%s/bugs/%%s' % BugsWindmillLayer.base_url
         # Open a bug page and wait for it to finish loading.
-        client.open(url=BUG_URL % 11)
+        client.open(url=bug_url % 11)
         client.waits.forPageLoad(timeout=PAGE_LOAD)
         lpuser.SAMPLE_PERSON.ensure_login(client)
 
@@ -142,7 +143,7 @@
 
         # Test unsubscribing via the remove icon for duplicates.
         # First, go to bug 6 and subscribe.
-        client.open(url=BUG_URL % 6)
+        client.open(url=bug_url % 6)
         client.waits.forPageLoad(timeout=PAGE_LOAD)
         client.waits.forElement(
             id=u'subscribers-links', timeout=FOR_ELEMENT)
@@ -152,7 +153,7 @@
             xpath=SUBSCRIPTION_LINK, validator=u'Unsubscribe')
         client.asserts.assertNode(xpath=PERSON_LINK % u'Foo Bar')
         # Bug 6 is a dupe of bug 5, so go to bug 5 to unsubscribe.
-        client.open(url=BUG_URL % 5)
+        client.open(url=bug_url % 5)
         client.waits.forPageLoad(timeout=PAGE_LOAD)
         client.waits.forElement(
             id=u'subscribers-links', timeout=FOR_ELEMENT)
@@ -162,7 +163,7 @@
             xpath=SUBSCRIPTION_LINK, validator=u'Subscribe')
         client.asserts.assertNotNode(xpath=PERSON_LINK % u'Foo Bar')
         # Then back to bug 6 to confirm the duplicate is also unsubscribed.
-        client.open(url=BUG_URL % 6)
+        client.open(url=bug_url % 6)
         client.waits.forPageLoad(timeout=PAGE_LOAD)
         client.waits.forElement(
             id=u'subscribers-links', timeout=FOR_ELEMENT)
@@ -177,7 +178,7 @@
         # dealing with a duplicate and an indirect subscription.
         lpuser.SAMPLE_PERSON.ensure_login(client)
         # Go to bug 6, the dupe, and subscribe.
-        client.open(url=BUG_URL % 6)
+        client.open(url=bug_url % 6)
         client.waits.forPageLoad(timeout=PAGE_LOAD)
         client.waits.forElement(
             id=u'subscribers-links', timeout=FOR_ELEMENT)
@@ -186,7 +187,7 @@
         client.asserts.assertText(
             xpath=SUBSCRIPTION_LINK, validator=u'Unsubscribe')
         # Now back to bug 5.
-        client.open(url=BUG_URL % 5)
+        client.open(url=bug_url % 5)
         client.waits.forPageLoad(timeout=PAGE_LOAD)
         client.waits.forElement(
             id=u'subscribers-links', timeout=FOR_ELEMENT)
@@ -216,7 +217,7 @@
         client.asserts.assertText(
             xpath=SUBSCRIPTION_LINK, validator=u'Unsubscribe')
         # Go to bug 6, the dupe, and subscribe.
-        client.open(url=BUG_URL % 6)
+        client.open(url=bug_url % 6)
         client.waits.forPageLoad(timeout=PAGE_LOAD)
         client.waits.forElement(
             id=u'subscribers-links', timeout=FOR_ELEMENT)
@@ -225,7 +226,7 @@
         client.asserts.assertText(
             xpath=SUBSCRIPTION_LINK, validator=u'Unsubscribe')
         # Now back to bug 5. Confirm there are 2 subscriptions.
-        client.open(url=BUG_URL % 5)
+        client.open(url=bug_url % 5)
         client.waits.forPageLoad(timeout=PAGE_LOAD)
         client.asserts.assertNode(
             id='direct-subscriber-12', timeout=FOR_ELEMENT)
@@ -246,5 +247,6 @@
             xpath=(u'//div[@id="subscribers-from-duplicates"]'
                    '/div/a[@name="Sample Person"]'))
 
+
 def test_suite():
     return unittest.TestLoader().loadTestsFromName(__name__)

=== modified file 'lib/lp/bugs/windmill/tests/test_bug_me_too.py'
--- lib/lp/bugs/windmill/tests/test_bug_me_too.py	2010-08-20 20:31:18 +0000
+++ lib/lp/bugs/windmill/tests/test_bug_me_too.py	2010-10-29 12:36:22 +0000
@@ -57,7 +57,7 @@
 
         # Open bug 11 and wait for it to finish loading.
         client.open(
-            url=u'http://bugs.launchpad.dev:8085/jokosher/+bug/11/+index')
+            url=u'%s/jokosher/+bug/11/+index' % BugsWindmillLayer.base_url)
         client.waits.forPageLoad(timeout=constants.PAGE_LOAD)
         lpuser.SAMPLE_PERSON.ensure_login(client)
 

=== modified file 'lib/lp/bugs/windmill/tests/test_bug_privacy_settings.py'
--- lib/lp/bugs/windmill/tests/test_bug_privacy_settings.py	2010-08-20 20:31:18 +0000
+++ lib/lp/bugs/windmill/tests/test_bug_privacy_settings.py	2010-10-29 12:36:22 +0000
@@ -11,7 +11,6 @@
 from lp.testing import WindmillTestCase
 
 
-BUG_URL = u'http://bugs.launchpad.dev:8085/bugs/15'
 MAIN_FORM_ELEMENT = u'//div[@id="privacy-form-container"]/div'
 FORM_NOT_VISIBLE = (
     u'element.className.search("yui-lazr-formoverlay-hidden") != -1')
@@ -50,8 +49,9 @@
          """
         client = self.client
 
+        bug_url = u'%s/bugs/15' % BugsWindmillLayer.base_url
         # Open a bug page and wait for it to finish loading.
-        client.open(url=BUG_URL)
+        client.open(url=bug_url)
         client.waits.forPageLoad(timeout=constants.PAGE_LOAD)
         lpuser.SAMPLE_PERSON.ensure_login(client)
 
@@ -99,7 +99,7 @@
         # we get the same text in the HTML data sent by the server,
         # so that we can be sure that the security settings are correctly
         # updated.
-        client.open(url=BUG_URL)
+        client.open(url=bug_url)
         client.waits.forPageLoad(timeout=constants.PAGE_LOAD)
         client.waits.forElement(
             xpath=MAIN_FORM_ELEMENT, timeout=constants.FOR_ELEMENT)
@@ -137,7 +137,7 @@
         client.asserts.assertChecked(id=FIELD_SECURITY_RELATED)
 
         # When we reload the page, we get the same texts.
-        client.open(url=BUG_URL)
+        client.open(url=bug_url)
         client.waits.forPageLoad(timeout=constants.PAGE_LOAD)
         client.waits.forElement(
             xpath=MAIN_FORM_ELEMENT, timeout=constants.FOR_ELEMENT)
@@ -157,7 +157,7 @@
 
         # When we reload the page, the <div> for the security message
         # does not exist either.
-        client.open(url=BUG_URL)
+        client.open(url=bug_url)
         client.waits.forPageLoad(timeout=constants.PAGE_LOAD)
         client.waits.forElement(
             xpath=MAIN_FORM_ELEMENT, timeout=constants.FOR_ELEMENT)
@@ -176,5 +176,6 @@
         client.asserts.assertElemJS(
             xpath=MAIN_FORM_ELEMENT, js=FORM_NOT_VISIBLE)
 
+
 def test_suite():
     return unittest.TestLoader().loadTestsFromName(__name__)

=== modified file 'lib/lp/bugs/windmill/tests/test_filebug_dupe_finder.py'
--- lib/lp/bugs/windmill/tests/test_filebug_dupe_finder.py	2010-08-20 20:31:18 +0000
+++ lib/lp/bugs/windmill/tests/test_filebug_dupe_finder.py	2010-10-29 12:36:22 +0000
@@ -11,8 +11,6 @@
 from lp.testing import WindmillTestCase
 
 
-FILEBUG_URL = 'http://bugs.launchpad.dev:8085/firefox/+filebug'
-
 FORM_OVERLAY = u'//div[@id="duplicate-overlay-bug-4"]/div'
 FORM_OVERLAY_CANCEL = (
     u'//div[@id="duplicate-overlay-bug-4"]'
@@ -30,6 +28,7 @@
 BUG_INFO_HIDDEN = 'style.height|0px'
 BUG_INFO_SHOWN_JS = 'element.style.height != "0px"'
 
+
 class TestDupeFinder(WindmillTestCase):
 
     layer = BugsWindmillLayer
@@ -46,7 +45,7 @@
         lpuser.SAMPLE_PERSON.ensure_login(client)
 
         # Go to the +filebug page for Firefox
-        client.open(url=FILEBUG_URL)
+        client.open(url=u'%s/firefox/+filebug' % BugsWindmillLayer.base_url)
         client.waits.forPageLoad(timeout=constants.PAGE_LOAD)
 
         # Ensure the "search" field has finished loading, then enter a simple
@@ -119,5 +118,6 @@
             xpath=u'//div[@class="message"]',
             validator="Required input is missing.")
 
+
 def test_suite():
     return unittest.TestLoader().loadTestsFromName(__name__)

=== modified file 'lib/lp/bugs/windmill/tests/test_filebug_extra_options.py'
--- lib/lp/bugs/windmill/tests/test_filebug_extra_options.py	2010-08-20 20:31:18 +0000
+++ lib/lp/bugs/windmill/tests/test_filebug_extra_options.py	2010-10-29 12:36:22 +0000
@@ -25,7 +25,7 @@
         client = self.client
 
         # Open a +filebug page and wait for it to finish loading.
-        client.open(url=u'http://bugs.launchpad.dev:8085/firefox/+filebug')
+        client.open(url=u'%s/firefox/+filebug' % BugsWindmillLayer.base_url)
         client.waits.forPageLoad(timeout=constants.PAGE_LOAD)
         lpuser.SAMPLE_PERSON.ensure_login(client)
 

=== modified file 'lib/lp/bugs/windmill/tests/test_mark_duplicate.py'
--- lib/lp/bugs/windmill/tests/test_mark_duplicate.py	2010-08-20 20:31:18 +0000
+++ lib/lp/bugs/windmill/tests/test_mark_duplicate.py	2010-10-29 12:36:22 +0000
@@ -41,7 +41,7 @@
         client = self.client
 
         # Open a bug page and wait for it to finish loading
-        client.open(url=u'http://bugs.launchpad.dev:8085/bugs/15')
+        client.open(url=u'%s/bugs/15' % BugsWindmillLayer.base_url)
         client.waits.forPageLoad(timeout=constants.PAGE_LOAD)
         lpuser.SAMPLE_PERSON.ensure_login(client)
 
@@ -121,7 +121,7 @@
             timeout=constants.FOR_ELEMENT)
 
         # When we go back to the page for the duplicate bug...
-        client.open(url=u'http://bugs.launchpad.dev:8085/bugs/15')
+        client.open(url=u'%s/bugs/15' % BugsWindmillLayer.base_url)
         client.waits.forPageLoad(timeout=constants.PAGE_LOAD)
         client.waits.forElement(
             xpath=MAIN_FORM_ELEMENT, timeout=constants.FOR_ELEMENT)

=== modified file 'lib/lp/bugs/windmill/tests/test_official_bug_tags_management.py'
--- lib/lp/bugs/windmill/tests/test_official_bug_tags_management.py	2010-08-20 20:31:18 +0000
+++ lib/lp/bugs/windmill/tests/test_official_bug_tags_management.py	2010-10-29 12:36:22 +0000
@@ -27,7 +27,7 @@
 
     # Firefox is a product - an official bug tags target.
 
-        client.open(url='http://bugs.launchpad.dev:8085/firefox')
+        client.open(url='%s/firefox' % BugsWindmillLayer.base_url)
         client.waits.forPageLoad(timeout=constants.PAGE_LOAD)
         lpuser.FOO_BAR.ensure_login(client)
 

=== modified file 'lib/lp/buildmaster/model/packagebuild.py'
--- lib/lp/buildmaster/model/packagebuild.py	2010-10-27 14:25:19 +0000
+++ lib/lp/buildmaster/model/packagebuild.py	2010-10-29 12:36:22 +0000
@@ -122,6 +122,12 @@
         store.add(package_build)
         return package_build
 
+    def destroySelf(self):
+        build_farm_job = self.build_farm_job
+        store = Store.of(self)
+        store.remove(self)
+        store.remove(build_farm_job)
+
     @property
     def current_component(self):
         """See `IPackageBuild`."""

=== modified file 'lib/lp/buildmaster/tests/test_packagebuild.py'
--- lib/lp/buildmaster/tests/test_packagebuild.py	2010-10-27 14:25:19 +0000
+++ lib/lp/buildmaster/tests/test_packagebuild.py	2010-10-29 12:36:22 +0000
@@ -32,6 +32,7 @@
     IPackageBuildSet,
     IPackageBuildSource,
     )
+from lp.buildmaster.model.buildfarmjob import BuildFarmJob
 from lp.buildmaster.model.packagebuild import PackageBuild
 from lp.buildmaster.tests.mock_slaves import WaitingSlave
 from lp.registry.interfaces.pocket import (
@@ -202,6 +203,19 @@
             self.package_build.id, self.package_build.build_farm_job.id)
         self.assertEquals(expected_cookie, cookie)
 
+    def test_destroySelf_removes_BuildFarmJob(self):
+        # Destroying a packagebuild also destroys the BuildFarmJob it
+        # references.
+        naked_build = removeSecurityProxy(self.package_build)
+        store = Store.of(self.package_build)
+        # Ensure build_farm_job_id is set.
+        store.flush()
+        build_farm_job_id = naked_build.build_farm_job_id
+        naked_build.destroySelf()
+        result = store.find(
+            BuildFarmJob, BuildFarmJob.id == build_farm_job_id)
+        self.assertIs(None, result.one())
+
 
 class TestPackageBuildSet(TestPackageBuildBase):
 

=== modified file 'lib/lp/code/browser/configure.zcml'
--- lib/lp/code/browser/configure.zcml	2010-10-20 03:44:49 +0000
+++ lib/lp/code/browser/configure.zcml	2010-10-29 12:36:22 +0000
@@ -1320,4 +1320,10 @@
             permission="zope.Public"/>
     </facet>
 
+    <browser:url
+        for="lp.code.interfaces.branchmergequeue.IBranchMergeQueue"
+        attribute_to_parent="owner"
+        path_expression="string:+merge-queues/${name}"
+        rootsite="code" />
+
 </configure>

=== modified file 'lib/lp/code/configure.zcml'
--- lib/lp/code/configure.zcml	2010-10-18 03:39:28 +0000
+++ lib/lp/code/configure.zcml	2010-10-29 12:36:22 +0000
@@ -22,23 +22,23 @@
       provides="zope.publisher.interfaces.browser.IDefaultBrowserLayer"
       name="code" />
 
-  <!-- Branch Merge Queue -->
-
-  <class class="lp.code.model.branchmergequeue.SingleBranchMergeQueue">
-    <allow interface="lp.code.interfaces.branchmergequeue.IBranchMergeQueue"/>
-  </class>
-  <class class="lp.code.model.branchmergequeue.MultiBranchMergeQueue">
-    <allow interface="lp.code.interfaces.branchmergequeue.IMultiBranchMergeQueue"/>
-    <require
-        permission="launchpad.Edit"
-        set_schema="lp.code.interfaces.branchmergequeue.IMultiBranchMergeQueue"/>
-  </class>
+  <!-- Branch Merge Queues -->
   <securedutility
-      class="lp.code.model.branchmergequeue.BranchMergeQueueSet"
-      provides="lp.code.interfaces.branchmergequeue.IBranchMergeQueueSet">
-    <allow interface="lp.code.interfaces.branchmergequeue.IBranchMergeQueueSet"/>
+     component="lp.code.model.branchmergequeue.BranchMergeQueue"
+     provides="lp.code.interfaces.branchmergequeue.IBranchMergeQueueSource">
+    <allow interface="lp.code.interfaces.branchmergequeue.IBranchMergeQueueSource"/>
+
   </securedutility>
 
+  <class class="lp.code.model.branchmergequeue.BranchMergeQueue">
+    <require permission="zope.Public"
+             attributes="registrant owner name description configuration
+                         date_created branches" />
+    <require permission="launchpad.Edit"
+             attributes="setMergeQueueConfig"
+             set_attributes="owner name description configuration" />
+  </class>
+
   <class class="lp.code.model.codereviewvote.CodeReviewVoteReference">
     <allow interface="lp.code.interfaces.codereviewvote.ICodeReviewVoteReferencePublic"/>
     <require
@@ -454,18 +454,18 @@
                    lp.code.interfaces.branch.IBranchAnyone
                    lp.code.interfaces.branch.IBranchEditableAttributes
                    lp.code.interfaces.branch.IBranchPublic
-                   lp.code.interfaces.branch.IBranchView
-                   "/>
+                   lp.code.interfaces.branch.IBranchView"
+        attributes="merge_queue merge_queue_config"/>
     <require
         permission="launchpad.Edit"
         interface="lp.code.interfaces.branch.IBranchEdit"
         set_schema="lp.code.interfaces.branch.IBranchEditableAttributes"
-        attributes="setPrivate"
+        attributes="setPrivate addToQueue setMergeQueueConfig"
         set_attributes="branch_format control_format repository_format
                         branch_type
                         last_scanned last_scanned_id
                         last_mirrored last_mirrored_id next_mirror_time
-                        revision_count merge_queue mirror_failures
+                        revision_count mirror_failures
                         stacked_on mirror_status_message"/>
     <require
         permission="launchpad.AnyPerson"
@@ -519,28 +519,6 @@
       for="lp.codehosting.scanner.events.IScanCompleted"
       handler="lp.codehosting.scanner.mergedetection.auto_merge_branches"/>
 
-  <!-- Temporarily disabling queues
-       <browser:page
-
-
-       name="+merge-queue"
-
-
-       for="lp.code.interfaces.branch.IBranch"
-
-
-       class="lp.code.browser.branch.BranchMergeQueueView"
-
-
-       facet="branches"
-
-
-       permission="zope.Public"
-
-
-       template="../templates/branch-merge-queue.pt" />
-  -->
-
   <!-- BranchSet -->
 
   <class class="lp.code.model.branch.BranchSet">

=== modified file 'lib/lp/code/enums.py'
--- lib/lp/code/enums.py	2010-08-20 20:31:18 +0000
+++ lib/lp/code/enums.py	2010-10-29 12:36:22 +0000
@@ -7,7 +7,6 @@
 __all__ = [
     'BranchLifecycleStatus',
     'BranchLifecycleStatusFilter',
-    'BranchMergeControlStatus',
     'BranchMergeProposalStatus',
     'BranchSubscriptionDiffSize',
     'BranchSubscriptionNotificationLevel',
@@ -77,44 +76,6 @@
     ABANDONED = DBItem(80, "Abandoned")
 
 
-class BranchMergeControlStatus(DBEnumeratedType):
-    """Branch Merge Control Status
-
-    Does the branch want Launchpad to manage a merge queue, and if it does,
-    how does the branch owner handle removing items from the queue.
-    """
-
-    NO_QUEUE = DBItem(1, """
-        Does not use a merge queue
-
-        The branch does not use the merge queue managed by Launchpad.  Merges
-        are tracked and managed elsewhere.  Users will not be able to queue up
-        approved branch merge proposals.
-        """)
-
-    MANUAL = DBItem(2, """
-        Manual processing of the merge queue
-
-        One or more people are responsible for manually processing the queued
-        branch merge proposals.
-        """)
-
-    ROBOT = DBItem(3, """
-        A branch merge robot is used to process the merge queue
-
-        An external application, like PQM, is used to merge in the queued
-        approved proposed merges.
-        """)
-
-    ROBOT_RESTRICTED = DBItem(4, """
-        The branch merge robot used to process the queue is in restricted mode
-
-        When the robot is in restricted mode, normal queued branches are not
-        returned for merging, only those with "Queued for Restricted
-        merging" will be.
-        """)
-
-
 class BranchType(DBEnumeratedType):
     """Branch Type
 

=== modified file 'lib/lp/code/errors.py'
--- lib/lp/code/errors.py	2010-09-02 14:30:47 +0000
+++ lib/lp/code/errors.py	2010-10-29 12:36:22 +0000
@@ -26,6 +26,7 @@
     'CodeImportNotInReviewedState',
     'ClaimReviewFailed',
     'InvalidBranchMergeProposal',
+    'InvalidMergeQueueConfig',
     'InvalidNamespace',
     'NoLinkedBranch',
     'NoSuchBranch',
@@ -291,3 +292,13 @@
         RecipeBuildException.__init__(
             self, recipe, distroseries,
             'A build against this distro is not allowed.')
+
+
+class InvalidMergeQueueConfig(Exception):
+    """The config specified is not a valid JSON string."""
+
+    webservice_error(400)
+
+    def __init__(self):
+        message = ('The configuration specified is not a valid JSON string.')
+        Exception.__init__(self, message)

=== modified file 'lib/lp/code/interfaces/branch.py'
--- lib/lp/code/interfaces/branch.py	2010-09-09 01:18:36 +0000
+++ lib/lp/code/interfaces/branch.py	2010-10-29 12:36:22 +0000
@@ -75,13 +75,13 @@
     )
 from lp.code.enums import (
     BranchLifecycleStatus,
-    BranchMergeControlStatus,
     BranchSubscriptionDiffSize,
     BranchSubscriptionNotificationLevel,
     CodeReviewNotificationLevel,
     UICreatableBranchType,
     )
 from lp.code.interfaces.branchlookup import IBranchLookup
+from lp.code.interfaces.branchmergequeue import IBranchMergeQueue
 from lp.code.interfaces.branchtarget import IHasBranchTarget
 from lp.code.interfaces.hasbranches import IHasMergeProposals
 from lp.code.interfaces.hasrecipes import IHasRecipes
@@ -394,9 +394,6 @@
 
     stacked_on = Attribute('Stacked-on branch')
 
-    merge_queue = Attribute(
-        "The queue that contains the QUEUED proposals for this branch.")
-
     # Bug attributes
     bug_branches = CollectionField(
             title=_("The bug-branch link objects that link this branch "
@@ -594,9 +591,6 @@
     def getStackedBranches():
         """The branches that are stacked on this one."""
 
-    def getMergeQueue():
-        """The proposals that are QUEUED to land on this branch."""
-
     def getMainlineBranchRevisions(start_date, end_date=None,
                                    oldest_first=False):
         """Return the matching mainline branch revision objects.
@@ -996,11 +990,6 @@
             required=False, readonly=True,
             vocabulary=ControlFormat))
 
-    merge_control_status = Choice(
-        title=_('Merge Control Status'), required=True,
-        vocabulary=BranchMergeControlStatus,
-        default=BranchMergeControlStatus.NO_QUEUE)
-
 
 class IBranchEdit(Interface):
     """IBranch attributes that require launchpad.Edit permission."""
@@ -1030,9 +1019,9 @@
         is set, the branch gets moved into the junk namespace of the branch
         owner.
 
-        :raise: `BranchTargetError` if both project and source_package are set,
-          or if either the project or source_package fail to be adapted to an
-          IBranchTarget.
+        :raise: `BranchTargetError` if both project and source_package are
+          set, or if either the project or source_package fail to be
+          adapted to an IBranchTarget.
         """
 
     def requestUpgrade():
@@ -1075,8 +1064,53 @@
         """
 
 
+class IMergeQueueable(Interface):
+    """An interface for branches that can be queued."""
+
+    merge_queue = exported(
+        Reference(
+            title=_('Branch Merge Queue'),
+            schema=IBranchMergeQueue, required=False, readonly=True,
+            description=_(
+                "The branch merge queue that manages merges for this "
+                "branch.")))
+
+    merge_queue_config = exported(
+        TextLine(
+            title=_('Name'), required=True, readonly=True,
+            description=_(
+                "A JSON string of configuration values to send to a "
+                "branch merge robot.")))
+
+    @mutator_for(merge_queue)
+    @operation_parameters(
+        queue=Reference(title=_('Branch Merge Queue'),
+              schema=IBranchMergeQueue))
+    @export_write_operation()
+    def addToQueue(queue):
+        """Add this branch to a specified queue.
+
+        A branch's merges can be managed by a queue.
+
+        :param queue: The branch merge queue that will manage the branch.
+        """
+
+    @mutator_for(merge_queue_config)
+    @operation_parameters(
+        config=TextLine(title=_("A JSON string of config values.")))
+    @export_write_operation()
+    def setMergeQueueConfig(config):
+        """Set the merge_queue_config property.
+
+        A branch can store a JSON string of configuration data for a merge
+        robot to retrieve.
+
+        :param config: A JSON string of data.
+        """
+
+
 class IBranch(IBranchPublic, IBranchView, IBranchEdit,
-              IBranchEditableAttributes, IBranchAnyone):
+              IBranchEditableAttributes, IBranchAnyone, IMergeQueueable):
     """A Bazaar branch."""
 
     # Mark branches as exported entries for the Launchpad API.

=== added file 'lib/lp/code/interfaces/branchmergequeue.py'
--- lib/lp/code/interfaces/branchmergequeue.py	1970-01-01 00:00:00 +0000
+++ lib/lp/code/interfaces/branchmergequeue.py	2010-10-29 12:36:22 +0000
@@ -0,0 +1,115 @@
+# Copyright 2009-2010 Canonical Ltd.  This software is licensed under the
+# GNU Affero General Public License version 3 (see the file LICENSE).
+
+"""Branch merge queue interfaces."""
+
+__metaclass__ = type
+
+__all__ = [
+    'IBranchMergeQueue',
+    'IBranchMergeQueueSource',
+    ]
+
+from lazr.restful.declarations import (
+    export_as_webservice_entry,
+    export_write_operation,
+    exported,
+    mutator_for,
+    operation_parameters,
+    )
+from lazr.restful.fields import (
+    CollectionField,
+    Reference,
+    )
+from zope.interface import Interface
+from zope.schema import (
+    Datetime,
+    Int,
+    Text,
+    TextLine,
+    )
+
+from canonical.launchpad import _
+from lp.services.fields import (
+    PersonChoice,
+    PublicPersonChoice,
+    )
+
+
+class IBranchMergeQueue(Interface):
+    """An interface for managing branch merges."""
+
+    export_as_webservice_entry()
+
+    id = Int(title=_('ID'), readonly=True, required=True)
+
+    registrant = exported(
+        PublicPersonChoice(
+            title=_("The user that registered the branch."),
+            required=True, readonly=True,
+            vocabulary='ValidPersonOrTeam'))
+
+    owner = exported(
+        PersonChoice(
+            title=_('Owner'),
+            required=True, readonly=True,
+            vocabulary='UserTeamsParticipationPlusSelf',
+            description=_("The owner of the merge queue.")))
+
+    name = exported(
+        TextLine(
+            title=_('Name'), required=True,
+            description=_(
+                "Keep very short, unique, and descriptive, because it will "
+                "be used in URLs.  "
+                "Examples: main, devel, release-1.0, gnome-vfs.")))
+
+    description = exported(
+        Text(
+            title=_('Description'), required=False,
+            description=_(
+                'A short description of the purpose of this merge queue.')))
+
+    configuration = exported(
+        TextLine(
+            title=_('Configuration'), required=False, readonly=True,
+            description=_(
+                "A JSON string of configuration values.")))
+
+    date_created = exported(
+        Datetime(
+            title=_('Date Created'),
+            required=True,
+            readonly=True))
+
+    branches = exported(
+        CollectionField(
+            title=_('Dependent Branches'),
+            description=_(
+                'A collection of branches that this queue manages.'),
+            readonly=True,
+            value_type=Reference(Interface)))
+
+    @mutator_for(configuration)
+    @operation_parameters(
+        config=TextLine(title=_("A JSON string of configuration values.")))
+    @export_write_operation()
+    def setMergeQueueConfig(config):
+        """Set the JSON string configuration of the merge queue.
+
+        :param config: A JSON string of configuration values.
+        """
+
+
+class IBranchMergeQueueSource(Interface):
+
+    def new(name, owner, registrant, description, configuration, branches):
+        """Create a new IBranchMergeQueue object.
+
+        :param name: The name of the branch merge queue.
+        :param description: A description of queue.
+        :param configuration: A JSON string of configuration values.
+        :param owner: The owner of the queue.
+        :param registrant: The registrant of the queue.
+        :param branches: A list of branches to add to the queue.
+        """

=== removed file 'lib/lp/code/interfaces/branchmergequeue.py'
--- lib/lp/code/interfaces/branchmergequeue.py	2010-08-20 20:31:18 +0000
+++ lib/lp/code/interfaces/branchmergequeue.py	1970-01-01 00:00:00 +0000
@@ -1,94 +0,0 @@
-# Copyright 2009 Canonical Ltd.  This software is licensed under the
-# GNU Affero General Public License version 3 (see the file LICENSE).
-
-# pylint: disable-msg=E0213
-
-"""Branch merge queues contain queued branch merge proposals."""
-
-__metaclass__ = type
-__all__ = [
-    'IBranchMergeQueue',
-    'IBranchMergeQueueSet',
-    'IMultiBranchMergeQueue',
-    ]
-
-
-from zope.interface import (
-    Attribute,
-    Interface,
-    )
-from zope.schema import (
-    Datetime,
-    TextLine,
-    )
-
-from canonical.launchpad import _
-from canonical.launchpad.validators.name import name_validator
-from lp.services.fields import (
-    PublicPersonChoice,
-    Summary,
-    )
-
-
-class IBranchMergeQueue(Interface):
-    """The queued branch merge proposals for one or more branches."""
-
-    branches = Attribute("The branches that this queue is for.")
-
-    items = Attribute("The ordered queued branch merge proposals.")
-
-
-class IMultiBranchMergeQueue(IBranchMergeQueue):
-    """A queue that has proposals from a number of branches."""
-
-    name = TextLine(
-        title=_('Name'), required=True, constraint=name_validator,
-        description=_("""At least one lowercase letter or number, followed by
-            letters, dots, hyphens or plusses.
-            Keep this name short, as it is used in URLs."""))
-
-    summary = Summary(title=_('Summary'), required=False,
-        description=_('Details about the purpose of the merge queue.'))
-
-    registrant = PublicPersonChoice(
-        title=_('Registrant'), required=True, readonly=True,
-        vocabulary='ValidPersonOrTeam',
-        description=_("Either yourself or a team you are a member of. "
-                      "This controls who can modify the queue."))
-
-    owner = PublicPersonChoice(
-        title=_('Owner'), required=True,
-        vocabulary='PersonActiveMembershipPlusSelf',
-        description=_("Either yourself or a team you are a member of. "
-                      "This controls who can manipulate the queue."))
-
-    date_created = Datetime(
-        title=_('Date Created'), required=True, readonly=True)
-
-
-class IBranchMergeQueueSet(Interface):
-    """A utility interface for getting merge queues."""
-
-    def getByName(queue_name):
-        """Return the BranchMergeQueue with the specified name.
-
-        :param queue_name: The name of the multi-branch merge queue.
-        :type queue_name: String.
-        :raises NotFoundError: if a queue with the specified name does not
-            exist.
-        """
-
-    def getForBranch(branch):
-        """Get a `BranchMergeQueue` for the specified branch.
-
-        If the branch has defined that the queue for the branch is a
-        multi-branch queue, then that queue is returned.
-
-        :param branch: The branch to get the queue for.
-        :type branch: `IBranch`.
-        :raises NotUsingBranchMergeQueues: If the branch has said that it is
-            not using Launchpad merge queues, an exception.
-        """
-
-    def newMultiBranchMergeQueue(registrant, owner, name, summary):
-        """Create a new `MultiBranchMergeQueue`."""

=== modified file 'lib/lp/code/interfaces/webservice.py'
--- lib/lp/code/interfaces/webservice.py	2010-08-20 20:31:18 +0000
+++ lib/lp/code/interfaces/webservice.py	2010-10-29 12:36:22 +0000
@@ -20,6 +20,7 @@
     IBranchSet,
     )
 from lp.code.interfaces.branchmergeproposal import IBranchMergeProposal
+from lp.code.interfaces.branchmergequeue import IBranchMergeQueue
 from lp.code.interfaces.branchsubscription import IBranchSubscription
 from lp.code.interfaces.codeimport import ICodeImport
 from lp.code.interfaces.codereviewcomment import ICodeReviewComment
@@ -35,3 +36,4 @@
     )
 
 
+IBranchMergeQueue['branches'].value_type.schema = IBranch

=== modified file 'lib/lp/code/model/branch.py'
--- lib/lp/code/model/branch.py	2010-10-21 03:22:06 +0000
+++ lib/lp/code/model/branch.py	2010-10-29 12:36:22 +0000
@@ -10,6 +10,7 @@
     ]
 
 from datetime import datetime
+import simplejson
 
 from bzrlib import urlutils
 from bzrlib.revision import NULL_REVISION
@@ -31,7 +32,11 @@
     Or,
     Select,
     )
-from storm.locals import AutoReload
+from storm.locals import (
+    AutoReload,
+    Int,
+    Reference,
+    )
 from storm.store import Store
 from zope.component import getUtility
 from zope.event import notify
@@ -70,7 +75,6 @@
     )
 from lp.code.enums import (
     BranchLifecycleStatus,
-    BranchMergeControlStatus,
     BranchMergeProposalStatus,
     BranchType,
     )
@@ -82,6 +86,7 @@
     BranchTypeError,
     CannotDeleteBranch,
     InvalidBranchMergeProposal,
+    InvalidMergeQueueConfig,
     )
 from lp.code.event.branchmergeproposal import (
     BranchMergeProposalNeedsReviewEvent,
@@ -468,15 +473,6 @@
                 if target.target_branch.last_scanned_id is not None]
         return jobs
 
-    # XXX: Tim Penhey, 2008-06-18, bug 240881
-    merge_queue = ForeignKey(
-        dbName='merge_robot', foreignKey='MultiBranchMergeQueue',
-        default=None)
-
-    merge_control_status = EnumCol(
-        enum=BranchMergeControlStatus, notNull=True,
-        default=BranchMergeControlStatus.NO_QUEUE)
-
     def addToLaunchBag(self, launchbag):
         """See `IBranch`."""
         launchbag.add(self.product)
@@ -490,14 +486,6 @@
         store = Store.of(self)
         return store.find(Branch, Branch.stacked_on == self)
 
-    def getMergeQueue(self):
-        """See `IBranch`."""
-        return BranchMergeProposal.select("""
-            BranchMergeProposal.target_branch = %s AND
-            BranchMergeProposal.queue_status = %s
-            """ % sqlvalues(self, BranchMergeProposalStatus.QUEUED),
-            orderBy="queue_position")
-
     @property
     def code_is_browseable(self):
         """See `IBranch`."""
@@ -1156,6 +1144,23 @@
             SourcePackageRecipeData)
         return SourcePackageRecipeData.findRecipes(self)
 
+    merge_queue_id = Int(name='merge_queue', allow_none=True)
+    merge_queue = Reference(merge_queue_id, 'BranchMergeQueue.id')
+
+    merge_queue_config = StringCol(dbName='merge_queue_config')
+
+    def addToQueue(self, queue):
+        """See `IBranchEdit`."""
+        self.merge_queue = queue
+
+    def setMergeQueueConfig(self, config):
+        """See `IBranchEdit`."""
+        try:
+            simplejson.loads(config)
+            self.merge_queue_config = config
+        except ValueError: # The json string is invalid
+            raise InvalidMergeQueueConfig
+
 
 class DeletionOperation:
     """Represent an operation to perform as part of branch deletion."""

=== added file 'lib/lp/code/model/branchmergequeue.py'
--- lib/lp/code/model/branchmergequeue.py	1970-01-01 00:00:00 +0000
+++ lib/lp/code/model/branchmergequeue.py	2010-10-29 12:36:22 +0000
@@ -0,0 +1,83 @@
+# Copyright 2010 Canonical Ltd.  This software is licensed under the
+# GNU Affero General Public License version 3 (see the file LICENSE).
+
+"""Implementation classes for IBranchMergeQueue, etc."""
+
+__metaclass__ = type
+__all__ = ['BranchMergeQueue']
+
+import simplejson
+
+from storm.locals import (
+    Int,
+    Reference,
+    Store,
+    Storm,
+    Unicode,
+    )
+from zope.interface import (
+    classProvides,
+    implements,
+    )
+
+from canonical.database.datetimecol import UtcDateTimeCol
+from canonical.launchpad.interfaces.lpstorm import IMasterStore
+from lp.code.errors import InvalidMergeQueueConfig
+from lp.code.interfaces.branchmergequeue import (
+    IBranchMergeQueue,
+    IBranchMergeQueueSource,
+    )
+from lp.code.model.branch import Branch
+
+
+class BranchMergeQueue(Storm):
+    """See `IBranchMergeQueue`."""
+
+    __storm_table__ = 'BranchMergeQueue'
+    implements(IBranchMergeQueue)
+    classProvides(IBranchMergeQueueSource)
+
+    id = Int(primary=True)
+
+    registrant_id = Int(name='registrant', allow_none=True)
+    registrant = Reference(registrant_id, 'Person.id')
+
+    owner_id = Int(name='owner', allow_none=True)
+    owner = Reference(owner_id, 'Person.id')
+
+    name = Unicode(allow_none=False)
+    description = Unicode(allow_none=False)
+    configuration = Unicode(allow_none=False)
+
+    date_created = UtcDateTimeCol(notNull=True)
+
+    @property
+    def branches(self):
+        """See `IBranchMergeQueue`."""
+        return Store.of(self).find(
+            Branch,
+            Branch.merge_queue_id == self.id)
+
+    def setMergeQueueConfig(self, config):
+        """See `IBranchMergeQueue`."""
+        try:
+            simplejson.loads(config)
+            self.configuration = config
+        except ValueError: # The config string is not valid JSON
+            raise InvalidMergeQueueConfig
+
+    @classmethod
+    def new(cls, name, owner, registrant, description=None,
+            configuration=None):
+        """See `IBranchMergeQueueSource`."""
+        store = IMasterStore(BranchMergeQueue)
+
+        queue = cls()
+        queue.name = name
+        queue.owner = owner
+        queue.registrant = registrant
+        queue.description = description
+        queue.configuration = configuration
+
+        store.add(queue)
+        return queue

=== removed file 'lib/lp/code/model/branchmergequeue.py'
--- lib/lp/code/model/branchmergequeue.py	2010-08-20 20:31:18 +0000
+++ lib/lp/code/model/branchmergequeue.py	1970-01-01 00:00:00 +0000
@@ -1,118 +0,0 @@
-# Copyright 2009 Canonical Ltd.  This software is licensed under the
-# GNU Affero General Public License version 3 (see the file LICENSE).
-
-"""Branch merge queues contain queued branch merge proposals."""
-
-__metaclass__ = type
-__all__ = [
-    'BranchMergeQueueSet',
-    'MultiBranchMergeQueue',
-    'SingleBranchMergeQueue',
-    ]
-
-
-from sqlobject import (
-    ForeignKey,
-    SQLMultipleJoin,
-    StringCol,
-    )
-from zope.interface import implements
-
-from canonical.database.constants import DEFAULT
-from canonical.database.datetimecol import UtcDateTimeCol
-from canonical.database.sqlbase import (
-    SQLBase,
-    sqlvalues,
-    )
-from lp.code.enums import BranchMergeProposalStatus
-from lp.code.interfaces.branchmergequeue import (
-    IBranchMergeQueue,
-    IBranchMergeQueueSet,
-    IMultiBranchMergeQueue,
-    )
-from lp.code.model.branchmergeproposal import BranchMergeProposal
-from lp.registry.interfaces.person import validate_public_person
-
-
-class BaseBranchMergeQueue:
-    """Common methods for both the single and multi branch queues."""
-
-    # Subclasses must implement a .branches attribute which contains the
-    # branches the queue is managing.
-
-    @property
-    def items(self):
-        """The qeueued merge proposals for the managed branches."""
-        branch_ids = [branch.id for branch in self.branches]
-        # If there are no associated branches, there is no queue.
-        if len(branch_ids) == 0:
-            return None
-        return BranchMergeProposal.select("""
-            BranchMergeProposal.target_branch in %s AND
-            BranchMergeProposal.queue_status = %s
-            """ % sqlvalues(branch_ids, BranchMergeProposalStatus.QUEUED),
-            orderBy="queue_position")
-
-
-class SingleBranchMergeQueue(BaseBranchMergeQueue):
-    """A branch merge queue contains proposals from one or more branches."""
-
-    implements(IBranchMergeQueue)
-
-    def __init__(self, branch):
-        """Constructed with the single branch.
-
-        All the items in the queue belong to this single branch.
-        """
-        self.branches = [branch]
-
-
-class MultiBranchMergeQueue(SQLBase, BaseBranchMergeQueue):
-    """A database entity used to group branches proposals together."""
-
-    implements(IMultiBranchMergeQueue)
-
-    # XXX: Tim Penhey 2008-06-14, bug 240881
-    # Need to rename the database table
-    _table = 'BranchMergeRobot'
-
-    registrant = ForeignKey(
-        dbName='registrant', foreignKey='Person',
-        storm_validator=validate_public_person, notNull=True)
-    owner = ForeignKey(
-        dbName='owner', foreignKey='Person',
-        storm_validator=validate_public_person, notNull=True)
-    name = StringCol(notNull=False)
-    summary = StringCol(dbName='whiteboard', default=None)
-
-    date_created = UtcDateTimeCol(notNull=True, default=DEFAULT)
-
-    branches = SQLMultipleJoin('Branch', joinColumn='merge_queue')
-
-
-class BranchMergeQueueSet:
-    """A utility for getting queues."""
-
-    implements(IBranchMergeQueueSet)
-
-    @staticmethod
-    def getByName(queue_name):
-        """See `IBranchMergeQueueSet`."""
-        return MultiBranchMergeQueue.selectOneBy(name=queue_name)
-
-    @staticmethod
-    def getForBranch(branch):
-        """See `IBranchMergeQueueSet`."""
-        if branch.merge_queue is None:
-            return SingleBranchMergeQueue(branch)
-        else:
-            return branch.merge_queue
-
-    @staticmethod
-    def newMultiBranchMergeQueue(registrant, owner, name, summary):
-        """See `IBranchMergeQueueSet`."""
-        return MultiBranchMergeQueue(
-            registrant=registrant,
-            owner=owner,
-            name=name,
-            summary=summary)

=== modified file 'lib/lp/code/model/branchnamespace.py'
--- lib/lp/code/model/branchnamespace.py	2010-09-29 14:38:30 +0000
+++ lib/lp/code/model/branchnamespace.py	2010-10-29 12:36:22 +0000
@@ -27,7 +27,6 @@
     )
 from lp.code.enums import (
     BranchLifecycleStatus,
-    BranchMergeControlStatus,
     BranchSubscriptionDiffSize,
     BranchSubscriptionNotificationLevel,
     BranchVisibilityRule,
@@ -84,8 +83,7 @@
                      lifecycle_status=BranchLifecycleStatus.DEVELOPMENT,
                      summary=None, whiteboard=None, date_created=None,
                      branch_format=None, repository_format=None,
-                     control_format=None,
-                     merge_control_status=BranchMergeControlStatus.NO_QUEUE):
+                     control_format=None):
         """See `IBranchNamespace`."""
 
         self.validateRegistrant(registrant)
@@ -119,8 +117,7 @@
             date_last_modified=date_created, branch_format=branch_format,
             repository_format=repository_format,
             control_format=control_format, distroseries=distroseries,
-            sourcepackagename=sourcepackagename,
-            merge_control_status=merge_control_status)
+            sourcepackagename=sourcepackagename)
 
         # Implicit subscriptions are to enable teams to see private branches
         # as soon as they are created.  The subscriptions can be edited at

=== modified file 'lib/lp/code/model/sourcepackagerecipebuild.py'
--- lib/lp/code/model/sourcepackagerecipebuild.py	2010-10-06 11:46:51 +0000
+++ lib/lp/code/model/sourcepackagerecipebuild.py	2010-10-29 12:36:22 +0000
@@ -228,7 +228,9 @@
             SourcePackageRelease.source_package_recipe_build == self.id)
         for release in releases:
             release.source_package_recipe_build = None
+        package_build = self.package_build
         store.remove(self)
+        package_build.destroySelf()
 
     @classmethod
     def getById(cls, build_id):

=== modified file 'lib/lp/code/model/tests/test_branch.py'
--- lib/lp/code/model/tests/test_branch.py	2010-10-26 15:47:24 +0000
+++ lib/lp/code/model/tests/test_branch.py	2010-10-29 12:36:22 +0000
@@ -12,6 +12,7 @@
     datetime,
     timedelta,
     )
+import simplejson
 from unittest import TestLoader
 
 from bzrlib.bzrdir import BzrDir
@@ -30,6 +31,7 @@
 from canonical.launchpad.interfaces.lpstorm import IStore
 from canonical.launchpad.webapp.interfaces import IOpenLaunchBag
 from canonical.testing.layers import (
+    AppServerLayer,
     DatabaseFunctionalLayer,
     LaunchpadZopelessLayer,
     )
@@ -64,6 +66,7 @@
     BranchTargetError,
     CannotDeleteBranch,
     InvalidBranchMergeProposal,
+    InvalidMergeQueueConfig,
     )
 from lp.code.interfaces.branch import (
     DEFAULT_BRANCH_STATUS_IN_LISTING,
@@ -114,6 +117,7 @@
 from lp.testing import (
     ANONYMOUS,
     celebrity_logged_in,
+    launchpadlib_for,
     login,
     login_person,
     logout,
@@ -122,6 +126,7 @@
     TestCase,
     TestCaseWithFactory,
     time_counter,
+    ws_object,
     )
 from lp.testing.factory import LaunchpadObjectFactory
 from lp.translations.model.translationtemplatesbuildjob import (
@@ -2702,5 +2707,83 @@
         self.assertRaises(UnsafeUrlSeen, db_stacked.getBzrBranch)
 
 
+class TestMergeQueue(TestCaseWithFactory):
+    """Tests for branch merge queue functionality in branches."""
+
+    layer = DatabaseFunctionalLayer
+
+    def test_addToQueue(self):
+        """Test Branch.addToQueue."""
+        branch = self.factory.makeBranch()
+        queue = self.factory.makeBranchMergeQueue()
+        with person_logged_in(branch.owner):
+            branch.addToQueue(queue)
+
+        self.assertEqual(branch.merge_queue, queue)
+
+    def test_setMergeQueueConfig(self):
+        """Test Branch.setMergeQueueConfig."""
+        branch = self.factory.makeBranch()
+        config = simplejson.dumps({
+            'path': '/',
+            'test': 'make test',})
+
+        with person_logged_in(branch.owner):
+            branch.setMergeQueueConfig(config)
+
+        self.assertEqual(branch.merge_queue_config, config)
+
+    def test_setMergeQueueConfig_invalid(self):
+        """Test that invalid JSON strings aren't added to the database."""
+        branch = self.factory.makeBranch()
+        config = 'abc'
+
+        with person_logged_in(branch.owner):
+            self.assertRaises(
+                InvalidMergeQueueConfig,
+                branch.setMergeQueueConfig,
+                config)
+
+
+class TestWebservice(TestCaseWithFactory):
+    """Tests for the webservice."""
+
+    layer = AppServerLayer
+
+    def test_set_merge_queue(self):
+        """Test that the merge queue can be set properly."""
+        with person_logged_in(ANONYMOUS):
+            db_queue = self.factory.makeBranchMergeQueue()
+            db_branch = self.factory.makeBranch()
+            launchpad = launchpadlib_for('test', db_branch.owner,
+                service_root="http://api.launchpad.dev:8085";)
+
+        configuration = simplejson.dumps({'test': 'make check'})
+
+        branch = ws_object(launchpad, db_branch)
+        queue = ws_object(launchpad, db_queue)
+        branch.merge_queue = queue
+        branch.lp_save()
+
+        branch2 = ws_object(launchpad, db_branch)
+        self.assertEqual(branch2.merge_queue, queue)
+
+    def test_set_configuration(self):
+        """Test the mutator for setting configuration."""
+        with person_logged_in(ANONYMOUS):
+            db_branch = self.factory.makeBranch()
+            launchpad = launchpadlib_for('test', db_branch.owner,
+                service_root="http://api.launchpad.dev:8085";)
+
+        configuration = simplejson.dumps({'test': 'make check'})
+
+        branch = ws_object(launchpad, db_branch)
+        branch.merge_queue_config = configuration
+        branch.lp_save()
+
+        branch2 = ws_object(launchpad, db_branch)
+        self.assertEqual(branch2.merge_queue_config, configuration)
+
+
 def test_suite():
     return TestLoader().loadTestsFromName(__name__)

=== modified file 'lib/lp/code/model/tests/test_branchmergeproposal.py'
--- lib/lp/code/model/tests/test_branchmergeproposal.py	2010-10-26 15:47:24 +0000
+++ lib/lp/code/model/tests/test_branchmergeproposal.py	2010-10-29 12:36:22 +0000
@@ -560,83 +560,6 @@
         self.assertIsNot(None, proposal.date_review_requested)
 
 
-class TestBranchMergeProposalQueueing(TestCase):
-    """Test the enqueueing and dequeueing of merge proposals."""
-
-    layer = DatabaseFunctionalLayer
-
-    def setUp(self):
-        TestCase.setUp(self)
-        login(ANONYMOUS)
-        factory = LaunchpadObjectFactory()
-        owner = factory.makePerson()
-        self.target_branch = factory.makeProductBranch(owner=owner)
-        login(self.target_branch.owner.preferredemail.email)
-        self.proposals = [
-            factory.makeBranchMergeProposal(self.target_branch)
-            for x in range(4)]
-
-    def test_empty_target_queue(self):
-        """If there are no proposals targeted to the branch, the queue has
-        nothing in it."""
-        queued_proposals = list(self.target_branch.getMergeQueue())
-        self.assertEqual(0, len(queued_proposals),
-                         "The initial merge queue should be empty.")
-
-    def test_single_item_in_queue(self):
-        """Enqueing a proposal makes it visible in the target branch queue."""
-        proposal = self.proposals[0]
-        proposal.enqueue(self.target_branch.owner, 'some-revision-id')
-        queued_proposals = list(self.target_branch.getMergeQueue())
-        self.assertEqual(1, len(queued_proposals),
-                         "Should have one entry in the queue, got %s."
-                         % len(queued_proposals))
-
-    def test_queue_ordering(self):
-        """Assert that the queue positions are based on the order the
-        proposals were enqueued."""
-        enqueued_order = []
-        for proposal in self.proposals[:-1]:
-            enqueued_order.append(proposal.source_branch.unique_name)
-            proposal.enqueue(self.target_branch.owner, 'some-revision')
-        queued_proposals = list(self.target_branch.getMergeQueue())
-        queue_order = [proposal.source_branch.unique_name
-                       for proposal in queued_proposals]
-        self.assertEqual(
-            enqueued_order, queue_order,
-            "The queue should be in the order they were added. "
-            "Expected %s, got %s" % (enqueued_order, queue_order))
-
-        # Move the last one to the front.
-        proposal = queued_proposals[-1]
-        proposal.moveToFrontOfQueue()
-
-        new_queue_order = enqueued_order[-1:] + enqueued_order[:-1]
-
-        queued_proposals = list(self.target_branch.getMergeQueue())
-        queue_order = [proposal.source_branch.unique_name
-                       for proposal in queued_proposals]
-        self.assertEqual(
-            new_queue_order, queue_order,
-            "The last should now be at the front. "
-            "Expected %s, got %s" % (new_queue_order, queue_order))
-
-        # Remove the proposal from the middle of the queue.
-        proposal = queued_proposals[1]
-        proposal.dequeue()
-        syncUpdate(proposal)
-
-        del new_queue_order[1]
-
-        queued_proposals = list(self.target_branch.getMergeQueue())
-        queue_order = [proposal.source_branch.unique_name
-                       for proposal in queued_proposals]
-        self.assertEqual(
-            new_queue_order, queue_order,
-            "There should be only two queued items now. "
-            "Expected %s, got %s" % (new_queue_order, queue_order))
-
-
 class TestCreateCommentNotifications(TestCaseWithFactory):
     """Test the notifications are raised at the right times."""
 

=== added file 'lib/lp/code/model/tests/test_branchmergequeue.py'
--- lib/lp/code/model/tests/test_branchmergequeue.py	1970-01-01 00:00:00 +0000
+++ lib/lp/code/model/tests/test_branchmergequeue.py	2010-10-29 12:36:22 +0000
@@ -0,0 +1,155 @@
+# Copyright 2010 Canonical Ltd.  This software is licensed under the
+# GNU Affero General Public License version 3 (see the file LICENSE).
+
+"""Unit tests for methods of BranchMergeQueue."""
+
+from __future__ import with_statement
+
+import simplejson
+
+from canonical.launchpad.interfaces.lpstorm import IStore
+from canonical.launchpad.webapp.testing import verifyObject
+from canonical.testing.layers import (
+    AppServerLayer,
+    DatabaseFunctionalLayer,
+    )
+from lp.code.errors import InvalidMergeQueueConfig
+from lp.code.interfaces.branchmergequeue import IBranchMergeQueue
+from lp.code.model.branchmergequeue import BranchMergeQueue
+from lp.testing import (
+    ANONYMOUS,
+    person_logged_in,
+    launchpadlib_for,
+    TestCaseWithFactory,
+    ws_object,
+    )
+
+
+class TestBranchMergeQueueInterface(TestCaseWithFactory):
+    """Test IBranchMergeQueue interface."""
+
+    layer = DatabaseFunctionalLayer
+
+    def test_implements_interface(self):
+        queue = self.factory.makeBranchMergeQueue()
+        IStore(BranchMergeQueue).add(queue)
+        verifyObject(IBranchMergeQueue, queue)
+
+
+class TestBranchMergeQueueSource(TestCaseWithFactory):
+    """Test the methods of IBranchMergeQueueSource."""
+
+    layer = DatabaseFunctionalLayer
+
+    def test_new(self):
+        owner = self.factory.makePerson()
+        name = u'SooperQueue'
+        description = u'This is Sooper Queue'
+        config = unicode(simplejson.dumps({'test': 'make check'}))
+
+        queue = BranchMergeQueue.new(
+            name, owner, owner, description, config)
+
+        self.assertEqual(queue.name, name)
+        self.assertEqual(queue.owner, owner)
+        self.assertEqual(queue.registrant, owner)
+        self.assertEqual(queue.description, description)
+        self.assertEqual(queue.configuration, config)
+
+
+class TestBranchMergeQueue(TestCaseWithFactory):
+    """Test the functions of the BranchMergeQueue."""
+
+    layer = DatabaseFunctionalLayer
+
+    def test_branches(self):
+        """Test that a merge queue can get all its managed branches."""
+        store = IStore(BranchMergeQueue)
+
+        queue = self.factory.makeBranchMergeQueue()
+        store.add(queue)
+
+        branch = self.factory.makeBranch()
+        store.add(branch)
+        with person_logged_in(branch.owner):
+            branch.addToQueue(queue)
+
+        self.assertEqual(
+            list(queue.branches),
+            [branch])
+
+    def test_setMergeQueueConfig(self):
+        """Test that the configuration is set properly."""
+        queue = self.factory.makeBranchMergeQueue()
+        config = unicode(simplejson.dumps({
+            'test': 'make test'}))
+
+        with person_logged_in(queue.owner):
+            queue.setMergeQueueConfig(config)
+
+        self.assertEqual(queue.configuration, config)
+
+    def test_setMergeQueueConfig_invalid_json(self):
+        """Test that invalid json can't be set as the config."""
+        queue = self.factory.makeBranchMergeQueue()
+
+        with person_logged_in(queue.owner):
+            self.assertRaises(
+                InvalidMergeQueueConfig,
+                queue.setMergeQueueConfig,
+                'abc')
+
+
+class TestWebservice(TestCaseWithFactory):
+
+    layer = AppServerLayer
+
+    def test_properties(self):
+        """Test that the correct properties are exposed."""
+        with person_logged_in(ANONYMOUS):
+            name = u'teh-queue'
+            description = u'Oh hai! I are a queues'
+            configuration = unicode(simplejson.dumps({'test': 'make check'}))
+
+            queuer = self.factory.makePerson()
+            db_queue = self.factory.makeBranchMergeQueue(
+                registrant=queuer, owner=queuer, name=name,
+                description=description,
+                configuration=configuration)
+            branch1 = self.factory.makeBranch()
+            with person_logged_in(branch1.owner):
+                branch1.addToQueue(db_queue)
+            branch2 = self.factory.makeBranch()
+            with person_logged_in(branch2.owner):
+                branch2.addToQueue(db_queue)
+            launchpad = launchpadlib_for('test', db_queue.owner,
+                service_root="http://api.launchpad.dev:8085";)
+
+        queuer = ws_object(launchpad, queuer)
+        queue = ws_object(launchpad, db_queue)
+        branch1 = ws_object(launchpad, branch1)
+        branch2 = ws_object(launchpad, branch2)
+
+        self.assertEqual(queue.registrant, queuer)
+        self.assertEqual(queue.owner, queuer)
+        self.assertEqual(queue.name, name)
+        self.assertEqual(queue.description, description)
+        self.assertEqual(queue.configuration, configuration)
+        self.assertEqual(queue.date_created, db_queue.date_created)
+        self.assertEqual(len(queue.branches), 2)
+
+    def test_set_configuration(self):
+        """Test the mutator for setting configuration."""
+        with person_logged_in(ANONYMOUS):
+            db_queue = self.factory.makeBranchMergeQueue()
+            launchpad = launchpadlib_for('test', db_queue.owner,
+                service_root="http://api.launchpad.dev:8085";)
+
+        configuration = simplejson.dumps({'test': 'make check'})
+
+        queue = ws_object(launchpad, db_queue)
+        queue.configuration = configuration
+        queue.lp_save()
+
+        queue2 = ws_object(launchpad, db_queue)
+        self.assertEqual(queue2.configuration, configuration)

=== removed file 'lib/lp/code/model/tests/test_branchmergequeue.py'
--- lib/lp/code/model/tests/test_branchmergequeue.py	2010-10-04 19:50:45 +0000
+++ lib/lp/code/model/tests/test_branchmergequeue.py	1970-01-01 00:00:00 +0000
@@ -1,185 +0,0 @@
-# Copyright 2009 Canonical Ltd.  This software is licensed under the
-# GNU Affero General Public License version 3 (see the file LICENSE).
-
-"""Tests for BranchMergeQueues."""
-
-__metaclass__ = type
-
-
-from unittest import TestLoader
-
-from zope.security.proxy import isinstance
-
-from canonical.launchpad.ftests import login_person
-from canonical.launchpad.webapp.testing import verifyObject
-from canonical.testing.layers import DatabaseFunctionalLayer
-from lp.code.enums import (
-    BranchMergeControlStatus,
-    BranchMergeProposalStatus,
-    )
-from lp.code.interfaces.branchmergequeue import (
-    IBranchMergeQueue,
-    IBranchMergeQueueSet,
-    IMultiBranchMergeQueue,
-    )
-from lp.code.model.branchmergequeue import (
-    BranchMergeQueueSet,
-    MultiBranchMergeQueue,
-    SingleBranchMergeQueue,
-    )
-from lp.testing import TestCaseWithFactory
-
-
-class TestBranchMergeQueueInterfaces(TestCaseWithFactory):
-    """Make sure that the interfaces are verifiable."""
-
-    layer = DatabaseFunctionalLayer
-
-    def test_branch_merge_queue_set(self):
-        # A BranchMergeQueueSet implements IBranchMergeQueueSet
-        self.assertTrue(
-            verifyObject(IBranchMergeQueueSet, BranchMergeQueueSet()))
-
-    def test_single_branch_merge_queue(self):
-        # A SingleBranchMergeQueue implements IBranchMergeQueue
-        self.assertTrue(
-            verifyObject(
-                IBranchMergeQueue,
-                SingleBranchMergeQueue(self.factory.makeAnyBranch())))
-
-    def test_multi_branch_merge_queue(self):
-        # A MultiBranchMergeQueue implements IMultiBranchMergeQueue
-        queue = MultiBranchMergeQueue(
-                    registrant=self.factory.makePerson(),
-                    owner=self.factory.makePerson(),
-                    name=self.factory.getUniqueString(),
-                    summary=self.factory.getUniqueString())
-        self.assertTrue(verifyObject(IMultiBranchMergeQueue, queue))
-
-
-class TestBranchMergeQueueSet(TestCaseWithFactory):
-    """Test the BranchMergeQueueSet."""
-
-    layer = DatabaseFunctionalLayer
-
-    def test_get_for_branch_with_simple_branch(self):
-        # If the branch does not have a merge_queue set then a
-        # SingleBranchMergeQueue is returned.
-        branch = self.factory.makeAnyBranch()
-        queue = BranchMergeQueueSet.getForBranch(branch)
-        self.assertTrue(isinstance(queue, SingleBranchMergeQueue))
-
-    def test_get_for_branch_with_merge_queue(self):
-        # If the branch does have a merge_queue set, then the associated merge
-        # queue is returned.
-        new_queue = self.factory.makeBranchMergeQueue()
-        branch = self.factory.makeAnyBranch()
-        # Login the branch owner to allow launchpad.Edit on the branch.
-        login_person(branch.owner)
-        branch.merge_queue = new_queue
-        queue = BranchMergeQueueSet.getForBranch(branch)
-        self.assertEqual(new_queue, queue)
-
-    def test_new_branch_merge_queue(self):
-        # A new multi-branch merge queue should be created with the
-        # appropriate attributes set.
-        registrant = self.factory.makePerson()
-        owner = self.factory.makePerson()
-        queue = BranchMergeQueueSet.newMultiBranchMergeQueue(
-            registrant=registrant, owner=owner, name='eric',
-            summary='A queue for eric.')
-        self.assertTrue(isinstance(queue, MultiBranchMergeQueue))
-        self.assertEqual(registrant, queue.registrant)
-        self.assertEqual(owner, queue.owner)
-        self.assertEqual('eric', queue.name)
-        self.assertEqual('A queue for eric.', queue.summary)
-
-    def test_get_by_name_not_existant(self):
-        self.assertTrue(BranchMergeQueueSet.getByName('anything') is None)
-
-    def test_get_by_name(self):
-        queue = self.factory.makeBranchMergeQueue(name='new-queue')
-        get_result = BranchMergeQueueSet.getByName('new-queue')
-        self.assertEqual(queue, get_result)
-
-
-class TestSingleBranchMergeQueue(TestCaseWithFactory):
-    """Test the implementation of the interface methods."""
-
-    layer = DatabaseFunctionalLayer
-
-    def test_queue_branches(self):
-        # A SingleBranchMergeQueue has one and only one branch, and that is
-        # the branch that it is constructed with.
-        branch = self.factory.makeAnyBranch()
-        queue = SingleBranchMergeQueue(branch)
-        self.assertEqual([branch], queue.branches)
-
-    def test_queue_items(self):
-        # The items of the queue are those merge proposals that are targetted
-        # at the branch of the queue, and are in a queued state.
-        branch = self.factory.makeProductBranch()
-        # Login the branch owner to make the proposals.  ANONYMOUS is not
-        # good enough as the date_last_modified needs launchpad.AnyPerson.
-        login_person(branch.owner)
-        queue = SingleBranchMergeQueue(branch)
-        first_item = self.factory.makeBranchMergeProposal(
-            target_branch=branch, set_state=BranchMergeProposalStatus.QUEUED)
-        second_item = self.factory.makeBranchMergeProposal(
-            target_branch=branch, set_state=BranchMergeProposalStatus.QUEUED)
-        non_queued_item = self.factory.makeBranchMergeProposal(
-            target_branch=branch)
-        different_queue_item = self.factory.makeBranchMergeProposal()
-
-        items = list(queue.items)
-        self.assertEqual([first_item, second_item], items)
-
-
-class TestMultiBranchMergeQueue(TestCaseWithFactory):
-    """Test the implementation of the interface methods."""
-
-    layer = DatabaseFunctionalLayer
-
-    def _make_branch_and_associate_with_queue(self, queue):
-        # Small helper to make a branch and set the merge queue.
-        branch = self.factory.makeProductBranch(
-            merge_control_status=BranchMergeControlStatus.ROBOT)
-        # Login the branch owner to allow launchpad.Edit on merge_queue.
-        login_person(branch.owner)
-        branch.merge_queue = queue
-        return branch
-
-    def test_queue_branches(self):
-        # A MultiBranchMergeQueue is able to list the branches that use it.
-        queue = self.factory.makeBranchMergeQueue()
-        branch1 = self._make_branch_and_associate_with_queue(queue)
-        branch2 = self._make_branch_and_associate_with_queue(queue)
-        branch3 = self._make_branch_and_associate_with_queue(queue)
-        # Result ordering is not guaranteed, so use a set.
-        self.assertEqual(set([branch1, branch2, branch3]),
-                         set(queue.branches))
-
-    def test_queue_items(self):
-        # The items of the queue are those merge proposals that are targetted
-        # at any of the branch of the queue, and are in a queued state.
-        queue = self.factory.makeBranchMergeQueue()
-        branch1 = self._make_branch_and_associate_with_queue(queue)
-        branch2 = self._make_branch_and_associate_with_queue(queue)
-        # Login the branch owner to make the proposals.  ANONYMOUS is not
-        # good enough as the date_last_modified needs launchpad.AnyPerson.
-        login_person(branch1.owner)
-        first_item = self.factory.makeBranchMergeProposal(
-            target_branch=branch1, set_state=BranchMergeProposalStatus.QUEUED)
-        login_person(branch2.owner)
-        second_item = self.factory.makeBranchMergeProposal(
-            target_branch=branch2, set_state=BranchMergeProposalStatus.QUEUED)
-        non_queued_item = self.factory.makeBranchMergeProposal(
-            target_branch=branch1)
-        different_queue_item = self.factory.makeBranchMergeProposal()
-
-        items = list(queue.items)
-        self.assertEqual([first_item, second_item], items)
-
-
-def test_suite():
-    return TestLoader().loadTestsFromName(__name__)

=== modified file 'lib/lp/code/model/tests/test_sourcepackagerecipe.py'
--- lib/lp/code/model/tests/test_sourcepackagerecipe.py	2010-10-26 15:47:24 +0000
+++ lib/lp/code/model/tests/test_sourcepackagerecipe.py	2010-10-29 12:36:22 +0000
@@ -730,7 +730,7 @@
         db_archive = self.factory.makeArchive(owner=owner, name="recipe-ppa")
         transaction.commit()
         launchpad = launchpadlib_for('test', user,
-                service_root="http://api.launchpad.dev:8085";)
+                service_root=self.layer.appserver_root_url('api'))
         login(ANONYMOUS)
         distroseries = ws_object(launchpad, db_distroseries)
         ws_owner = ws_object(launchpad, owner)

=== modified file 'lib/lp/code/model/tests/test_sourcepackagerecipebuild.py'
--- lib/lp/code/model/tests/test_sourcepackagerecipebuild.py	2010-10-26 20:43:50 +0000
+++ lib/lp/code/model/tests/test_sourcepackagerecipebuild.py	2010-10-29 12:36:22 +0000
@@ -24,6 +24,8 @@
 from lp.app.errors import NotFoundError
 from lp.buildmaster.enums import BuildStatus
 from lp.buildmaster.interfaces.buildqueue import IBuildQueue
+from lp.buildmaster.model.buildfarmjob import BuildFarmJob
+from lp.buildmaster.model.packagebuild import PackageBuild
 from lp.buildmaster.tests.mock_slaves import WaitingSlave
 from lp.buildmaster.tests.test_packagebuild import (
     TestGetUploadMethodsMixin,
@@ -300,6 +302,23 @@
         self.assertIs(None, release.source_package_recipe_build)
         transaction.commit()
 
+    def test_destroySelf_destroys_referenced(self):
+        # Destroying a sourcepackagerecipebuild also destroys the
+        # PackageBuild and BuildFarmJob it references.
+        build = self.factory.makeSourcePackageRecipeBuild()
+        store = Store.of(build)
+        naked_build = removeSecurityProxy(build)
+        # Ensure database ids are set.
+        store.flush()
+        package_build_id = naked_build.package_build_id
+        build_farm_job_id = naked_build.package_build.build_farm_job_id
+        build.destroySelf()
+        result = store.find(PackageBuild, PackageBuild.id == package_build_id)
+        self.assertIs(None, result.one())
+        result = store.find(
+            BuildFarmJob, BuildFarmJob.id == build_farm_job_id)
+        self.assertIs(None, result.one())
+
     def test_cancelBuild(self):
         # ISourcePackageRecipeBuild should make sure to remove jobs and build
         # queue entries and then invalidate itself.

=== modified file 'lib/lp/code/stories/webservice/xx-branch.txt'
--- lib/lp/code/stories/webservice/xx-branch.txt	2010-10-18 22:24:59 +0000
+++ lib/lp/code/stories/webservice/xx-branch.txt	2010-10-29 12:36:22 +0000
@@ -123,6 +123,8 @@
     last_scanned_id: None
     lifecycle_status: u'Development'
     linked_bugs_collection_link: u'http://.../~eric/fooix/trunk/linked_bugs'
+    merge_queue_config: None
+    merge_queue_link: None
     mirror_status_message: None
     name: u'trunk'
     owner_link: u'.../~eric'

=== modified file 'lib/lp/code/windmill/testing.py'
--- lib/lp/code/windmill/testing.py	2010-01-13 23:13:21 +0000
+++ lib/lp/code/windmill/testing.py	2010-10-29 12:36:22 +0000
@@ -15,4 +15,8 @@
 class CodeWindmillLayer(BaseWindmillLayer):
     """Layer for Code Windmill tests."""
 
-    base_url = 'http://code.launchpad.dev:8085/'
+    @classmethod
+    def setUp(cls):
+        cls.base_url = cls.appserver_root_url('code')
+        super(CodeWindmillLayer, cls).setUp()
+

=== modified file 'lib/lp/code/windmill/tests/test_branch_bugspeclinks.py'
--- lib/lp/code/windmill/tests/test_branch_bugspeclinks.py	2010-02-01 18:37:00 +0000
+++ lib/lp/code/windmill/tests/test_branch_bugspeclinks.py	2010-10-29 12:36:22 +0000
@@ -43,7 +43,7 @@
         lpuser.FOO_BAR.ensure_login(client)
 
         start_url = (
-            windmill.settings['TEST_URL'] + '/~mark/firefox/release--0.9.1')
+            windmill.settings['TEST_URL'] + '~mark/firefox/release--0.9.1')
         client.open(url=start_url)
         client.waits.forElement(id=u'linkbug', timeout=u'10000')
 

=== modified file 'lib/lp/code/windmill/tests/test_branch_subscriptions.py'
--- lib/lp/code/windmill/tests/test_branch_subscriptions.py	2010-08-20 20:31:18 +0000
+++ lib/lp/code/windmill/tests/test_branch_subscriptions.py	2010-10-29 12:36:22 +0000
@@ -29,7 +29,7 @@
         lpuser.FOO_BAR.ensure_login(client)
 
         client.open(url=(
-            windmill.settings['TEST_URL'] + '/~mark/firefox/release--0.9.1'))
+            windmill.settings['TEST_URL'] + '~mark/firefox/release--0.9.1'))
         client.waits.forElement(id=u'none-subscribers', timeout=u'10000')
         client.asserts.assertText(
             xpath=u'//a[@class="sprite add subscribe-self js-action"]',
@@ -66,7 +66,7 @@
 
         client.open(url=''.join([
             windmill.settings['TEST_URL'],
-            '/~name12/landscape/feature-x/']))
+            '~name12/landscape/feature-x/']))
         client.waits.forPageLoad(timeout=u'10000')
 
         client.waits.forElement(

=== modified file 'lib/lp/code/windmill/tests/test_branchmergeproposal_review.py'
--- lib/lp/code/windmill/tests/test_branchmergeproposal_review.py	2010-10-27 04:27:31 +0000
+++ lib/lp/code/windmill/tests/test_branchmergeproposal_review.py	2010-10-29 12:36:22 +0000
@@ -45,7 +45,7 @@
 
         client.open(url=''.join([
             windmill.settings['TEST_URL'],
-            '/~name12/gnome-terminal/klingon/']))
+            '~name12/gnome-terminal/klingon/']))
         client.waits.forPageLoad(timeout=u'10000')
 
         link = u'//a[@class="menu-link-register_merge sprite add"]'

=== modified file 'lib/lp/code/windmill/tests/test_productseries_setbranch.py'
--- lib/lp/code/windmill/tests/test_productseries_setbranch.py	2010-08-20 20:31:18 +0000
+++ lib/lp/code/windmill/tests/test_productseries_setbranch.py	2010-10-29 12:36:22 +0000
@@ -26,7 +26,7 @@
         user = lpuser.FOO_BAR
         user.ensure_login(self.client)
         self.client.open(
-            url=u'http://launchpad.dev:8085/firefox/trunk/+setbranch')
+            url=u'%s/firefox/trunk/+setbranch' % CodeWindmillLayer.base_url)
 
         # To demonstrate the Javascript is loaded we simply need to see that
         # one of the controls is deactivated when the radio button selections

=== modified file 'lib/lp/registry/browser/person.py'
--- lib/lp/registry/browser/person.py	2010-10-24 13:02:07 +0000
+++ lib/lp/registry/browser/person.py	2010-10-29 12:36:22 +0000
@@ -543,6 +543,11 @@
         """Traverse to this person's recipes."""
         return self.context.getRecipe(name)
 
+    @stepthrough('+merge-queues')
+    def traverse_merge_queue(self, name):
+        """Traverse to this person's merge queues."""
+        return self.context.getMergeQueue(name)
+
 
 class TeamNavigation(PersonNavigation):
 

=== modified file 'lib/lp/registry/interfaces/person.py'
--- lib/lp/registry/interfaces/person.py	2010-10-19 20:54:44 +0000
+++ lib/lp/registry/interfaces/person.py	2010-10-29 12:36:22 +0000
@@ -895,6 +895,9 @@
     def getRecipe(name):
         """Return the person's recipe with the given name."""
 
+    def getMergeQueue(name):
+        """Return the person's merge queue with the given name."""
+
     @call_with(requester=REQUEST_USER)
     @export_read_operation()
     def getArchiveSubscriptionURLs(requester):

=== modified file 'lib/lp/registry/model/person.py'
--- lib/lp/registry/model/person.py	2010-10-28 09:35:57 +0000
+++ lib/lp/registry/model/person.py	2010-10-29 12:36:22 +0000
@@ -2666,6 +2666,13 @@
             SourcePackageRecipe, SourcePackageRecipe.owner == self,
             SourcePackageRecipe.name == name).one()
 
+    def getMergeQueue(self, name):
+        from lp.code.model.branchmergequeue import BranchMergeQueue
+        return Store.of(self).find(
+            BranchMergeQueue,
+            BranchMergeQueue.owner == self,
+            BranchMergeQueue.name == unicode(name)).one()
+
     def isUploader(self, distribution):
         """See `IPerson`."""
         permissions = getUtility(IArchivePermissionSet).componentsForUploader(
@@ -3423,6 +3430,11 @@
                 ''', dict(to_id=to_id, from_id=from_id,
                           name=name, new_name=new_name, product=product))
 
+    def _mergeBranchMergeQueues(self, cur, from_id, to_id):
+        cur.execute('''
+            UPDATE BranchMergeQueue SET owner = %(to_id)s WHERE owner =
+            %(from_id)s''', dict(to_id=to_id, from_id=from_id))
+
     def _mergeMailingListSubscriptions(self, cur, from_id, to_id):
         # Update MailingListSubscription. Note that since all the from_id
         # email addresses are set to NEW, all the subscriptions must be
@@ -3811,6 +3823,45 @@
                     'DELETE FROM TeamParticipation WHERE person = %s AND '
                     'team = %s' % sqlvalues(from_id, team_id))
 
+    def _mergeKarmaCache(self, cur, from_id, to_id, from_karma):
+        # Merge the karma total cache so the user does not think the karma
+        # was lost.
+        if from_karma > 0:
+            cur.execute('''
+                SELECT karma_total FROM KarmaTotalCache
+                WHERE person = %(to_id)d
+                ''' % vars())
+            result = cur.fetchone()
+            if result:
+                # Add the karma to the remaining user.
+                karma_total = from_karma + result[0]
+                cur.execute('''
+                    UPDATE KarmaTotalCache SET karma_total = %(karma_total)d
+                    WHERE person = %(to_id)d
+                    ''' % vars())
+            else:
+                # Make the existing karma belong to the remaining user.
+                cur.execute('''
+                    UPDATE KarmaTotalCache SET person = %(to_id)d
+                    WHERE person = %(from_id)d
+                    ''' % vars())
+        # Delete the old caches; the daily job will build them later.
+        cur.execute('''
+            DELETE FROM KarmaTotalCache WHERE person = %(from_id)d
+            ''' % vars())
+        cur.execute('''
+            DELETE FROM KarmaCache WHERE person = %(from_id)d
+            ''' % vars())
+
+    def _mergeDateCreated(self, cur, from_id, to_id):
+        cur.execute('''
+            UPDATE Person
+            SET datecreated = (
+                SELECT MIN(datecreated) FROM Person
+                WHERE id in (%(to_id)d, %(from_id)d) LIMIT 1)
+            WHERE id = %(to_id)d
+            ''' % vars())
+
     def merge(self, from_person, to_person):
         """See `IPersonSet`."""
         # Sanity checks
@@ -3849,8 +3900,6 @@
             ('personlanguage', 'person'),
             ('person', 'merged'),
             ('emailaddress', 'person'),
-            ('karmacache', 'person'),
-            ('karmatotalcache', 'person'),
             # Polls are not carried over when merging teams.
             ('poll', 'team'),
             # We can safely ignore the mailinglist table as there's a sanity
@@ -3908,6 +3957,9 @@
         self._mergeBranches(cur, from_id, to_id)
         skip.append(('branch', 'owner'))
 
+        self._mergeBranchMergeQueues(cur, from_id, to_id)
+        skip.append(('branchmergequeue', 'owner'))
+
         # XXX MichaelHudson 2010-01-13: Write _mergeSourcePackageRecipes!
         #self._mergeSourcePackageRecipes(cur, from_id, to_id))
         skip.append(('sourcepackagerecipe', 'owner'))
@@ -3982,6 +4034,12 @@
         self._mergeWebServiceBan(cur, from_id, to_id)
         skip.append(('webserviceban', 'person'))
 
+        self._mergeKarmaCache(cur, from_id, to_id, from_person.karma)
+        skip.append(('karmacache', 'person'))
+        skip.append(('karmatotalcache', 'person'))
+
+        self._mergeDateCreated(cur, from_id, to_id)
+
         # Sanity check. If we have a reference that participates in a
         # UNIQUE index, it must have already been handled by this point.
         # We can tell this by looking at the skip list.

=== modified file 'lib/lp/registry/tests/test_person.py'
--- lib/lp/registry/tests/test_person.py	2010-10-28 10:18:31 +0000
+++ lib/lp/registry/tests/test_person.py	2010-10-29 12:36:22 +0000
@@ -55,7 +55,10 @@
     PersonVisibility,
     )
 from lp.registry.interfaces.product import IProductSet
-from lp.registry.model.karma import KarmaCategory
+from lp.registry.model.karma import (
+    KarmaCategory,
+    KarmaTotalCache,
+    )
 from lp.registry.model.person import Person
 from lp.registry.model.structuralsubscription import StructuralSubscription
 from lp.services.openid.model.openididentifier import OpenIdIdentifier
@@ -447,7 +450,46 @@
         self.assertEqual(person1, person2)
 
 
-class TestPersonSetMerge(TestCaseWithFactory):
+class KarmaTestMixin:
+    """Helper methods for setting karma."""
+
+    def _makeKarmaCache(self, person, product, category_name_values):
+        """Create a KarmaCache entry with the given arguments.
+
+        In order to create the KarmaCache record we must switch to the DB
+        user 'karma'. This invalidates the objects under test so they
+        must be retrieved again.
+        """
+        transaction.commit()
+        reconnect_stores('karmacacheupdater')
+        total = 0
+        # Insert category total for person and project.
+        for category_name, value in category_name_values:
+            category = KarmaCategory.byName(category_name)
+            self.cache_manager.new(
+                value, person.id, category.id, product_id=product.id)
+            total += value
+        # Insert total cache for person and project.
+        self.cache_manager.new(
+            total, person.id, None, product_id=product.id)
+        transaction.commit()
+        reconnect_stores('launchpad')
+
+    def _makeKarmaTotalCache(self, person, total):
+        """Create a KarmaTotalCache entry.
+
+        In order to create the KarmaTotalCache record we must switch to the DB
+        user 'karma'. This invalidates the objects under test so they
+        must be retrieved again.
+        """
+        transaction.commit()
+        reconnect_stores('karmacacheupdater')
+        KarmaTotalCache(person=person.id, karma_total=total)
+        transaction.commit()
+        reconnect_stores('launchpad')
+
+
+class TestPersonSetMerge(TestCaseWithFactory, KarmaTestMixin):
     """Test cases for PersonSet merge."""
 
     layer = DatabaseFunctionalLayer
@@ -495,6 +537,60 @@
         self.assertIn(duplicate_identifier, merged_identifiers)
         self.assertIn(person_identifier, merged_identifiers)
 
+    def test_karmacache_transferred_to_user_has_no_karma(self):
+        # Verify that the merged user has no KarmaCache entries,
+        # and the karma total was transfered.
+        self.cache_manager = getUtility(IKarmaCacheManager)
+        product = self.factory.makeProduct()
+        duplicate = self.factory.makePerson()
+        self._makeKarmaCache(
+            duplicate, product, [('bugs', 10)])
+        self._makeKarmaTotalCache(duplicate, 15)
+        # The karma changes invalidated duplicate instance.
+        duplicate = self.person_set.get(duplicate.id)
+        person = self.factory.makePerson()
+        self._do_premerge(duplicate, person)
+        login_person(person)
+        self.person_set.merge(duplicate, person)
+        self.assertEqual([], duplicate.karma_category_caches)
+        self.assertEqual(0, duplicate.karma)
+        self.assertEqual(15, person.karma)
+
+    def test_karmacache_transferred_to_user_has_karma(self):
+        # Verify that the merged user has no KarmaCache entries,
+        # and the karma total was summed.
+        self.cache_manager = getUtility(IKarmaCacheManager)
+        product = self.factory.makeProduct()
+        duplicate = self.factory.makePerson()
+        self._makeKarmaCache(
+            duplicate, product, [('bugs', 10)])
+        self._makeKarmaTotalCache(duplicate, 15)
+        person = self.factory.makePerson()
+        self._makeKarmaCache(
+            person, product, [('bugs', 9)])
+        self._makeKarmaTotalCache(person, 13)
+        # The karma changes invalidated duplicate and person instances.
+        duplicate = self.person_set.get(duplicate.id)
+        person = self.person_set.get(person.id)
+        self._do_premerge(duplicate, person)
+        login_person(person)
+        self.person_set.merge(duplicate, person)
+        self.assertEqual([], duplicate.karma_category_caches)
+        self.assertEqual(0, duplicate.karma)
+        self.assertEqual(28, person.karma)
+
+    def test_person_date_created_preserved(self):
+        # Verify that the oldest datecreated is merged.
+        person = self.factory.makePerson()
+        duplicate = self.factory.makePerson()
+        oldest_date = datetime(
+            2005, 11, 25, 0, 0, 0, 0, pytz.timezone('UTC'))
+        removeSecurityProxy(duplicate).datecreated = oldest_date
+        self._do_premerge(duplicate, person)
+        login_person(person)
+        self.person_set.merge(duplicate, person)
+        self.assertEqual(oldest_date, person.datecreated)
+
 
 class TestPersonSetCreateByOpenId(TestCaseWithFactory):
     layer = DatabaseFunctionalLayer
@@ -860,7 +956,7 @@
             assignee=self.user)
 
 
-class TestPersonKarma(TestCaseWithFactory):
+class TestPersonKarma(TestCaseWithFactory, KarmaTestMixin):
 
     layer = DatabaseFunctionalLayer
 
@@ -878,28 +974,6 @@
         self._makeKarmaCache(
             self.person, self.c_product, [('code', 100), (('bugs', 50))])
 
-    def _makeKarmaCache(self, person, product, category_name_values):
-        """Create a KarmaCache entry with the given arguments.
-
-        In order to create the KarmaCache record we must switch to the DB
-        user 'karma'. This requires a commit and invalidates the product
-        instance.
-        """
-        transaction.commit()
-        reconnect_stores('karmacacheupdater')
-        total = 0
-        # Insert category total for person and project.
-        for category_name, value in category_name_values:
-            category = KarmaCategory.byName(category_name)
-            self.cache_manager.new(
-                value, person.id, category.id, product_id=product.id)
-            total += value
-        # Insert total cache for person and project.
-        self.cache_manager.new(
-            total, person.id, None, product_id=product.id)
-        transaction.commit()
-        reconnect_stores('launchpad')
-
     def test__getProjectsWithTheMostKarma_ordering(self):
         # Verify that pillars are ordered by karma.
         results = removeSecurityProxy(

=== modified file 'lib/lp/registry/windmill/testing.py'
--- lib/lp/registry/windmill/testing.py	2009-10-09 21:24:20 +0000
+++ lib/lp/registry/windmill/testing.py	2010-10-29 12:36:22 +0000
@@ -15,4 +15,8 @@
 class RegistryWindmillLayer(BaseWindmillLayer):
     """Layer for Registry Windmill tests."""
 
-    base_url = 'http://launchpad.dev:8085/'
+    @classmethod
+    def setUp(cls):
+        cls.base_url = cls.appserver_root_url()
+        super(RegistryWindmillLayer, cls).setUp()
+

=== modified file 'lib/lp/registry/windmill/tests/test_add_bugtracker.py'
--- lib/lp/registry/windmill/tests/test_add_bugtracker.py	2010-08-20 20:31:18 +0000
+++ lib/lp/registry/windmill/tests/test_add_bugtracker.py	2010-10-29 12:36:22 +0000
@@ -91,7 +91,8 @@
     def test_adding_bugtracker_for_project(self):
         test_inline_add_bugtracker(
             self.client,
-            url='http://launchpad.dev:8085/bzr/+configure-bugtracker',
+            url='%s/bzr/+configure-bugtracker'
+                 % RegistryWindmillLayer.base_url,
             name='test_inline_add_bugtracker_for_project')
 
 

=== modified file 'lib/lp/registry/windmill/tests/test_add_milestone.py'
--- lib/lp/registry/windmill/tests/test_add_milestone.py	2010-08-20 20:31:18 +0000
+++ lib/lp/registry/windmill/tests/test_add_milestone.py	2010-10-29 12:36:22 +0000
@@ -87,7 +87,7 @@
     def test_adding_milestone_on_addrelease_page(self):
         test_inline_add_milestone(
             self.client,
-            url='http://launchpad.dev:8085/bzr/trunk/+addrelease',
+            url='%s/bzr/trunk/+addrelease' % RegistryWindmillLayer.base_url,
             name='test_inline_add_milestone_for_release')
 
 

=== modified file 'lib/lp/registry/windmill/tests/test_datetime_picker.py'
--- lib/lp/registry/windmill/tests/test_datetime_picker.py	2010-08-20 20:31:18 +0000
+++ lib/lp/registry/windmill/tests/test_datetime_picker.py	2010-10-29 12:36:22 +0000
@@ -31,7 +31,8 @@
 
         # Open a new sprint page and wait for it to finish loading.
         self.client.open(
-            url=u'http://blueprints.launchpad.dev:8085/sprints/+new')
+            url=u'%s/sprints/+new'
+                % self.layer.appserver_root_url('blueprints'))
         self.client.waits.forPageLoad(timeout=u'20000')
         self.client.waits.forElement(link=u'Choose...', timeout=u'8000')
 

=== modified file 'lib/lp/registry/windmill/tests/test_person_picker.py'
--- lib/lp/registry/windmill/tests/test_person_picker.py	2010-08-20 20:31:18 +0000
+++ lib/lp/registry/windmill/tests/test_person_picker.py	2010-10-29 12:36:22 +0000
@@ -30,7 +30,8 @@
         client = self.client
         lpuser.SAMPLE_PERSON.ensure_login(client)
 
-        client.open(url=u'http://launchpad.dev:8085/people/+requestmerge')
+        client.open(url=u'%s/people/+requestmerge'
+                    % RegistryWindmillLayer.base_url)
         client.waits.forPageLoad(timeout=constants.PAGE_LOAD)
         client.waits.forElement(id=u'show-widget-field-dupe_person',
                                 timeout=constants.FOR_ELEMENT)

=== modified file 'lib/lp/registry/windmill/tests/test_plusnew_step1.py'
--- lib/lp/registry/windmill/tests/test_plusnew_step1.py	2010-08-20 20:31:18 +0000
+++ lib/lp/registry/windmill/tests/test_plusnew_step1.py	2010-10-29 12:36:22 +0000
@@ -30,7 +30,8 @@
         """
         # Perform step 1 of the project registration, using information
         # that will yield search results.
-        self.client.open(url=u'http://launchpad.dev:8085/projects/+new')
+        self.client.open(url=u'%s/projects/+new'
+                        % RegistryWindmillLayer.base_url)
 
         lpuser.SAMPLE_PERSON.ensure_login(self.client)
 

=== modified file 'lib/lp/registry/windmill/tests/test_plusnew_step2.py'
--- lib/lp/registry/windmill/tests/test_plusnew_step2.py	2010-08-20 20:31:18 +0000
+++ lib/lp/registry/windmill/tests/test_plusnew_step2.py	2010-10-29 12:36:22 +0000
@@ -32,7 +32,8 @@
 
         # Perform step 1 of the project registration, using information
         # that will yield search results.
-        self.client.open(url=u'http://launchpad.dev:8085/projects/+new')
+        self.client.open(url=u'%s/projects/+new'
+                        % RegistryWindmillLayer.base_url)
 
         lpuser.SAMPLE_PERSON.ensure_login(self.client)
 

=== modified file 'lib/lp/registry/windmill/tests/test_product.py'
--- lib/lp/registry/windmill/tests/test_product.py	2010-08-20 20:31:18 +0000
+++ lib/lp/registry/windmill/tests/test_product.py	2010-10-29 12:36:22 +0000
@@ -23,7 +23,7 @@
 
     def test_title_inline_edit(self):
         test = widgets.InlineEditorWidgetTest(
-            url='http://launchpad.dev:8085/firefox',
+            url='%s/firefox' % RegistryWindmillLayer.base_url,
             widget_id='product-title',
             expected_value='Mozilla Firefox',
             new_value='The awesome Mozilla Firefox',
@@ -34,7 +34,7 @@
 
     def test_programming_languages_edit(self):
         test = widgets.InlineEditorWidgetTest(
-            url='http://launchpad.dev:8085/firefox',
+            url='%s/firefox' % RegistryWindmillLayer.base_url,
             widget_id='programminglang',
             widget_tag='span',
             expected_value='Not yet specified',

=== modified file 'lib/lp/registry/windmill/tests/test_product_edit_people.py'
--- lib/lp/registry/windmill/tests/test_product_edit_people.py	2010-08-20 20:31:18 +0000
+++ lib/lp/registry/windmill/tests/test_product_edit_people.py	2010-10-29 12:36:22 +0000
@@ -21,7 +21,7 @@
     def test_product_edit_people_driver(self):
         test = FormPickerWidgetTest(
             name='test_product_edit_people_driver',
-            url='http://launchpad.dev:8085/firefox/+edit-people',
+            url='%s/firefox/+edit-people' % RegistryWindmillLayer.base_url,
             short_field_name='driver',
             search_text='Perell\xc3\xb3',
             result_index=1,
@@ -31,7 +31,7 @@
     def test_product_edit_people_owner(self):
         test = FormPickerWidgetTest(
             name='test_product_edit_people_owner',
-            url='http://launchpad.dev:8085/firefox/+edit-people',
+            url='%s/firefox/+edit-people' % RegistryWindmillLayer.base_url,
             short_field_name='owner',
             search_text='guadamen',
             result_index=1,

=== modified file 'lib/lp/registry/windmill/tests/test_project_licenses.py'
--- lib/lp/registry/windmill/tests/test_project_licenses.py	2010-08-26 23:51:10 +0000
+++ lib/lp/registry/windmill/tests/test_project_licenses.py	2010-10-29 12:36:22 +0000
@@ -23,7 +23,8 @@
         """Test the dynamic aspects of the project license picker."""
         # The firefox project is as good as any.
         lpuser.SAMPLE_PERSON.ensure_login(self.client)
-        self.client.open(url=u'http://launchpad.dev:8085/firefox/+edit')
+        self.client.open(url=u'%s/firefox/+edit'
+                        % RegistryWindmillLayer.base_url)
         self.client.waits.forPageLoad(timeout=u'20000')
 
         # The Recommended table is visible.
@@ -126,7 +127,8 @@
         self.client.click(id='field.actions.change')
         self.client.waits.forPageLoad(timeout=u'20000')
 
-        self.client.open(url=u'http://launchpad.dev:8085/firefox/+edit')
+        self.client.open(url=u'%s/firefox/+edit'
+                        % RegistryWindmillLayer.base_url)
         self.client.waits.forPageLoad(timeout=u'20000')
 
         self.client.asserts.assertProperty(

=== modified file 'lib/lp/registry/windmill/tests/test_team_index.py'
--- lib/lp/registry/windmill/tests/test_team_index.py	2010-08-20 20:31:18 +0000
+++ lib/lp/registry/windmill/tests/test_team_index.py	2010-10-29 12:36:22 +0000
@@ -24,7 +24,7 @@
 
     def test_addmember(self):
         self.client.open(
-            url=u'http://launchpad.dev:8085/~testing-spanish-team')
+            url=u'%s/~testing-spanish-team' % RegistryWindmillLayer.base_url)
 
         lpuser.TRANSLATIONS_ADMIN.ensure_login(self.client)
 

=== modified file 'lib/lp/registry/windmill/tests/test_timeline_graph.py'
--- lib/lp/registry/windmill/tests/test_timeline_graph.py	2010-02-01 18:37:00 +0000
+++ lib/lp/registry/windmill/tests/test_timeline_graph.py	2010-10-29 12:36:22 +0000
@@ -22,7 +22,8 @@
         """Test timeline graph on /$project/+timeline-graph page."""
 
         self.client.open(
-            url=u'http://launchpad.dev:8085/firefox/+timeline-graph')
+            url=u'%s/firefox/+timeline-graph'
+                % RegistryWindmillLayer.base_url)
         self.client.waits.forElement(id=u'spinner', timeout=u'20000')
         self.client.waits.forElementProperty(
             id=u'spinner',
@@ -35,7 +36,7 @@
     def test_project_timeline_graph(self):
         """Test that the timeline graph loads on /$project page."""
 
-        self.client.open(url=u'http://launchpad.dev:8085/firefox')
+        self.client.open(url=u'%s/firefox' % RegistryWindmillLayer.base_url)
 
         self.client.waits.forElementProperty(
             id=u'timeline-loading',
@@ -49,7 +50,8 @@
     def test_series_timeline_graph(self):
         """Test that the timeline graph loads on /$project/$series page."""
 
-        self.client.open(url=u'http://launchpad.dev:8085/firefox/trunk')
+        self.client.open(url=u'%s/firefox/trunk'
+                        % RegistryWindmillLayer.base_url)
 
         self.client.waits.forElementProperty(
             id=u'timeline-iframe',
@@ -64,7 +66,8 @@
     def test_all_series_timeline_graph(self):
         """Test that the timeline graph loads on /$project/+series page."""
 
-        self.client.open(url=u'http://launchpad.dev:8085/firefox/+series')
+        self.client.open(url=u'%s/firefox/+series'
+                        % RegistryWindmillLayer.base_url)
 
         self.client.waits.forElement(
             id=u'timeline-loading',

=== modified file 'lib/lp/services/mailman/doc/contact-address.txt'
--- lib/lp/services/mailman/doc/contact-address.txt	2009-12-02 22:56:09 +0000
+++ lib/lp/services/mailman/doc/contact-address.txt	2010-10-29 12:36:22 +0000
@@ -22,8 +22,10 @@
 
     >>> from canonical.launchpad.testing.pages import strip_label
 
+    >>> from canonical.testing.layers import BaseLayer
+    >>> root_url = BaseLayer.appserver_root_url()
     >>> browser = Browser('no-priv@xxxxxxxxxxxxx:test')
-    >>> browser.open('http://launchpad.dev:8085/~itest-one/+contactaddress')
+    >>> browser.open('%s/~itest-one/+contactaddress' % root_url)
     >>> browser.getControl('The Launchpad mailing list').selected = True
     >>> browser.getControl('Change').click()
 
@@ -33,8 +35,9 @@
     >>> [strip_label(label) for label in control.displayValue]
     ['The Launchpad mailing list for this team...]
 
+    >>> answers_url = BaseLayer.appserver_root_url('answers')
     >>> browser.open(
-    ...     'http://answers.launchpad.dev:8085/firefox/+answer-contact')
+    ...     '%s/firefox/+answer-contact' % answers_url)
     >>> browser.getControl(name='field.answer_contact_teams').displayValue = [
     ...     'Itest One']
     >>> browser.getControl('Continue').click()
@@ -42,7 +45,7 @@
 Now that the contact address for the team is its mailing list, a new questions
 will be delivered to the mailing list.
 
-    >>> browser.open('http://answers.launchpad.dev:8085/firefox/+addquestion')
+    >>> browser.open('%s/firefox/+addquestion' % answers_url)
     >>> browser.getControl('Summary').value = 'A new question'
     >>> browser.getControl('Continue').click()
     >>> browser.getControl('Description').value = 'More detail.'
@@ -86,7 +89,7 @@
     X-RcptTo: no-priv@xxxxxxxxxxxxx
     <BLANKLINE>
     New question #... on Mozilla Firefox:
-    http://answers.launchpad.dev:8085/firefox/+question/...
+    http://answers.launchpad.dev:.../firefox/+question/...
     <BLANKLINE>
     More detail.
     <BLANKLINE>
@@ -125,7 +128,7 @@
     X-RcptTo: anne.person@xxxxxxxxxxx
     <BLANKLINE>
     New question #... on Mozilla Firefox:
-    http://answers.launchpad.dev:8085/firefox/+question/...
+    http://answers.launchpad.dev:.../firefox/+question/...
     <BLANKLINE>
     More detail.
     <BLANKLINE>
@@ -154,7 +157,7 @@
 sent to Anne and to the archive, via the mailing list.
 
     >>> browser.open(
-    ...     'http://launchpad.dev:8085/firefox/+spec/canvas/+addsubscriber')
+    ...     '%s/firefox/+spec/canvas/+addsubscriber' % root_url)
     >>> browser.getControl('Subscriber').value = 'itest-one'
     >>> browser.getControl('Continue').click()
 
@@ -195,7 +198,7 @@
     Objects.
     <BLANKLINE>
     --
-      http://blueprints.launchpad.dev:8085/firefox/+spec/canvas
+      http://blueprints.launchpad.d