Merge ~cjwatson/launchpad:doctest-reformat-headers into launchpad:master

Proposed by Colin Watson
Status: Merged
Approved by: Colin Watson
Approved revision: 509c09bb8067888b42b7aac9a06cb5e9a4f42539
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~cjwatson/launchpad:doctest-reformat-headers
Merge into: launchpad:master
Diff against target: 10666 lines (+2106/-1053)
321 files modified
configs/README.txt (+22/-11)
lib/lp/answers/stories/faq-add.txt (+2/-1)
lib/lp/answers/stories/faq-browse-and-search.txt (+12/-6)
lib/lp/answers/stories/faq-edit.txt (+2/-1)
lib/lp/answers/stories/question-add-in-other-languages.txt (+2/-1)
lib/lp/answers/stories/question-browse-and-search.txt (+42/-21)
lib/lp/answers/stories/question-compatibility-urls.txt (+18/-9)
lib/lp/answers/stories/question-edit.txt (+6/-3)
lib/lp/answers/stories/question-message.txt (+6/-3)
lib/lp/answers/stories/question-obfuscation.txt (+6/-3)
lib/lp/answers/stories/question-reject-and-change-status.txt (+4/-2)
lib/lp/answers/stories/question-search-multiple-languages.txt (+10/-5)
lib/lp/answers/stories/question-subscriptions.txt (+8/-4)
lib/lp/answers/stories/this-is-a-faq.txt (+18/-9)
lib/lp/app/doc/displaying-numbers.txt (+6/-3)
lib/lp/app/doc/launchpadform.txt (+28/-14)
lib/lp/app/doc/tales-email-formatting.txt (+6/-3)
lib/lp/app/doc/validation.txt (+4/-2)
lib/lp/app/stories/basics/marketing.txt (+20/-10)
lib/lp/app/stories/basics/max-batch-size.txt (+2/-1)
lib/lp/app/stories/basics/user-requested-oops.txt (+2/-1)
lib/lp/app/stories/basics/xx-dbpolicy.txt (+2/-1)
lib/lp/app/stories/basics/xx-developerexceptions.txt (+4/-2)
lib/lp/app/stories/basics/xx-lowercase-redirection.txt (+2/-1)
lib/lp/app/stories/basics/xx-maintenance-message.txt (+4/-2)
lib/lp/app/stories/folder.txt (+10/-5)
lib/lp/app/stories/launchpad-root/xx-featuredprojects.txt (+8/-4)
lib/lp/app/widgets/doc/announcement-date-widget.txt (+2/-1)
lib/lp/app/widgets/doc/lower-case-text-widget.txt (+2/-1)
lib/lp/app/widgets/doc/noneable-text-widgets.txt (+6/-3)
lib/lp/app/widgets/doc/project-scope-widget.txt (+10/-5)
lib/lp/app/widgets/doc/tokens-text-widget.txt (+2/-1)
lib/lp/app/widgets/doc/zope3-widgets-use-form-ng.txt (+2/-1)
lib/lp/archivepublisher/tests/deathrow.txt (+4/-2)
lib/lp/archiveuploader/tests/upload-path-parsing.txt (+10/-5)
lib/lp/blueprints/stories/blueprints/xx-buglinks.txt (+6/-3)
lib/lp/blueprints/stories/blueprints/xx-dependencies.txt (+18/-9)
lib/lp/blueprints/stories/standalone/xx-batching.txt (+2/-1)
lib/lp/blueprints/stories/standalone/xx-informational-blueprints.txt (+6/-3)
lib/lp/bugs/browser/tests/buglinktarget-views.txt (+10/-5)
lib/lp/bugs/browser/tests/bugtask-edit-views.txt (+12/-6)
lib/lp/bugs/browser/tests/bugtask-search-views.txt (+10/-5)
lib/lp/bugs/browser/tests/distrosourcepackage-bug-views.txt (+4/-2)
lib/lp/bugs/doc/bug-change.txt (+34/-17)
lib/lp/bugs/doc/bug-reported-acknowledgement.txt (+2/-1)
lib/lp/bugs/doc/bug-reporting-guidelines.txt (+2/-1)
lib/lp/bugs/doc/bug-set-status.txt (+6/-3)
lib/lp/bugs/doc/bugmessage-visibility.txt (+2/-1)
lib/lp/bugs/doc/bugmessage.txt (+12/-6)
lib/lp/bugs/doc/bugnotifications.txt (+20/-10)
lib/lp/bugs/doc/bugtarget.txt (+4/-2)
lib/lp/bugs/doc/bugtask-package-bugcounts.txt (+6/-3)
lib/lp/bugs/doc/bugtask-search-old-urls.txt (+2/-1)
lib/lp/bugs/doc/bugtask-status-workflow.txt (+4/-2)
lib/lp/bugs/doc/bugwidget.txt (+2/-1)
lib/lp/bugs/doc/cve.txt (+12/-6)
lib/lp/bugs/doc/displaying-bugs-and-tasks.txt (+10/-5)
lib/lp/bugs/doc/externalbugtracker-checkwatches.txt (+4/-2)
lib/lp/bugs/doc/externalbugtracker-comment-pushing.txt (+4/-2)
lib/lp/bugs/doc/externalbugtracker-emailaddress.txt (+6/-3)
lib/lp/bugs/doc/externalbugtracker-linking-back.txt (+4/-2)
lib/lp/bugs/doc/externalbugtracker-mantis-csv.txt (+6/-3)
lib/lp/bugs/doc/externalbugtracker-mantis.txt (+6/-3)
lib/lp/bugs/doc/externalbugtracker-roundup-python-bugs.txt (+4/-2)
lib/lp/bugs/doc/externalbugtracker-roundup.txt (+12/-6)
lib/lp/bugs/doc/externalbugtracker-rt.txt (+18/-9)
lib/lp/bugs/doc/externalbugtracker-sourceforge.txt (+12/-6)
lib/lp/bugs/doc/externalbugtracker-trac.txt (+14/-7)
lib/lp/bugs/doc/product-update-remote-product-script.txt (+2/-1)
lib/lp/bugs/doc/products-with-no-remote-product.txt (+2/-1)
lib/lp/bugs/doc/treelookup.txt (+12/-6)
lib/lp/bugs/stories/bug-also-affects/xx-also-affects-distribution-default-values.txt (+2/-1)
lib/lp/bugs/stories/bug-also-affects/xx-also-affects-new-upstream.txt (+4/-2)
lib/lp/bugs/stories/bug-also-affects/xx-bugtracker-information.txt (+2/-1)
lib/lp/bugs/stories/bug-also-affects/xx-duplicate-bugwatches.txt (+6/-3)
lib/lp/bugs/stories/bug-also-affects/xx-request-distribution-no-release-fix.txt (+6/-3)
lib/lp/bugs/stories/bug-also-affects/xx-upstream-bugtracker-links.txt (+2/-1)
lib/lp/bugs/stories/bug-release-management/nomination-navigation.txt (+2/-1)
lib/lp/bugs/stories/bug-tags/xx-searching-for-tags.txt (+4/-2)
lib/lp/bugs/stories/bugattachments/xx-delete-bug-attachment.txt (+2/-1)
lib/lp/bugs/stories/bugattachments/xx-display-filesize-attachment.txt (+2/-1)
lib/lp/bugs/stories/bugs/xx-add-comment-bugtask-edit.txt (+2/-1)
lib/lp/bugs/stories/bugs/xx-add-comment-distribution-no-current-release.txt (+2/-1)
lib/lp/bugs/stories/bugs/xx-add-comment-with-bugwatch-and-cve.txt (+2/-1)
lib/lp/bugs/stories/bugs/xx-bug-affects-me-too.txt (+6/-3)
lib/lp/bugs/stories/bugs/xx-bug-heat-on-bug-page.txt (+2/-1)
lib/lp/bugs/stories/bugs/xx-bug-hidden-comments.txt (+2/-1)
lib/lp/bugs/stories/bugs/xx-bug-nomination-table-row.txt (+2/-1)
lib/lp/bugs/stories/bugs/xx-bug-text-pages.txt (+12/-6)
lib/lp/bugs/stories/bugs/xx-distributionsourcepackage-bugs.txt (+2/-1)
lib/lp/bugs/stories/bugs/xx-distrorelease-bugs-page.txt (+6/-3)
lib/lp/bugs/stories/bugs/xx-duplicate-of-private-bug.txt (+2/-1)
lib/lp/bugs/stories/bugs/xx-edit-no-currentrelease-distribution-task.txt (+2/-1)
lib/lp/bugs/stories/bugs/xx-front-page-search.txt (+14/-7)
lib/lp/bugs/stories/bugs/xx-front-page-statistics.txt (+2/-1)
lib/lp/bugs/stories/bugs/xx-incomplete-bugs.txt (+10/-5)
lib/lp/bugs/stories/bugs/xx-project-bugs-page.txt (+2/-1)
lib/lp/bugs/stories/bugs/xx-unique-ids-on-bug-page.txt (+2/-1)
lib/lp/bugs/stories/bugtask-management/xx-bug-privileged-statuses.txt (+6/-3)
lib/lp/bugs/stories/bugtask-management/xx-edit-email-address-bugtask.txt (+6/-3)
lib/lp/bugs/stories/bugtask-searches/xx-filter-by-linked-branches.txt (+2/-1)
lib/lp/bugs/stories/bugtask-searches/xx-listing-basics.txt (+18/-9)
lib/lp/bugs/stories/bugtask-searches/xx-old-urls-still-work.txt (+4/-2)
lib/lp/bugs/stories/bugtracker/xx-bugtracker-handshake-tokens.txt (+2/-1)
lib/lp/bugs/stories/bugwatches/xx-bugwatch-comments.txt (+2/-1)
lib/lp/bugs/stories/bugwatches/xx-bugwatch-errors.txt (+2/-1)
lib/lp/bugs/stories/cve/xx-cve-link-xss.txt (+2/-1)
lib/lp/bugs/stories/feeds/xx-bug-atom.txt (+28/-14)
lib/lp/bugs/stories/feeds/xx-bug-html.txt (+14/-7)
lib/lp/bugs/stories/guided-filebug/xx-distro-guided-filebug-tags.txt (+2/-1)
lib/lp/bugs/stories/guided-filebug/xx-distro-guided-filebug.txt (+4/-2)
lib/lp/bugs/stories/guided-filebug/xx-filebug-attachments.txt (+6/-3)
lib/lp/bugs/stories/guided-filebug/xx-filebug-tags.txt (+6/-3)
lib/lp/bugs/stories/guided-filebug/xx-options-for-bug-supervisors.txt (+4/-2)
lib/lp/bugs/stories/guided-filebug/xx-productseries-guided-filebug.txt (+2/-1)
lib/lp/bugs/stories/guided-filebug/xx-sorting-by-relevance.txt (+2/-1)
lib/lp/bugs/stories/upstream-bugprivacy/xx-upstream-bug-privacy.txt (+2/-1)
lib/lp/bugs/stories/webservice/xx-bug-target.txt (+8/-4)
lib/lp/bugs/stories/webservice/xx-hide-comments.txt (+2/-1)
lib/lp/bugs/tests/buglinktarget.txt (+10/-5)
lib/lp/bugs/tests/trac-xmlrpc-transport.txt (+14/-7)
lib/lp/buildmaster/doc/buildqueue.txt (+6/-3)
lib/lp/buildmaster/stories/builder-views.txt (+10/-5)
lib/lp/buildmaster/stories/xx-buildfarm-index.txt (+2/-1)
lib/lp/code/doc/branch-karma.txt (+8/-4)
lib/lp/code/doc/branch-notifications.txt (+16/-8)
lib/lp/code/doc/code-jobs.txt (+20/-10)
lib/lp/code/doc/codeimport-job.txt (+18/-9)
lib/lp/code/doc/codeimport-result.txt (+6/-3)
lib/lp/code/doc/codereviewcomment.txt (+6/-3)
lib/lp/code/doc/revision.txt (+16/-8)
lib/lp/code/stories/branches/package-branch-merge-proposals.txt (+2/-1)
lib/lp/code/stories/branches/package-branch-merges-with-product-branches.txt (+2/-1)
lib/lp/code/stories/branches/xx-branch-listings-merge-proposal-badge.txt (+2/-1)
lib/lp/code/stories/branches/xx-branch-listings.txt (+16/-8)
lib/lp/code/stories/branches/xx-branch-mirror-failures.txt (+6/-3)
lib/lp/code/stories/branches/xx-claiming-team-code-reviews.txt (+2/-1)
lib/lp/code/stories/branches/xx-distribution-branches.txt (+2/-1)
lib/lp/code/stories/branches/xx-distroseries-branches.txt (+2/-1)
lib/lp/code/stories/branches/xx-person-portlet-teambranches.txt (+2/-1)
lib/lp/code/stories/branches/xx-product-overview.txt (+2/-1)
lib/lp/code/stories/branches/xx-source-package-branches-empty.txt (+2/-1)
lib/lp/code/stories/branches/xx-source-package-branches-listing.txt (+2/-1)
lib/lp/code/stories/branches/xx-upload-directions.txt (+10/-5)
lib/lp/code/stories/codeimport/xx-codeimport-machines.txt (+6/-3)
lib/lp/code/stories/codeimport/xx-edit-codeimport.txt (+14/-7)
lib/lp/code/stories/codeimport/xx-failing-codeimport.txt (+2/-1)
lib/lp/code/stories/feeds/xx-branch-atom.txt (+12/-6)
lib/lp/code/stories/feeds/xx-revision-atom.txt (+10/-5)
lib/lp/code/stories/webservice/xx-branches.txt (+8/-4)
lib/lp/code/stories/webservice/xx-branchmergeproposal.txt (+18/-9)
lib/lp/coop/answersbugs/stories/question-buglink.txt (+8/-4)
lib/lp/coop/answersbugs/stories/question-makebug.txt (+2/-1)
lib/lp/registry/browser/tests/poll-views_0.txt (+8/-4)
lib/lp/registry/browser/tests/team-join-views.txt (+4/-2)
lib/lp/registry/codesofconduct/1.0.1.txt (+2/-1)
lib/lp/registry/codesofconduct/1.0.txt (+2/-1)
lib/lp/registry/codesofconduct/1.1.txt (+2/-1)
lib/lp/registry/codesofconduct/2.0.txt (+6/-3)
lib/lp/registry/doc/announcement.txt (+18/-9)
lib/lp/registry/doc/cache-country-mirrors.txt (+2/-1)
lib/lp/registry/doc/distribution-mirror.txt (+16/-8)
lib/lp/registry/doc/distribution-sourcepackage.txt (+14/-7)
lib/lp/registry/doc/featuredproject.txt (+2/-1)
lib/lp/registry/doc/hasowner-authorization.txt (+2/-1)
lib/lp/registry/doc/irc.txt (+2/-1)
lib/lp/registry/doc/jabber.txt (+2/-1)
lib/lp/registry/doc/karmacache.txt (+6/-3)
lib/lp/registry/doc/launchpad-container.txt (+8/-4)
lib/lp/registry/doc/personroles.txt (+12/-6)
lib/lp/registry/doc/pillar-aliases-field.txt (+2/-1)
lib/lp/registry/doc/pillar.txt (+8/-4)
lib/lp/registry/doc/productrelease.txt (+2/-1)
lib/lp/registry/doc/productseries.txt (+12/-6)
lib/lp/registry/doc/standing.txt (+8/-4)
lib/lp/registry/doc/team-nav-menus.txt (+2/-1)
lib/lp/registry/doc/user-to-user.txt (+8/-4)
lib/lp/registry/doc/wikiname.txt (+2/-1)
lib/lp/registry/stories/distributionmirror/xx-distribution-countrymirrors.txt (+2/-1)
lib/lp/registry/stories/distributionmirror/xx-distributionmirror-prober-logs.txt (+2/-1)
lib/lp/registry/stories/gpg-coc/xx-gpg-coc.txt (+10/-5)
lib/lp/registry/stories/mailinglists/hosted-email-address.txt (+2/-1)
lib/lp/registry/stories/milestone/xx-milestone-add-and-edit.txt (+8/-4)
lib/lp/registry/stories/milestone/xx-milestone-description.txt (+6/-3)
lib/lp/registry/stories/person/xx-add-sshkey.txt (+2/-1)
lib/lp/registry/stories/person/xx-approve-members.txt (+2/-1)
lib/lp/registry/stories/person/xx-person-working-on.txt (+2/-1)
lib/lp/registry/stories/pillar/xx-pillar-deactivation.txt (+2/-1)
lib/lp/registry/stories/pillar/xx-pillar-sprints.txt (+2/-1)
lib/lp/registry/stories/pillar/xx-pillar-traversal.txt (+2/-1)
lib/lp/registry/stories/product/xx-launchpad-project-search.txt (+4/-2)
lib/lp/registry/stories/product/xx-product-edit-sourceforge-project.txt (+2/-1)
lib/lp/registry/stories/productrelease/xx-productrelease-basics.txt (+8/-4)
lib/lp/registry/stories/productrelease/xx-productrelease-delete.txt (+2/-1)
lib/lp/registry/stories/project/xx-project-add.txt (+2/-1)
lib/lp/registry/stories/team-polls/create-poll-options.txt (+2/-1)
lib/lp/registry/stories/team-polls/edit-options.txt (+2/-1)
lib/lp/registry/stories/team-polls/edit-poll.txt (+2/-1)
lib/lp/registry/stories/team-polls/vote-poll.txt (+6/-3)
lib/lp/registry/stories/team/xx-team-add-my-teams.txt (+2/-1)
lib/lp/registry/stories/team/xx-team-contactemail-xss.txt (+2/-1)
lib/lp/registry/stories/team/xx-team-contactemail.txt (+4/-2)
lib/lp/registry/stories/teammembership/private-team.txt (+6/-3)
lib/lp/registry/stories/teammembership/xx-member-renewed-membership.txt (+2/-1)
lib/lp/registry/stories/teammembership/xx-renew-subscription.txt (+2/-1)
lib/lp/registry/stories/teammembership/xx-team-leave.txt (+6/-3)
lib/lp/registry/stories/webservice/xx-distribution-mirror.txt (+6/-3)
lib/lp/registry/stories/webservice/xx-private-team.txt (+4/-2)
lib/lp/registry/stories/webservice/xx-structuralsubscription.txt (+2/-1)
lib/lp/registry/tests/bug-249185.txt (+2/-1)
lib/lp/registry/tests/person_from_principal.txt (+2/-1)
lib/lp/services/database/doc/decoratedresultset.txt (+14/-7)
lib/lp/services/database/doc/multitablecopy.txt (+24/-12)
lib/lp/services/database/doc/storm-store-reset.txt (+2/-1)
lib/lp/services/database/tests/decoratedresultset.txt (+24/-12)
lib/lp/services/doc/looptuner.txt (+28/-14)
lib/lp/services/feeds/doc/feeds.txt (+10/-5)
lib/lp/services/feeds/stories/xx-links.txt (+30/-15)
lib/lp/services/feeds/stories/xx-navigation.txt (+12/-6)
lib/lp/services/fields/doc/uri-field.txt (+18/-9)
lib/lp/services/gpg/doc/gpghandler.txt (+10/-5)
lib/lp/services/oauth/doc/oauth-pages.txt (+4/-2)
lib/lp/services/oauth/stories/access-token.txt (+2/-1)
lib/lp/services/oauth/stories/managing-tokens.txt (+2/-1)
lib/lp/services/oauth/stories/request-token.txt (+2/-1)
lib/lp/services/scripts/doc/profile.txt (+2/-1)
lib/lp/services/verification/browser/tests/logintoken-views.txt (+4/-2)
lib/lp/services/verification/doc/logintoken.txt (+4/-2)
lib/lp/services/webapp/doc/canonical_url.txt (+24/-12)
lib/lp/services/webapp/doc/canonicalurl.txt (+8/-4)
lib/lp/services/webapp/doc/launchbag.txt (+2/-1)
lib/lp/services/webapp/doc/menus.txt (+26/-13)
lib/lp/services/webapp/doc/navigation.txt (+22/-11)
lib/lp/services/webapp/doc/notification-text-escape.txt (+2/-1)
lib/lp/services/webapp/doc/renamed-view.txt (+10/-5)
lib/lp/services/webapp/doc/timeout.txt (+4/-2)
lib/lp/services/webapp/doc/uri.txt (+2/-1)
lib/lp/services/webapp/doc/xmlrpc-infrastructure.txt (+2/-1)
lib/lp/services/webapp/doc/zcmldirectives.txt (+18/-9)
lib/lp/services/webapp/tests/test_launchpad_login_source.txt (+2/-1)
lib/lp/services/webservice/doc/launchpadlib.txt (+2/-1)
lib/lp/services/webservice/doc/webservice-configuration.txt (+4/-2)
lib/lp/services/webservice/doc/webservice-error.txt (+2/-1)
lib/lp/services/webservice/doc/webservice-marshallers.txt (+4/-2)
lib/lp/services/webservice/stories/apidoc.txt (+2/-1)
lib/lp/services/webservice/stories/root.txt (+2/-1)
lib/lp/services/webservice/stories/xx-wadl.txt (+2/-1)
lib/lp/services/worlddata/stories/webservice/xx-country.txt (+4/-2)
lib/lp/soyuz/browser/tests/archivesubscription-views.txt (+4/-2)
lib/lp/soyuz/browser/tests/binarypackagerelease-views.txt (+2/-1)
lib/lp/soyuz/browser/tests/distroseriesqueue-views.txt (+4/-2)
lib/lp/soyuz/browser/tests/sourcepackage-views.txt (+2/-1)
lib/lp/soyuz/doc/archiveauthtoken.txt (+8/-4)
lib/lp/soyuz/doc/binarypackagerelease.txt (+4/-2)
lib/lp/soyuz/doc/build-failedtoupload-workflow.txt (+4/-2)
lib/lp/soyuz/doc/build-files.txt (+2/-1)
lib/lp/soyuz/doc/distroseriesbinarypackage.txt (+2/-1)
lib/lp/soyuz/doc/fakepackager.txt (+8/-4)
lib/lp/soyuz/doc/package-cache-script.txt (+2/-1)
lib/lp/soyuz/doc/package-meta-classes.txt (+2/-1)
lib/lp/soyuz/doc/package-relationship-pages.txt (+2/-1)
lib/lp/soyuz/doc/package-relationship.txt (+2/-1)
lib/lp/soyuz/doc/packagecopyrequest.txt (+2/-1)
lib/lp/soyuz/doc/pocketchroot.txt (+2/-1)
lib/lp/soyuz/doc/sampledata-setup.txt (+2/-1)
lib/lp/soyuz/doc/sourcepackagerelease.txt (+8/-4)
lib/lp/soyuz/stories/packaging/package-pages-navigation.txt (+16/-8)
lib/lp/soyuz/stories/ppa/xx-edit-dependencies.txt (+14/-7)
lib/lp/soyuz/stories/ppa/xx-ppa-navigation.txt (+2/-1)
lib/lp/soyuz/stories/ppa/xx-private-ppa-presentation.txt (+6/-3)
lib/lp/soyuz/stories/ppa/xx-private-ppa-subscription-stories.txt (+30/-15)
lib/lp/soyuz/stories/ppa/xx-private-ppa-subscriptions.txt (+10/-5)
lib/lp/soyuz/stories/ppa/xx-private-ppas.txt (+10/-5)
lib/lp/soyuz/stories/ppa/xx-ubuntu-ppas.txt (+24/-12)
lib/lp/soyuz/stories/soyuz/xx-binarypackagerelease-index.txt (+2/-1)
lib/lp/soyuz/stories/soyuz/xx-distribution-add.txt (+2/-1)
lib/lp/soyuz/stories/soyuz/xx-distribution-archives.txt (+2/-1)
lib/lp/soyuz/stories/soyuz/xx-distribution-edit.txt (+2/-1)
lib/lp/soyuz/stories/soyuz/xx-distroarchseries.txt (+10/-5)
lib/lp/soyuz/stories/soyuz/xx-distroseries-binary-packages.txt (+2/-1)
lib/lp/soyuz/stories/soyuz/xx-distroseries-index.txt (+2/-1)
lib/lp/soyuz/stories/soyuz/xx-package-diff.txt (+8/-4)
lib/lp/soyuz/stories/soyuz/xx-portlet-publishing-details.txt (+2/-1)
lib/lp/soyuz/stories/soyuz/xx-private-builds.txt (+10/-5)
lib/lp/soyuz/stories/webservice/xx-person-createppa.txt (+6/-3)
lib/lp/testing/doc/sample-data-assertions.txt (+4/-2)
lib/lp/translations/browser/tests/productseries-views.txt (+6/-3)
lib/lp/translations/doc/message-sharing-merge-script.txt (+2/-1)
lib/lp/translations/doc/poexport-request-productseries.txt (+2/-1)
lib/lp/translations/doc/poexport-request.txt (+10/-5)
lib/lp/translations/doc/poexportqueue-replication-lag.txt (+2/-1)
lib/lp/translations/doc/remove-translations-by.txt (+4/-2)
lib/lp/translations/doc/translationbranchapprover.txt (+2/-1)
lib/lp/translations/doc/translationbuildapprover.txt (+2/-1)
lib/lp/translations/doc/translationrelicensingagreement.txt (+2/-1)
lib/lp/translations/stories/distribution/xx-distribution-change-language-pack-admins.txt (+2/-1)
lib/lp/translations/stories/importqueue/xx-entry-error-output.txt (+2/-1)
lib/lp/translations/stories/importqueue/xx-translation-import-queue-filtering.txt (+18/-9)
lib/lp/translations/stories/importqueue/xx-translation-import-queue-targets.txt (+10/-5)
lib/lp/translations/stories/navigation-links/pofile.txt (+2/-1)
lib/lp/translations/stories/productseries/xx-productseries-translation-export.txt (+12/-6)
lib/lp/translations/stories/productseries/xx-productseries-translations-bzr-request.txt (+8/-4)
lib/lp/translations/stories/standalone/xx-person-editlanguages.txt (+6/-3)
lib/lp/translations/stories/standalone/xx-pofile-translate-dismiss-suggestions.txt (+4/-2)
lib/lp/translations/stories/standalone/xx-pofile-translate-legal-warning.txt (+2/-1)
lib/lp/translations/stories/standalone/xx-pofile-translate-performance.txt (+6/-3)
lib/lp/translations/stories/standalone/xx-pofile-translate-search.txt (+2/-1)
lib/lp/translations/stories/standalone/xx-products-with-translations.txt (+2/-1)
lib/lp/translations/stories/standalone/xx-rosetta-distributionsourcepackage-list.txt (+2/-1)
lib/lp/translations/stories/standalone/xx-rosetta-sourcepackage-list.txt (+2/-1)
lib/lp/translations/stories/standalone/xx-translation-access-display.txt (+6/-3)
lib/lp/translations/stories/standalone/xx-translation-credits.txt (+2/-1)
lib/lp/translations/stories/standalone/xx-translation-help.txt (+2/-1)
lib/lp/translations/stories/translations/xx-translations.txt (+8/-4)
lib/lp/translations/stories/webservice/xx-translationfocus.txt (+2/-1)
lib/lp/translations/utilities/doc/gettext_mo_exporter.txt (+8/-4)
lib/lp/translations/utilities/doc/gettext_po_exporter.txt (+8/-4)
lib/lp/translations/utilities/doc/gettext_po_parser.txt (+20/-10)
lib/lp/translations/utilities/doc/gettext_po_parser_context.txt (+14/-7)
lib/lp/translations/utilities/doc/kde-po-file-format.txt (+18/-9)
lib/lp/translations/utilities/doc/templatenames.txt (+2/-1)
Reviewer Review Type Date Requested Status
Colin Watson (community) Approve
Review via email: mp+406176@code.launchpad.net

Commit message

Reformat doctest headers in reStructuredText style

Description of the change

pocket-lint (and hence lp-lint-doctest) have been complaining about Moin-style headers in doctests for a long time, but we've never got round to fixing them all. Let's just get it over with.

Patch generated by:

  git grep -El '^= .+ = *$' | fgrep .txt | \
    xargs perl -pi -e 's/^= (.+) = *$/"$1\n" . ("=" x length($1))/e'
  git grep -El '^== .+ == *$' | fgrep .txt | \
    xargs perl -pi -e 's/^== (.+) == *$/"$1\n" . ("-" x length($1))/e'
  git grep -El '^=== .+ === *$' | fgrep .txt | \
    xargs perl -pi -e 's/^=== (.+) === *$/"$1\n" . ("." x length($1))/e'

To post a comment you must log in.
Revision history for this message
Colin Watson (cjwatson) wrote :

Self-approving (trivial and mechanical).

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/configs/README.txt b/configs/README.txt
index 38e2893..4348000 100644
--- a/configs/README.txt
+++ b/configs/README.txt
@@ -1,10 +1,12 @@
1= Launchpad configs =1Launchpad configs
2=================
23
3This directory defines the configurations used to run Launchpad4This directory defines the configurations used to run Launchpad
4applications in specific environments.5applications in specific environments.
56
67
7== Environments ==8Environments
9------------
810
9This directory stores configs. The config used is selected on startup11This directory stores configs. The config used is selected on startup
10using the LPCONFIG environment variable.12using the LPCONFIG environment variable.
@@ -24,13 +26,15 @@ to do this if you are adding a new required config option to
24launchpad-lazr.conf.26launchpad-lazr.conf.
2527
2628
27== LaunchpadConfig ==29LaunchpadConfig
30---------------
2831
29Launchpad uses a singleton LaunchpadConfig object to select the config32Launchpad uses a singleton LaunchpadConfig object to select the config
30to load and manage its state.33to load and manage its state.
3134
3235
33=== Instance directories and process files ===36Instance directories and process files
37......................................
3438
35The directories in configs/ represent environment's config `instance`.39The directories in configs/ represent environment's config `instance`.
36Environment and instance are synonymous in this case. The instance is40Environment and instance are synonymous in this case. The instance is
@@ -60,7 +64,8 @@ All this information is available in the config object.
60 '.../configs/development/launchpad-lazr.conf'64 '.../configs/development/launchpad-lazr.conf'
6165
6266
63=== Accessing the LaunchpadConfig in code ===67Accessing the LaunchpadConfig in code
68.....................................
6469
65The LaunchpadConfig singleton is exposed as config in its module.70The LaunchpadConfig singleton is exposed as config in its module.
6671
@@ -87,7 +92,8 @@ You can learn more about lp.services.config in the doctest located at
87 lib/canonical/launchpad/doc/canonical-config.txt92 lib/canonical/launchpad/doc/canonical-config.txt
8893
8994
90=== Testing with LaunchpadConfig ===95Testing with LaunchpadConfig
96............................
9197
92Configurations are meant to be immutable--applications should never98Configurations are meant to be immutable--applications should never
93alter the config. Nor should tests. Older code and tests assumed99alter the config. Nor should tests. Older code and tests assumed
@@ -121,7 +127,8 @@ the config.
121 'answers.launchpad.net'127 'answers.launchpad.net'
122128
123129
124== lazr.conf schema and confs ==130lazr.conf schema and confs
131--------------------------
125132
126All Launchpad configs inherit from the Launchpad schema defined133All Launchpad configs inherit from the Launchpad schema defined
127in ../lib/lp/services/config/schema-lazr.conf (it is symlinked134in ../lib/lp/services/config/schema-lazr.conf (it is symlinked
@@ -166,7 +173,8 @@ You can learn more about lazr.config in the doctest located at
166 lib/canonical/lazr/doc/config.txt173 lib/canonical/lazr/doc/config.txt
167174
168175
169=== schema template and optional sections ===176schema template and optional sections
177.....................................
170178
171The schema can contain [<category>.template] sections that define a179The schema can contain [<category>.template] sections that define a
172common set of keys and default value for category of sections.180common set of keys and default value for category of sections.
@@ -238,7 +246,8 @@ Including just the section ([vhost.xmlrpc_private]) will suffice. In
238this case, the two keys were redefined.246this case, the two keys were redefined.
239247
240248
241=== Implicit typing ===249Implicit typing
250...............
242251
243lazr.config support implicit typing so that the application does not252lazr.config support implicit typing so that the application does not
244need to coerce the config values:253need to coerce the config values:
@@ -264,7 +273,8 @@ the callsite must split the host:port compound object and coerce the
264port to an int.273port to an int.
265274
266275
267=== Config inheritance ===276Config inheritance
277..................
268278
269The lazr configurations in this directory descend from the279The lazr configurations in this directory descend from the
270Launchpad schema. This is a general outline of inheritance:280Launchpad schema. This is a general outline of inheritance:
@@ -323,7 +333,8 @@ There are other configuration in this directory that are not
323listed here333listed here
324334
325335
326=== Viewing a configuration with lsconf.py ===336Viewing a configuration with lsconf.py
337......................................
327338
328You can view the complete configuration for an process using the339You can view the complete configuration for an process using the
329lsconf.py utility to assemble the configuration from the lazr340lsconf.py utility to assemble the configuration from the lazr
diff --git a/lib/lp/answers/stories/faq-add.txt b/lib/lp/answers/stories/faq-add.txt
index c17df73..ac6023e 100644
--- a/lib/lp/answers/stories/faq-add.txt
+++ b/lib/lp/answers/stories/faq-add.txt
@@ -1,4 +1,5 @@
1== Creating a new FAQ ==1Creating a new FAQ
2------------------
23
3New FAQs can be created for a project by users who have 'moderation'4New FAQs can be created for a project by users who have 'moderation'
4privileges. This includes answer contacts and the project's owner.5privileges. This includes answer contacts and the project's owner.
diff --git a/lib/lp/answers/stories/faq-browse-and-search.txt b/lib/lp/answers/stories/faq-browse-and-search.txt
index 51ba8eb..555aa33 100644
--- a/lib/lp/answers/stories/faq-browse-and-search.txt
+++ b/lib/lp/answers/stories/faq-browse-and-search.txt
@@ -1,6 +1,8 @@
1= Browsing and Searching FAQs =1Browsing and Searching FAQs
2===========================
23
3== No FAQs ==4No FAQs
5-------
46
5Miss Piggy decided to give Kubuntu a try based on the recommendations of7Miss Piggy decided to give Kubuntu a try based on the recommendations of
6Kermit. She wants to watch the wedding scene of The Muppets Take8Kermit. She wants to watch the wedding scene of The Muppets Take
@@ -36,7 +38,8 @@ Kubuntu:
36 There are no FAQs for Kubuntu.38 There are no FAQs for Kubuntu.
3739
3840
39== Browsing FAQs ==41Browsing FAQs
42-------------
4043
41She learns through Fozzie Bear that support for Kubuntu is really44She learns through Fozzie Bear that support for Kubuntu is really
42happening on the Ubuntu project.45happening on the Ubuntu project.
@@ -94,7 +97,8 @@ The FAQ page has a link back to the FAQ listing:
94 http://answers.launchpad.test/ubuntu/+faqs97 http://answers.launchpad.test/ubuntu/+faqs
9598
9699
97== Searching FAQs ==100Searching FAQs
101--------------
98102
99All FAQs listing have a search box at the top, where the user can103All FAQs listing have a search box at the top, where the user can
100enter keywords that be used to filter the displayed FAQs.104enter keywords that be used to filter the displayed FAQs.
@@ -158,7 +162,8 @@ Following the link will show the questions results:
158 Flash/Java web pages162 Flash/Java web pages
159163
160164
161== Distribution Source Packages and FAQs ==165Distribution Source Packages and FAQs
166-------------------------------------
162167
163Altough distribution source packages aren't directly associated with168Altough distribution source packages aren't directly associated with
164FAQs. The 'All FAQs' link that appears in that context links to the169FAQs. The 'All FAQs' link that appears in that context links to the
@@ -173,7 +178,8 @@ distribution FAQs.
173 http://answers.launchpad.test/ubuntu/+faqs178 http://answers.launchpad.test/ubuntu/+faqs
174179
175180
176== Accessing an FAQ directly ==181Accessing an FAQ directly
182-------------------------
177183
178Asking for a non-existent FAQ or an invalid ID will raise a 404 error.184Asking for a non-existent FAQ or an invalid ID will raise a 404 error.
179185
diff --git a/lib/lp/answers/stories/faq-edit.txt b/lib/lp/answers/stories/faq-edit.txt
index dc5969c..9a635d4 100644
--- a/lib/lp/answers/stories/faq-edit.txt
+++ b/lib/lp/answers/stories/faq-edit.txt
@@ -1,4 +1,5 @@
1= Editing FAQs =1Editing FAQs
2============
23
3It is possible to modify the title, keywords and content of an existing4It is possible to modify the title, keywords and content of an existing
4FAQ. To do this, the user goes to the FAQ that they want to modify and5FAQ. To do this, the user goes to the FAQ that they want to modify and
diff --git a/lib/lp/answers/stories/question-add-in-other-languages.txt b/lib/lp/answers/stories/question-add-in-other-languages.txt
index 9ec7b8d..47498e5 100644
--- a/lib/lp/answers/stories/question-add-in-other-languages.txt
+++ b/lib/lp/answers/stories/question-add-in-other-languages.txt
@@ -1,4 +1,5 @@
1= Asking questions in languages other than English =1Asking questions in languages other than English
2================================================
23
3It is possible to ask questions in a language other than English. The4It is possible to ask questions in a language other than English. The
4'Ask a question' page has a pop-up where the user can select the language5'Ask a question' page has a pop-up where the user can select the language
diff --git a/lib/lp/answers/stories/question-browse-and-search.txt b/lib/lp/answers/stories/question-browse-and-search.txt
index 6c5bc69..ba3b8f9 100644
--- a/lib/lp/answers/stories/question-browse-and-search.txt
+++ b/lib/lp/answers/stories/question-browse-and-search.txt
@@ -1,4 +1,5 @@
1= Browsing and Searching Questions =1Browsing and Searching Questions
2================================
23
3This story describes some common use cases about using the browsing and4This story describes some common use cases about using the browsing and
4searching features of the Answer Tracker.5searching features of the Answer Tracker.
@@ -9,7 +10,8 @@ IP address, since we'll use that later.
9 >>> browser.addHeader('X_FORWARDED_FOR', '196.36.161.227')10 >>> browser.addHeader('X_FORWARDED_FOR', '196.36.161.227')
1011
1112
12== When Nobody Uses the Answer Tracker ==13When Nobody Uses the Answer Tracker
14-----------------------------------
1315
14Average Joe has recently installed Kubuntu. He has a problem with his16Average Joe has recently installed Kubuntu. He has a problem with his
15system and goes to the Kubuntu's support page in Launchpad to see if17system and goes to the Kubuntu's support page in Launchpad to see if
@@ -46,7 +48,8 @@ For projects that don't have products, the Answers facet is disabled.
46 ...48 ...
47 zope.testbrowser.browser.LinkNotFoundError49 zope.testbrowser.browser.LinkNotFoundError
4850
49== Browsing Questions ==51Browsing Questions
52------------------
5053
51He realises that support for Kubuntu is probably going on in the Ubuntu54He realises that support for Kubuntu is probably going on in the Ubuntu
52Answers page and goes there to check.55Answers page and goes there to check.
@@ -143,7 +146,8 @@ details of the question are available.
143 [<div class="report"><p>I get really poor hard drive performance.</p></div>]146 [<div class="report"><p>I get really poor hard drive performance.</p></div>]
144147
145148
146== Jumping to Questions ==149Jumping to Questions
150--------------------
147151
148The Answer Tracker main page permits the user to jump to a question by152The Answer Tracker main page permits the user to jump to a question by
149submitting the question's id in the text input field with the 'Find153submitting the question's id in the text input field with the 'Find
@@ -188,7 +192,8 @@ is shown search results instead of the question.
188 There are no questions matching "question 8" with the requested statuses.192 There are no questions matching "question 8" with the requested statuses.
189193
190194
191== Searching Questions ==195Searching Questions
196-------------------
192197
193Browsing is fine when the number of questions is small, but searching198Browsing is fine when the number of questions is small, but searching
194is more convenient as the number of questions grow larger.199is more convenient as the number of questions grow larger.
@@ -250,7 +255,8 @@ error is displayed when the user forgets to select a status.
250 You must choose at least one status.255 You must choose at least one status.
251256
252257
253== Controlling the Sort Order ==258Controlling the Sort Order
259--------------------------
254260
255That question isn't exactly what Average Joe was looking for. Now, he'd261That question isn't exactly what Average Joe was looking for. Now, he'd
256like to see all the questions that were related to the firefox package.262like to see all the questions that were related to the firefox package.
@@ -289,12 +295,14 @@ selects the 'oldest first' sort order.
289 </table>295 </table>
290296
291297
292== Common Reports ==298Common Reports
299--------------
293300
294In the actions menu, we find links to some common reports.301In the actions menu, we find links to some common reports.
295302
296303
297=== Open Questions ===304Open Questions
305..............
298306
299Nice Guy likes helping others. He uses the 'Open' link to view the most307Nice Guy likes helping others. He uses the 'Open' link to view the most
300recent questions on Mozilla Firefox.308recent questions on Mozilla Firefox.
@@ -329,7 +337,8 @@ problems:
329 Problem showing the SVG demo on W3C site337 Problem showing the SVG demo on W3C site
330338
331339
332=== Answered Questions ===340Answered Questions
341..................
333342
334A random user has a problem with firefox in Ubuntu. They use the343A random user has a problem with firefox in Ubuntu. They use the
335'Answered' link on the 'Answers' facet of the distribution to look for344'Answered' link on the 'Answers' facet of the distribution to look for
@@ -363,7 +372,8 @@ they enter 'Evolution' as a keyword and hit the search button.
363 ...372 ...
364373
365374
366=== My questions ===375My questions
376............
367377
368Sample Person remembers posting a question on mozilla-firefox. They use378Sample Person remembers posting a question on mozilla-firefox. They use
369the 'My questions' link on the distribution source package Answers facet379the 'My questions' link on the distribution source package Answers facet
@@ -435,7 +445,8 @@ informing them of this fact is displayed.
435 You didn't ask any questions about gnomebaker.445 You didn't ask any questions about gnomebaker.
436446
437447
438=== Need attention ===448Need attention
449..............
439450
440A user can often forget which questions need their attention. For451A user can often forget which questions need their attention. For
441this purpose, there is a 'Need attention' report which displays the452this purpose, there is a 'Need attention' report which displays the
@@ -488,7 +499,8 @@ informing them of this fact is displayed.
488 No questions need your attention for gnomebaker.499 No questions need your attention for gnomebaker.
489500
490501
491== Person Reports ==502Person Reports
503--------------
492504
493The Answers facet on on person also contains various searchable505The Answers facet on on person also contains various searchable
494listings.506listings.
@@ -553,7 +565,8 @@ The actions menu contains links to listing that contain only a specific
553type of involvement.565type of involvement.
554566
555567
556=== Assigned ===568Assigned
569........
557570
558The assigned report only lists the questions to which the person is571The assigned report only lists the questions to which the person is
559assigned.572assigned.
@@ -565,7 +578,8 @@ assigned.
565 No questions assigned to Foo Bar found with the requested statuses.578 No questions assigned to Foo Bar found with the requested statuses.
566579
567580
568=== Answered ===581Answered
582........
569583
570The 'Answered' link displays all the questions where the person is the584The 'Answered' link displays all the questions where the person is the
571answerer.585answerer.
@@ -579,7 +593,8 @@ answerer.
579 mailto: problem in webpage593 mailto: problem in webpage
580594
581595
582=== Commented ===596Commented
597.........
583598
584The report available under the 'Commented' link displays all the599The report available under the 'Commented' link displays all the
585questions commented on by the person.600questions commented on by the person.
@@ -597,7 +612,8 @@ questions commented on by the person.
597 Newly installed plug-in doesn't seem to be used612 Newly installed plug-in doesn't seem to be used
598613
599614
600=== Asked ===615Asked
616.....
601617
602The 'Asked' link displays a listing containing all the questions618The 'Asked' link displays a listing containing all the questions
603asked by the person.619asked by the person.
@@ -612,7 +628,8 @@ asked by the person.
612 Firefox loses focus and gets stuck628 Firefox loses focus and gets stuck
613629
614630
615=== Need attention ===631Need attention
632..............
616633
617The 'Need attention' link displays all the questions that need634The 'Need attention' link displays all the questions that need
618the attention of that person.635the attention of that person.
@@ -627,7 +644,8 @@ the attention of that person.
627 Slow system644 Slow system
628645
629646
630=== Subscribed ===647Subscribed
648..........
631649
632Foo Bar can find all the questions to which they are subscribed by650Foo Bar can find all the questions to which they are subscribed by
633visiting the 'Subscribed' link in the 'Answers' facet.651visiting the 'Subscribed' link in the 'Answers' facet.
@@ -641,7 +659,8 @@ visiting the 'Subscribed' link in the 'Answers' facet.
641 Slow system659 Slow system
642660
643661
644== Browsing and Searching Questions in a ProjectGroup ==662Browsing and Searching Questions in a ProjectGroup
663--------------------------------------------------
645664
646When going to the Answers facet of a project, a listing of all the665When going to the Answers facet of a project, a listing of all the
647questions filed against any of the project's products is displayed.666questions filed against any of the project's products is displayed.
@@ -699,7 +718,8 @@ The same standard reports than on regular QuestionTarget are available:
699 Questions needing your attention for The Mozilla Project : Questions : The Mozilla Project718 Questions needing your attention for The Mozilla Project : Questions : The Mozilla Project
700719
701720
702== Searching All Questions ==721Searching All Questions
722-----------------------
703723
704It is possible from the Answer Tracker front page to search among all724It is possible from the Answer Tracker front page to search among all
705questions ever filed on Launchpad.725questions ever filed on Launchpad.
@@ -754,7 +774,8 @@ display all questions asked in Launchpad with the selected statuses.
754 Firefox cannot render Bank Site Mozilla Firefox774 Firefox cannot render Bank Site Mozilla Firefox
755775
756776
757== Searching in a Selected Project ==777Searching in a Selected Project
778-------------------------------
758779
759From the Answers front page, the user can select to search questions780From the Answers front page, the user can select to search questions
760only in a particular project. In this context a "project" means either781only in a particular project. In this context a "project" means either
diff --git a/lib/lp/answers/stories/question-compatibility-urls.txt b/lib/lp/answers/stories/question-compatibility-urls.txt
index 29eaf2a..25572d9 100644
--- a/lib/lp/answers/stories/question-compatibility-urls.txt
+++ b/lib/lp/answers/stories/question-compatibility-urls.txt
@@ -1,16 +1,19 @@
1= Backward Compatible URLs =1Backward Compatible URLs
2========================
23
3The Answer Tracker was renamed from the old Technical Support Tracker.4The Answer Tracker was renamed from the old Technical Support Tracker.
4As part of that rename many URLs were changed to reflect the new5As part of that rename many URLs were changed to reflect the new
5terminology. We provide redirect from the old names to the new ones.6terminology. We provide redirect from the old names to the new ones.
67
7== Answer Contact Page ==8Answer Contact Page
9-------------------
810
9 >>> user_browser.open('http://launchpad.test/firefox/+support-contact')11 >>> user_browser.open('http://launchpad.test/firefox/+support-contact')
10 >>> print(user_browser.url)12 >>> print(user_browser.url)
11 http://answers.launchpad.test/firefox/+answer-contact13 http://answers.launchpad.test/firefox/+answer-contact
1214
13== Add Question Page ==15Add Question Page
16-----------------
1417
15 >>> user_browser.open('http://launchpad.test/firefox/+addticket')18 >>> user_browser.open('http://launchpad.test/firefox/+addticket')
16 >>> print(user_browser.url)19 >>> print(user_browser.url)
@@ -20,19 +23,22 @@ terminology. We provide redirect from the old names to the new ones.
20 >>> print(user_browser.url)23 >>> print(user_browser.url)
21 http://answers.launchpad.test/mozilla/+addquestion24 http://answers.launchpad.test/mozilla/+addquestion
2225
23== My Questions Page ==26My Questions Page
27-----------------
2428
25 >>> user_browser.open('http://launchpad.test/firefox/+mytickets')29 >>> user_browser.open('http://launchpad.test/firefox/+mytickets')
26 >>> print(user_browser.url)30 >>> print(user_browser.url)
27 http://answers.launchpad.test/firefox/+myquestions31 http://answers.launchpad.test/firefox/+myquestions
2832
29== Questions Listing ==33Questions Listing
34-----------------
3035
31 >>> browser.open('http://launchpad.test/firefox/+tickets')36 >>> browser.open('http://launchpad.test/firefox/+tickets')
32 >>> print(browser.url)37 >>> print(browser.url)
33 http://answers.launchpad.test/firefox/+questions38 http://answers.launchpad.test/firefox/+questions
3439
35== Question Page ==40Question Page
41-------------
3642
37 >>> browser.open('http://launchpad.test/firefox/+ticket/1')43 >>> browser.open('http://launchpad.test/firefox/+ticket/1')
38 >>> print(browser.url)44 >>> print(browser.url)
@@ -42,7 +48,8 @@ terminology. We provide redirect from the old names to the new ones.
42 >>> print(browser.url)48 >>> print(browser.url)
43 http://api.launchpad.test/devel/firefox/+question/149 http://api.launchpad.test/devel/firefox/+question/1
4450
45== Person Questions Listing ==51Person Questions Listing
52------------------------
4653
47 >>> browser.open('http://launchpad.test/~name12/+tickets')54 >>> browser.open('http://launchpad.test/~name12/+tickets')
48 >>> print(browser.url)55 >>> print(browser.url)
@@ -73,7 +80,8 @@ terminology. We provide redirect from the old names to the new ones.
73 http://answers.launchpad.test/~name12/+subscribedquestions80 http://answers.launchpad.test/~name12/+subscribedquestions
7481
7582
76== Unsupported questions ==83Unsupported questions
84---------------------
7785
78The Unsupported View is irrelevant. The question search page provides86The Unsupported View is irrelevant. The question search page provides
79links to the +by-language pages that have unsolved questions.87links to the +by-language pages that have unsolved questions.
@@ -83,7 +91,8 @@ links to the +by-language pages that have unsolved questions.
83 http://answers.launchpad.test/ubuntu/+questions91 http://answers.launchpad.test/ubuntu/+questions
8492
8593
86== Enumeration changes in search URLs ==94Enumeration changes in search URLs
95----------------------------------
8796
88The switch from dbschema to lazr based enums changed the values of97The switch from dbschema to lazr based enums changed the values of
89status and sort from titles to uppercase tokens in the search URLs.98status and sort from titles to uppercase tokens in the search URLs.
diff --git a/lib/lp/answers/stories/question-edit.txt b/lib/lp/answers/stories/question-edit.txt
index be19a95..ef36a05 100644
--- a/lib/lp/answers/stories/question-edit.txt
+++ b/lib/lp/answers/stories/question-edit.txt
@@ -1,4 +1,5 @@
1= Editing Questions =1Editing Questions
2=================
23
3To edit the title and description of question, one uses the 'Edit4To edit the title and description of question, one uses the 'Edit
4Question' menu item. You need to be logged in to see the edit form, and5Question' menu item. You need to be logged in to see the edit form, and
@@ -61,7 +62,8 @@ You can even modify the title and description of 'Answered' and
61 <Link...>62 <Link...>
6263
6364
64== Source Package ==65Source Package
66--------------
6567
66Distribution questions can have a source package associated with them.68Distribution questions can have a source package associated with them.
67Any logged in user can change the question source package on the69Any logged in user can change the question source package on the
@@ -82,7 +84,8 @@ Product questions ignore sourcepackage information if it is submitted:
82 >>> user_browser.getControl('Save Changes').click()84 >>> user_browser.getControl('Save Changes').click()
8385
8486
85== Changing Other Metadata ==87Changing Other Metadata
88-----------------------
8689
87A user with 'launchpad.Admin' privilege (usually the product or90A user with 'launchpad.Admin' privilege (usually the product or
88distribution owner) can also change the question Assignee, and91distribution owner) can also change the question Assignee, and
diff --git a/lib/lp/answers/stories/question-message.txt b/lib/lp/answers/stories/question-message.txt
index 0afd96b..50e9a8c 100644
--- a/lib/lp/answers/stories/question-message.txt
+++ b/lib/lp/answers/stories/question-message.txt
@@ -1,4 +1,5 @@
1= Question messages =1Question messages
2=================
23
3Question messages are plain text. They are formatted as HTML for web4Question messages are plain text. They are formatted as HTML for web
4pages. Many messages originate from emails where unwanted or5pages. Many messages originate from emails where unwanted or
@@ -31,7 +32,8 @@ quoted passage, and a signature with an email address in it.
31 >>> user_browser.getControl('Add Information Request').click()32 >>> user_browser.getControl('Add Information Request').click()
3233
3334
34== Email addresses are only shown to authenticated users ==35Email addresses are only shown to authenticated users
36-----------------------------------------------------
3537
36Email addresses are visible to authenticated users. Sample Person is38Email addresses are visible to authenticated users. Sample Person is
37authenticated already, so they will see 'human@somewhere.org'.39authenticated already, so they will see 'human@somewhere.org'.
@@ -63,7 +65,8 @@ see the obfuscated email address (<email address hidden>).
63 Witty signatures rock!65 Witty signatures rock!
6466
6567
66== Signatures and quoted passages are hidden ==68Signatures and quoted passages are hidden
69-----------------------------------------
6770
68The style and script in the user_browser control the display and71The style and script in the user_browser control the display and
69behaviour of content inside tags with the class 'foldable'. The script72behaviour of content inside tags with the class 'foldable'. The script
diff --git a/lib/lp/answers/stories/question-obfuscation.txt b/lib/lp/answers/stories/question-obfuscation.txt
index 87133b1..f6a23c9 100644
--- a/lib/lp/answers/stories/question-obfuscation.txt
+++ b/lib/lp/answers/stories/question-obfuscation.txt
@@ -1,4 +1,5 @@
1= Question obfuscation =1Question obfuscation
2====================
23
3Launchpad obfuscates email addresses when pages are viewed by4Launchpad obfuscates email addresses when pages are viewed by
4anonymous users to prevent address harvesting by spammers. Logged5anonymous users to prevent address harvesting by spammers. Logged
@@ -6,7 +7,8 @@ in users can see the email address in Question descriptions.
6See question-message.txt for additional documentation.7See question-message.txt for additional documentation.
78
89
9== Logged in users can see email addresses ==10Logged in users can see email addresses
11---------------------------------------
1012
11No Privileges Person can see the email address in the tooltip of the13No Privileges Person can see the email address in the tooltip of the
12questions in the Latest questions solved portlet on the Answers14questions in the Latest questions solved portlet on the Answers
@@ -87,7 +89,8 @@ description. They can then see the email address in the tooltip in the
87 ...89 ...
8890
8991
90== Anonymous users cannot see email addresses ==92Anonymous users cannot see email addresses
93------------------------------------------
9194
92Anonymous cannot see the email address anywhere on the Answers front95Anonymous cannot see the email address anywhere on the Answers front
93page.96page.
diff --git a/lib/lp/answers/stories/question-reject-and-change-status.txt b/lib/lp/answers/stories/question-reject-and-change-status.txt
index ece123c..c7466fd 100644
--- a/lib/lp/answers/stories/question-reject-and-change-status.txt
+++ b/lib/lp/answers/stories/question-reject-and-change-status.txt
@@ -1,4 +1,5 @@
1= Rejecting Questions =1Rejecting Questions
2===================
23
3Answer contacts and administrators can reject a question.4Answer contacts and administrators can reject a question.
4This should be done when the question isn't an actual pertinent question5This should be done when the question isn't an actual pertinent question
@@ -87,7 +88,8 @@ stating that the question is already rejected:
87 ... print(message.decode_contents())88 ... print(message.decode_contents())
88 The question is already rejected.89 The question is already rejected.
8990
90= Changing the Question Status =91Changing the Question Status
92============================
9193
92In the previous example, that rejection was clearly a mistake: you94In the previous example, that rejection was clearly a mistake: you
93shouldn't reject a question because it is related to a bug, for these95shouldn't reject a question because it is related to a bug, for these
diff --git a/lib/lp/answers/stories/question-search-multiple-languages.txt b/lib/lp/answers/stories/question-search-multiple-languages.txt
index aaa1ccc..5188300 100644
--- a/lib/lp/answers/stories/question-search-multiple-languages.txt
+++ b/lib/lp/answers/stories/question-search-multiple-languages.txt
@@ -1,4 +1,5 @@
1= Searching Questions in Multiple Languages =1Searching Questions in Multiple Languages
2=========================================
23
3By default, only questions written in English or one of the user4By default, only questions written in English or one of the user
4preferred languages are listed and searched.5preferred languages are listed and searched.
@@ -10,7 +11,8 @@ African IP address, since we'll use that later.
10 >>> user_browser.addHeader('X_FORWARDED_FOR', '196.36.161.227')11 >>> user_browser.addHeader('X_FORWARDED_FOR', '196.36.161.227')
1112
1213
13== Anonymous searching ==14Anonymous searching
15-------------------
1416
15For example, a user who isn't logged in will only see questions17For example, a user who isn't logged in will only see questions
16written in English, in one of the language configured in their browser,18written in English, in one of the language configured in their browser,
@@ -154,7 +156,8 @@ then questions with those language will be displayed:
154 Installation failed156 Installation failed
155157
156158
157== Authenticated searching ==159Authenticated searching
160-----------------------
158161
159Authenticated users without preferred languages are assumed to have162Authenticated users without preferred languages are assumed to have
160the languages determined by what their browser sends in the163the languages determined by what their browser sends in the
@@ -261,7 +264,8 @@ English, and can use it to locate English questions.
261 Slow system264 Slow system
262265
263266
264== Questions by language ==267Questions by language
268---------------------
265269
266When open questions are in languages that no answer contacts270When open questions are in languages that no answer contacts
267speak, the project questions page displays links to see those271speak, the project questions page displays links to see those
@@ -308,7 +312,8 @@ the preceding page.
308The page in all other respects behaves like a question search page.312The page in all other respects behaves like a question search page.
309313
310314
311== My questions ignores preferred languages ==315My questions ignores preferred languages
316----------------------------------------
312317
313The "My questions" view ignores the user's language preferences, because318The "My questions" view ignores the user's language preferences, because
314they may change them over time, but they must always see their questions. For319they may change them over time, but they must always see their questions. For
diff --git a/lib/lp/answers/stories/question-subscriptions.txt b/lib/lp/answers/stories/question-subscriptions.txt
index 3ceaf6a..e4e6b2e 100644
--- a/lib/lp/answers/stories/question-subscriptions.txt
+++ b/lib/lp/answers/stories/question-subscriptions.txt
@@ -1,10 +1,12 @@
1= Question Subscriptions =1Question Subscriptions
2======================
23
3Users can subscribe to specific questions. When they are subscribed they4Users can subscribe to specific questions. When they are subscribed they
4will receive notifications for any changes to the question.5will receive notifications for any changes to the question.
56
67
7== Subscribing ==8Subscribing
9-----------
810
9To subscribe, users use the 'Subscribe' link and then confirm that11To subscribe, users use the 'Subscribe' link and then confirm that
10they want to subscribe by clicking on the 'Subscribe' button. The user12they want to subscribe by clicking on the 'Subscribe' button. The user
@@ -27,7 +29,8 @@ A message confirming that they were subscribed is displayed:
27 You have subscribed to this question.29 You have subscribed to this question.
2830
2931
30== Unsubscribing ==32Unsubscribing
33-------------
3134
32When the user is subscribed to the question, the 'Subscribe' link35When the user is subscribed to the question, the 'Subscribe' link
33becomes an 'Unsubscribe' link. To unsubscribe, the user follows that36becomes an 'Unsubscribe' link. To unsubscribe, the user follows that
@@ -49,7 +52,8 @@ A confirmation is displayed:
49 You have unsubscribed from this question.52 You have unsubscribed from this question.
5053
5154
52== Subscribing While Posting A Message ==55Subscribing While Posting A Message
56-----------------------------------
5357
54It is also possible to subscribe at the same time than posting a message58It is also possible to subscribe at the same time than posting a message
55on an existing question. The user can simply check the 'Email me future59on an existing question. The user can simply check the 'Email me future
diff --git a/lib/lp/answers/stories/this-is-a-faq.txt b/lib/lp/answers/stories/this-is-a-faq.txt
index 3164116..ec9e715 100644
--- a/lib/lp/answers/stories/this-is-a-faq.txt
+++ b/lib/lp/answers/stories/this-is-a-faq.txt
@@ -1,4 +1,5 @@
1= Link to a FAQ =1Link to a FAQ
2=============
23
3Even though similar questions are shown when a user creates a new4Even though similar questions are shown when a user creates a new
4question, common questions still happen for a number of reasons.5question, common questions still happen for a number of reasons.
@@ -6,7 +7,8 @@ The Answer Tracker can be used to manage common answers
6(a.k.a. Frequently Asked Question - FAQ) which can be used to answer7(a.k.a. Frequently Asked Question - FAQ) which can be used to answer
7a particular question.8a particular question.
89
9== Fix up sample data ==10Fix up sample data
11------------------
1012
11The sample data has question titles which perform poorly with the sample data's13The sample data has question titles which perform poorly with the sample data's
12answers in fulltext searching, using efficient tsearch2 queries; we are going14answers in fulltext searching, using efficient tsearch2 queries; we are going
@@ -23,7 +25,8 @@ permits better matching. See bug 612384.
23 >>> logout()25 >>> logout()
2426
2527
26== Linking to a FAQ ==28Linking to a FAQ
29----------------
2730
28Any logged in user can use the 'Link to a FAQ' action item to link31Any logged in user can use the 'Link to a FAQ' action item to link
29the question to an existing FAQ.32the question to an existing FAQ.
@@ -140,7 +143,8 @@ The answer message was added to the question's discussion:
140 FAQ #10: \u201cHow do I install plugins...143 FAQ #10: \u201cHow do I install plugins...
141144
142145
143== Modifying the FAQ ==146Modifying the FAQ
147-----------------
144148
145The link to the FAQ can be changed by using the same 'Link to a FAQ'149The link to the FAQ can be changed by using the same 'Link to a FAQ'
146option. Continuing on the previous example, the user went on to read150option. Continuing on the previous example, the user went on to read
@@ -193,7 +197,8 @@ The link was also removed from the details portlet:
193 Related FAQ: None ...197 Related FAQ: None ...
194198
195199
196== Creating a new FAQ ==200Creating a new FAQ
201------------------
197202
198When no existing FAQs are relevant, it is possible to create a new FAQ203When no existing FAQs are relevant, it is possible to create a new FAQ
199from the same 'Link to a FAQ' action. But this option is reserved to204from the same 'Link to a FAQ' action. But this option is reserved to
@@ -289,7 +294,8 @@ description:
289 Related FAQ: Displaying SVG in Firefox ...294 Related FAQ: Displaying SVG in Firefox ...
290295
291296
292== Viewing a FAQ ==297Viewing a FAQ
298-------------
293299
294From a question page which has a related FAQ, the user can click on the300From a question page which has a related FAQ, the user can click on the
295FAQ title to display the FAQ content.301FAQ title to display the FAQ content.
@@ -328,7 +334,8 @@ the FAQ:
328 http://answers.launchpad.test/firefox/+question/2334 http://answers.launchpad.test/firefox/+question/2
329335
330336
331== Distribution and Source Packages ==337Distribution and Source Packages
338--------------------------------
332339
333Questions asked about a distribution or distribution source package340Questions asked about a distribution or distribution source package
334can also be linked to FAQs.341can also be linked to FAQs.
@@ -351,7 +358,8 @@ can also be linked to FAQs.
351 'Is question #8 a FAQ...358 'Is question #8 a FAQ...
352359
353360
354== Solved questions can be linked to a FAQ ==361Solved questions can be linked to a FAQ
362---------------------------------------
355363
356When linking a solved question to a FAQ the action is treated as a364When linking a solved question to a FAQ the action is treated as a
357comment.365comment.
@@ -397,7 +405,8 @@ discussion.
397 FAQ #6: ...How can I play MP3/Divx/DVDs/Quicktime/Realmedia files...405 FAQ #6: ...How can I play MP3/Divx/DVDs/Quicktime/Realmedia files...
398406
399407
400== FAQs are links ==408FAQs are links
409--------------
401410
402You can respond to a question by pointing people to a FAQ. FAQs are411You can respond to a question by pointing people to a FAQ. FAQs are
403linkified as you would expect! You can use the "this is a FAQ" menu412linkified as you would expect! You can use the "this is a FAQ" menu
diff --git a/lib/lp/app/doc/displaying-numbers.txt b/lib/lp/app/doc/displaying-numbers.txt
index eb1069b..fcdd4e0 100644
--- a/lib/lp/app/doc/displaying-numbers.txt
+++ b/lib/lp/app/doc/displaying-numbers.txt
@@ -1,8 +1,10 @@
1= Displaying Numbers with ZPT =1Displaying Numbers with ZPT
2===========================
23
3 >>> from lp.testing import test_tales4 >>> from lp.testing import test_tales
45
5== bytes: Byte contractions ==6bytes: Byte contractions
7------------------------
68
7The TALES formatter for numbers allows them to be rendered as byte9The TALES formatter for numbers allows them to be rendered as byte
8contractions as per IEC60027-2:10contractions as per IEC60027-2:
@@ -37,7 +39,8 @@ that (thank god!)
37 >>> test_tales('foo/fmt:bytes', foo=123456789012345678901234567890)39 >>> test_tales('foo/fmt:bytes', foo=123456789012345678901234567890)
38 '102121.1 YiB'40 '102121.1 YiB'
3941
40== float: Float formatting ==42float: Float formatting
43-----------------------
4144
42There's a method that allows formatting float values in TAL analogously45There's a method that allows formatting float values in TAL analogously
43to how the Python "%f" string formatter works:46to how the Python "%f" string formatter works:
diff --git a/lib/lp/app/doc/launchpadform.txt b/lib/lp/app/doc/launchpadform.txt
index e79a5ec..5bf686b 100644
--- a/lib/lp/app/doc/launchpadform.txt
+++ b/lib/lp/app/doc/launchpadform.txt
@@ -1,4 +1,5 @@
1= LaunchpadFormView =1LaunchpadFormView
2=================
23
3LaunchpadFormView is a base class for form views in Launchpad. It is4LaunchpadFormView is a base class for form views in Launchpad. It is
4intended as a replacement for GeneralFormView.5intended as a replacement for GeneralFormView.
@@ -39,7 +40,8 @@ There is also a LaunchpadEditFormView class to make it easier to write
39edit views.40edit views.
4041
4142
42== The Schema ==43The Schema
44----------
4345
44The schema can be an interface implemented by your content object, or46The schema can be an interface implemented by your content object, or
45an interface specifically tailored for data entry. Below is an47an interface specifically tailored for data entry. Below is an
@@ -77,7 +79,8 @@ A form that handles all fields in the schema needs only set the
77 ['name', 'displayname', 'password']79 ['name', 'displayname', 'password']
7880
7981
80== Restricting Displayed Fields ==82Restricting Displayed Fields
83----------------------------
8184
82The list of fields can be restricted with the "field_names" attribute:85The list of fields can be restricted with the "field_names" attribute:
8386
@@ -93,7 +96,8 @@ The list of fields can be restricted with the "field_names" attribute:
93 ['name', 'displayname']96 ['name', 'displayname']
9497
9598
96== Custom Adapters ==99Custom Adapters
100---------------
97101
98Sometimes a schema is used for a form that is not actually implemented102Sometimes a schema is used for a form that is not actually implemented
99by the context widget. This can be handled by providing some custom103by the context widget. This can be handled by providing some custom
@@ -123,7 +127,8 @@ should in turn have the FormTest instance as a context:
123 True127 True
124128
125129
126== Custom Widgets ==130Custom Widgets
131--------------
127132
128In some cases we will want to use a custom widget for a particular133In some cases we will want to use a custom widget for a particular
129field. These can be installed easily with a "custom_widget_NAME"134field. These can be installed easily with a "custom_widget_NAME"
@@ -150,7 +155,8 @@ attribute:
150 <...TextWidget object at ...>155 <...TextWidget object at ...>
151156
152157
153== Using Another Context ==158Using Another Context
159---------------------
154160
155setUpWidgets() uses the view's context by default when setting up the161setUpWidgets() uses the view's context by default when setting up the
156widgets, but it's also possible to specify the context explicitly.162widgets, but it's also possible to specify the context explicitly.
@@ -167,7 +173,8 @@ widgets, but it's also possible to specify the context explicitly.
167 True173 True
168174
169175
170== Actions ==176Actions
177-------
171178
172In order for a form to accept submissions, it will need one or more179In order for a form to accept submissions, it will need one or more
173submit actions. These are added to the view class using the "action"180submit actions. These are added to the view class using the "action"
@@ -201,7 +208,8 @@ method. Instead, it should be performed in the validate() method, or
201in per-field validators.208in per-field validators.
202209
203210
204== Form Wide Validation ==211Form Wide Validation
212--------------------
205213
206While constraints on individual fields and schema invariants can catch214While constraints on individual fields and schema invariants can catch
207the majority of input errors, in some cases it is necessary to215the majority of input errors, in some cases it is necessary to
@@ -319,7 +327,8 @@ The default behaviour is to validate all widgets.
319 Password: Required input is missing.327 Password: Required input is missing.
320328
321329
322== Redirect URL ==330Redirect URL
331------------
323332
324If the form is successfully posted, then LaunchpadFormView will333If the form is successfully posted, then LaunchpadFormView will
325redirect the user to another URL. The URL is specified by the334redirect the user to another URL. The URL is specified by the
@@ -348,7 +357,8 @@ redirect the user to another URL. The URL is specified by the
348 http://www.ubuntu.com/357 http://www.ubuntu.com/
349358
350359
351== Form Rendering ==360Form Rendering
361--------------
352362
353 (Let's define the view for the rendering tests.)363 (Let's define the view for the rendering tests.)
354 >>> class RenderFormTest(LaunchpadFormView):364 >>> class RenderFormTest(LaunchpadFormView):
@@ -414,7 +424,8 @@ This is also true of failure handlers:
414 Some errors occured.424 Some errors occured.
415425
416426
417== Initial Focused Widget ==427Initial Focused Widget
428----------------------
418429
419The standard template for LaunchpadFormView can set the initial focus430The standard template for LaunchpadFormView can set the initial focus
420on a form element. This is achieved by some javascript that gets run431on a form element. This is achieved by some javascript that gets run
@@ -461,7 +472,8 @@ error, the generated script will focus the first widget with an error:
461 // -->472 // -->
462473
463474
464== Hidden widgets ==475Hidden widgets
476--------------
465477
466Any widget can be hidden in a LaunchpadFormView while still having its478Any widget can be hidden in a LaunchpadFormView while still having its
467value POSTed with the values of the other (visible) ones. The widget's479value POSTed with the values of the other (visible) ones. The widget's
@@ -513,7 +525,8 @@ using its hidden() method, which should return a hidden <input> tag.
513 >>> os.remove(filename)525 >>> os.remove(filename)
514526
515527
516== Safe Actions ==528Safe Actions
529------------
517530
518By default, LaunchpadFormView requires that form submissions be done531By default, LaunchpadFormView requires that form submissions be done
519via POST requests. There are a number of reasons for this:532via POST requests. There are a number of reasons for this:
@@ -580,7 +593,8 @@ In contrast, the "search" action can be submitted with a GET request:
580593
581594
582595
583== LaunchpadEditFormView ==596LaunchpadEditFormView
597---------------------
584598
585The LaunchpadEditFormView differs from LaunchpadFormView in the599The LaunchpadEditFormView differs from LaunchpadFormView in the
586following ways:600following ways:
diff --git a/lib/lp/app/doc/tales-email-formatting.txt b/lib/lp/app/doc/tales-email-formatting.txt
index 8c5fc79..0dd70cb 100644
--- a/lib/lp/app/doc/tales-email-formatting.txt
+++ b/lib/lp/app/doc/tales-email-formatting.txt
@@ -1,4 +1,5 @@
1= TALES email formatting =1TALES email formatting
2======================
23
3There are many edge-cases when marking up email text for presentation.4There are many edge-cases when marking up email text for presentation.
4There is subtle differences in how people quote text that must be5There is subtle differences in how people quote text that must be
@@ -12,7 +13,8 @@ First, let's bring in a small helper function:
1213
13 >>> from lp.testing import test_tales14 >>> from lp.testing import test_tales
1415
15== Quoting styles ==16Quoting styles
17--------------
1618
17Paragraphs that mix quoted and reply text fold only the quoted lines.19Paragraphs that mix quoted and reply text fold only the quoted lines.
1820
@@ -100,7 +102,8 @@ wrapped in a foldable-quoted span.
100 </span></p>102 </span></p>
101103
102104
103== Python interpreter and dpkg handling ==105Python interpreter and dpkg handling
106------------------------------------
104107
105The output from the Python interpreter is not quoted text. Passages108The output from the Python interpreter is not quoted text. Passages
106of text that start with '>>> ' are exempted from the 'foldable-quoted'109of text that start with '>>> ' are exempted from the 'foldable-quoted'
diff --git a/lib/lp/app/doc/validation.txt b/lib/lp/app/doc/validation.txt
index 7244fe5..3eff615 100644
--- a/lib/lp/app/doc/validation.txt
+++ b/lib/lp/app/doc/validation.txt
@@ -1,6 +1,8 @@
1= Validation =1Validation
2==========
23
3== LaunchpadValidationError ==4LaunchpadValidationError
5------------------------
46
5LaunchpadValidationError is the standard exception used for custom7LaunchpadValidationError is the standard exception used for custom
6validators upon a validation error. Rendering one is done by getting8validators upon a validation error. Rendering one is done by getting
diff --git a/lib/lp/app/stories/basics/marketing.txt b/lib/lp/app/stories/basics/marketing.txt
index 714be3a..eeb08b6 100644
--- a/lib/lp/app/stories/basics/marketing.txt
+++ b/lib/lp/app/stories/basics/marketing.txt
@@ -1,4 +1,5 @@
1= Launchpad tour =1Launchpad tour
2==============
23
3From Launchpad's front page, you can access the tour.4From Launchpad's front page, you can access the tour.
45
@@ -50,7 +51,8 @@ But the source directory isn't available:
50 zope.publisher.interfaces.NotFound: ...51 zope.publisher.interfaces.NotFound: ...
5152
5253
53== +about compatibility ==54+about compatibility
55--------------------
5456
55Each application used to have an introduction living at +about, this is57Each application used to have an introduction living at +about, this is
56now redirected to the relevant tour page.58now redirected to the relevant tour page.
@@ -80,7 +82,8 @@ now redirected to the relevant tour page.
80 http://launchpad.test/+tour/community-support82 http://launchpad.test/+tour/community-support
8183
8284
83== +tour compatibility ==85+tour compatibility
86-------------------
8487
85Similarly, each application has their +tour redirecting to their proper88Similarly, each application has their +tour redirecting to their proper
86tour page.89tour page.
@@ -110,7 +113,8 @@ tour page.
110 http://launchpad.test/+tour/community-support113 http://launchpad.test/+tour/community-support
111114
112115
113== +faq compatibility ==116+faq compatibility
117------------------
114118
115Each application also had a +faq link, that link is also redirected to119Each application also had a +faq link, that link is also redirected to
116the appropriate tour page.120the appropriate tour page.
@@ -136,13 +140,15 @@ the appropriate tour page.
136 http://launchpad.test/+tour/community-support140 http://launchpad.test/+tour/community-support
137141
138142
139== Links to tour on application main page ==143Links to tour on application main page
144--------------------------------------
140145
141Each application home page features a 'Take a tour' button that brings146Each application home page features a 'Take a tour' button that brings
142the user to the appropriate tour page.147the user to the appropriate tour page.
143148
144149
145=== Code ===150Code
151....
146152
147 >>> browser.open('http://code.launchpad.test')153 >>> browser.open('http://code.launchpad.test')
148 >>> tour_link = browser.getLink('Take a tour')154 >>> tour_link = browser.getLink('Take a tour')
@@ -151,7 +157,8 @@ the user to the appropriate tour page.
151 >>> tour_link.click()157 >>> tour_link.click()
152158
153159
154=== Bugs ===160Bugs
161....
155162
156 >>> browser.open('http://bugs.launchpad.test')163 >>> browser.open('http://bugs.launchpad.test')
157 >>> tour_link = browser.getLink('take a tour')164 >>> tour_link = browser.getLink('take a tour')
@@ -160,7 +167,8 @@ the user to the appropriate tour page.
160 >>> tour_link.click()167 >>> tour_link.click()
161168
162169
163=== Blueprints ===170Blueprints
171..........
164172
165 >>> browser.open('http://blueprints.launchpad.test')173 >>> browser.open('http://blueprints.launchpad.test')
166 >>> tour_link = browser.getLink('Take a tour')174 >>> tour_link = browser.getLink('Take a tour')
@@ -169,7 +177,8 @@ the user to the appropriate tour page.
169 >>> tour_link.click()177 >>> tour_link.click()
170178
171179
172=== Translations ===180Translations
181............
173182
174 >>> browser.open('http://translations.launchpad.test')183 >>> browser.open('http://translations.launchpad.test')
175 >>> tour_link = browser.getLink('Take a tour')184 >>> tour_link = browser.getLink('Take a tour')
@@ -178,7 +187,8 @@ the user to the appropriate tour page.
178 >>> tour_link.click()187 >>> tour_link.click()
179188
180189
181=== Answers ===190Answers
191.......
182192
183 >>> browser.open('http://answers.launchpad.test')193 >>> browser.open('http://answers.launchpad.test')
184 >>> tour_link = browser.getLink('Take a tour')194 >>> tour_link = browser.getLink('Take a tour')
diff --git a/lib/lp/app/stories/basics/max-batch-size.txt b/lib/lp/app/stories/basics/max-batch-size.txt
index 9bd585b..ce3d44b 100644
--- a/lib/lp/app/stories/basics/max-batch-size.txt
+++ b/lib/lp/app/stories/basics/max-batch-size.txt
@@ -1,4 +1,5 @@
1= Invalid batch size =1Invalid batch size
2==================
23
3To prevent users from exhausting server resources, pages that use4To prevent users from exhausting server resources, pages that use
4batching have a maximum on the batch size. For example, requesting 10005batching have a maximum on the batch size. For example, requesting 1000
diff --git a/lib/lp/app/stories/basics/user-requested-oops.txt b/lib/lp/app/stories/basics/user-requested-oops.txt
index d2475a0..0be69d2 100644
--- a/lib/lp/app/stories/basics/user-requested-oops.txt
+++ b/lib/lp/app/stories/basics/user-requested-oops.txt
@@ -1,4 +1,5 @@
1= Requesting an OOPS from Launchpad =1Requesting an OOPS from Launchpad
2=================================
23
3OOPSes happen from time to time in Launchpad, and they contain lots of4OOPSes happen from time to time in Launchpad, and they contain lots of
4interesting information for helping debug. Sometimes though it is useful to5interesting information for helping debug. Sometimes though it is useful to
diff --git a/lib/lp/app/stories/basics/xx-dbpolicy.txt b/lib/lp/app/stories/basics/xx-dbpolicy.txt
index 1d42045..433973f 100644
--- a/lib/lp/app/stories/basics/xx-dbpolicy.txt
+++ b/lib/lp/app/stories/basics/xx-dbpolicy.txt
@@ -1,4 +1,5 @@
1= Application Server Database Policy =1Application Server Database Policy
2==================================
23
3The database policy chooses the default Storm store to used. Its goal4The database policy chooses the default Storm store to used. Its goal
4is to distribute load away from the master databases to read only5is to distribute load away from the master databases to read only
diff --git a/lib/lp/app/stories/basics/xx-developerexceptions.txt b/lib/lp/app/stories/basics/xx-developerexceptions.txt
index a8d08b6..ee8c170 100644
--- a/lib/lp/app/stories/basics/xx-developerexceptions.txt
+++ b/lib/lp/app/stories/basics/xx-developerexceptions.txt
@@ -1,4 +1,5 @@
1= Developer exceptions =1Developer exceptions
2====================
23
3Launchpad developers get tracebacks and a linkified OOPS if an exception4Launchpad developers get tracebacks and a linkified OOPS if an exception
4occurs. Other users get no traceback and only the OOPS ID.5occurs. Other users get no traceback and only the OOPS ID.
@@ -96,7 +97,8 @@ unregister the adapter.
96 >>> error_view_fixture.cleanUp()97 >>> error_view_fixture.cleanUp()
9798
9899
99= http handle_errors =100http handle_errors
101==================
100102
101lp.testing.pages.http accepts the handle_errors parameter in case you103lp.testing.pages.http accepts the handle_errors parameter in case you
102want to see tracebacks instead of error pages.104want to see tracebacks instead of error pages.
diff --git a/lib/lp/app/stories/basics/xx-lowercase-redirection.txt b/lib/lp/app/stories/basics/xx-lowercase-redirection.txt
index 394eda3..b477fe3 100644
--- a/lib/lp/app/stories/basics/xx-lowercase-redirection.txt
+++ b/lib/lp/app/stories/basics/xx-lowercase-redirection.txt
@@ -1,4 +1,5 @@
1= Redirection of Mixed Case paths =1Redirection of Mixed Case paths
2===============================
23
3When someone visits a page such as http://launchpad.net/jOkOshEr4When someone visits a page such as http://launchpad.net/jOkOshEr
4launchpad does a permanent redirect to the lowercase path:5launchpad does a permanent redirect to the lowercase path:
diff --git a/lib/lp/app/stories/basics/xx-maintenance-message.txt b/lib/lp/app/stories/basics/xx-maintenance-message.txt
index 51a2a7f..6416bbf 100644
--- a/lib/lp/app/stories/basics/xx-maintenance-message.txt
+++ b/lib/lp/app/stories/basics/xx-maintenance-message.txt
@@ -1,4 +1,5 @@
1= Launchpad maintenance messages =1Launchpad maintenance messages
2==============================
23
3A system adminstrator can write an iso format timestamp to the file4A system adminstrator can write an iso format timestamp to the file
4"+maintenancetime.txt" in the launchpad application root directory.5"+maintenancetime.txt" in the launchpad application root directory.
@@ -95,7 +96,8 @@ Remove +maintenancetime.txt to clean up.
95 >>> os.remove('+maintenancetime.txt')96 >>> os.remove('+maintenancetime.txt')
9697
9798
98== Per-page maintenance messages ==99Per-page maintenance messages
100-----------------------------
99101
100Alternatively, a maintenance message can be set in the102Alternatively, a maintenance message can be set in the
101app.maintenance_message feature flag, which can be scoped to particular103app.maintenance_message feature flag, which can be scoped to particular
diff --git a/lib/lp/app/stories/folder.txt b/lib/lp/app/stories/folder.txt
index 8ebd441..8124932 100644
--- a/lib/lp/app/stories/folder.txt
+++ b/lib/lp/app/stories/folder.txt
@@ -1,9 +1,11 @@
1= Serving directories of files =1Serving directories of files
2============================
23
3LAZR adds special views that can be used to serve all the files under a4LAZR adds special views that can be used to serve all the files under a
4particular directory.5particular directory.
56
6== ExportedFolder ==7ExportedFolder
8--------------
79
8This is the base implementation. To export a directory, you need to10This is the base implementation. To export a directory, you need to
9subclass that view and provide a folder property returning the path of11subclass that view and provide a folder property returning the path of
@@ -99,7 +101,8 @@ As requesting a non-existent file.
99 zope.publisher.interfaces.NotFound: ...101 zope.publisher.interfaces.NotFound: ...
100102
101103
102== ExportedImageFolder ==104ExportedImageFolder
105-------------------
103106
104For images, it's often convenient not to request the extension. There is107For images, it's often convenient not to request the extension. There is
105an ExportedImageFolder subclass, that will accept serving an image file108an ExportedImageFolder subclass, that will accept serving an image file
@@ -140,7 +143,8 @@ If a file without extension exists, that one will be served.
140 Image with extension143 Image with extension
141144
142145
143== Exporting trees ==146Exporting trees
147---------------
144148
145By default ExportedFolder doesn't export contained folders, but if the149By default ExportedFolder doesn't export contained folders, but if the
146export_subdirectories is set to True, it will allow traversing to150export_subdirectories is set to True, it will allow traversing to
@@ -201,7 +205,8 @@ NotFound.
201 zope.publisher.interfaces.NotFound: ...205 zope.publisher.interfaces.NotFound: ...
202206
203207
204== Clean-up ==208Clean-up
209--------
205210
206 >>> import shutil211 >>> import shutil
207 >>> shutil.rmtree(resource_dir)212 >>> shutil.rmtree(resource_dir)
diff --git a/lib/lp/app/stories/launchpad-root/xx-featuredprojects.txt b/lib/lp/app/stories/launchpad-root/xx-featuredprojects.txt
index bf0dd16..3f1771a 100644
--- a/lib/lp/app/stories/launchpad-root/xx-featuredprojects.txt
+++ b/lib/lp/app/stories/launchpad-root/xx-featuredprojects.txt
@@ -1,5 +1,6 @@
11
2= Featured Projects =2Featured Projects
3=================
34
4We maintain a list of featured projects, which are displayed on the home5We maintain a list of featured projects, which are displayed on the home
5page and managed via a special admin-only page.6page and managed via a special admin-only page.
@@ -7,7 +8,8 @@ page and managed via a special admin-only page.
7 >>> MANAGE_LINK = "Manage featured project list"8 >>> MANAGE_LINK = "Manage featured project list"
89
910
10== The home page listing ==11The home page listing
12---------------------
1113
12Featured projects are visible to everyone on the home page. One poject is14Featured projects are visible to everyone on the home page. One poject is
13featured as "project of the day" depending on the current day. As we do not15featured as "project of the day" depending on the current day. As we do not
@@ -44,7 +46,8 @@ projects' pages in Launchpad. The "project of the day" is listed separately.
44 Mozilla Thunderbird46 Mozilla Thunderbird
45 Ubuntu47 Ubuntu
4648
47== Adding a featured project ==49Adding a featured project
50-------------------------
4851
49Anonymous users cannot see the link to administer featured projects:52Anonymous users cannot see the link to administer featured projects:
5053
@@ -112,7 +115,8 @@ is now at index '4' and is therefore displayed as the top project:
112 Mozilla Thunderbird115 Mozilla Thunderbird
113 Ubuntu116 Ubuntu
114117
115== Removing a project ==118Removing a project
119------------------
116120
117 >>> admin_browser.getLink(MANAGE_LINK).click()121 >>> admin_browser.getLink(MANAGE_LINK).click()
118 >>> admin_browser.getControl('Apache').click()122 >>> admin_browser.getControl('Apache').click()
diff --git a/lib/lp/app/widgets/doc/announcement-date-widget.txt b/lib/lp/app/widgets/doc/announcement-date-widget.txt
index c6ac676..b33fcaa 100644
--- a/lib/lp/app/widgets/doc/announcement-date-widget.txt
+++ b/lib/lp/app/widgets/doc/announcement-date-widget.txt
@@ -1,4 +1,5 @@
1= AnnouncementDateWidget =1AnnouncementDateWidget
2======================
23
3This widget combines radio buttons and a DateTimeWidget. It allows you to4This widget combines radio buttons and a DateTimeWidget. It allows you to
4choose to publish an announcement immediately, at a predetermined date in the5choose to publish an announcement immediately, at a predetermined date in the
diff --git a/lib/lp/app/widgets/doc/lower-case-text-widget.txt b/lib/lp/app/widgets/doc/lower-case-text-widget.txt
index eb84fe1..d9a0237 100644
--- a/lib/lp/app/widgets/doc/lower-case-text-widget.txt
+++ b/lib/lp/app/widgets/doc/lower-case-text-widget.txt
@@ -1,4 +1,5 @@
1= LowerCaseTextWidget =1LowerCaseTextWidget
2===================
23
3This custom widget is used to convert strings to lower case.4This custom widget is used to convert strings to lower case.
45
diff --git a/lib/lp/app/widgets/doc/noneable-text-widgets.txt b/lib/lp/app/widgets/doc/noneable-text-widgets.txt
index 911a9e3..85ca174 100644
--- a/lib/lp/app/widgets/doc/noneable-text-widgets.txt
+++ b/lib/lp/app/widgets/doc/noneable-text-widgets.txt
@@ -1,10 +1,12 @@
1= Noneable widgets =1Noneable widgets
2================
23
3In the spirit of Postel's Law, the Noneable widgets permits users to enter4In the spirit of Postel's Law, the Noneable widgets permits users to enter
4just whitespace, while ensuring that the schema's field value is None.5just whitespace, while ensuring that the schema's field value is None.
56
67
7== Noneable TextLine widget ==8Noneable TextLine widget
9------------------------
810
9This custom widget is used to normalise the value of meaning less11This custom widget is used to normalise the value of meaning less
10text value to None.12text value to None.
@@ -36,7 +38,8 @@ Excess whitespace and newlines are stripped.
36 flower38 flower
3739
3840
39== Noneable Description widget ==41Noneable Description widget
42---------------------------
4043
41This custom widget is used to normalise the value of meaning less44This custom widget is used to normalise the value of meaning less
42text value to None.45text value to None.
diff --git a/lib/lp/app/widgets/doc/project-scope-widget.txt b/lib/lp/app/widgets/doc/project-scope-widget.txt
index 8816009..e0bf442 100644
--- a/lib/lp/app/widgets/doc/project-scope-widget.txt
+++ b/lib/lp/app/widgets/doc/project-scope-widget.txt
@@ -1,4 +1,5 @@
1= The Project Scope Widget =1The Project Scope Widget
2========================
23
3Many application front pages contain a search form. The search4Many application front pages contain a search form. The search
4can usually be across the whole Launchpad or only in one project.5can usually be across the whole Launchpad or only in one project.
@@ -74,7 +75,8 @@ By default, the 'All projects' scope is selected:
74 One project:75 One project:
75 ...76 ...
7677
77== Selecting All Projects ==78Selecting All Projects
79----------------------
7880
79When the 'All projects' option is selected, the widget returns None.81When the 'All projects' option is selected, the widget returns None.
8082
@@ -88,7 +90,8 @@ When the 'All projects' option is selected, the widget returns None.
88 >>> widget.getInputValue() is None90 >>> widget.getInputValue() is None
89 True91 True
9092
91== Selecting One Project ==93Selecting One Project
94---------------------
9295
93If we select a project, the project with that name is returned96If we select a project, the project with that name is returned
94by getInputValue().97by getInputValue().
@@ -159,7 +162,8 @@ If no project name is given at all, a widget error is also raised:
159 >>> print(widget.error())162 >>> print(widget.error())
160 Please enter a project name163 Please enter a project name
161164
162== setRenderedValue() ==165setRenderedValue()
166------------------
163167
164In order to initialize the widget with a value, setRenderedValue() is168In order to initialize the widget with a value, setRenderedValue() is
165used. Passing a product to it will select the 'One project' radio169used. Passing a product to it will select the 'One project' radio
@@ -197,7 +201,8 @@ Setting the scope to None, will default to the 'All projects' option.
197 type="radio" value="all" />201 type="radio" value="all" />
198 ...202 ...
199203
200== getScope() and partial queries ==204getScope() and partial queries
205------------------------------
201206
202In some cases, forms with a ProjectScopeWidget are requested by bots207In some cases, forms with a ProjectScopeWidget are requested by bots
203which incorrectly build the query string without without the `scope`208which incorrectly build the query string without without the `scope`
diff --git a/lib/lp/app/widgets/doc/tokens-text-widget.txt b/lib/lp/app/widgets/doc/tokens-text-widget.txt
index e51ff15..040b911 100644
--- a/lib/lp/app/widgets/doc/tokens-text-widget.txt
+++ b/lib/lp/app/widgets/doc/tokens-text-widget.txt
@@ -1,4 +1,5 @@
1= Tokens TextLine Widget =1Tokens TextLine Widget
2======================
23
3This custom widget is used to normalise the space between words,4This custom widget is used to normalise the space between words,
4strip punctuation, and strip leading and trailing whitespace.5strip punctuation, and strip leading and trailing whitespace.
diff --git a/lib/lp/app/widgets/doc/zope3-widgets-use-form-ng.txt b/lib/lp/app/widgets/doc/zope3-widgets-use-form-ng.txt
index 241526d..5888dee 100644
--- a/lib/lp/app/widgets/doc/zope3-widgets-use-form-ng.txt
+++ b/lib/lp/app/widgets/doc/zope3-widgets-use-form-ng.txt
@@ -1,4 +1,5 @@
1= Zope Widgets use IBrowserFormNG =1Zope Widgets use IBrowserFormNG
2===============================
23
3Regular Zope widgets have the problem of failing with low-level4Regular Zope widgets have the problem of failing with low-level
4exceptions (TypeError, AttributeError, ...) when the request contains5exceptions (TypeError, AttributeError, ...) when the request contains
diff --git a/lib/lp/archivepublisher/tests/deathrow.txt b/lib/lp/archivepublisher/tests/deathrow.txt
index 92b4381..4d77654 100644
--- a/lib/lp/archivepublisher/tests/deathrow.txt
+++ b/lib/lp/archivepublisher/tests/deathrow.txt
@@ -1,4 +1,5 @@
1= Package Death Row =1Package Death Row
2=================
23
3We start by creating a pair of temporary directories to be used in4We start by creating a pair of temporary directories to be used in
4this test.5this test.
@@ -29,7 +30,8 @@ The no-operation use case, reflects the sampledata status.
29 DEBUG Marking 0 condemned packages as removed.30 DEBUG Marking 0 condemned packages as removed.
3031
3132
32== Removal unreferenced packages ==33Removal unreferenced packages
34-----------------------------
3335
34Setup `SoyuzTestPublisher` for creating publications for Ubuntu/hoary.36Setup `SoyuzTestPublisher` for creating publications for Ubuntu/hoary.
3537
diff --git a/lib/lp/archiveuploader/tests/upload-path-parsing.txt b/lib/lp/archiveuploader/tests/upload-path-parsing.txt
index ea7666e..c4c998d 100644
--- a/lib/lp/archiveuploader/tests/upload-path-parsing.txt
+++ b/lib/lp/archiveuploader/tests/upload-path-parsing.txt
@@ -1,4 +1,5 @@
1= Upload path parsing =1Upload path parsing
2===================
23
3The upload path is used to decide in which context a uploaded package4The upload path is used to decide in which context a uploaded package
4will be processed.5will be processed.
@@ -19,7 +20,8 @@ in several scenarios.
19 ... print('Suite: %s' % suite_name)20 ... print('Suite: %s' % suite_name)
2021
2122
22== Distribution uploads ==23Distribution uploads
24--------------------
2325
24Upload placed on 'root', i.e, no 'relative_path' will be targeted to26Upload placed on 'root', i.e, no 'relative_path' will be targeted to
25'ubuntu' primary archive.27'ubuntu' primary archive.
@@ -74,7 +76,8 @@ is raised.
74 lp.archiveuploader.uploadprocessor.UploadPathError: Could not find suite 'imaginary'.76 lp.archiveuploader.uploadprocessor.UploadPathError: Could not find suite 'imaginary'.
7577
7678
77== PPA uploads ==79PPA uploads
80-----------
7881
79An upload will be considered targeted to a PPA if the first path term82An upload will be considered targeted to a PPA if the first path term
80starts with '~', then the subsequent text in this term will be looked83starts with '~', then the subsequent text in this term will be looked
@@ -204,7 +207,8 @@ And the upload now found its way to the new named PPA.
204 Suite: None207 Suite: None
205208
206209
207== Non-sense upload paths ==210Non-sense upload paths
211----------------------
208212
209Obviously upload paths can be completely bogus and the processing function213Obviously upload paths can be completely bogus and the processing function
210identifies and warns users accordingly.214identifies and warns users accordingly.
@@ -259,7 +263,8 @@ An old-style named PPA upload missing '~'.
259 lp.archiveuploader.uploadprocessor.UploadPathError: Path format mismatch.263 lp.archiveuploader.uploadprocessor.UploadPathError: Path format mismatch.
260264
261265
262== Binary uploads from build slaves ==266Binary uploads from build slaves
267--------------------------------
263268
264A relative path for a binary upload from a build slave will have the269A relative path for a binary upload from a build slave will have the
265following format: <archive_id>/<distribution_name> where archive_id270following format: <archive_id>/<distribution_name> where archive_id
diff --git a/lib/lp/blueprints/stories/blueprints/xx-buglinks.txt b/lib/lp/blueprints/stories/blueprints/xx-buglinks.txt
index 6c4e692..04ea753 100644
--- a/lib/lp/blueprints/stories/blueprints/xx-buglinks.txt
+++ b/lib/lp/blueprints/stories/blueprints/xx-buglinks.txt
@@ -1,4 +1,5 @@
1= Linking Specs and Bugs =1Linking Specs and Bugs
2======================
23
3Specifications can be linked to bugs. Bug reports exposing problems that4Specifications can be linked to bugs. Bug reports exposing problems that
4will be solved by the specification are likely candidates for such5will be solved by the specification are likely candidates for such
@@ -16,7 +17,8 @@ the 'Related Bugs' section.
16 Bug #1: Firefox does not support SVG New17 Bug #1: Firefox does not support SVG New
1718
1819
19== Adding Links ==20Adding Links
21------------
2022
21Linking a bug report to a specification is done by using the23Linking a bug report to a specification is done by using the
22'Link to a bug report' link.24'Link to a bug report' link.
@@ -46,7 +48,8 @@ link.
46 ...Reflow problems with complex page layouts...</div>48 ...Reflow problems with complex page layouts...</div>
4749
4850
49== Removing Links ==51Removing Links
52--------------
5053
51Oops, that was actually the wrong bug. So lets remove the link. This is54Oops, that was actually the wrong bug. So lets remove the link. This is
52done by using the 'Remove bug link' link.55done by using the 'Remove bug link' link.
diff --git a/lib/lp/blueprints/stories/blueprints/xx-dependencies.txt b/lib/lp/blueprints/stories/blueprints/xx-dependencies.txt
index 9b66034..9021466 100644
--- a/lib/lp/blueprints/stories/blueprints/xx-dependencies.txt
+++ b/lib/lp/blueprints/stories/blueprints/xx-dependencies.txt
@@ -1,4 +1,5 @@
1= Blueprint dependencies =1Blueprint dependencies
2======================
23
3Blueprints support the idea of dependencies: one blueprint can require4Blueprints support the idea of dependencies: one blueprint can require
4another blueprint be complete before its own implementation can5another blueprint be complete before its own implementation can
@@ -18,7 +19,8 @@ itself.
18 True19 True
1920
2021
21== Adding a new dependency ==22Adding a new dependency
23-----------------------
2224
23Let's add a new dependency for the "canvas" blueprint. We'll add the25Let's add a new dependency for the "canvas" blueprint. We'll add the
24"extension-manager-upgrades" blueprint as a dependency. First, we26"extension-manager-upgrades" blueprint as a dependency. First, we
@@ -67,7 +69,8 @@ dependency.
67 'http://blueprints.launchpad.test/firefox/+spec/canvas'69 'http://blueprints.launchpad.test/firefox/+spec/canvas'
6870
6971
70== Removing a dependency ==72Removing a dependency
73---------------------
7174
72But we don't want to keep that, so we will remove it as a dependency. First75But we don't want to keep that, so we will remove it as a dependency. First
73we make sure we can see the link to remove a dependency. We need to be76we make sure we can see the link to remove a dependency. We need to be
@@ -122,9 +125,11 @@ users with launchpad.Edit permission for the blueprint.
122 zope.security.interfaces.Unauthorized: ...125 zope.security.interfaces.Unauthorized: ...
123126
124127
125== Corner cases ==128Corner cases
129------------
126130
127=== Cross-project blueprints ===131Cross-project blueprints
132........................
128133
129Blueprints can only depend on blueprints in the same project. To134Blueprints can only depend on blueprints in the same project. To
130show this, we register a blueprint for a different project.135show this, we register a blueprint for a different project.
@@ -152,7 +157,8 @@ blueprint we registered in jokosher.
152 True157 True
153158
154159
155=== Circular dependencies ===160Circular dependencies
161.....................
156162
157In order to prevent circular dependencies, it is impossible to mark a163In order to prevent circular dependencies, it is impossible to mark a
158blueprint A as depending on blueprint B, if B is already marked as164blueprint A as depending on blueprint B, if B is already marked as
@@ -170,7 +176,8 @@ We know that "canvas" depends on "e4x". We try to make "e4x" depend on
170 True176 True
171177
172178
173=== Status ===179Status
180......
174181
175It should be possible to indicate any blueprint as a dependency,182It should be possible to indicate any blueprint as a dependency,
176regardless of its status. Let's mark mergewin as Implemented:183regardless of its status. Let's mark mergewin as Implemented:
@@ -196,7 +203,8 @@ And ensure it works:
196 'http://blueprints.launchpad.test/firefox/+spec/canvas'203 'http://blueprints.launchpad.test/firefox/+spec/canvas'
197204
198205
199== Project dependency charts ==206Project dependency charts
207-------------------------
200208
201We know that no blueprints depend on "canvas", but "canvas" depends on209We know that no blueprints depend on "canvas", but "canvas" depends on
202"e4x" and "e4x" depends on "svg-support". So the big picture is that210"e4x" and "e4x" depends on "svg-support". So the big picture is that
@@ -256,7 +264,8 @@ is useful for experimenting with the dot layout using production data.
256 digraph "deptree" {264 digraph "deptree" {
257 ...265 ...
258266
259== Distro blueprints ==267Distro blueprints
268-----------------
260269
261Let's look at blueprints targetting a distribution, rather than a product.270Let's look at blueprints targetting a distribution, rather than a product.
262We create two blueprints in `ubuntu`.271We create two blueprints in `ubuntu`.
diff --git a/lib/lp/blueprints/stories/standalone/xx-batching.txt b/lib/lp/blueprints/stories/standalone/xx-batching.txt
index 0c3ca4c..619b246 100644
--- a/lib/lp/blueprints/stories/standalone/xx-batching.txt
+++ b/lib/lp/blueprints/stories/standalone/xx-batching.txt
@@ -1,4 +1,5 @@
1= Blueprint Batching =1Blueprint Batching
2==================
23
3For projects with large numbers of blueprints, it's important that users are4For projects with large numbers of blueprints, it's important that users are
4able to navigate easily through those blueprints. It's also important for us 5able to navigate easily through those blueprints. It's also important for us
diff --git a/lib/lp/blueprints/stories/standalone/xx-informational-blueprints.txt b/lib/lp/blueprints/stories/standalone/xx-informational-blueprints.txt
index e2d67f8..0603ab6 100644
--- a/lib/lp/blueprints/stories/standalone/xx-informational-blueprints.txt
+++ b/lib/lp/blueprints/stories/standalone/xx-informational-blueprints.txt
@@ -1,4 +1,5 @@
1= Informational Blueprints =1Informational Blueprints
2========================
23
3Informational blueprints are blueprints for which no implementation is4Informational blueprints are blueprints for which no implementation is
4necessary, other than writing the blueprint itself. We track such blueprints5necessary, other than writing the blueprint itself. We track such blueprints
@@ -6,7 +7,8 @@ by setting their ''implementation_status'' to ''informational'' and using
6only their ''definition_status'' to follow change.7only their ''definition_status'' to follow change.
78
89
9== Tracking informational blueprints ==10Tracking informational blueprints
11---------------------------------
1012
11When a blueprint does not require an implementation at all, it can be13When a blueprint does not require an implementation at all, it can be
12said to be ''informational'', and it isn't necessary to track its14said to be ''informational'', and it isn't necessary to track its
@@ -38,7 +40,8 @@ The blueprint is displayed with the ''informational'' icon.
38 <...Informational blueprint, no implementation necessary...>40 <...Informational blueprint, no implementation necessary...>
3941
4042
41== Documentation ==43Documentation
44-------------
4245
43An informational blueprint that has been approved, displays on the its46An informational blueprint that has been approved, displays on the its
44project's documentation page.47project's documentation page.
diff --git a/lib/lp/bugs/browser/tests/buglinktarget-views.txt b/lib/lp/bugs/browser/tests/buglinktarget-views.txt
index 192d936..ed48965 100644
--- a/lib/lp/bugs/browser/tests/buglinktarget-views.txt
+++ b/lib/lp/bugs/browser/tests/buglinktarget-views.txt
@@ -1,4 +1,5 @@
1= IBugLinkTarget Views =1IBugLinkTarget Views
2====================
23
3The +linkbug and +unlinkbug views operates on IBugLinkTarget.4The +linkbug and +unlinkbug views operates on IBugLinkTarget.
45
@@ -24,7 +25,8 @@ The +linkbug and +unlinkbug views operates on IBugLinkTarget.
24 >>> login('no-priv@canonical.com')25 >>> login('no-priv@canonical.com')
2526
2627
27== Link Bug View ==28Link Bug View
29-------------
2830
29The +linkbug view is used to link bugs to IBugLinkTarget.31The +linkbug view is used to link bugs to IBugLinkTarget.
3032
@@ -72,7 +74,8 @@ A ObjectModifiedEvent was sent:
72 >>> collected_events = []74 >>> collected_events = []
7375
7476
75== Unlink Bugs View ==77Unlink Bugs View
78----------------
7679
77 (Link some other bugs first.)80 (Link some other bugs first.)
78 >>> link = cve.linkBug(bugset.get(2))81 >>> link = cve.linkBug(bugset.get(2))
@@ -122,7 +125,8 @@ A ObjectModifiedEvent was sent:
122 [1, 2, 3]125 [1, 2, 3]
123126
124127
125== Bug titles are escaped in notifications ==128Bug titles are escaped in notifications
129---------------------------------------
126130
127Bug titles may legitimately contain HTML markup, such as reporting that131Bug titles may legitimately contain HTML markup, such as reporting that
128there is "Too much space between <h1> and <h2>". Notifications, like the132there is "Too much space between <h1> and <h2>". Notifications, like the
@@ -149,7 +153,8 @@ The notification contains the escaped bug title.
149 ...&lt;script&gt;window.alert(&quot;Hello!&quot;)&lt;/script&gt;....153 ...&lt;script&gt;window.alert(&quot;Hello!&quot;)&lt;/script&gt;....
150154
151155
152== Cleanup ==156Cleanup
157-------
153158
154 (Deactivate the event listener.)159 (Deactivate the event listener.)
155 >>> modified_listener.cleanUp()160 >>> modified_listener.cleanUp()
diff --git a/lib/lp/bugs/browser/tests/bugtask-edit-views.txt b/lib/lp/bugs/browser/tests/bugtask-edit-views.txt
index 1896e5e..6dfeb04 100644
--- a/lib/lp/bugs/browser/tests/bugtask-edit-views.txt
+++ b/lib/lp/bugs/browser/tests/bugtask-edit-views.txt
@@ -1,10 +1,12 @@
1= Editing Bug Tasks =1Editing Bug Tasks
2=================
23
3A bugtask's status, assignee, package name, milestone, etc., can be4A bugtask's status, assignee, package name, milestone, etc., can be
4modified on its +editstatus page.5modified on its +editstatus page.
56
67
7== Edit the Status ==8Edit the Status
9---------------
810
9Let's start simple and edit the status of a bug task logged in as Sample11Let's start simple and edit the status of a bug task logged in as Sample
10Person:12Person:
@@ -33,7 +35,8 @@ Person:
33 'In Progress'35 'In Progress'
3436
3537
36== Edit the Package ==38Edit the Package
39----------------
3740
38When editing the package of a distribution task, the user may enter41When editing the package of a distribution task, the user may enter
39either a binary or a source package name. We only deal with bugs on42either a binary or a source package name. We only deal with bugs on
@@ -91,7 +94,8 @@ exist in Launchpad. we'll get an error message.
91An error is reported to the user when a bug is retargeted and there is94An error is reported to the user when a bug is retargeted and there is
92an existing task for the same target.95an existing task for the same target.
9396
94== Edit the Product ==97Edit the Product
98----------------
9599
96+editstatus allows a bug to be retargeted to another product.100+editstatus allows a bug to be retargeted to another product.
97101
@@ -141,7 +145,8 @@ If no product name is given, an error message is displayed.
141 ('product', 'Project', RequiredMissing('product'))145 ('product', 'Project', RequiredMissing('product'))
142146
143147
144== Bug Watch Linkage ==148Bug Watch Linkage
149-----------------
145150
146Let's edit a bugtask which is linked to a remote bug. The most151Let's edit a bugtask which is linked to a remote bug. The most
147important thing to edit is the bug watch, since it controls the status152important thing to edit is the bug watch, since it controls the status
@@ -204,7 +209,8 @@ set to their default values:
204 True209 True
205210
206211
207== Milestone Editing Permissions ==212Milestone Editing Permissions
213-----------------------------
208214
209A milestone can be edited only by a user with launchpad.Edit permissions215A milestone can be edited only by a user with launchpad.Edit permissions
210on the distribution or product context. When the user has this216on the distribution or product context. When the user has this
diff --git a/lib/lp/bugs/browser/tests/bugtask-search-views.txt b/lib/lp/bugs/browser/tests/bugtask-search-views.txt
index 97120cc..041a1fa 100644
--- a/lib/lp/bugs/browser/tests/bugtask-search-views.txt
+++ b/lib/lp/bugs/browser/tests/bugtask-search-views.txt
@@ -1,4 +1,5 @@
1= Distribution Search page =1Distribution Search page
2========================
23
3In the 'Bugs' facet of a distribution we can find a list of bugs4In the 'Bugs' facet of a distribution we can find a list of bugs
4reported in that distribution and simple and advanced search forms.5reported in that distribution and simple and advanced search forms.
@@ -208,7 +209,8 @@ in each series. In this case, the component search widget is hidden.
208 False209 False
209210
210211
211== Distribution Series search page ==212Distribution Series search page
213-------------------------------
212214
213 >>> sarge = debian.getSeries('sarge')215 >>> sarge = debian.getSeries('sarge')
214216
@@ -286,7 +288,8 @@ The same is true for a sarge package.
286 []288 []
287289
288290
289== ProjectGroup Search Page ==291ProjectGroup Search Page
292------------------------
290293
291 >>> from lp.registry.interfaces.projectgroup import IProjectGroupSet294 >>> from lp.registry.interfaces.projectgroup import IProjectGroupSet
292 >>> mozilla = getUtility(IProjectGroupSet).getByName('mozilla')295 >>> mozilla = getUtility(IProjectGroupSet).getByName('mozilla')
@@ -353,7 +356,8 @@ Check what milestones are displayed on the advanced search form:
353 Mozilla Firefox 1.0 (2056-10-16)356 Mozilla Firefox 1.0 (2056-10-16)
354357
355358
356== Searching by information type ==359Searching by information type
360-----------------------------
357361
358The advanced form allows us to query for bugs matching specific362The advanced form allows us to query for bugs matching specific
359information types.363information types.
@@ -390,7 +394,8 @@ Submit the search:
390 >>> flush_database_updates()394 >>> flush_database_updates()
391395
392396
393== Constructing search filter urls ==397Constructing search filter urls
398-------------------------------
394399
395There is a helper method, get_buglisting_search_filter_url(), which can400There is a helper method, get_buglisting_search_filter_url(), which can
396be used to construct bug search URLs. It takes keyword parameters for401be used to construct bug search URLs. It takes keyword parameters for
diff --git a/lib/lp/bugs/browser/tests/distrosourcepackage-bug-views.txt b/lib/lp/bugs/browser/tests/distrosourcepackage-bug-views.txt
index 48620d1..c3a85c2 100644
--- a/lib/lp/bugs/browser/tests/distrosourcepackage-bug-views.txt
+++ b/lib/lp/bugs/browser/tests/distrosourcepackage-bug-views.txt
@@ -1,6 +1,8 @@
1= Distro Source Package Bug Views =1Distro Source Package Bug Views
2===============================
23
3== Searching ==4Searching
5---------
46
5Simple searching is possible on the distro source package bug view page.7Simple searching is possible on the distro source package bug view page.
68
diff --git a/lib/lp/bugs/doc/bug-change.txt b/lib/lp/bugs/doc/bug-change.txt
index f2e2170..f51c352 100644
--- a/lib/lp/bugs/doc/bug-change.txt
+++ b/lib/lp/bugs/doc/bug-change.txt
@@ -1,4 +1,5 @@
1= Tracking changes to a bug =1Tracking changes to a bug
2=========================
23
3The base class for BugChanges doesn't actually implement anything.4The base class for BugChanges doesn't actually implement anything.
45
@@ -190,9 +191,11 @@ notification you'll get an error.
190 AssertionError: notification_data must include a `text` value.191 AssertionError: notification_data must include a `text` value.
191192
192193
193== BugChange subclasses ==194BugChange subclasses
195--------------------
194196
195=== Getting the right bug change class ===197Getting the right bug change class
198..................................
196199
197Given that we know what's changing and the name of the field that is200Given that we know what's changing and the name of the field that is
198being changed, we can find a suitable IBugChange implementation to201being changed, we can find a suitable IBugChange implementation to
@@ -221,7 +224,8 @@ get_bug_change_class will also work for BugTasks.
221 <class '...BugTaskImportanceChange'>224 <class '...BugTaskImportanceChange'>
222225
223226
224=== AttributeChange ===227AttributeChange
228...............
225229
226The AttributeChange class offers basic functionality for dealing with230The AttributeChange class offers basic functionality for dealing with
227bug attribute changes.231bug attribute changes.
@@ -244,7 +248,8 @@ method.
244 'whatchanged': 'title'}248 'whatchanged': 'title'}
245249
246250
247=== BugDescriptionChange ===251BugDescriptionChange
252....................
248253
249This describes a change to the description of a254This describes a change to the description of a
250bug. getBugNotification() returns a formatted description of the255bug. getBugNotification() returns a formatted description of the
@@ -264,7 +269,8 @@ change.
264 + Well, maybe not269 + Well, maybe not
265270
266271
267=== BugTitleChange ===272BugTitleChange
273..............
268274
269This, surprisingly, describes a title change for a bug. Again,275This, surprisingly, describes a title change for a bug. Again,
270getBugNotification() returns a specially formatted description of276getBugNotification() returns a specially formatted description of
@@ -291,7 +297,8 @@ within the UI.
291 summary297 summary
292298
293299
294=== BugDuplicateChange ===300BugDuplicateChange
301..................
295302
296This describes a change to the duplicate marker for a bug.303This describes a change to the duplicate marker for a bug.
297304
@@ -316,7 +323,8 @@ returned fields.
316 'whatchanged': 'marked as duplicate'}323 'whatchanged': 'marked as duplicate'}
317324
318325
319== BugTagsChange ==326BugTagsChange
327-------------
320328
321BugTagsChange is used to represent a change in a Bug's tag list.329BugTagsChange is used to represent a change in a Bug's tag list.
322330
@@ -345,7 +353,8 @@ Addtions and removals are expressed separately in the notification.
345 ** Tags added: zillionth-tag353 ** Tags added: zillionth-tag
346354
347355
348=== CveLinkedToBug / CveUnlinkedFromBug ===356CveLinkedToBug / CveUnlinkedFromBug
357...................................
349358
350These describe the linking or unlinking of a CVE to a bug.359These describe the linking or unlinking of a CVE to a bug.
351360
@@ -381,7 +390,8 @@ And when a CVE is unlinked from a bug.
381 ** CVE removed: https://cve.mitre.org/cgi-bin/cvename.cgi?name=1999-8979390 ** CVE removed: https://cve.mitre.org/cgi-bin/cvename.cgi?name=1999-8979
382391
383392
384== BugAttachmentChange ==393BugAttachmentChange
394-------------------
385395
386BugAttachmentChange is used to handle the addition and removal of396BugAttachmentChange is used to handle the addition and removal of
387attachments from a bug.397attachments from a bug.
@@ -426,7 +436,8 @@ Or remove one.
426 http://bugs.launchpad.test/bugs/.../+attachment/.../+files/...436 http://bugs.launchpad.test/bugs/.../+attachment/.../+files/...
427437
428438
429== BugTaskAttributeChange ==439BugTaskAttributeChange
440----------------------
430441
431BugTaskAttributeChange is a generic BugChange that can be used to442BugTaskAttributeChange is a generic BugChange that can be used to
432represent a change in the attributes of one of a Bug's BugTasks. It is443represent a change in the attributes of one of a Bug's BugTasks. It is
@@ -467,7 +478,8 @@ Several types of attribute change can be handled by
467BugTaskAttributeChange.478BugTaskAttributeChange.
468479
469480
470=== Status changes ===481Status changes
482..............
471483
472Status changes use a BugTaskStatus's `title` attribute to describe to484Status changes use a BugTaskStatus's `title` attribute to describe to
473the user what has changed.485the user what has changed.
@@ -490,7 +502,8 @@ the user what has changed.
490 Status: New => Fix Released502 Status: New => Fix Released
491503
492504
493=== Importance changes ===505Importance changes
506..................
494507
495Importance changes use a BugTaskImportance's `title` attribute to508Importance changes use a BugTaskImportance's `title` attribute to
496describe to the user what has changed.509describe to the user what has changed.
@@ -514,7 +527,8 @@ describe to the user what has changed.
514 Importance: Undecided => Critical527 Importance: Undecided => Critical
515528
516529
517=== Milestone changes ===530Milestone changes
531.................
518532
519Milestone changes use a Milestone's `name` attribute to describe to533Milestone changes use a Milestone's `name` attribute to describe to
520the user what has changed.534the user what has changed.
@@ -541,7 +555,8 @@ the user what has changed.
541 Milestone: None => example-milestone555 Milestone: None => example-milestone
542556
543557
544=== Bugwatch changes ===558Bugwatch changes
559................
545560
546Bugwatch changes use a Bugwatch's `title` attribute to describe to the561Bugwatch changes use a Bugwatch's `title` attribute to describe to the
547user what has changed.562user what has changed.
@@ -570,7 +585,8 @@ user what has changed.
570 Remote watch: None => bugs.example.com/ #1245585 Remote watch: None => bugs.example.com/ #1245
571586
572587
573=== Assignee changes ===588Assignee changes
589................
574590
575Assignee changes use the assignee's `unique_displayname` attribute to591Assignee changes use the assignee's `unique_displayname` attribute to
576describe to the user what has changed.592describe to the user what has changed.
@@ -593,7 +609,8 @@ describe to the user what has changed.
593 Assignee: (unassigned) => Ford Prefect (ford-prefect)609 Assignee: (unassigned) => Ford Prefect (ford-prefect)
594610
595611
596=== Target (Affects) changes ===612Target (Affects) changes
613........................
597614
598Changes to the bug task target (aka affects) use the BugTaskTargetChange615Changes to the bug task target (aka affects) use the BugTaskTargetChange
599class to describe the change. It inspects the `bugtargetname`616class to describe the change. It inspects the `bugtargetname`
diff --git a/lib/lp/bugs/doc/bug-reported-acknowledgement.txt b/lib/lp/bugs/doc/bug-reported-acknowledgement.txt
index 6997fa4..393b23b 100644
--- a/lib/lp/bugs/doc/bug-reported-acknowledgement.txt
+++ b/lib/lp/bugs/doc/bug-reported-acknowledgement.txt
@@ -1,4 +1,5 @@
1= Bug Reported Acknowledgement Message =1Bug Reported Acknowledgement Message
2====================================
23
3A message of acknowledgement to be displayed to bug reporters after they've4A message of acknowledgement to be displayed to bug reporters after they've
4reported a bug can be set at the Distribution, DistributionSourcePackage,5reported a bug can be set at the Distribution, DistributionSourcePackage,
diff --git a/lib/lp/bugs/doc/bug-reporting-guidelines.txt b/lib/lp/bugs/doc/bug-reporting-guidelines.txt
index b6ebff5..44cb6c4 100644
--- a/lib/lp/bugs/doc/bug-reporting-guidelines.txt
+++ b/lib/lp/bugs/doc/bug-reporting-guidelines.txt
@@ -1,4 +1,5 @@
1= Bug Reporting Guidelines =1Bug Reporting Guidelines
2========================
23
3Guidelines can be set at the Distribution, DistributionSourcePackage,4Guidelines can be set at the Distribution, DistributionSourcePackage,
4ProjectGroup or Product level to help users file good bug reports, direct5ProjectGroup or Product level to help users file good bug reports, direct
diff --git a/lib/lp/bugs/doc/bug-set-status.txt b/lib/lp/bugs/doc/bug-set-status.txt
index af6cd66..89caa02 100644
--- a/lib/lp/bugs/doc/bug-set-status.txt
+++ b/lib/lp/bugs/doc/bug-set-status.txt
@@ -1,4 +1,5 @@
1= Setting the status of a bug =1Setting the status of a bug
2===========================
23
3If you have a bug and a target, there's method which makes it easier to4If you have a bug and a target, there's method which makes it easier to
4change the bug's status for that specific target. It expects the user5change the bug's status for that specific target. It expects the user
@@ -67,7 +68,8 @@ bugtask already has the specified status, None is returned.
67 >>> print(bug.setStatus(firefox, BugTaskStatus.CONFIRMED, no_priv))68 >>> print(bug.setStatus(firefox, BugTaskStatus.CONFIRMED, no_priv))
68 None69 None
6970
70=== Product series ===71Product series
72..............
7173
72If a product series is specified, but the bug is target only to the74If a product series is specified, but the bug is target only to the
73product, not the product series, the product bugtask is edited.75product, not the product series, the product bugtask is edited.
@@ -126,7 +128,8 @@ updated automatically.
126 >>> firefox_bugtask.status.name128 >>> firefox_bugtask.status.name
127 'CONFIRMED'129 'CONFIRMED'
128130
129=== Distributions and packages ===131Distributions and packages
132..........................
130133
131Setting the status of a distribution or package bugtask work the same as134Setting the status of a distribution or package bugtask work the same as
132for product tasks.135for product tasks.
diff --git a/lib/lp/bugs/doc/bugmessage-visibility.txt b/lib/lp/bugs/doc/bugmessage-visibility.txt
index 0c91cfb..43c683e 100644
--- a/lib/lp/bugs/doc/bugmessage-visibility.txt
+++ b/lib/lp/bugs/doc/bugmessage-visibility.txt
@@ -1,4 +1,5 @@
1= Bug message visibility =1Bug message visibility
2======================
23
3Bug messages have a visible field, which provides a means4Bug messages have a visible field, which provides a means
4for hiding messages rather than having to delete them.5for hiding messages rather than having to delete them.
diff --git a/lib/lp/bugs/doc/bugmessage.txt b/lib/lp/bugs/doc/bugmessage.txt
index 9e14348..34c4e7f 100644
--- a/lib/lp/bugs/doc/bugmessage.txt
+++ b/lib/lp/bugs/doc/bugmessage.txt
@@ -1,4 +1,5 @@
1= Bug Messages =1Bug Messages
2============
23
3Bug messages are messages associated with bugs. A bug message is4Bug messages are messages associated with bugs. A bug message is
4described by the IBugMessage interface.5described by the IBugMessage interface.
@@ -6,7 +7,8 @@ described by the IBugMessage interface.
6One IMessage can be associated with many IBugs, but one IBugMessage is7One IMessage can be associated with many IBugs, but one IBugMessage is
7always associated with exactly one bug.8always associated with exactly one bug.
89
9== Retrieving bug messages ==10Retrieving bug messages
11-----------------------
1012
11IBugMessageSet represents the set of all IBugMessages in the13IBugMessageSet represents the set of all IBugMessages in the
12system.14system.
@@ -47,7 +49,8 @@ bug watch.
47 ...49 ...
4850
4951
50== Creating bug messages ==52Creating bug messages
53---------------------
5154
52To create a bug message, use IBugMessageSet.createMessage:55To create a bug message, use IBugMessageSet.createMessage:
5356
@@ -74,7 +77,8 @@ And the index of the bugmessage is set:
74 277 2
7578
7679
77== Links and CVEs in bug messages ==80Links and CVEs in bug messages
81------------------------------
7882
79If a bug message contains links to an external bug report or a CVE,83If a bug message contains links to an external bug report or a CVE,
80bugwatches resp. CVE watches are automatically created. We add this84bugwatches resp. CVE watches are automatically created. We add this
@@ -156,7 +160,8 @@ an external bug tracker.
156 http://some.bugzilla/show_bug.cgi?id=9876160 http://some.bugzilla/show_bug.cgi?id=9876
157161
158162
159== Last message date ==163Last message date
164-----------------
160165
161For each bug, we cache the date of the last message linked to it using166For each bug, we cache the date of the last message linked to it using
162the attribute `date_last_message` in order to optimize searches the need167the attribute `date_last_message` in order to optimize searches the need
@@ -174,7 +179,8 @@ to compare this value for every bug in a large set.
174 True179 True
175180
176181
177== Retrieving IMessage.id from IBugMessage ==182Retrieving IMessage.id from IBugMessage
183---------------------------------------
178184
179Each IBugMessage has a message_id attribute, which allows access185Each IBugMessage has a message_id attribute, which allows access
180to IBugMessage.IMessage.id without the additional query.186to IBugMessage.IMessage.id without the additional query.
diff --git a/lib/lp/bugs/doc/bugnotifications.txt b/lib/lp/bugs/doc/bugnotifications.txt
index 1e364cc..d4ea291 100644
--- a/lib/lp/bugs/doc/bugnotifications.txt
+++ b/lib/lp/bugs/doc/bugnotifications.txt
@@ -1,15 +1,18 @@
11
2= Bug notifications =2Bug notifications
3=================
34
45
5== What is a bug notification? ==6What is a bug notification?
7---------------------------
68
7A bug notification gets added when something interesting happens to the9A bug notification gets added when something interesting happens to the
8bug. It's stored in a a table, and later on a cronscript constructs an10bug. It's stored in a a table, and later on a cronscript constructs an
9email and sends the notification to the bug's subscribers.11email and sends the notification to the bug's subscribers.
1012
1113
12== When do bug notifications get added? ==14When do bug notifications get added?
15------------------------------------
1316
14Not *every* change on a bug causes a notification to be added. This17Not *every* change on a bug causes a notification to be added. This
15section will give a rundown of the things that do cause notifications to18section will give a rundown of the things that do cause notifications to
@@ -21,7 +24,8 @@ Here are the things that cause bug notifications to be added and what
21those notifications look like.24those notifications look like.
2225
2326
24=== Reporting a new bug ===27Reporting a new bug
28...................
2529
26 >>> from zope.event import notify30 >>> from zope.event import notify
27 >>> from lazr.lifecycle.event import ObjectCreatedEvent31 >>> from lazr.lifecycle.event import ObjectCreatedEvent
@@ -63,7 +67,8 @@ bugactivity.txt, but for now here is a small demo.
63 Sample Person67 Sample Person
6468
6569
66=== Editing a bug report ===70Editing a bug report
71....................
6772
68 >>> from lp.services.webapp.snapshot import notify_modified73 >>> from lp.services.webapp.snapshot import notify_modified
6974
@@ -88,7 +93,8 @@ bugactivity.txt, but for now here is a small demo.
88 a new description93 a new description
8994
9095
91=== Filing a new task on an existing bug ===96Filing a new task on an existing bug
97....................................
9298
93There are three kinds of tasks that can be added to an existing99There are three kinds of tasks that can be added to an existing
94bug. Let's take a look at each type.100bug. Let's take a look at each type.
@@ -201,7 +207,8 @@ bug. Let's take a look at each type.
201 ...207 ...
202208
203209
204=== Commenting on a bug report ===210Commenting on a bug report
211..........................
205212
206 >>> from lp.bugs.interfaces.bugmessage import IBugMessageSet213 >>> from lp.bugs.interfaces.bugmessage import IBugMessageSet
207214
@@ -223,7 +230,8 @@ bug. Let's take a look at each type.
223 just a test comment230 just a test comment
224231
225232
226=== Editing a task ===233Editing a task
234..............
227235
228Let's demonstrate a notification email where Sample Person marks a236Let's demonstrate a notification email where Sample Person marks a
229task Fixed, and assigns themselves to it.237task Fixed, and assigns themselves to it.
@@ -265,7 +273,8 @@ task Fixed, and assigns themselves to it.
265 ...273 ...
266274
267275
268=== Adding and editing a CVE reference ===276Adding and editing a CVE reference
277..................................
269278
270Adding a CVE reference to a bug also causes a notification email to go279Adding a CVE reference to a bug also causes a notification email to go
271out to the bug notification recipient list. Let's create a CVE ref and280out to the bug notification recipient list. Let's create a CVE ref and
@@ -290,7 +299,8 @@ this document:
290 ** CVE added: https://cve.mitre.org/cgi-bin/cvename.cgi?name=2004-0276299 ** CVE added: https://cve.mitre.org/cgi-bin/cvename.cgi?name=2004-0276
291300
292301
293=== Expiring notifications ===302Expiring notifications
303......................
294304
295During bulk imports or changes of bugs, we often want to suppress305During bulk imports or changes of bugs, we often want to suppress
296email notifications. Due to the previous operation, there is a306email notifications. Due to the previous operation, there is a
diff --git a/lib/lp/bugs/doc/bugtarget.txt b/lib/lp/bugs/doc/bugtarget.txt
index 9fa9f2d..59a60fd 100644
--- a/lib/lp/bugs/doc/bugtarget.txt
+++ b/lib/lp/bugs/doc/bugtarget.txt
@@ -1,10 +1,12 @@
1= Bug Targets =1Bug Targets
2===========
23
3A bug target is a thing on which a bug can be reported, e.g., an4A bug target is a thing on which a bug can be reported, e.g., an
4IDistributionSourcePackage, an IProduct, etc.5IDistributionSourcePackage, an IProduct, etc.
56
67
7== Bug Tasks on Bug Targets ==8Bug Tasks on Bug Targets
9------------------------
810
9Bug targets have a bugtargetdisplayname attribute, which returns a value11Bug targets have a bugtargetdisplayname attribute, which returns a value
10tailored for human reading (e.g. display in Web pages); and a bugtargetname12tailored for human reading (e.g. display in Web pages); and a bugtargetname
diff --git a/lib/lp/bugs/doc/bugtask-package-bugcounts.txt b/lib/lp/bugs/doc/bugtask-package-bugcounts.txt
index 60af96d..7d24bfc 100644
--- a/lib/lp/bugs/doc/bugtask-package-bugcounts.txt
+++ b/lib/lp/bugs/doc/bugtask-package-bugcounts.txt
@@ -1,4 +1,5 @@
1= Bug Counts For Open Bugs on Packages =1Bug Counts For Open Bugs on Packages
2====================================
23
3BugTaskset has a method, getBugCountsForPackages(), which returns counts4BugTaskset has a method, getBugCountsForPackages(), which returns counts
4for open bugs on each package.5for open bugs on each package.
@@ -128,7 +129,8 @@ If we mark the bug as In Progress, the open_inprogress will increase.
128 open_unassigned: 1129 open_unassigned: 1
129 package: mozilla-firefox (Ubuntu)130 package: mozilla-firefox (Ubuntu)
130131
131== Privacy ==132Privacy
133-------
132134
133Only those bugs that the user has access to are shown, so if we mark the135Only those bugs that the user has access to are shown, so if we mark the
134bug as private, No Privileges Person will only see that there is one136bug as private, No Privileges Person will only see that there is one
@@ -160,7 +162,8 @@ Foo Bar still can see all the bugs, though.
160 open_unassigned: 1162 open_unassigned: 1
161 package: mozilla-firefox (Ubuntu)163 package: mozilla-firefox (Ubuntu)
162164
163== Duplicate Bugs ==165Duplicate Bugs
166--------------
164167
165Duplicates bugs are omitted from the counts.168Duplicates bugs are omitted from the counts.
166169
diff --git a/lib/lp/bugs/doc/bugtask-search-old-urls.txt b/lib/lp/bugs/doc/bugtask-search-old-urls.txt
index 388be56..34a6b7b 100644
--- a/lib/lp/bugs/doc/bugtask-search-old-urls.txt
+++ b/lib/lp/bugs/doc/bugtask-search-old-urls.txt
@@ -1,4 +1,5 @@
1= Searching bugtasks with old statuses =1Searching bugtasks with old statuses
2====================================
23
3The BugWorkflow spec renames several bug statuses, but we need4The BugWorkflow spec renames several bug statuses, but we need
4bookmarks, etc., to keep working using the old status names. Instead5bookmarks, etc., to keep working using the old status names. Instead
diff --git a/lib/lp/bugs/doc/bugtask-status-workflow.txt b/lib/lp/bugs/doc/bugtask-status-workflow.txt
index 3363180..2ffd3be 100644
--- a/lib/lp/bugs/doc/bugtask-status-workflow.txt
+++ b/lib/lp/bugs/doc/bugtask-status-workflow.txt
@@ -1,4 +1,5 @@
1= BugTask Status Workflow =1BugTask Status Workflow
2=======================
23
3BugTasks have a natural status workflow: New => Confirmed => In4BugTasks have a natural status workflow: New => Confirmed => In
4Progress => Fix Committed => Fix Released, etc. Some state transitions5Progress => Fix Committed => Fix Released, etc. Some state transitions
@@ -301,7 +302,8 @@ setting an assignee has "side effects".
301 True302 True
302303
303304
304== date_xxx and the UNKNOWN status ==305date_xxx and the UNKNOWN status
306-------------------------------
305307
306When an IBugTask is set to status UNKNOWN, the date_confirmed,308When an IBugTask is set to status UNKNOWN, the date_confirmed,
307date_closed, date_inprogress, date_triaged, date_fixcommitted309date_closed, date_inprogress, date_triaged, date_fixcommitted
diff --git a/lib/lp/bugs/doc/bugwidget.txt b/lib/lp/bugs/doc/bugwidget.txt
index 680bf16..f20d44a 100644
--- a/lib/lp/bugs/doc/bugwidget.txt
+++ b/lib/lp/bugs/doc/bugwidget.txt
@@ -1,4 +1,5 @@
1= Widget for entering a bug id =1Widget for entering a bug id
2============================
23
3The BugWidget converts string bug ids to the corresponding bug object.4The BugWidget converts string bug ids to the corresponding bug object.
45
diff --git a/lib/lp/bugs/doc/cve.txt b/lib/lp/bugs/doc/cve.txt
index 631cd55..6801d8f 100644
--- a/lib/lp/bugs/doc/cve.txt
+++ b/lib/lp/bugs/doc/cve.txt
@@ -1,4 +1,5 @@
1= Common Vulnerabilities and Exposures (CVE) =1Common Vulnerabilities and Exposures (CVE)
2==========================================
23
3Malone supports attaching CVE references to bugs. From4Malone supports attaching CVE references to bugs. From
4https://cve.mitre.org/about/ CVE is:5https://cve.mitre.org/about/ CVE is:
@@ -11,11 +12,13 @@ For more information, consult the CVE website:
1112
12 https://cve.mitre.org/13 https://cve.mitre.org/
1314
14== CveSet ==15CveSet
16------
1517
16The ICveSet utility is used to create and get CVEs and BugCves.18The ICveSet utility is used to create and get CVEs and BugCves.
1719
18=== Creating CVE entries ===20Creating CVE entries
21....................
1922
20CVE references can be created with the ICveSet utility.23CVE references can be created with the ICveSet utility.
2124
@@ -35,7 +38,8 @@ To create a CVE, call ICveSet.new(sequence, description,
35 >>> print(cve.displayname)38 >>> print(cve.displayname)
36 CVE-2004-027639 CVE-2004-0276
3740
38=== Number of CVE links ===41Number of CVE links
42...................
3943
40We can get the number of CVE links to bugs in Launchpad using44We can get the number of CVE links to bugs in Launchpad using
41getBugCveCount.45getBugCveCount.
@@ -62,7 +66,8 @@ And if we unlink it, the count will decrease.
62 >>> cveset.getBugCveCount()66 >>> cveset.getBugCveCount()
63 267 2
6468
65== Linking CVEs to Bugs ==69Linking CVEs to Bugs
70--------------------
6671
67You can link a CVE to a bug. You can also see which CVEs are currently72You can link a CVE to a bug. You can also see which CVEs are currently
68linked to a bug:73linked to a bug:
@@ -139,7 +144,8 @@ Text references to CVEs using 2014 format can be found:
139 True144 True
140 >>> b.unlinkCVE(cve_2014, user=no_priv)145 >>> b.unlinkCVE(cve_2014, user=no_priv)
141146
142== CVE Reports ==147CVE Reports
148-----------
143149
144Launchpad offers distributions, distribution releases and products with150Launchpad offers distributions, distribution releases and products with
145reports that inform on the status of bugs related to CVEs in the151reports that inform on the status of bugs related to CVEs in the
diff --git a/lib/lp/bugs/doc/displaying-bugs-and-tasks.txt b/lib/lp/bugs/doc/displaying-bugs-and-tasks.txt
index 25f9674..3e4af4f 100644
--- a/lib/lp/bugs/doc/displaying-bugs-and-tasks.txt
+++ b/lib/lp/bugs/doc/displaying-bugs-and-tasks.txt
@@ -1,11 +1,13 @@
1= Displaying Information on Bugs and Bug Tasks =1Displaying Information on Bugs and Bug Tasks
2============================================
23
3This document discusses TALES techniques and IBugTask object4This document discusses TALES techniques and IBugTask object
4attributes that may be useful to you, if you're writing some code to5attributes that may be useful to you, if you're writing some code to
5display bug and bug task information.6display bug and bug task information.
67
78
8== Displaying an Icon with image:icon ==9Displaying an Icon with image:icon
10----------------------------------
911
10image:sprite_css is a TALES adapter that returns the CSS class for12image:sprite_css is a TALES adapter that returns the CSS class for
11an icon for a bugtask.13an icon for a bugtask.
@@ -60,7 +62,8 @@ Let's use a few examples to demonstrate:
60 ... ORIGINAL_IMPORTANCE, getUtility(ILaunchBag).user)62 ... ORIGINAL_IMPORTANCE, getUtility(ILaunchBag).user)
6163
6264
63== Displaying Logos for Bug Tasks ==65Displaying Logos for Bug Tasks
66------------------------------
6467
65The logo for a bug task display the corresponding logo for its68The logo for a bug task display the corresponding logo for its
66target.69target.
@@ -85,7 +88,8 @@ And the logo for a distro bug task shows the source package icon:
85 '<img alt="" width="64" height="64" src="/@@/distribution-logo" />'88 '<img alt="" width="64" height="64" src="/@@/distribution-logo" />'
8689
8790
88== Displaying Status ==91Displaying Status
92-----------------
8993
90Sometimes it's useful to display the status of an IBugTask as a94Sometimes it's useful to display the status of an IBugTask as a
91human-readable string. So, instead of displaying something like:95human-readable string. So, instead of displaying something like:
@@ -157,7 +161,8 @@ Lastly, some cleanup:
157 >>> test_task.transitionToAssignee(ORIGINAL_ASSIGNEE)161 >>> test_task.transitionToAssignee(ORIGINAL_ASSIGNEE)
158162
159163
160== Status Elsewhere ==164Status Elsewhere
165----------------
161166
162It's often useful to present information about the status of a bug in167It's often useful to present information about the status of a bug in
163other contexts. Again, the listing-view holds a method which provides us168other contexts. Again, the listing-view holds a method which provides us
diff --git a/lib/lp/bugs/doc/externalbugtracker-checkwatches.txt b/lib/lp/bugs/doc/externalbugtracker-checkwatches.txt
index 0f4c01e..42d4c58 100644
--- a/lib/lp/bugs/doc/externalbugtracker-checkwatches.txt
+++ b/lib/lp/bugs/doc/externalbugtracker-checkwatches.txt
@@ -1,4 +1,5 @@
1= External Bug Tracker: checkwatches =1External Bug Tracker: checkwatches
2==================================
23
3Strictly speaking, checkwatches is the name of a cronscript and a4Strictly speaking, checkwatches is the name of a cronscript and a
4module in the Launchpad codebase. In the absence of a more complete5module in the Launchpad codebase. In the absence of a more complete
@@ -12,7 +13,8 @@ framework.
12 -- Gavin Panella, 2007-07-1813 -- Gavin Panella, 2007-07-18
1314
1415
15== get_external_bugtracker ==16get_external_bugtracker
17-----------------------
1618
17get_external_bugtracker is used to get an ExternalBugTracker suitable19get_external_bugtracker is used to get an ExternalBugTracker suitable
18for a particular bugtracker.20for a particular bugtracker.
diff --git a/lib/lp/bugs/doc/externalbugtracker-comment-pushing.txt b/lib/lp/bugs/doc/externalbugtracker-comment-pushing.txt
index e64217b..86d0359 100644
--- a/lib/lp/bugs/doc/externalbugtracker-comment-pushing.txt
+++ b/lib/lp/bugs/doc/externalbugtracker-comment-pushing.txt
@@ -1,4 +1,5 @@
1= Pushing comments to external bugtrackers =1Pushing comments to external bugtrackers
2========================================
23
3Some ExternalBugTrackers support the pushing of comments from Launchpad4Some ExternalBugTrackers support the pushing of comments from Launchpad
4to the remote bug tracker.5to the remote bug tracker.
@@ -268,7 +269,8 @@ invalid remote comment ID, an error will be raised:
268 AssertionError: A remote_comment_id must be specified.269 AssertionError: A remote_comment_id must be specified.
269270
270271
271== Formatting pushed comments ==272Formatting pushed comments
273--------------------------
272274
273The comments that have been pushed to the remote bugtracker have been275The comments that have been pushed to the remote bugtracker have been
274formatted to include data about the comment in Launchpad.276formatted to include data about the comment in Launchpad.
diff --git a/lib/lp/bugs/doc/externalbugtracker-emailaddress.txt b/lib/lp/bugs/doc/externalbugtracker-emailaddress.txt
index c440f94..9e6adf8 100644
--- a/lib/lp/bugs/doc/externalbugtracker-emailaddress.txt
+++ b/lib/lp/bugs/doc/externalbugtracker-emailaddress.txt
@@ -1,6 +1,8 @@
1= Email addresses as bug trackers =1Email addresses as bug trackers
2===============================
23
3== The EMAILADDRESS BugTrackerType ==4The EMAILADDRESS BugTrackerType
5-------------------------------
46
5Launchpad allows users to register an email address as an external bug7Launchpad allows users to register an email address as an external bug
6tracker. This means that bugs for that bug tracker can be forwarded to8tracker. This means that bugs for that bug tracker can be forwarded to
@@ -66,7 +68,8 @@ the local part of an email address (e.g. <local_name>@foobar.com).
66 auto-another.bugtracker68 auto-another.bugtracker
6769
6870
69== Adding a BugWatch to an upstream email address ==71Adding a BugWatch to an upstream email address
72----------------------------------------------
7073
71We can add a bug watch to an upstream email address in the normal74We can add a bug watch to an upstream email address in the normal
72fashion. For email addresses, we record the message ID of the mail sent75fashion. For email addresses, we record the message ID of the mail sent
diff --git a/lib/lp/bugs/doc/externalbugtracker-linking-back.txt b/lib/lp/bugs/doc/externalbugtracker-linking-back.txt
index 32186e3..28b8597 100644
--- a/lib/lp/bugs/doc/externalbugtracker-linking-back.txt
+++ b/lib/lp/bugs/doc/externalbugtracker-linking-back.txt
@@ -1,4 +1,5 @@
1= Remote bugs linking back to Launchpad =1Remote bugs linking back to Launchpad
2=====================================
23
3Some bug trackers support linking back to bugs in Launchpad. This way we4Some bug trackers support linking back to bugs in Launchpad. This way we
4can tell external bug trackers that we're watching the bug, and make it5can tell external bug trackers that we're watching the bug, and make it
@@ -69,7 +70,8 @@ be related to a bug task, not just a bug.
69 ... external_bugtracker, [bug_watch_without_bugtask])70 ... external_bugtracker, [bug_watch_without_bugtask])
7071
7172
72== BugWatchUpdater.linkLaunchpadBug() ==73BugWatchUpdater.linkLaunchpadBug()
74----------------------------------
7375
74The BugWatchUpdater method that does the work of setting the Launchpad76The BugWatchUpdater method that does the work of setting the Launchpad
75bug link is linkLaunchpadBug(). This method first retrieves the77bug link is linkLaunchpadBug(). This method first retrieves the
diff --git a/lib/lp/bugs/doc/externalbugtracker-mantis-csv.txt b/lib/lp/bugs/doc/externalbugtracker-mantis-csv.txt
index 0cd932f..d9fb120 100644
--- a/lib/lp/bugs/doc/externalbugtracker-mantis-csv.txt
+++ b/lib/lp/bugs/doc/externalbugtracker-mantis-csv.txt
@@ -1,4 +1,5 @@
1= ExternalBugTracker: Mantis =1ExternalBugTracker: Mantis
2==========================
23
3This covers the implementation of the Mantis bug watch updater when4This covers the implementation of the Mantis bug watch updater when
4used in the "CSV export" mode. The default mode is to page-scrape5used in the "CSV export" mode. The default mode is to page-scrape
@@ -8,7 +9,8 @@ installations work with it (at least two prominent installations
8return empty exports).9return empty exports).
910
1011
11== Basics ==12Basics
13------
1214
13The class that implements ExternalBugTracker for Mantis is called,15The class that implements ExternalBugTracker for Mantis is called,
14surprisingly, Mantis! It doesn't do any version probing and simply16surprisingly, Mantis! It doesn't do any version probing and simply
@@ -42,7 +44,8 @@ If the status can't be converted an UnknownRemoteStatusError is raised.
42 lp.bugs.externalbugtracker.base.UnknownRemoteStatusError: foo: bar44 lp.bugs.externalbugtracker.base.UnknownRemoteStatusError: foo: bar
4345
4446
45== Updating Bug Watches ==47Updating Bug Watches
48--------------------
4649
47Let's set up a BugTracker and some watches for the Example.com Bug50Let's set up a BugTracker and some watches for the Example.com Bug
48Tracker:51Tracker:
diff --git a/lib/lp/bugs/doc/externalbugtracker-mantis.txt b/lib/lp/bugs/doc/externalbugtracker-mantis.txt
index bfc1b0a..bf2768b 100644
--- a/lib/lp/bugs/doc/externalbugtracker-mantis.txt
+++ b/lib/lp/bugs/doc/externalbugtracker-mantis.txt
@@ -1,9 +1,11 @@
1= ExternalBugTracker: Mantis =1ExternalBugTracker: Mantis
2==========================
23
3This covers the implementation of the Mantis bug watch updater.4This covers the implementation of the Mantis bug watch updater.
45
56
6== Basics ==7Basics
8------
79
8The class that implements ExternalBugTracker for Mantis is called,10The class that implements ExternalBugTracker for Mantis is called,
9surprisingly, Mantis! It doesn't do any version probing and simply11surprisingly, Mantis! It doesn't do any version probing and simply
@@ -45,7 +47,8 @@ If the status can't be converted an UnknownRemoteStatusError is raised.
45 lp.bugs.externalbugtracker.base.UnknownRemoteStatusError: foo: bar47 lp.bugs.externalbugtracker.base.UnknownRemoteStatusError: foo: bar
4648
4749
48== Updating Bug Watches ==50Updating Bug Watches
51--------------------
4952
50Let's set up a BugTracker and some watches for the Example.com Bug53Let's set up a BugTracker and some watches for the Example.com Bug
51Tracker:54Tracker:
diff --git a/lib/lp/bugs/doc/externalbugtracker-roundup-python-bugs.txt b/lib/lp/bugs/doc/externalbugtracker-roundup-python-bugs.txt
index ee95543..4c2916a 100644
--- a/lib/lp/bugs/doc/externalbugtracker-roundup-python-bugs.txt
+++ b/lib/lp/bugs/doc/externalbugtracker-roundup-python-bugs.txt
@@ -1,4 +1,5 @@
1= ExternalBugTracker: Python =1ExternalBugTracker: Python
2==========================
23
3This covers the implementation of the ExternalBugTracker class for4This covers the implementation of the ExternalBugTracker class for
4Python bugwatches.5Python bugwatches.
@@ -11,7 +12,8 @@ common to Roundup and Python instances, see
11externalbugtracker-roundup.txt12externalbugtracker-roundup.txt
1213
1314
14== Status Conversion ==15Status Conversion
16-----------------
1517
16The basic Python bug statuses map to Launchpad bug statuses.18The basic Python bug statuses map to Launchpad bug statuses.
17Roundup.convertRemoteStatus() handles the conversion.19Roundup.convertRemoteStatus() handles the conversion.
diff --git a/lib/lp/bugs/doc/externalbugtracker-roundup.txt b/lib/lp/bugs/doc/externalbugtracker-roundup.txt
index b4f4963..1d369a2 100644
--- a/lib/lp/bugs/doc/externalbugtracker-roundup.txt
+++ b/lib/lp/bugs/doc/externalbugtracker-roundup.txt
@@ -1,10 +1,12 @@
1= ExternalBugTracker: Roundup =1ExternalBugTracker: Roundup
2===========================
23
3This covers the implementation of the ExternalBugTracker class for Roundup4This covers the implementation of the ExternalBugTracker class for Roundup
4bugwatches.5bugwatches.
56
67
7== Basics ==8Basics
9------
810
9The ExternalBugTracker descendant class which implements methods for updating11The ExternalBugTracker descendant class which implements methods for updating
10bug watches on Roundup bug trackers is externalbugtracker.Roundup, which12bug watches on Roundup bug trackers is externalbugtracker.Roundup, which
@@ -22,7 +24,8 @@ implements IExternalBugTracker.
22 True24 True
2325
2426
25== Status Conversion ==27Status Conversion
28-----------------
2629
27The basic Roundup bug statuses (i.e. those available by default in new30The basic Roundup bug statuses (i.e. those available by default in new
28Roundup instances) map to Launchpad bug statuses.31Roundup instances) map to Launchpad bug statuses.
@@ -70,7 +73,8 @@ understand an UnknownRemoteStatusError will be raised.
70 lp.bugs.externalbugtracker.base.UnknownRemoteStatusError: Unrecognized value for field 1 (status): eggs73 lp.bugs.externalbugtracker.base.UnknownRemoteStatusError: Unrecognized value for field 1 (status): eggs
7174
7275
73== Initialization ==76Initialization
77--------------
7478
75Calling initializeRemoteBugDB() on our Roundup instance and passing it a set79Calling initializeRemoteBugDB() on our Roundup instance and passing it a set
76of remote bug IDs will fetch those bug IDs from the server and file them in a80of remote bug IDs will fetch those bug IDs from the server and file them in a
@@ -88,7 +92,8 @@ avoids relying on a working network connection.
88 [1]92 [1]
8993
9094
91== Export Methods ==95Export Methods
96--------------
9297
93There are two means by which we can export Roundup bug statuses: on a98There are two means by which we can export Roundup bug statuses: on a
94bug-by-bug basis and as a batch. When the number of bugs that need updating is99bug-by-bug basis and as a batch. When the number of bugs that need updating is
@@ -115,7 +120,8 @@ fetched as a batch:
115 GET http://test.roundup/issue?...@startwith=0120 GET http://test.roundup/issue?...@startwith=0
116121
117122
118== Updating Bug Watches ==123Updating Bug Watches
124--------------------
119125
120First, we create some bug watches to test with:126First, we create some bug watches to test with:
121127
diff --git a/lib/lp/bugs/doc/externalbugtracker-rt.txt b/lib/lp/bugs/doc/externalbugtracker-rt.txt
index 215cf9d..2feb460 100644
--- a/lib/lp/bugs/doc/externalbugtracker-rt.txt
+++ b/lib/lp/bugs/doc/externalbugtracker-rt.txt
@@ -1,10 +1,12 @@
1= ExternalBugTracker: RT =1ExternalBugTracker: RT
2======================
23
3This covers the implementation of an ExternalBugTracker class for RT4This covers the implementation of an ExternalBugTracker class for RT
4instances.5instances.
56
67
7== Basics ==8Basics
9------
810
9When importing bugs from remote RT instances, we use an RT-specific11When importing bugs from remote RT instances, we use an RT-specific
10implementation of ExternalBugTracker, RequestTracker.12implementation of ExternalBugTracker, RequestTracker.
@@ -22,7 +24,8 @@ implementation of ExternalBugTracker, RequestTracker.
22 True24 True
2325
2426
25== Authentication Credentials ==27Authentication Credentials
28--------------------------
2629
27RT instances require that we log in to be able to export statuses for30RT instances require that we log in to be able to export statuses for
28their tickets. The RequestTracker ExternalBugTracker class has a31their tickets. The RequestTracker ExternalBugTracker class has a
@@ -45,7 +48,8 @@ configuration files. rt.example.com is known to Launchpad.
45 >>> print(pretty(rt_two.credentials))48 >>> print(pretty(rt_two.credentials))
46 {'pass': 'pangalacticgargleblaster', 'user': 'zaphod'}49 {'pass': 'pangalacticgargleblaster', 'user': 'zaphod'}
4750
48== Status Conversion ==51Status Conversion
52-----------------
4953
50The RequestTracker class can convert the default RT ticket statuses into54The RequestTracker class can convert the default RT ticket statuses into
51Launchpad statuses:55Launchpad statuses:
@@ -72,7 +76,8 @@ result in an UnknownRemoteStatusError being raised.
72 lp.bugs.externalbugtracker.base.UnknownRemoteStatusError: spam76 lp.bugs.externalbugtracker.base.UnknownRemoteStatusError: spam
7377
7478
75== Importance Conversion ==79Importance Conversion
80---------------------
7681
77There is no obvious mapping from ticket priorities to importances. They82There is no obvious mapping from ticket priorities to importances. They
78are all imported as Unknown. No exception is raised, because they are83are all imported as Unknown. No exception is raised, because they are
@@ -82,7 +87,8 @@ all unknown.
82 'Unknown'87 'Unknown'
8388
8489
85== Initialization ==90Initialization
91--------------
8692
87Calling initializeRemoteBugDB() on our RequestTracker instance and93Calling initializeRemoteBugDB() on our RequestTracker instance and
88passing it a set of remote bug IDs will fetch those bug IDs from the94passing it a set of remote bug IDs will fetch those bug IDs from the
@@ -119,7 +125,8 @@ Subsequent requests use this.
119 GET http://example.com/REST/1.0/search/ticket/?...125 GET http://example.com/REST/1.0/search/ticket/?...
120126
121127
122== Export Methods ==128Export Methods
129--------------
123130
124There are two means by which we can export RT bug statuses: on a131There are two means by which we can export RT bug statuses: on a
125bug-by-bug basis and as a batch. When the number of bugs that need132bug-by-bug basis and as a batch. When the number of bugs that need
@@ -166,7 +173,8 @@ This can also be demonstrated for importing bugs as a batch:
166 ...173 ...
167 lp.bugs.externalbugtracker.base.BugTrackerConnectError: ...174 lp.bugs.externalbugtracker.base.BugTrackerConnectError: ...
168175
169== Updating Bug Watches ==176Updating Bug Watches
177--------------------
170178
171First, we create some bug watches to test with. Example.com hosts an RT179First, we create some bug watches to test with. Example.com hosts an RT
172instance which has several bugs that we wish to watch:180instance which has several bugs that we wish to watch:
@@ -252,7 +260,8 @@ statuses:
252 Remote bug 1589: Invalid260 Remote bug 1589: Invalid
253261
254262
255== Getting the remote product for a bug ==263Getting the remote product for a bug
264------------------------------------
256265
257It's possible to get the remote product for a remote RT bug using266It's possible to get the remote product for a remote RT bug using
258getRemoteProduct(). In the case of RT, what we refer to in Launchpad as267getRemoteProduct(). In the case of RT, what we refer to in Launchpad as
diff --git a/lib/lp/bugs/doc/externalbugtracker-sourceforge.txt b/lib/lp/bugs/doc/externalbugtracker-sourceforge.txt
index bcaf316..707bbb4 100644
--- a/lib/lp/bugs/doc/externalbugtracker-sourceforge.txt
+++ b/lib/lp/bugs/doc/externalbugtracker-sourceforge.txt
@@ -1,10 +1,12 @@
1= ExternalBugTracker: SourceForge =1ExternalBugTracker: SourceForge
2===============================
23
3This covers the implementation of the ExternalBugTracker class for4This covers the implementation of the ExternalBugTracker class for
4SourceForge bugwatches.5SourceForge bugwatches.
56
67
7== Basics ==8Basics
9------
810
9The ExternalBugTracker descendant class which implements methods for11The ExternalBugTracker descendant class which implements methods for
10updating bug watches on SourceForge bug trackers is12updating bug watches on SourceForge bug trackers is
@@ -20,7 +22,8 @@ externalbugtracker.SourceForge, which implements IExternalBugTracker.
20 True22 True
2123
2224
23== Status Conversion ==25Status Conversion
26-----------------
2427
25The SourceForge bug status/resolution combinations map to Launchpad bug28The SourceForge bug status/resolution combinations map to Launchpad bug
26statuses. SourceForge.convertRemoteStatus() handles the conversion.29statuses. SourceForge.convertRemoteStatus() handles the conversion.
@@ -73,7 +76,8 @@ understand an UnknownRemoteStatusError will be raised.
73 lp.bugs.externalbugtracker.base.UnknownRemoteStatusError: eggs76 lp.bugs.externalbugtracker.base.UnknownRemoteStatusError: eggs
7477
7578
76== Initialization ==79Initialization
80--------------
7781
78Calling initializeRemoteBugDB() on our SourceForge instance and passing82Calling initializeRemoteBugDB() on our SourceForge instance and passing
79it a set of remote bug IDs will fetch those bug IDs from the server and83it a set of remote bug IDs will fetch those bug IDs from the server and
@@ -136,7 +140,8 @@ a PrivateRemoteBug error.
136 lp.bugs.externalbugtracker.base.PrivateRemoteBug: Bug 99 on http://example.com is private.140 lp.bugs.externalbugtracker.base.PrivateRemoteBug: Bug 99 on http://example.com is private.
137141
138142
139== Updating Bug Watches ==143Updating Bug Watches
144--------------------
140145
141First, we create some bug watches to test with. Example.com hosts a146First, we create some bug watches to test with. Example.com hosts a
142SourceForge instance which has several bugs that we wish to watch:147SourceForge instance which has several bugs that we wish to watch:
@@ -260,7 +265,8 @@ statuses:
260 Remote bug 1722259: Won't Fix265 Remote bug 1722259: Won't Fix
261266
262267
263== Getting the remote product for a bug ==268Getting the remote product for a bug
269------------------------------------
264270
265It's possible to get the remote product for a bug by calling271It's possible to get the remote product for a bug by calling
266SourceForge.getRemoteProduct(). In SourceForge's case, what we refer to272SourceForge.getRemoteProduct(). In SourceForge's case, what we refer to
diff --git a/lib/lp/bugs/doc/externalbugtracker-trac.txt b/lib/lp/bugs/doc/externalbugtracker-trac.txt
index 2dc976a..53df563 100644
--- a/lib/lp/bugs/doc/externalbugtracker-trac.txt
+++ b/lib/lp/bugs/doc/externalbugtracker-trac.txt
@@ -1,10 +1,12 @@
1= ExternalBugTracker: Trac =1ExternalBugTracker: Trac
2========================
23
3This covers the implementation of the ExternalBugTracker class for Trac4This covers the implementation of the ExternalBugTracker class for Trac
4bugwatches.5bugwatches.
56
67
7== Basics ==8Basics
9------
810
9The ExternalBugTracker descendant class which implements methods for updating11The ExternalBugTracker descendant class which implements methods for updating
10bug watches on Trac bug trackers is externalbugtracker.Trac, which implements12bug watches on Trac bug trackers is externalbugtracker.Trac, which implements
@@ -21,7 +23,8 @@ IExternalBugTracker.
21 True23 True
2224
2325
24== LP plugin ==26LP plugin
27---------
2528
26Some Trac instances have a plugin installed to make it easier for us to29Some Trac instances have a plugin installed to make it easier for us to
27communicate with them. getExternalBugTrackerToUse() probes the bug30communicate with them. getExternalBugTrackerToUse() probes the bug
@@ -99,7 +102,8 @@ persists.
99 True102 True
100103
101104
102== Status Conversion ==105Status Conversion
106-----------------
103107
104The basic Trac ticket statuses map to Launchpad bug statuses.108The basic Trac ticket statuses map to Launchpad bug statuses.
105Trac.convertRemoteStatus() handles the conversion.109Trac.convertRemoteStatus() handles the conversion.
@@ -140,7 +144,8 @@ an UnknownRemoteStatusError will be raised.
140 lp.bugs.externalbugtracker.base.UnknownRemoteStatusError: eggs144 lp.bugs.externalbugtracker.base.UnknownRemoteStatusError: eggs
141145
142146
143== Initialization ==147Initialization
148--------------
144149
145Calling initializeRemoteBugDB() on our Trac instance and passing it a set of150Calling initializeRemoteBugDB() on our Trac instance and passing it a set of
146remote bug IDs will fetch those bug IDs from the server and file them in a151remote bug IDs will fetch those bug IDs from the server and file them in a
@@ -164,7 +169,8 @@ If we initialize with a different set of keys we overwrite the first set:
164 [6, 7, 8, 9, 10, 11, 12]169 [6, 7, 8, 9, 10, 11, 12]
165170
166171
167== Export Methods ==172Export Methods
173--------------
168174
169There are two means by which we can export Trac bug statuses: on a bug-by-bug175There are two means by which we can export Trac bug statuses: on a bug-by-bug
170basis and as a batch. When the number of bugs that need updating is less than176basis and as a batch. When the number of bugs that need updating is less than
@@ -263,7 +269,8 @@ export, it will raise an UnparsableBugData error.
263 lp.bugs.externalbugtracker.base.UnparsableBugData: External bugtracker http://test.trac does not define all the necessary fields for bug status imports (Defined field names: ['<html>']).269 lp.bugs.externalbugtracker.base.UnparsableBugData: External bugtracker http://test.trac does not define all the necessary fields for bug status imports (Defined field names: ['<html>']).
264270
265271
266== Updating Bug Watches ==272Updating Bug Watches
273--------------------
267274
268First, we create some bug watches to test with:275First, we create some bug watches to test with:
269276
diff --git a/lib/lp/bugs/doc/product-update-remote-product-script.txt b/lib/lp/bugs/doc/product-update-remote-product-script.txt
index 4f76945..c0801b6 100644
--- a/lib/lp/bugs/doc/product-update-remote-product-script.txt
+++ b/lib/lp/bugs/doc/product-update-remote-product-script.txt
@@ -1,4 +1,5 @@
1== update-remote-product.py ==1update-remote-product.py
2------------------------
23
3The script that uses RemoteProductUpdater is update-remote-product.py.4The script that uses RemoteProductUpdater is update-remote-product.py.
45
diff --git a/lib/lp/bugs/doc/products-with-no-remote-product.txt b/lib/lp/bugs/doc/products-with-no-remote-product.txt
index 6646de1..bb3d587 100644
--- a/lib/lp/bugs/doc/products-with-no-remote-product.txt
+++ b/lib/lp/bugs/doc/products-with-no-remote-product.txt
@@ -1,4 +1,5 @@
1= Products with no remote_product =1Products with no remote_product
2===============================
23
3Product.remote_product is used to keep track of which remote product in4Product.remote_product is used to keep track of which remote product in
4an upstream bug tracker, a Product registered in Launchpad corresponds5an upstream bug tracker, a Product registered in Launchpad corresponds
diff --git a/lib/lp/bugs/doc/treelookup.txt b/lib/lp/bugs/doc/treelookup.txt
index 7dfd661..7ef5b4e 100644
--- a/lib/lp/bugs/doc/treelookup.txt
+++ b/lib/lp/bugs/doc/treelookup.txt
@@ -1,4 +1,5 @@
1= Doing lookups in a tree =1Doing lookups in a tree
2=======================
23
3 >>> from lp.bugs.adapters.treelookup import (4 >>> from lp.bugs.adapters.treelookup import (
4 ... LookupBranch, LookupTree)5 ... LookupBranch, LookupTree)
@@ -35,7 +36,8 @@ tree, because it would not make sense for it to appear in any other
35position.36position.
3637
3738
38== Creation ==39Creation
40--------
3941
40 >>> tree = LookupTree(42 >>> tree = LookupTree(
41 ... ('Snack', LookupTree(43 ... ('Snack', LookupTree(
@@ -92,7 +94,8 @@ instances), `LookupTree._verify` also checks that every branch is a
92 TypeError: Not a LookupBranch: ...'Greenland'94 TypeError: Not a LookupBranch: ...'Greenland'
9395
9496
95== Searching ==97Searching
98---------
9699
97Just call `tree.find`.100Just call `tree.find`.
98101
@@ -113,7 +116,8 @@ But an exception is raised if it does not reach a leaf.
113 KeyError: ...'Snack'116 KeyError: ...'Snack'
114117
115118
116== Development ==119Development
120-----------
117121
118`LookupTree` makes development easy, because `describe` gives a122`LookupTree` makes development easy, because `describe` gives a
119complete description of the tree you've created.123complete description of the tree you've created.
@@ -152,7 +156,8 @@ Simple keys are shown without quotes, to aid readability, and default
152branches are shown with '*' as the key.156branches are shown with '*' as the key.
153157
154158
155== Pruning ==159Pruning
160-------
156161
157During tree creation, branches which have keys that already appear in162During tree creation, branches which have keys that already appear in
158earlier branches are cloned and have those already seen keys163earlier branches are cloned and have those already seen keys
@@ -180,7 +185,8 @@ branches with keys are candidates for being discarded.
180 )185 )
181186
182187
183== Documentation ==188Documentation
189-------------
184190
185You can discover the minimum and maximum depth of a tree.191You can discover the minimum and maximum depth of a tree.
186192
diff --git a/lib/lp/bugs/stories/bug-also-affects/xx-also-affects-distribution-default-values.txt b/lib/lp/bugs/stories/bug-also-affects/xx-also-affects-distribution-default-values.txt
index f5c7d6e..c6a1a27 100644
--- a/lib/lp/bugs/stories/bug-also-affects/xx-also-affects-distribution-default-values.txt
+++ b/lib/lp/bugs/stories/bug-also-affects/xx-also-affects-distribution-default-values.txt
@@ -1,4 +1,5 @@
1= Default values on the +distrotask form =1Default values on the +distrotask form
2======================================
23
3Source packages often share names across distributions, especially4Source packages often share names across distributions, especially
4Debian and Ubuntu. So when you want to indicate that the bug affects5Debian and Ubuntu. So when you want to indicate that the bug affects
diff --git a/lib/lp/bugs/stories/bug-also-affects/xx-also-affects-new-upstream.txt b/lib/lp/bugs/stories/bug-also-affects/xx-also-affects-new-upstream.txt
index cbfe9a9..876f24e 100644
--- a/lib/lp/bugs/stories/bug-also-affects/xx-also-affects-new-upstream.txt
+++ b/lib/lp/bugs/stories/bug-also-affects/xx-also-affects-new-upstream.txt
@@ -1,4 +1,5 @@
1= Registering an upstream affected by a given bug =1Registering an upstream affected by a given bug
2===============================================
23
3The test browser does not support javascript4The test browser does not support javascript
4 >>> user_browser.open(5 >>> user_browser.open(
@@ -93,7 +94,8 @@ the bug as affecting another (unregistered) upstream.
93 The Bar Project ... auto-bugs.foo.org #12394 The Bar Project ... auto-bugs.foo.org #123
94 The Bar Project ... auto-bugs.foo.org #42195 The Bar Project ... auto-bugs.foo.org #421
9596
96== Error handling ==97Error handling
98--------------
9799
98If the URL of the remote bug is not recognized by Launchpad, we'll tell the100If the URL of the remote bug is not recognized by Launchpad, we'll tell the
99user and ask them to check if it's correct.101user and ask them to check if it's correct.
diff --git a/lib/lp/bugs/stories/bug-also-affects/xx-bugtracker-information.txt b/lib/lp/bugs/stories/bug-also-affects/xx-bugtracker-information.txt
index 3ea9322..a238e64 100644
--- a/lib/lp/bugs/stories/bug-also-affects/xx-bugtracker-information.txt
+++ b/lib/lp/bugs/stories/bug-also-affects/xx-bugtracker-information.txt
@@ -1,4 +1,5 @@
1= Bug tracker information =1Bug tracker information
2=======================
23
3If a product doesn't use Launchpad to track its bugs, there's4If a product doesn't use Launchpad to track its bugs, there's
4information about the product's bug tracker when adding an upstream5information about the product's bug tracker when adding an upstream
diff --git a/lib/lp/bugs/stories/bug-also-affects/xx-duplicate-bugwatches.txt b/lib/lp/bugs/stories/bug-also-affects/xx-duplicate-bugwatches.txt
index 9d380cf..53c99f1 100644
--- a/lib/lp/bugs/stories/bug-also-affects/xx-duplicate-bugwatches.txt
+++ b/lib/lp/bugs/stories/bug-also-affects/xx-duplicate-bugwatches.txt
@@ -1,6 +1,8 @@
1= Duplicate bug watches =1Duplicate bug watches
2=====================
23
3== Adding the same bug watch twice to a bug ==4Adding the same bug watch twice to a bug
5----------------------------------------
46
5When adding bug watches, existing bug watches are re-used if there7When adding bug watches, existing bug watches are re-used if there
6already is one pointing to the same remote bug. For example, let's start8already is one pointing to the same remote bug. For example, let's start
@@ -64,7 +66,8 @@ same bug watch.
64 pmount (Debian) ... Unknown Unknown debbugs #4266 pmount (Debian) ... Unknown Unknown debbugs #42
6567
6668
67== Adding the same bug watch to two different bugs ==69Adding the same bug watch to two different bugs
70-----------------------------------------------
6871
69If a bug watch which is already added to another bug is added, a72If a bug watch which is already added to another bug is added, a
70notification is added linking to the bug. This is useful for detecting73notification is added linking to the bug. This is useful for detecting
diff --git a/lib/lp/bugs/stories/bug-also-affects/xx-request-distribution-no-release-fix.txt b/lib/lp/bugs/stories/bug-also-affects/xx-request-distribution-no-release-fix.txt
index a840405..072ba0a 100644
--- a/lib/lp/bugs/stories/bug-also-affects/xx-request-distribution-no-release-fix.txt
+++ b/lib/lp/bugs/stories/bug-also-affects/xx-request-distribution-no-release-fix.txt
@@ -1,10 +1,12 @@
1= Requesting a fix for a distribution with no current release =1Requesting a fix for a distribution with no current release
2===========================================================
23
3Sometimes a distribution might not have any releases, thus it won't have4Sometimes a distribution might not have any releases, thus it won't have
4a current release either. In this case it will still be possible to5a current release either. In this case it will still be possible to
5request a fix for these releases.6request a fix for these releases.
67
7== A distribution using Launchpad ==8A distribution using Launchpad
9------------------------------
810
9Gentoo is currently using Launchpad.11Gentoo is currently using Launchpad.
1012
@@ -22,7 +24,8 @@ Any user can request a fix for it.
22 >>> user_browser.url24 >>> user_browser.url
23 'http://bugs.launchpad.test/gentoo/+bug/4'25 'http://bugs.launchpad.test/gentoo/+bug/4'
2426
25== A distribution not using Launchpad ==27A distribution not using Launchpad
28----------------------------------
2629
27If we change Gentoo not to use Launchpad, any user can still add a task and30If we change Gentoo not to use Launchpad, any user can still add a task and
28link to a external bug for it.31link to a external bug for it.
diff --git a/lib/lp/bugs/stories/bug-also-affects/xx-upstream-bugtracker-links.txt b/lib/lp/bugs/stories/bug-also-affects/xx-upstream-bugtracker-links.txt
index 9cc69fc..1d29a68 100644
--- a/lib/lp/bugs/stories/bug-also-affects/xx-upstream-bugtracker-links.txt
+++ b/lib/lp/bugs/stories/bug-also-affects/xx-upstream-bugtracker-links.txt
@@ -1,4 +1,5 @@
1= Links to upstream bug trackers =1Links to upstream bug trackers
2==============================
23
3Sometimes people will want to mark a bug as being upstream but will4Sometimes people will want to mark a bug as being upstream but will
4either not know what the bug's upstream URL is or will know that the bug5either not know what the bug's upstream URL is or will know that the bug
diff --git a/lib/lp/bugs/stories/bug-release-management/nomination-navigation.txt b/lib/lp/bugs/stories/bug-release-management/nomination-navigation.txt
index 5c951e4..b974d94 100644
--- a/lib/lp/bugs/stories/bug-release-management/nomination-navigation.txt
+++ b/lib/lp/bugs/stories/bug-release-management/nomination-navigation.txt
@@ -1,4 +1,5 @@
1= Bug nomination navigation =1Bug nomination navigation
2=========================
23
3Most people don't see the separate page for approving or declining a4Most people don't see the separate page for approving or declining a
4release nomination for a bug, because it's handled using an expandable5release nomination for a bug, because it's handled using an expandable
diff --git a/lib/lp/bugs/stories/bug-tags/xx-searching-for-tags.txt b/lib/lp/bugs/stories/bug-tags/xx-searching-for-tags.txt
index c51e388..4c45b07 100644
--- a/lib/lp/bugs/stories/bug-tags/xx-searching-for-tags.txt
+++ b/lib/lp/bugs/stories/bug-tags/xx-searching-for-tags.txt
@@ -1,4 +1,5 @@
1= Searching for bug tags =1Searching for bug tags
2======================
23
3On the advanced search page it's possible to search for a specific tag.4On the advanced search page it's possible to search for a specific tag.
45
@@ -38,7 +39,8 @@ If an invalid tag name is entered, an error message will be displayed.
38 allowed after the first character.39 allowed after the first character.
3940
4041
41== Cross-Site Scripting, or XSS ==42Cross-Site Scripting, or XSS
43----------------------------
4244
43The tags field and its related messages are properly escaped in order45The tags field and its related messages are properly escaped in order
44to prevent XSS.46to prevent XSS.
diff --git a/lib/lp/bugs/stories/bugattachments/xx-delete-bug-attachment.txt b/lib/lp/bugs/stories/bugattachments/xx-delete-bug-attachment.txt
index b9f7292..00561d1 100644
--- a/lib/lp/bugs/stories/bugattachments/xx-delete-bug-attachment.txt
+++ b/lib/lp/bugs/stories/bugattachments/xx-delete-bug-attachment.txt
@@ -1,4 +1,5 @@
1= Deleting bug attachments =1Deleting bug attachments
2========================
23
3If some attachment gets added which isn't relevant to the bug, it can be4If some attachment gets added which isn't relevant to the bug, it can be
4deleted again from the bug attachment edit page.5deleted again from the bug attachment edit page.
diff --git a/lib/lp/bugs/stories/bugattachments/xx-display-filesize-attachment.txt b/lib/lp/bugs/stories/bugattachments/xx-display-filesize-attachment.txt
index 83571e0..4d94cd4 100644
--- a/lib/lp/bugs/stories/bugattachments/xx-display-filesize-attachment.txt
+++ b/lib/lp/bugs/stories/bugattachments/xx-display-filesize-attachment.txt
@@ -1,4 +1,5 @@
1== Display of filesize and mime type of attachments ==1Display of filesize and mime type of attachments
2------------------------------------------------
23
3File size and mime type are displayed for each attachment4File size and mime type are displayed for each attachment
45
diff --git a/lib/lp/bugs/stories/bugs/xx-add-comment-bugtask-edit.txt b/lib/lp/bugs/stories/bugs/xx-add-comment-bugtask-edit.txt
index d2e6dcb..1698d19 100644
--- a/lib/lp/bugs/stories/bugs/xx-add-comment-bugtask-edit.txt
+++ b/lib/lp/bugs/stories/bugs/xx-add-comment-bugtask-edit.txt
@@ -1,4 +1,5 @@
1= Add a comment while editing the bugtask =1Add a comment while editing the bugtask
2=======================================
23
3When editing a bug task it's possible to add a comment as well. It's not4When editing a bug task it's possible to add a comment as well. It's not
4necessary to actually edit the bug task in order to add the comment,5necessary to actually edit the bug task in order to add the comment,
diff --git a/lib/lp/bugs/stories/bugs/xx-add-comment-distribution-no-current-release.txt b/lib/lp/bugs/stories/bugs/xx-add-comment-distribution-no-current-release.txt
index b90a49f..f68811c 100644
--- a/lib/lp/bugs/stories/bugs/xx-add-comment-distribution-no-current-release.txt
+++ b/lib/lp/bugs/stories/bugs/xx-add-comment-distribution-no-current-release.txt
@@ -1,4 +1,5 @@
1= Add a comment on a bug on a distribution with no current release =1Add a comment on a bug on a distribution with no current release
2================================================================
23
3If a bug is reported distribution with no current release, like Gentoo,4If a bug is reported distribution with no current release, like Gentoo,
4it's still possible to add comments to the bug.5it's still possible to add comments to the bug.
diff --git a/lib/lp/bugs/stories/bugs/xx-add-comment-with-bugwatch-and-cve.txt b/lib/lp/bugs/stories/bugs/xx-add-comment-with-bugwatch-and-cve.txt
index 6228d8c..147cc45 100644
--- a/lib/lp/bugs/stories/bugs/xx-add-comment-with-bugwatch-and-cve.txt
+++ b/lib/lp/bugs/stories/bugs/xx-add-comment-with-bugwatch-and-cve.txt
@@ -1,4 +1,5 @@
1= links to remote bug reports and CVEs in bug comments =1links to remote bug reports and CVEs in bug comments
2====================================================
23
3When a comment is added to a bug, links to "remote" bug reports and CVEs are4When a comment is added to a bug, links to "remote" bug reports and CVEs are
4added to the bugwatches resp CVEs related to this bug5added to the bugwatches resp CVEs related to this bug
diff --git a/lib/lp/bugs/stories/bugs/xx-bug-affects-me-too.txt b/lib/lp/bugs/stories/bugs/xx-bug-affects-me-too.txt
index e1c6458..33ce24b 100644
--- a/lib/lp/bugs/stories/bugs/xx-bug-affects-me-too.txt
+++ b/lib/lp/bugs/stories/bugs/xx-bug-affects-me-too.txt
@@ -1,4 +1,5 @@
1= Marking a bug as affecting the user =1Marking a bug as affecting the user
2===================================
23
3Users can mark bugs as affecting them. Let's create a sample bug to4Users can mark bugs as affecting them. Let's create a sample bug to
4try this out.5try this out.
@@ -66,7 +67,8 @@ Back at the bug page, the text changes once again.
66 This bug affects 1 person, but not you67 This bug affects 1 person, but not you
6768
6869
69== Anonymous users ==70Anonymous users
71---------------
7072
71Anonymous users just see the number of affected users.73Anonymous users just see the number of affected users.
7274
@@ -87,7 +89,8 @@ appear at all to anonymous users.
87 None89 None
8890
8991
90== Static and dynamic support ==92Static and dynamic support
93--------------------------
9194
92A bug page contains markup to support both static (no Javascript) and95A bug page contains markup to support both static (no Javascript) and
93dynamic (Javascript enabled) scenarios.96dynamic (Javascript enabled) scenarios.
diff --git a/lib/lp/bugs/stories/bugs/xx-bug-heat-on-bug-page.txt b/lib/lp/bugs/stories/bugs/xx-bug-heat-on-bug-page.txt
index d42f14c..141f6e8 100644
--- a/lib/lp/bugs/stories/bugs/xx-bug-heat-on-bug-page.txt
+++ b/lib/lp/bugs/stories/bugs/xx-bug-heat-on-bug-page.txt
@@ -1,4 +1,5 @@
1= Bug heat on bug page =1Bug heat on bug page
2====================
23
3Bug heat appears on the bug index page:4Bug heat appears on the bug index page:
45
diff --git a/lib/lp/bugs/stories/bugs/xx-bug-hidden-comments.txt b/lib/lp/bugs/stories/bugs/xx-bug-hidden-comments.txt
index e92f1ef..31fb476 100644
--- a/lib/lp/bugs/stories/bugs/xx-bug-hidden-comments.txt
+++ b/lib/lp/bugs/stories/bugs/xx-bug-hidden-comments.txt
@@ -1,4 +1,5 @@
1= Hide bug comments =1Hide bug comments
2=================
23
3Comments that have had their visible attribute set to False4Comments that have had their visible attribute set to False
4will not show up when browsing the comment list for a bug.5will not show up when browsing the comment list for a bug.
diff --git a/lib/lp/bugs/stories/bugs/xx-bug-nomination-table-row.txt b/lib/lp/bugs/stories/bugs/xx-bug-nomination-table-row.txt
index b1697d3..f5b0609 100644
--- a/lib/lp/bugs/stories/bugs/xx-bug-nomination-table-row.txt
+++ b/lib/lp/bugs/stories/bugs/xx-bug-nomination-table-row.txt
@@ -1,4 +1,5 @@
1= Bug nominations =1Bug nominations
2===============
23
3Bug nominations are displayed in the table at the top of the bug page,4Bug nominations are displayed in the table at the top of the bug page,
4using the +bugtasks-and-nominations-table-row view. This view allows5using the +bugtasks-and-nominations-table-row view. This view allows
diff --git a/lib/lp/bugs/stories/bugs/xx-bug-text-pages.txt b/lib/lp/bugs/stories/bugs/xx-bug-text-pages.txt
index aedbffd..d2e9c6d 100644
--- a/lib/lp/bugs/stories/bugs/xx-bug-text-pages.txt
+++ b/lib/lp/bugs/stories/bugs/xx-bug-text-pages.txt
@@ -1,4 +1,5 @@
1= Bug Text Pages =1Bug Text Pages
2==============
23
3Launchpad provides a way for users to view textual descriptions of bug reports,4Launchpad provides a way for users to view textual descriptions of bug reports,
4as an alternative to the graphical user interface.5as an alternative to the graphical user interface.
@@ -43,7 +44,8 @@ toggle away from Fix Released we must be the target owner):
43 >>> flush_database_updates()44 >>> flush_database_updates()
4445
4546
46== Text Pages from a Bug Context ==47Text Pages from a Bug Context
48-----------------------------
4749
48Users can view a textual description of any bug at that bug's text page,50Users can view a textual description of any bug at that bug's text page,
49according to the following URL pattern:51according to the following URL pattern:
@@ -167,7 +169,8 @@ The comments are represented as a MIME message.
167 comment for file with space169 comment for file with space
168170
169171
170== Text Pages from a Bug Task Context ==172Text Pages from a Bug Task Context
173----------------------------------
171174
172Users can also view a textual description of a bug from the context of a task175Users can also view a textual description of a bug from the context of a task
173relating to that bug, according to the following URL pattern:176relating to that bug, according to the following URL pattern:
@@ -234,7 +237,8 @@ The only differences are the download URLs of bug attachments:
234 http://bugs.launchpad.test/bugs/1/.../+files/bug-patch.diff text/plain237 http://bugs.launchpad.test/bugs/1/.../+files/bug-patch.diff text/plain
235 http://bugs.launchpad.test/firefox/+bug/.../+files/bug-patch.diff text/plain238 http://bugs.launchpad.test/firefox/+bug/.../+files/bug-patch.diff text/plain
236239
237== Duplicate Bugs ==240Duplicate Bugs
241--------------
238242
239When one bug duplicates another bug, the textual description includes the243When one bug duplicates another bug, the textual description includes the
240duplicated bug's ID:244duplicated bug's ID:
@@ -268,7 +272,8 @@ duplicate bug IDs:
268 ...272 ...
269273
270274
271== Bug Lists ==275Bug Lists
276---------
272277
273Users can also see a list of all bug IDs for a given target by viewing that278Users can also see a list of all bug IDs for a given target by viewing that
274product's bugs text page, according to the following URL pattern:279product's bugs text page, according to the following URL pattern:
@@ -322,7 +327,8 @@ This page is also available for project groups.
322 4327 4
323328
324329
325== Private bugs ==330Private bugs
331------------
326332
327When a bug is private, the textual description reflects this:333When a bug is private, the textual description reflects this:
328334
diff --git a/lib/lp/bugs/stories/bugs/xx-distributionsourcepackage-bugs.txt b/lib/lp/bugs/stories/bugs/xx-distributionsourcepackage-bugs.txt
index da5542b..4608aa3 100644
--- a/lib/lp/bugs/stories/bugs/xx-distributionsourcepackage-bugs.txt
+++ b/lib/lp/bugs/stories/bugs/xx-distributionsourcepackage-bugs.txt
@@ -1,4 +1,5 @@
1= Distribution Source Package Bugs =1Distribution Source Package Bugs
2================================
23
3This page is like most bug listing pages, but it also has a portlet4This page is like most bug listing pages, but it also has a portlet
4"portlet-publishing-details" giving information about the latest published5"portlet-publishing-details" giving information about the latest published
diff --git a/lib/lp/bugs/stories/bugs/xx-distrorelease-bugs-page.txt b/lib/lp/bugs/stories/bugs/xx-distrorelease-bugs-page.txt
index 7d95a21..5be0bc6 100644
--- a/lib/lp/bugs/stories/bugs/xx-distrorelease-bugs-page.txt
+++ b/lib/lp/bugs/stories/bugs/xx-distrorelease-bugs-page.txt
@@ -1,4 +1,5 @@
1== The Distribution Series Bugs Page ==1The Distribution Series Bugs Page
2---------------------------------
23
3The +bugs page for a distribution series presents some basic information the4The +bugs page for a distribution series presents some basic information the
4bugs, as well as a listing.5bugs, as well as a listing.
@@ -26,7 +27,8 @@ It also has a link to subscribe to bug mail.
26 http://bugs.launchpad.test/ubuntu/warty/+subscribe27 http://bugs.launchpad.test/ubuntu/warty/+subscribe
2728
2829
29== Bugs Fixed Elsewhere ==30Bugs Fixed Elsewhere
31--------------------
3032
31The Bugs frontpage includes the number of bugs that are fixed in some33The Bugs frontpage includes the number of bugs that are fixed in some
32other context.34other context.
@@ -46,7 +48,8 @@ The link takes you to the list of the bugs fixed elsewhere.
46 ...48 ...
4749
4850
49== Expirable Bugs ==51Expirable Bugs
52--------------
5053
51The bugs page displays the number of Incomplete, unattended bugs that54The bugs page displays the number of Incomplete, unattended bugs that
52can expire when the project has enabled bug expiration.55can expire when the project has enabled bug expiration.
diff --git a/lib/lp/bugs/stories/bugs/xx-duplicate-of-private-bug.txt b/lib/lp/bugs/stories/bugs/xx-duplicate-of-private-bug.txt
index 68bf232..c25ee8c 100644
--- a/lib/lp/bugs/stories/bugs/xx-duplicate-of-private-bug.txt
+++ b/lib/lp/bugs/stories/bugs/xx-duplicate-of-private-bug.txt
@@ -1,4 +1,5 @@
1= Showing a duplicate of a private bug =1Showing a duplicate of a private bug
2====================================
23
3When showing a duplicate of a private bug, the title of the private4When showing a duplicate of a private bug, the title of the private
4bug is not included in the page if the user does not have permission5bug is not included in the page if the user does not have permission
diff --git a/lib/lp/bugs/stories/bugs/xx-edit-no-currentrelease-distribution-task.txt b/lib/lp/bugs/stories/bugs/xx-edit-no-currentrelease-distribution-task.txt
index 6a0539e..1d0245d 100644
--- a/lib/lp/bugs/stories/bugs/xx-edit-no-currentrelease-distribution-task.txt
+++ b/lib/lp/bugs/stories/bugs/xx-edit-no-currentrelease-distribution-task.txt
@@ -1,4 +1,5 @@
1= Editing a Distribution task with no current release =1Editing a Distribution task with no current release
2===================================================
23
3If a distribution doesn't have a current release, like Gentoo, it's4If a distribution doesn't have a current release, like Gentoo, it's
4still possible to edit its tasks from the bug page. There are no Gentoo5still possible to edit its tasks from the bug page. There are no Gentoo
diff --git a/lib/lp/bugs/stories/bugs/xx-front-page-search.txt b/lib/lp/bugs/stories/bugs/xx-front-page-search.txt
index c7914a7..7367a15 100644
--- a/lib/lp/bugs/stories/bugs/xx-front-page-search.txt
+++ b/lib/lp/bugs/stories/bugs/xx-front-page-search.txt
@@ -1,4 +1,5 @@
1= Searching from the Bugs front page =1Searching from the Bugs front page
2==================================
23
3It's possible to search bug reports across all of Launchpad from the4It's possible to search bug reports across all of Launchpad from the
4Bugs front page.5Bugs front page.
@@ -14,7 +15,8 @@ Either all projects, or a specific one can be searched.
14 >>> anon_browser.getControl('One project') is not None15 >>> anon_browser.getControl('One project') is not None
15 True16 True
1617
17== Searching all projects ==18Searching all projects
19----------------------
1820
19When choosing to search all the projects, all open bug reports in21When choosing to search all the projects, all open bug reports in
20Launchpad will be searched, and the bug target will be visible in the22Launchpad will be searched, and the bug target will be visible in the
@@ -69,7 +71,8 @@ the form at the front page.
69 >>> anon_browser.title71 >>> anon_browser.title
70 'Search all bug reports'72 'Search all bug reports'
7173
72== Searching one project ==74Searching one project
75---------------------
7376
74If the user chooses to search only one project, they will be forwarded to77If the user chooses to search only one project, they will be forwarded to
75the project's bug listing, and the search will be performed there. If no78the project's bug listing, and the search will be performed there. If no
@@ -116,7 +119,8 @@ support javascript, so a 'Find' link pointing to /bugs is displayed.
116'Project' in this context means either a product, distribution or a119'Project' in this context means either a product, distribution or a
117project group.120project group.
118121
119=== Searching a product ===122Searching a product
123...................
120124
121 >>> anon_browser.open('http://bugs.launchpad.test/')125 >>> anon_browser.open('http://bugs.launchpad.test/')
122 >>> anon_browser.getControl('One project').selected = True126 >>> anon_browser.getControl('One project').selected = True
@@ -131,7 +135,8 @@ project group.
131 7 A test bug Evolution135 7 A test bug Evolution
132 Medium New136 Medium New
133137
134=== Searching a project ===138Searching a project
139...................
135140
136 >>> anon_browser.open('http://bugs.launchpad.test/')141 >>> anon_browser.open('http://bugs.launchpad.test/')
137 >>> anon_browser.getControl('One project').selected = True142 >>> anon_browser.getControl('One project').selected = True
@@ -146,7 +151,8 @@ project group.
146 7 A test bug151 7 A test bug
147 Evolution Medium New152 Evolution Medium New
148153
149=== Searching a distribution ===154Searching a distribution
155........................
150156
151 >>> anon_browser.open('http://bugs.launchpad.test/')157 >>> anon_browser.open('http://bugs.launchpad.test/')
152 >>> anon_browser.getControl('One project').selected = True158 >>> anon_browser.getControl('One project').selected = True
@@ -161,7 +167,8 @@ project group.
161 10 another test bug167 10 another test bug
162 linux-source-2.6.15 (Ubuntu) Medium New168 linux-source-2.6.15 (Ubuntu) Medium New
163169
164=== Jumping to a bug ===170Jumping to a bug
171................
165172
166Like with all other bug searches, it's possible to jump a bug by173Like with all other bug searches, it's possible to jump a bug by
167specifying only the bug id as the search term.174specifying only the bug id as the search term.
diff --git a/lib/lp/bugs/stories/bugs/xx-front-page-statistics.txt b/lib/lp/bugs/stories/bugs/xx-front-page-statistics.txt
index 918a76e..48782c7 100644
--- a/lib/lp/bugs/stories/bugs/xx-front-page-statistics.txt
+++ b/lib/lp/bugs/stories/bugs/xx-front-page-statistics.txt
@@ -1,4 +1,5 @@
1= Launchpad Bug Statistics =1Launchpad Bug Statistics
2========================
23
3The Bugs front page shows some statistics:4The Bugs front page shows some statistics:
45
diff --git a/lib/lp/bugs/stories/bugs/xx-incomplete-bugs.txt b/lib/lp/bugs/stories/bugs/xx-incomplete-bugs.txt
index f93df7f..b54b9f1 100644
--- a/lib/lp/bugs/stories/bugs/xx-incomplete-bugs.txt
+++ b/lib/lp/bugs/stories/bugs/xx-incomplete-bugs.txt
@@ -1,4 +1,5 @@
1= Incomplete bugs =1Incomplete bugs
2===============
23
3Bugs can have their status set to 'Incomplete', to indicate that more4Bugs can have their status set to 'Incomplete', to indicate that more
4information is required before they can be confirmed.5information is required before they can be confirmed.
@@ -79,7 +80,8 @@ incomplete bugs without response.
79 False80 False
8081
8182
82== Bugs that can expire display a notice ==83Bugs that can expire display a notice
84-------------------------------------
8385
84Projects that use Launchpad to track bugs will expire 'Incomplete'86Projects that use Launchpad to track bugs will expire 'Incomplete'
85bugs after the configured expiration age has passed. The rules87bugs after the configured expiration age has passed. The rules
@@ -129,7 +131,8 @@ date. We alter the date_last_updated field of bug 11 to demonstrate this.
129 >>> user_browser.getLink('find out why').url131 >>> user_browser.getLink('find out why').url
130 'https://help.launchpad.net/BugExpiry'132 'https://help.launchpad.net/BugExpiry'
131133
132== The expirable bug search ==134The expirable bug search
135------------------------
133136
134Users can view a list of expirable bugs via a link on the project's137Users can view a list of expirable bugs via a link on the project's
135bug page. To see the behaviour of the bug listing, we need another138bug page. To see the behaviour of the bug listing, we need another
@@ -213,7 +216,8 @@ Jokosher's bug page.
213 12 Copy, Cut and Delete operations should work ...216 12 Copy, Cut and Delete operations should work ...
214217
215218
216== Incomplete bugs that do not expire ==219Incomplete bugs that do not expire
220----------------------------------
217221
218Debian does not use launchpad to track bugs, so its incomplete bugs222Debian does not use launchpad to track bugs, so its incomplete bugs
219cannot expire. No Privileges Person sets a Debian bug to Incomplete,223cannot expire. No Privileges Person sets a Debian bug to Incomplete,
@@ -246,7 +250,8 @@ expirable bugs they read that Debian does not use bug expiration.
246 updating the project's details. See Bugs/Expiry.250 updating the project's details. See Bugs/Expiry.
247251
248252
249== Default search parameters for incomplete bugs ==253Default search parameters for incomplete bugs
254---------------------------------------------
250255
251Default bug searches look for both Incomplete (with response) and256Default bug searches look for both Incomplete (with response) and
252Incomplete (without response) bugs.257Incomplete (without response) bugs.
diff --git a/lib/lp/bugs/stories/bugs/xx-project-bugs-page.txt b/lib/lp/bugs/stories/bugs/xx-project-bugs-page.txt
index 1ac1b71..6d9ad58 100644
--- a/lib/lp/bugs/stories/bugs/xx-project-bugs-page.txt
+++ b/lib/lp/bugs/stories/bugs/xx-project-bugs-page.txt
@@ -1,4 +1,5 @@
1= The ProjectGroup Bugs Page =1The ProjectGroup Bugs Page
2==========================
23
3The default page for a ProjectGroup on the bugs domain shows the bug listing4The default page for a ProjectGroup on the bugs domain shows the bug listing
4for the ProjectGroup.5for the ProjectGroup.
diff --git a/lib/lp/bugs/stories/bugs/xx-unique-ids-on-bug-page.txt b/lib/lp/bugs/stories/bugs/xx-unique-ids-on-bug-page.txt
index 5fc9584..b183d8f 100644
--- a/lib/lp/bugs/stories/bugs/xx-unique-ids-on-bug-page.txt
+++ b/lib/lp/bugs/stories/bugs/xx-unique-ids-on-bug-page.txt
@@ -1,4 +1,5 @@
1= Inline Editing of BugTasks =1Inline Editing of BugTasks
2==========================
23
3On the bug page, the bugtasks are editable inline. This means that4On the bug page, the bugtasks are editable inline. This means that
4basically the same form is included on the page for each bugtask. Even5basically the same form is included on the page for each bugtask. Even
diff --git a/lib/lp/bugs/stories/bugtask-management/xx-bug-privileged-statuses.txt b/lib/lp/bugs/stories/bugtask-management/xx-bug-privileged-statuses.txt
index fe928ec..ff2d0cd 100644
--- a/lib/lp/bugs/stories/bugtask-management/xx-bug-privileged-statuses.txt
+++ b/lib/lp/bugs/stories/bugtask-management/xx-bug-privileged-statuses.txt
@@ -1,4 +1,5 @@
1= Bug Privileged Statuses =1Bug Privileged Statuses
2=======================
23
3Some statuses, e.g. Won't Fix, are restricted. Only members of the Bug4Some statuses, e.g. Won't Fix, are restricted. Only members of the Bug
4Supervisor team may change a bug to that status.5Supervisor team may change a bug to that status.
@@ -7,7 +8,8 @@ Supervisor team may change a bug to that status.
7 >>> def print_highlighted_bugtask(browser):8 >>> def print_highlighted_bugtask(browser):
8 ... print_bug_affects_table(browser.contents, highlighted_only=True)9 ... print_bug_affects_table(browser.contents, highlighted_only=True)
910
10== Unprivileged users ==11Unprivileged users
12------------------
1113
12 >>> user_browser.open(14 >>> user_browser.open(
13 ... 'http://bugs.launchpad.test/ubuntu/+source/'15 ... 'http://bugs.launchpad.test/ubuntu/+source/'
@@ -50,7 +52,8 @@ those statuses are not shown in the UI:
50 ...52 ...
51 zope.testbrowser.browser.ItemNotFoundError: Triaged53 zope.testbrowser.browser.ItemNotFoundError: Triaged
5254
53== Bug Supervisor ==55Bug Supervisor
56--------------
5457
55Ubuntu needs a Bug Supervisor first of all:58Ubuntu needs a Bug Supervisor first of all:
5659
diff --git a/lib/lp/bugs/stories/bugtask-management/xx-edit-email-address-bugtask.txt b/lib/lp/bugs/stories/bugtask-management/xx-edit-email-address-bugtask.txt
index f42e154..a238b7c 100644
--- a/lib/lp/bugs/stories/bugtask-management/xx-edit-email-address-bugtask.txt
+++ b/lib/lp/bugs/stories/bugtask-management/xx-edit-email-address-bugtask.txt
@@ -1,4 +1,5 @@
1= Editing Email Address bugtasks =1Editing Email Address bugtasks
2==============================
23
3 >>> import transaction4 >>> import transaction
4 >>> from zope.component import getUtility5 >>> from zope.component import getUtility
@@ -34,7 +35,8 @@
34 ... print('Status: %s\nImportance: %s' % (status, importance))35 ... print('Status: %s\nImportance: %s' % (status, importance))
3536
3637
37== "Normal" (not Email Address) bugtasks ==38"Normal" (not Email Address) bugtasks
39-------------------------------------
3840
39Normally, it's not possible to edit the status or importance of a41Normally, it's not possible to edit the status or importance of a
40bugtask associated with a bugwatch that is linked to an external bug42bugtask associated with a bugwatch that is linked to an external bug
@@ -95,7 +97,8 @@ And the bug supervisor can't see the widgets either.
95 Importance: False97 Importance: False
9698
9799
98== Email Address bugtasks ==100Email Address bugtasks
101----------------------
99102
100The status and importance of a bugtask with an email address bugwatch103The status and importance of a bugtask with an email address bugwatch
101will be editable.104will be editable.
diff --git a/lib/lp/bugs/stories/bugtask-searches/xx-filter-by-linked-branches.txt b/lib/lp/bugs/stories/bugtask-searches/xx-filter-by-linked-branches.txt
index 2d0e8fe..a7514ff 100644
--- a/lib/lp/bugs/stories/bugtask-searches/xx-filter-by-linked-branches.txt
+++ b/lib/lp/bugs/stories/bugtask-searches/xx-filter-by-linked-branches.txt
@@ -1,4 +1,5 @@
1= Searching for bugs with linked branches =1Searching for bugs with linked branches
2=======================================
23
3Using the "advanced search" form, we can limit a bug task search4Using the "advanced search" form, we can limit a bug task search
4to bugs that are linked to branches or to bugs that are not linked5to bugs that are linked to branches or to bugs that are not linked
diff --git a/lib/lp/bugs/stories/bugtask-searches/xx-listing-basics.txt b/lib/lp/bugs/stories/bugtask-searches/xx-listing-basics.txt
index 2076c5b..e6921f7 100644
--- a/lib/lp/bugs/stories/bugtask-searches/xx-listing-basics.txt
+++ b/lib/lp/bugs/stories/bugtask-searches/xx-listing-basics.txt
@@ -1,4 +1,5 @@
1= Bug listings =1Bug listings
2============
23
3This test looks at various aspects of bug listings. Here's a very basic4This test looks at various aspects of bug listings. Here's a very basic
4use case: Sample Person views the bug task listing for the Mozilla5use case: Sample Person views the bug task listing for the Mozilla
@@ -35,7 +36,8 @@ But you can make it show fixed ones to:
35 8 Printing doesn't work mozilla-firefox (Debian) Medium Fix Released36 8 Printing doesn't work mozilla-firefox (Debian) Medium Fix Released
3637
3738
38== Example listings ==39Example listings
40----------------
3941
40An anonymous user views the bug tasks in upstream Ubuntu.42An anonymous user views the bug tasks in upstream Ubuntu.
4143
@@ -96,7 +98,8 @@ Do an advanced search with dupes turned on and find the duplicate in the results
96 Mozilla Firefox Low New98 Mozilla Firefox Low New
9799
98100
99== Critical bugs ==101Critical bugs
102-------------
100103
101A list of critical bugs reported in a given upstream can be viewed by104A list of critical bugs reported in a given upstream can be viewed by
102clicking the "critical" quick search link. Debian has no open critical bugs:105clicking the "critical" quick search link. Debian has no open critical bugs:
@@ -113,7 +116,8 @@ But Firefox has a fixed one that Foo Bar can see:
113 Mozilla Firefox Critical New116 Mozilla Firefox Critical New
114117
115118
116== My todo list ==119My todo list
120------------
117121
118The "my todo list" link gives the logged in user the ability to122The "my todo list" link gives the logged in user the ability to
119quickly see which bugs have been assigned to them.123quickly see which bugs have been assigned to them.
@@ -130,7 +134,8 @@ This also works for upstream listings:
130 Mozilla Firefox Critical New134 Mozilla Firefox Critical New
131135
132136
133== Looking at unassigned bugs ==137Looking at unassigned bugs
138--------------------------
134139
135View the unassigned bug tasks listing as user Sample Person.140View the unassigned bug tasks listing as user Sample Person.
136141
@@ -140,7 +145,8 @@ View the unassigned bug tasks listing as user Sample Person.
140 Mozilla Firefox Medium New145 Mozilla Firefox Medium New
141146
142147
143== Search criteria is persistent ==148Search criteria is persistent
149-----------------------------
144150
145The bug listing pages save their search criteria.151The bug listing pages save their search criteria.
146152
@@ -167,7 +173,8 @@ The result set is filtered to show only New bugs.
167 2 Blackhole Trash folder Ubuntu Medium New173 2 Blackhole Trash folder Ubuntu Medium New
168174
169175
170== Searching for simple strings ==176Searching for simple strings
177----------------------------
171178
172The bugtask search facility supports searching on a simple text179The bugtask search facility supports searching on a simple text
173string.180string.
@@ -199,7 +206,8 @@ it'll say so.
199 ...206 ...
200207
201208
202== Bug Badge Decoration ==209Bug Badge Decoration
210--------------------
203211
204We display bug badges for associated branches, specifications, patches, etc.212We display bug badges for associated branches, specifications, patches, etc.
205213
@@ -265,7 +273,8 @@ Patches also appear as badges in bug listings.
265 Badge: haspatch273 Badge: haspatch
266274
267275
268== Bug heat in listings ==276Bug heat in listings
277--------------------
269278
270Bug listings display the bug heat in the last column. Heat is displayed279Bug listings display the bug heat in the last column. Heat is displayed
271as a number.280as a number.
diff --git a/lib/lp/bugs/stories/bugtask-searches/xx-old-urls-still-work.txt b/lib/lp/bugs/stories/bugtask-searches/xx-old-urls-still-work.txt
index 99d8893..2992c0b 100644
--- a/lib/lp/bugs/stories/bugtask-searches/xx-old-urls-still-work.txt
+++ b/lib/lp/bugs/stories/bugtask-searches/xx-old-urls-still-work.txt
@@ -1,4 +1,5 @@
1= Keeping old bookmarks working =1Keeping old bookmarks working
2=============================
23
3As part of the bug workflow spec various statuses are being changed4As part of the bug workflow spec various statuses are being changed
4but we need old bookmarks to keep working with the status names.5but we need old bookmarks to keep working with the status names.
@@ -70,7 +71,8 @@ the new status names in place of the old.
70 field.status:list=Unconfirmed --> field.status:list=New71 field.status:list=Unconfirmed --> field.status:list=New
71 field.status:list=Needs Info --> field.status:list=Incomplete72 field.status:list=Needs Info --> field.status:list=Incomplete
7273
73== Assigned, Reported and Subscribed Bugs ==74Assigned, Reported and Subscribed Bugs
75--------------------------------------
7476
75Bugs searched for in the context of a person or team are redirected77Bugs searched for in the context of a person or team are redirected
76too.78too.
diff --git a/lib/lp/bugs/stories/bugtracker/xx-bugtracker-handshake-tokens.txt b/lib/lp/bugs/stories/bugtracker/xx-bugtracker-handshake-tokens.txt
index ba0cc92..d8f2e1a 100644
--- a/lib/lp/bugs/stories/bugtracker/xx-bugtracker-handshake-tokens.txt
+++ b/lib/lp/bugs/stories/bugtracker/xx-bugtracker-handshake-tokens.txt
@@ -1,4 +1,5 @@
1= Handling BugTracker handshake tokens =1Handling BugTracker handshake tokens
2====================================
23
3Launchpad can generate LoginTokens which can then be used to4Launchpad can generate LoginTokens which can then be used to
4authenticate it with remote bug trackers. Generating these tokens is5authenticate it with remote bug trackers. Generating these tokens is
diff --git a/lib/lp/bugs/stories/bugwatches/xx-bugwatch-comments.txt b/lib/lp/bugs/stories/bugwatches/xx-bugwatch-comments.txt
index 576043d..b64a470 100644
--- a/lib/lp/bugs/stories/bugwatches/xx-bugwatch-comments.txt
+++ b/lib/lp/bugs/stories/bugwatches/xx-bugwatch-comments.txt
@@ -1,4 +1,5 @@
1= Comments Imported From a Bug Watch =1Comments Imported From a Bug Watch
2==================================
23
3Comments can be imported from remote bugtrackers.4Comments can be imported from remote bugtrackers.
45
diff --git a/lib/lp/bugs/stories/bugwatches/xx-bugwatch-errors.txt b/lib/lp/bugs/stories/bugwatches/xx-bugwatch-errors.txt
index ba403de..2501411 100644
--- a/lib/lp/bugs/stories/bugwatches/xx-bugwatch-errors.txt
+++ b/lib/lp/bugs/stories/bugwatches/xx-bugwatch-errors.txt
@@ -1,4 +1,5 @@
1= Displaying Bug Watch Errors to the User =1Displaying Bug Watch Errors to the User
2=======================================
23
3If an error occurs when importing the remote status of a bug that is4If an error occurs when importing the remote status of a bug that is
4being watched in Launchpad that error will be displayed to users.5being watched in Launchpad that error will be displayed to users.
diff --git a/lib/lp/bugs/stories/cve/xx-cve-link-xss.txt b/lib/lp/bugs/stories/cve/xx-cve-link-xss.txt
index 96b75a0..8676508 100644
--- a/lib/lp/bugs/stories/cve/xx-cve-link-xss.txt
+++ b/lib/lp/bugs/stories/cve/xx-cve-link-xss.txt
@@ -1,4 +1,5 @@
1== Cross-Site Scripting, or XSS ==1Cross-Site Scripting, or XSS
2----------------------------
23
3The CVE Sequence Number field and its related messages are properly4The CVE Sequence Number field and its related messages are properly
4escaped in order to prevent XSS.5escaped in order to prevent XSS.
diff --git a/lib/lp/bugs/stories/feeds/xx-bug-atom.txt b/lib/lp/bugs/stories/feeds/xx-bug-atom.txt
index b36d6c8..a71dfc5 100644
--- a/lib/lp/bugs/stories/feeds/xx-bug-atom.txt
+++ b/lib/lp/bugs/stories/feeds/xx-bug-atom.txt
@@ -1,4 +1,5 @@
1= Atom Feeds =1Atom Feeds
2==========
23
3Atom feeds produce XML not HTML. Therefore we must parse the output as XML4Atom feeds produce XML not HTML. Therefore we must parse the output as XML
4by asking BeautifulSoup to use lxml.5by asking BeautifulSoup to use lxml.
@@ -17,7 +18,8 @@ will arrange the entries in a different sort order based on the update
17time.18time.
1819
1920
20== Latest bugs for a product ==21Latest bugs for a product
22-------------------------
2123
22This feed gets the latest bugs reported against a product. The feed24This feed gets the latest bugs reported against a product. The feed
23includes summary information about the bugs such as ID, title, author,25includes summary information about the bugs such as ID, title, author,
@@ -77,7 +79,8 @@ The Atom feed must have the content-type of "application/atom+xml".
77 >>> browser.headers['content-type']79 >>> browser.headers['content-type']
78 'application/atom+xml;charset=utf-8'80 'application/atom+xml;charset=utf-8'
7981
80== Latest bugs for a project ==82Latest bugs for a project
83-------------------------
8184
82This feed gets the latest bugs for a project, and has the same type of content85This feed gets the latest bugs for a project, and has the same type of content
83as the latest bugs feed for a product.86as the latest bugs feed for a product.
@@ -138,7 +141,8 @@ Ensure the entries are in reverse chronological order by published date.
138 >>> assert check_entries_order(entries), (141 >>> assert check_entries_order(entries), (
139 ... "Published dates are not sorted.")142 ... "Published dates are not sorted.")
140143
141== Latest bugs for a distro ==144Latest bugs for a distro
145------------------------
142146
143This feed gets the latest bugs for a distribution, and has the same type147This feed gets the latest bugs for a distribution, and has the same type
144of content as the latest bugs feed for a product.148of content as the latest bugs feed for a product.
@@ -176,7 +180,8 @@ of content as the latest bugs feed for a product.
176 >>> assert check_entries_order(entries), (180 >>> assert check_entries_order(entries), (
177 ... "Published dates are not sorted.")181 ... "Published dates are not sorted.")
178182
179=== Private teams as assignees ===183Private teams as assignees
184..........................
180185
181Create a private team and assign an ubuntu distro bug to that team.186Create a private team and assign an ubuntu distro bug to that team.
182187
@@ -222,7 +227,8 @@ Private teams should show as '-'.
222 -227 -
223 -228 -
224229
225== Latest bugs for a source package ==230Latest bugs for a source package
231--------------------------------
226232
227This feed gets the latest bugs for a source package, and has the same233This feed gets the latest bugs for a source package, and has the same
228type of content as the latest bugs feed for a product.234type of content as the latest bugs feed for a product.
@@ -255,7 +261,8 @@ type of content as the latest bugs feed for a product.
255 ... "Published dates are not sorted.")261 ... "Published dates are not sorted.")
256262
257263
258== Latest bugs for a distroseries ==264Latest bugs for a distroseries
265------------------------------
259266
260This feed gets the latest bugs for a distribution series, and has the same267This feed gets the latest bugs for a distribution series, and has the same
261type of content as the latest bugs feed for a product.268type of content as the latest bugs feed for a product.
@@ -295,7 +302,8 @@ type of content as the latest bugs feed for a product.
295 ... "Published dates are not sorted.")302 ... "Published dates are not sorted.")
296303
297304
298== Latest bugs for a product series ==305Latest bugs for a product series
306--------------------------------
299307
300This feed gets the latest bugs for a product series, and has the same308This feed gets the latest bugs for a product series, and has the same
301type of content as the latest bugs feed for a product.309type of content as the latest bugs feed for a product.
@@ -335,7 +343,8 @@ type of content as the latest bugs feed for a product.
335 ... "Published dates are not sorted.")343 ... "Published dates are not sorted.")
336344
337345
338== Latest bugs for a person ==346Latest bugs for a person
347------------------------
339348
340This feed gets the latest bugs for a person.349This feed gets the latest bugs for a person.
341350
@@ -381,7 +390,8 @@ This feed gets the latest bugs for a person.
381 ... "Published dates are not sorted.")390 ... "Published dates are not sorted.")
382391
383392
384== Latest bugs for a team ==393Latest bugs for a team
394----------------------
385395
386This feed gets the latest bugs for a whole team.396This feed gets the latest bugs for a whole team.
387First, make a team responsible for some bugs.397First, make a team responsible for some bugs.
@@ -438,7 +448,8 @@ some results.
438 ... "Published dates are not sorted.")448 ... "Published dates are not sorted.")
439449
440450
441== Latest bugs for any target ==451Latest bugs for any target
452--------------------------
442453
443This feed gets the latest bugs reported against any target.454This feed gets the latest bugs reported against any target.
444455
@@ -476,7 +487,8 @@ This feed gets the latest bugs reported against any target.
476 ... "Published dates are not sorted.")487 ... "Published dates are not sorted.")
477488
478489
479== General bug search ==490General bug search
491------------------
480492
481This feed is the most useful of them all. Any bug search can be turned into493This feed is the most useful of them all. Any bug search can be turned into
482a feed.494a feed.
@@ -550,7 +562,8 @@ to True.
550 http://bugs.launchpad.test/~name12562 http://bugs.launchpad.test/~name12
551563
552564
553== Results for a single bug ==565Results for a single bug
566------------------------
554567
555This feed shows the status of a single bug.568This feed shows the status of a single bug.
556569
@@ -570,7 +583,8 @@ This feed shows the status of a single bug.
570 ... print(link)583 ... print(link)
571 <link href="http://feeds.launchpad.test/bugs/1/bug.atom" rel="self"/>584 <link href="http://feeds.launchpad.test/bugs/1/bug.atom" rel="self"/>
572585
573== Feeds Configuration Options ==586Feeds Configuration Options
587---------------------------
574588
575The max_bug_feed_cache_minutes configuration is provided to allow589The max_bug_feed_cache_minutes configuration is provided to allow
576overriding the Expires and Cache-Control headers so that the feeds590overriding the Expires and Cache-Control headers so that the feeds
diff --git a/lib/lp/bugs/stories/feeds/xx-bug-html.txt b/lib/lp/bugs/stories/feeds/xx-bug-html.txt
index 3b6a6c1..782b8f2 100644
--- a/lib/lp/bugs/stories/feeds/xx-bug-html.txt
+++ b/lib/lp/bugs/stories/feeds/xx-bug-html.txt
@@ -1,4 +1,5 @@
1= HTML Feeds =1HTML Feeds
2==========
23
3HTML feeds produce snippets of html for inclusion in user's own web pages.4HTML feeds produce snippets of html for inclusion in user's own web pages.
4The content of an HTML feed is very similar to an Atom feed, but is formatted5The content of an HTML feed is very similar to an Atom feed, but is formatted
@@ -40,7 +41,8 @@ And two for printing the results:
40 ... return bug_numbers41 ... return bug_numbers
4142
4243
43== Latest bugs for a product ==44Latest bugs for a product
45-------------------------
4446
45This feed gets the latest bugs reported against a product. The feed includes47This feed gets the latest bugs reported against a product. The feed includes
46summary information about the bugs such as ID, title, author, and a link to48summary information about the bugs such as ID, title, author, and a link to
@@ -67,7 +69,8 @@ the bug itself.
67 >>> get_bug_numbers(entries)69 >>> get_bug_numbers(entries)
68 [12, 11]70 [12, 11]
6971
70== Latest bugs for a project ==72Latest bugs for a project
73-------------------------
7174
72This feed gets the latest bugs for a project, and has the same type of content75This feed gets the latest bugs for a project, and has the same type of content
73as the latest bugs feed for a product.76as the latest bugs feed for a product.
@@ -93,7 +96,8 @@ as the latest bugs feed for a product.
93 >>> get_bug_numbers(entries)96 >>> get_bug_numbers(entries)
94 [15, 15, 9, 9, 5, 5, 5, 4, 1, 1, 1]97 [15, 15, 9, 9, 5, 5, 5, 4, 1, 1, 1]
9598
96=== Private teams as assignees ===99Private teams as assignees
100..........................
97101
98Create a private team and assign a mozilla bug to that team.102Create a private team and assign a mozilla bug to that team.
99103
@@ -121,7 +125,8 @@ Get the mozilla/latest-bugs feed. The previous bug should be included.
121 >>> get_bug_numbers(entries)125 >>> get_bug_numbers(entries)
122 [15, 15, 9, 9, 5, 5, 5, 4, 1, 1, 1]126 [15, 15, 9, 9, 5, 5, 5, 4, 1, 1, 1]
123127
124== Latest bugs for a person ==128Latest bugs for a person
129------------------------
125130
126This feed gets the latest bugs for a person.131This feed gets the latest bugs for a person.
127132
@@ -147,7 +152,8 @@ This feed gets the latest bugs for a person.
147 [15, 15, 12, 11, 10, 9, 9, 7, 7, 3, 3, 3, 2, 2, 2, 2, 2, 1, 1, 1]152 [15, 15, 12, 11, 10, 9, 9, 7, 7, 3, 3, 3, 2, 2, 2, 2, 2, 1, 1, 1]
148153
149154
150== Latest bugs for any target ==155Latest bugs for any target
156--------------------------
151157
152This feed gets the latest bugs reported against any target.158This feed gets the latest bugs reported against any target.
153159
@@ -174,7 +180,8 @@ This feed gets the latest bugs reported against any target.
174 2, 1, 1, 1]180 2, 1, 1, 1]
175181
176182
177== General bug search ==183General bug search
184------------------
178185
179This feed is the most useful of them all. Any bug search can be turned into186This feed is the most useful of them all. Any bug search can be turned into
180a feed.187a feed.
diff --git a/lib/lp/bugs/stories/guided-filebug/xx-distro-guided-filebug-tags.txt b/lib/lp/bugs/stories/guided-filebug/xx-distro-guided-filebug-tags.txt
index 48b4589..52aa4ef 100644
--- a/lib/lp/bugs/stories/guided-filebug/xx-distro-guided-filebug-tags.txt
+++ b/lib/lp/bugs/stories/guided-filebug/xx-distro-guided-filebug-tags.txt
@@ -1,4 +1,5 @@
1= Adding tags when filing bugs =1Adding tags when filing bugs
2============================
23
3Even though there's no input field for adding tags on the normal4Even though there's no input field for adding tags on the normal
4+filebug page, it's still possible to add tags to filed bugs on that5+filebug page, it's still possible to add tags to filed bugs on that
diff --git a/lib/lp/bugs/stories/guided-filebug/xx-distro-guided-filebug.txt b/lib/lp/bugs/stories/guided-filebug/xx-distro-guided-filebug.txt
index f835994..3755680 100644
--- a/lib/lp/bugs/stories/guided-filebug/xx-distro-guided-filebug.txt
+++ b/lib/lp/bugs/stories/guided-filebug/xx-distro-guided-filebug.txt
@@ -1,4 +1,5 @@
1= Filing bugs on Distributions =1Filing bugs on Distributions
2============================
23
3Like filing bugs on products, filing bugs on distributions involves4Like filing bugs on products, filing bugs on distributions involves
4first finding out if you're bug has already been reported.5first finding out if you're bug has already been reported.
@@ -73,7 +74,8 @@ Finally, let's submit the bug.
73 http://bugs.launchpad.test/ubuntu/+source/mozilla-firefox/+bug/...74 http://bugs.launchpad.test/ubuntu/+source/mozilla-firefox/+bug/...
7475
7576
76== Filing a bug when there are none similar ==77Filing a bug when there are none similar
78----------------------------------------
7779
78When no similar bugs are found the form works the same but appears80When no similar bugs are found the form works the same but appears
79different in the user agent.81different in the user agent.
diff --git a/lib/lp/bugs/stories/guided-filebug/xx-filebug-attachments.txt b/lib/lp/bugs/stories/guided-filebug/xx-filebug-attachments.txt
index 4843c14..ac1f245 100644
--- a/lib/lp/bugs/stories/guided-filebug/xx-filebug-attachments.txt
+++ b/lib/lp/bugs/stories/guided-filebug/xx-filebug-attachments.txt
@@ -1,11 +1,13 @@
1= Adding attachments when filing a bug =1Adding attachments when filing a bug
2====================================
23
3It is possible to add attachments when filing a bug. The tests in this4It is possible to add attachments when filing a bug. The tests in this
4file will cover this functionality for both the guided and advanced5file will cover this functionality for both the guided and advanced
5filebug forms.6filebug forms.
67
78
8== Guided filebug form ==9Guided filebug form
10-------------------
911
10Adding an attachment to a new bug is part of the second step of the12Adding an attachment to a new bug is part of the second step of the
11guided filebug form.13guided filebug form.
@@ -50,7 +52,8 @@ No Privileges Person can see the attachment in the attachments portlet.
50 'http://bugs.launchpad.test/firefox/+bug/.../+attachment/.../+files/ex...'52 'http://bugs.launchpad.test/firefox/+bug/.../+attachment/.../+files/ex...'
5153
5254
53== Empty Attachment Fields ==55Empty Attachment Fields
56-----------------------
5457
55Sometimes browsers submit values empty fields, leading them to being58Sometimes browsers submit values empty fields, leading them to being
56treated as non-empty by the receiving view. The attachment form will59treated as non-empty by the receiving view. The attachment form will
diff --git a/lib/lp/bugs/stories/guided-filebug/xx-filebug-tags.txt b/lib/lp/bugs/stories/guided-filebug/xx-filebug-tags.txt
index f01789f..94d1640 100644
--- a/lib/lp/bugs/stories/guided-filebug/xx-filebug-tags.txt
+++ b/lib/lp/bugs/stories/guided-filebug/xx-filebug-tags.txt
@@ -1,7 +1,9 @@
1= Adding tags =1Adding tags
2===========
23
34
4== Normal bug filing page ==5Normal bug filing page
6----------------------
57
6On the normal +filebug page, tags can be added to the bug as the bug8On the normal +filebug page, tags can be added to the bug as the bug
7is being filed.9is being filed.
@@ -25,7 +27,8 @@ is being filed.
25 unofficial-tag foo27 unofficial-tag foo
2628
2729
28== Pre-populating the tags field ==30Pre-populating the tags field
31-----------------------------
2932
30For people wanting to pre-fill the tags field with certain tags, it's33For people wanting to pre-fill the tags field with certain tags, it's
31possible to do so by supplying a 'field.tags' URL parameter.34possible to do so by supplying a 'field.tags' URL parameter.
diff --git a/lib/lp/bugs/stories/guided-filebug/xx-options-for-bug-supervisors.txt b/lib/lp/bugs/stories/guided-filebug/xx-options-for-bug-supervisors.txt
index f5d8da2..ed42952 100644
--- a/lib/lp/bugs/stories/guided-filebug/xx-options-for-bug-supervisors.txt
+++ b/lib/lp/bugs/stories/guided-filebug/xx-options-for-bug-supervisors.txt
@@ -1,4 +1,5 @@
1= Bug filing options for bug supervisors =1Bug filing options for bug supervisors
2======================================
23
3During the bug filing process, normal or advanced, bug supervisors are4During the bug filing process, normal or advanced, bug supervisors are
4able to set the status and importance of the bug being filed, can5able to set the status and importance of the bug being filed, can
@@ -55,7 +56,8 @@ Users who are bug supervisors can see these options:
55 <Control name='field.assignee' type='text'>56 <Control name='field.assignee' type='text'>
5657
5758
58== Using these extra options ==59Using these extra options
60-------------------------
5961
60 >>> from lp.bugs.tests.bug import print_bug_affects_table62 >>> from lp.bugs.tests.bug import print_bug_affects_table
6163
diff --git a/lib/lp/bugs/stories/guided-filebug/xx-productseries-guided-filebug.txt b/lib/lp/bugs/stories/guided-filebug/xx-productseries-guided-filebug.txt
index 699005f..af6d155 100644
--- a/lib/lp/bugs/stories/guided-filebug/xx-productseries-guided-filebug.txt
+++ b/lib/lp/bugs/stories/guided-filebug/xx-productseries-guided-filebug.txt
@@ -1,4 +1,5 @@
1= Filing a bug from the product series page =1Filing a bug from the product series page
2=========================================
23
3The product series Bugs frontpage includes a link to report a bug.4The product series Bugs frontpage includes a link to report a bug.
45
diff --git a/lib/lp/bugs/stories/guided-filebug/xx-sorting-by-relevance.txt b/lib/lp/bugs/stories/guided-filebug/xx-sorting-by-relevance.txt
index 994b4d1..f021320 100644
--- a/lib/lp/bugs/stories/guided-filebug/xx-sorting-by-relevance.txt
+++ b/lib/lp/bugs/stories/guided-filebug/xx-sorting-by-relevance.txt
@@ -1,4 +1,5 @@
1= Sorting the similar bugs found by relevance =1Sorting the similar bugs found by relevance
2===========================================
23
3When displaying the similar bugs, we display only a small number, even4When displaying the similar bugs, we display only a small number, even
4though the search usually returns a huge number of results. For this5though the search usually returns a huge number of results. For this
diff --git a/lib/lp/bugs/stories/upstream-bugprivacy/xx-upstream-bug-privacy.txt b/lib/lp/bugs/stories/upstream-bugprivacy/xx-upstream-bug-privacy.txt
index cbc2de2..00bea23 100644
--- a/lib/lp/bugs/stories/upstream-bugprivacy/xx-upstream-bug-privacy.txt
+++ b/lib/lp/bugs/stories/upstream-bugprivacy/xx-upstream-bug-privacy.txt
@@ -62,7 +62,8 @@ bug listing.
62 ...<div class="importance importanceUNDECIDED"> Undecided </div>...62 ...<div class="importance importanceUNDECIDED"> Undecided </div>...
63 ...<span class="bugnumber">#BUG-ID</span>...63 ...<span class="bugnumber">#BUG-ID</span>...
6464
65== Checking basic access to the private bug pages ==65Checking basic access to the private bug pages
66----------------------------------------------
6667
67Trying to access the task edit page of a task on a private bug68Trying to access the task edit page of a task on a private bug
68fails, because we pretend that inaccessible private bugs do not exist.69fails, because we pretend that inaccessible private bugs do not exist.
diff --git a/lib/lp/bugs/stories/webservice/xx-bug-target.txt b/lib/lp/bugs/stories/webservice/xx-bug-target.txt
index f4e4c45..6017625 100644
--- a/lib/lp/bugs/stories/webservice/xx-bug-target.txt
+++ b/lib/lp/bugs/stories/webservice/xx-bug-target.txt
@@ -1,10 +1,12 @@
1= Introduction =1Introduction
2============
23
3Many exposed objects in the API provide IBugTarget, including4Many exposed objects in the API provide IBugTarget, including
4projects, distributions, distribution series, and source packages.5projects, distributions, distribution series, and source packages.
56
67
7== bug_reporting_guidelines ==8bug_reporting_guidelines
9------------------------
810
9All bug targets have a read/write bug_reporting_guidelines property.11All bug targets have a read/write bug_reporting_guidelines property.
1012
@@ -38,7 +40,8 @@ Not everyone can modify it however:
38 (<Product at ...>, 'bug_reporting_guidelines', 'launchpad.BugSupervisor')40 (<Product at ...>, 'bug_reporting_guidelines', 'launchpad.BugSupervisor')
3941
4042
41== Official Bug Tags ==43Official Bug Tags
44-----------------
4245
43We can access official bug tag targets and add and remove tags. We46We can access official bug tag targets and add and remove tags. We
44create a new product, owned by ~salgado.47create a new product, owned by ~salgado.
@@ -138,7 +141,8 @@ We can also access official tags as a list.
138 ... dumps({'official_bug_tags': [u'foo', u'bar']})))141 ... dumps({'official_bug_tags': [u'foo', u'bar']})))
139 HTTP/1.1 209 Content Returned...142 HTTP/1.1 209 Content Returned...
140143
141== bug_supervisor ==144bug_supervisor
145--------------
142146
143We can retrieve or set a person or team as the bug supervisor for projects.147We can retrieve or set a person or team as the bug supervisor for projects.
144148
diff --git a/lib/lp/bugs/stories/webservice/xx-hide-comments.txt b/lib/lp/bugs/stories/webservice/xx-hide-comments.txt
index dd5510e..8a2a6e1 100644
--- a/lib/lp/bugs/stories/webservice/xx-hide-comments.txt
+++ b/lib/lp/bugs/stories/webservice/xx-hide-comments.txt
@@ -1,4 +1,5 @@
1= Hide bug comments =1Hide bug comments
2=================
23
3Bug comments can be hidden by setting visible to False. There is4Bug comments can be hidden by setting visible to False. There is
4a corresponding API method to do this. Call the method with the5a corresponding API method to do this. Call the method with the
diff --git a/lib/lp/bugs/tests/buglinktarget.txt b/lib/lp/bugs/tests/buglinktarget.txt
index c8c4099..119c94e 100644
--- a/lib/lp/bugs/tests/buglinktarget.txt
+++ b/lib/lp/bugs/tests/buglinktarget.txt
@@ -1,4 +1,5 @@
1= IBugLinkTarget Interface =1IBugLinkTarget Interface
2========================
23
3Launchpad includes Malone, the powerful bug tracker. One of the best4Launchpad includes Malone, the powerful bug tracker. One of the best
4features of Malone is the ability to track a bug in multiple products5features of Malone is the ability to track a bug in multiple products
@@ -22,7 +23,8 @@ shouldn't have any bugs linked to it at the start of the test.)
22 >>> verifyObject(IBugLinkTarget, target)23 >>> verifyObject(IBugLinkTarget, target)
23 True24 True
2425
25== linkBug() ==26linkBug()
27---------
2628
27 >>> bugset = getUtility(IBugSet)29 >>> bugset = getUtility(IBugSet)
28 >>> bug1 = bugset.get(1)30 >>> bug1 = bugset.get(1)
@@ -100,7 +102,8 @@ if they are an administrator:
100 >>> target.linkBug(private_bug, admin)102 >>> target.linkBug(private_bug, admin)
101 True103 True
102104
103== bugs ==105bugs
106----
104107
105The list of bugs linked to the target should be available in the bugs108The list of bugs linked to the target should be available in the bugs
106attributes:109attributes:
@@ -108,7 +111,8 @@ attributes:
108 >>> [bug.id for bug in target.bugs]111 >>> [bug.id for bug in target.bugs]
109 [1, 2, 6]112 [1, 2, 6]
110113
111== unlinkBug() ==114unlinkBug()
115-----------
112116
113The unlinkBug() method is used to remove a link between a bug and117The unlinkBug() method is used to remove a link between a bug and
114the target.118the target.
@@ -169,7 +173,8 @@ the bug or if they are an administrator.
169 >>> target.unlinkBug(private_bug, admin)173 >>> target.unlinkBug(private_bug, admin)
170 True174 True
171175
172== Cleanup ==176Cleanup
177-------
173178
174 # Unregister event listeners.179 # Unregister event listeners.
175 >>> linked_event_listener.cleanUp()180 >>> linked_event_listener.cleanUp()
diff --git a/lib/lp/bugs/tests/trac-xmlrpc-transport.txt b/lib/lp/bugs/tests/trac-xmlrpc-transport.txt
index 66de8e7..7f52f95 100644
--- a/lib/lp/bugs/tests/trac-xmlrpc-transport.txt
+++ b/lib/lp/bugs/tests/trac-xmlrpc-transport.txt
@@ -1,4 +1,5 @@
1= TestTracXMLRPCTransport =1TestTracXMLRPCTransport
2=======================
23
3TestTracXMLRPCTransport is an XML-RPC transport which simulates the LP4TestTracXMLRPCTransport is an XML-RPC transport which simulates the LP
4Trac plugin. It can be used to avoid network traffic while testing, and5Trac plugin. It can be used to avoid network traffic while testing, and
@@ -26,7 +27,8 @@ some cookie is set.
26 >>> trac_transport.setCookie('trac_auth=auth_cookie')27 >>> trac_transport.setCookie('trac_auth=auth_cookie')
2728
2829
29== launchpad.bugtracker_version() ==30launchpad.bugtracker_version()
31------------------------------
3032
31bugtracker_version() returns a list of33bugtracker_version() returns a list of
32[Trac version, plugin version, dupe knowledge]. The version numbers are34[Trac version, plugin version, dupe knowledge]. The version numbers are
@@ -37,7 +39,8 @@ instance knows how to track duplicate bugs.
37 ['0.11.0', '1.0', False]39 ['0.11.0', '1.0', False]
3840
3941
40== launchpad.time_snapshot() ==42launchpad.time_snapshot()
43-------------------------
4144
42time_snapshot returns information about what the Trac instance thinks45time_snapshot returns information about what the Trac instance thinks
43the current time is. It returns the local time zone, the local time, and46the current time is. It returns the local time zone, the local time, and
@@ -57,7 +60,8 @@ isn't suitable.
57 US/Eastern 1206328061 120634246160 US/Eastern 1206328061 1206342461
5861
5962
60== launchpad.bug_info() ==63launchpad.bug_info()
64--------------------
6165
62bug_info() returns, as the name suggests, info about a given bug or set66bug_info() returns, as the name suggests, info about a given bug or set
63of bugs. It takes two parameters: level, an integer indicating how much67of bugs. It takes two parameters: level, an integer indicating how much
@@ -215,7 +219,8 @@ are in the bugs list being returned.
215 [{'id': '1'}]219 [{'id': '1'}]
216220
217221
218== launchpad.get_comments() ==222launchpad.get_comments()
223------------------------
219224
220get_comments() returns a list of comment dicts. The comment dicts225get_comments() returns a list of comment dicts. The comment dicts
221returned correspond to the comment IDs passed in the comments parameter.226returned correspond to the comment IDs passed in the comments parameter.
@@ -245,7 +250,8 @@ returned correspond to the comment IDs passed in the comments parameter.
245250
246251
247252
248== launchpad.add_comment() ==253launchpad.add_comment()
254-----------------------
249255
250The Trac XML-RPC API allows us to push comments to remote bug trackers256The Trac XML-RPC API allows us to push comments to remote bug trackers
251via the launchpad.add_comment() method.257via the launchpad.add_comment() method.
@@ -281,7 +287,8 @@ The comment will be included in the remote bug's comments.
281 user: launchpad287 user: launchpad
282288
283289
284== Getting and setting the Launchpad bug ID ==290Getting and setting the Launchpad bug ID
291----------------------------------------
285292
286The Trac XML-RPC API allows us to tell the remote tracker which293The Trac XML-RPC API allows us to tell the remote tracker which
287Launchpad bug links to a particular one of its bugs and also allows us294Launchpad bug links to a particular one of its bugs and also allows us
diff --git a/lib/lp/buildmaster/doc/buildqueue.txt b/lib/lp/buildmaster/doc/buildqueue.txt
index e55c68a..f864ac2 100644
--- a/lib/lp/buildmaster/doc/buildqueue.txt
+++ b/lib/lp/buildmaster/doc/buildqueue.txt
@@ -1,4 +1,5 @@
1= BuildQueue =1BuildQueue
2==========
23
3BuildQueue class represents the run-time-records of builds being4BuildQueue class represents the run-time-records of builds being
4processed.5processed.
@@ -90,7 +91,8 @@ set 'manual' attribute atomically. For this we use manualScore:
90 (True, 1000)91 (True, 1000)
9192
9293
93== Dispatching and Reseting jobs ==94Dispatching and Reseting jobs
95-----------------------------
9496
95The sampledata contains an active job, being built by the 'bob'97The sampledata contains an active job, being built by the 'bob'
96builder.98builder.
@@ -151,7 +153,8 @@ the specified builder.
151 BUILDING153 BUILDING
152154
153155
154== BuildQueueSet utility ==156BuildQueueSet utility
157---------------------
155158
156Now perform the tests for the BuildQueue zope utility, BuildQueueSet.159Now perform the tests for the BuildQueue zope utility, BuildQueueSet.
157Check if the instance returned as utility corresponds to its160Check if the instance returned as utility corresponds to its
diff --git a/lib/lp/buildmaster/stories/builder-views.txt b/lib/lp/buildmaster/stories/builder-views.txt
index f93d409..67d5ba3 100644
--- a/lib/lp/buildmaster/stories/builder-views.txt
+++ b/lib/lp/buildmaster/stories/builder-views.txt
@@ -1,4 +1,5 @@
1= Builder View Classes and Pages =1Builder View Classes and Pages
2==============================
23
3 >>> from zope.component import getMultiAdapter, getUtility4 >>> from zope.component import getMultiAdapter, getUtility
4 >>> from lp.buildmaster.interfaces.builder import IBuilderSet5 >>> from lp.buildmaster.interfaces.builder import IBuilderSet
@@ -28,7 +29,8 @@ mode button.
28 Switch to manual-mode29 Switch to manual-mode
2930
3031
31== Builder history ==32Builder history
33---------------
3234
33Let's instantiate a view for +history:35Let's instantiate a view for +history:
3436
@@ -49,7 +51,8 @@ mock_form:
49 551 5
5052
5153
52== Builder edit ==54Builder edit
55------------
5356
54Let's instantiate the view for +edit and check that the correct title,57Let's instantiate the view for +edit and check that the correct title,
55fields and actions are displayed:58fields and actions are displayed:
@@ -118,7 +121,8 @@ After editing a builder, a relevant notification is added to the view.
118 The builder &quot;Bob The Builder&quot; was updated successfully.121 The builder &quot;Bob The Builder&quot; was updated successfully.
119122
120123
121== Builders building private jobs ==124Builders building private jobs
125------------------------------
122126
123In order to restrict access to private PPA details in general, we also127In order to restrict access to private PPA details in general, we also
124need to be able to hide the fact that a builder is building a private128need to be able to hide the fact that a builder is building a private
@@ -229,7 +233,8 @@ again.
229 >>> login(ANONYMOUS)233 >>> login(ANONYMOUS)
230234
231235
232== BuilderSet view ==236BuilderSet view
237---------------
233238
234BuilderSetView offer a way to treat the currently registered builders239BuilderSetView offer a way to treat the currently registered builders
235in categories. They are:240in categories. They are:
diff --git a/lib/lp/buildmaster/stories/xx-buildfarm-index.txt b/lib/lp/buildmaster/stories/xx-buildfarm-index.txt
index 5ab1e01..16932a5 100644
--- a/lib/lp/buildmaster/stories/xx-buildfarm-index.txt
+++ b/lib/lp/buildmaster/stories/xx-buildfarm-index.txt
@@ -1,4 +1,5 @@
1= BuildFarm page =1BuildFarm page
2==============
23
3The BuildFarm page is accessible from the root page, although we don't4The BuildFarm page is accessible from the root page, although we don't
4link to it yet because we are not yet sure of the benefits of doing5link to it yet because we are not yet sure of the benefits of doing
diff --git a/lib/lp/code/doc/branch-karma.txt b/lib/lp/code/doc/branch-karma.txt
index f780602..5b44699 100644
--- a/lib/lp/code/doc/branch-karma.txt
+++ b/lib/lp/code/doc/branch-karma.txt
@@ -1,4 +1,5 @@
1= Karma for branch related activity =1Karma for branch related activity
2=================================
23
3We want people to register their branches on Launchpad, and also to4We want people to register their branches on Launchpad, and also to
4link their branches to bugs and specs, so we give them some karma for5link their branches to bugs and specs, so we give them some karma for
@@ -29,7 +30,8 @@ give karma for it.
29 >>> karma_helper = KarmaAssignedEventListener(show_person=True)30 >>> karma_helper = KarmaAssignedEventListener(show_person=True)
30 >>> karma_helper.register_listener()31 >>> karma_helper.register_listener()
3132
32== Registering branches ==33Registering branches
34--------------------
3335
34Karma is added for registering a branch.36Karma is added for registering a branch.
3537
@@ -44,7 +46,8 @@ However, no karma is added for junk branches.
44 >>> junk_branch = factory.makePersonalBranch(owner=eric)46 >>> junk_branch = factory.makePersonalBranch(owner=eric)
4547
4648
47== Linking bugs and branches ==49Linking bugs and branches
50-------------------------
4851
49You get karma for linking a bug to a branch.52You get karma for linking a bug to a branch.
5053
@@ -59,7 +62,8 @@ As long as it is not a junk branch.
59 >>> branch_link = bug.linkBranch(junk_branch, eric)62 >>> branch_link = bug.linkBranch(junk_branch, eric)
6063
6164
62== Linking blueprints and branches ==65Linking blueprints and branches
66-------------------------------
6367
64You get karma for linking a blueprint to a branch.68You get karma for linking a blueprint to a branch.
6569
diff --git a/lib/lp/code/doc/branch-notifications.txt b/lib/lp/code/doc/branch-notifications.txt
index 00696fe..d59000b 100644
--- a/lib/lp/code/doc/branch-notifications.txt
+++ b/lib/lp/code/doc/branch-notifications.txt
@@ -1,4 +1,5 @@
1= Email Notifications for Branches =1Email Notifications for Branches
2================================
23
3Only subscribers get email notifications. If the owner/author of the4Only subscribers get email notifications. If the owner/author of the
4branch wants to receive emails, then they need to subscribe to the5branch wants to receive emails, then they need to subscribe to the
@@ -12,7 +13,8 @@ There are two situations where emails are sent out for branches:
12 - when the branch scanner scans new revisions in the branches history13 - when the branch scanner scans new revisions in the branches history
1314
1415
15== Email Format ==16Email Format
17------------
1618
17All branch notification emails use a standard email template.19All branch notification emails use a standard email template.
1820
@@ -77,7 +79,8 @@ also sends the email to the list of recipients.
77 >>> branch.unsubscribe(branch.owner, branch.owner)79 >>> branch.unsubscribe(branch.owner, branch.owner)
7880
7981
80== Subscriptions ==82Subscriptions
83-------------
8184
82When users subscribe to the branch, they specify which branch85When users subscribe to the branch, they specify which branch
83modified events they want to receive email for. This is one of the86modified events they want to receive email for. This is one of the
@@ -192,7 +195,8 @@ to allow email filtering.
192 mark@example.com Send entire diff Subscriber195 mark@example.com Send entire diff Subscriber
193196
194197
195== Limiting the size of diff received by email ==198Limiting the size of diff received by email
199-------------------------------------------
196200
197 # A helper function to print out the To header and201 # A helper function to print out the To header and
198 # email body202 # email body
@@ -359,7 +363,8 @@ Unsubscribe everybody.
359 0363 0
360364
361365
362== Group subscriptions ==366Group subscriptions
367-------------------
363368
364If a group is subscribed the emails are sent to the members of that team.369If a group is subscribed the emails are sent to the members of that team.
365If an individual is also subscribed to the branch, then the setting370If an individual is also subscribed to the branch, then the setting
@@ -398,7 +403,8 @@ that is used rather than the email addresses of the seven members.
398 support@ubuntu.com 1000 lines Subscriber @ubuntu-team403 support@ubuntu.com 1000 lines Subscriber @ubuntu-team
399404
400405
401== Attribute emails ==406Attribute emails
407----------------
402408
403 # Another helper function to print out the To, From and Subject headers409 # Another helper function to print out the To, From and Subject headers
404 # and the email body410 # and the email body
@@ -522,7 +528,8 @@ something like this:
522 http://code.launchpad.test/~name12/firefox/new-name/+edit-subscription528 http://code.launchpad.test/~name12/firefox/new-name/+edit-subscription
523529
524530
525== Unicode in emails ==531Unicode in emails
532-----------------
526533
527All the text fields of a branch are considered unicode, so the email534All the text fields of a branch are considered unicode, so the email
528must also handle the unicode.535must also handle the unicode.
@@ -551,7 +558,8 @@ must also handle the unicode.
551 http://code.launchpad.test/~name12/firefox/new-name/+edit-subscription558 http://code.launchpad.test/~name12/firefox/new-name/+edit-subscription
552559
553560
554== Modifications by users other than the branch owner ==561Modifications by users other than the branch owner
562--------------------------------------------------
555563
556If another user modified some branch attributes, then an email is sent564If another user modified some branch attributes, then an email is sent
557to the branch owner.565to the branch owner.
diff --git a/lib/lp/code/doc/code-jobs.txt b/lib/lp/code/doc/code-jobs.txt
index 991cca4..732d9d6 100644
--- a/lib/lp/code/doc/code-jobs.txt
+++ b/lib/lp/code/doc/code-jobs.txt
@@ -1,9 +1,11 @@
1= Code Jobs =1Code Jobs
2=========
23
3The addition of the Job table provides a generic way to have server side jobs4The addition of the Job table provides a generic way to have server side jobs
4processing events generated from the web UI.5processing events generated from the web UI.
56
6== Branch Jobs ==7Branch Jobs
8-----------
79
8This type of job processes events that have been generated for branches.10This type of job processes events that have been generated for branches.
911
@@ -18,7 +20,8 @@ created.
18The BranchJob table has a json_data field to hold details specific20The BranchJob table has a json_data field to hold details specific
19to the particular type of subscription job.21to the particular type of subscription job.
2022
21=== BranchJobType.REVISION ===23BranchJobType.REVISION
24......................
2225
23The json data would hold:26The json data would hold:
24 from_revno - the first revision number to process27 from_revno - the first revision number to process
@@ -26,19 +29,22 @@ The json data would hold:
26 to_revno - the last revision number to process29 to_revno - the last revision number to process
27 to_revid - the revision id of the to revno30 to_revid - the revision id of the to revno
2831
29=== BranchJobType.ATTRIBUTE ===32BranchJobType.ATTRIBUTE
33.......................
3034
31The json data would hold the from and to values of the change, and for values35The json data would hold the from and to values of the change, and for values
32where we only show the new values, it would hold those too.36where we only show the new values, it would hold those too.
3337
34=== BranchJobType.IMPORT ===38BranchJobType.IMPORT
39....................
3540
36The json data here would effectively store the text of the message. Used41The json data here would effectively store the text of the message. Used
37primarily in the status changes on the import job itself. Perhpas this should42primarily in the status changes on the import job itself. Perhpas this should
38be combined with the attribute type email and have a general preamble for the43be combined with the attribute type email and have a general preamble for the
39generated email.44generated email.
4045
41== Branch Merge Proposal Jobs ==46Branch Merge Proposal Jobs
47--------------------------
4248
43Jobs for merge proposals are slightly different from individual branch49Jobs for merge proposals are slightly different from individual branch
44subscription based emails as merge proposal jobs end up sending emails to50subscription based emails as merge proposal jobs end up sending emails to
@@ -52,22 +58,26 @@ subscribers of both the source and target branches.
5258
53Each job also has some optional json data.59Each job also has some optional json data.
5460
55=== BranchMergeProposalJobType.NEW ===61BranchMergeProposalJobType.NEW
62..............................
5663
57The json data includes the identity of the initial comment if one was made,64The json data includes the identity of the initial comment if one was made,
58and the initial reviewer if one was requested.65and the initial reviewer if one was requested.
5966
6067
61=== BranchMergeProposalJobType.COMMENT ===68BranchMergeProposalJobType.COMMENT
69..................................
6270
63The json data here refers to the identify of the commit message.71The json data here refers to the identify of the commit message.
6472
65=== BranchMergeProposalJobType.NEW_REVIEWER ===73BranchMergeProposalJobType.NEW_REVIEWER
74.......................................
6675
67The json data here refers to the new reviewer and the type of review76The json data here refers to the new reviewer and the type of review
68requested.77requested.
6978
70=== BranchMergeProposalJobType.DIFF_GENERATION ===79BranchMergeProposalJobType.DIFF_GENERATION
80..........................................
7181
72The dynamic moving diff has been determined to be out of date, and a new diff82The dynamic moving diff has been determined to be out of date, and a new diff
73needs to be generated. This is processed by the merge analysis deamon.83needs to be generated. This is processed by the merge analysis deamon.
diff --git a/lib/lp/code/doc/codeimport-job.txt b/lib/lp/code/doc/codeimport-job.txt
index 0e83ca1..e28e6d8 100644
--- a/lib/lp/code/doc/codeimport-job.txt
+++ b/lib/lp/code/doc/codeimport-job.txt
@@ -1,4 +1,5 @@
1= Code Import Jobs =1Code Import Jobs
2================
23
3A CodeImportJob is a record of a pending or running code import job.4A CodeImportJob is a record of a pending or running code import job.
45
@@ -45,7 +46,8 @@ modified using the CodeImportJobWorkflow utility.
45 True46 True
4647
4748
48== Sample data of interest ==49Sample data of interest
50-----------------------
4951
50There are two CodeImport objects of interest in the sample data.52There are two CodeImport objects of interest in the sample data.
5153
@@ -79,7 +81,8 @@ required to initiate the action.
79 >>> nopriv = person_set.getByName('no-priv')81 >>> nopriv = person_set.getByName('no-priv')
8082
8183
82== Test helpers ==84Test helpers
85------------
8386
84The NewEvents class helps testing the creation of CodeImportEvent87The NewEvents class helps testing the creation of CodeImportEvent
85objects.88objects.
@@ -88,7 +91,8 @@ objects.
88 ... NewEvents)91 ... NewEvents)
8992
9093
91== Testing whether a job is overdue ==94Testing whether a job is overdue
95--------------------------------
9296
93CodeImportJob objects have a date_due attribute that specifies when the97CodeImportJob objects have a date_due attribute that specifies when the
94job should ideally be started. If the date_due is in the past, the job98job should ideally be started. If the date_due is in the past, the job
@@ -129,7 +133,8 @@ current transaction, then the job is overdue.
129 True133 True
130134
131135
132== Creating a new job ==136Creating a new job
137------------------
133138
134CodeImportJob objects are created using the CodeImportJobWorkflow.newJob139CodeImportJob objects are created using the CodeImportJobWorkflow.newJob
135method.140method.
@@ -158,7 +163,8 @@ the date due may be UTC_NOW or a timestamp in the future. This is
158covered in detail in the test_codeimportjob.py file.163covered in detail in the test_codeimportjob.py file.
159164
160165
161== Deleting a pending job ==166Deleting a pending job
167----------------------
162168
163In normal use, the only case where a job object is deleted explicitly is169In normal use, the only case where a job object is deleted explicitly is
164when the review status of a code import is modified. This case is170when the review status of a code import is modified. This case is
@@ -173,7 +179,8 @@ associated job is not running, the job is deleted.
173 None179 None
174180
175181
176== Requesting a job run ==182Requesting a job run
183--------------------
177184
178When a job is pending, users can request that it be run as soon as185When a job is pending, users can request that it be run as soon as
179possible.186possible.
@@ -213,7 +220,8 @@ another user, present a message explaining that this has happened.
213 ~vcs-imports/gnome-terminal/import was already requested by no-priv.220 ~vcs-imports/gnome-terminal/import was already requested by no-priv.
214221
215222
216== Starting a job ==223Starting a job
224--------------
217225
218When a job is about to performed by a code import worker, the startJob226When a job is about to performed by a code import worker, the startJob
219workflow method updates the job's fields to indicate that it is now227workflow method updates the job's fields to indicate that it is now
@@ -235,7 +243,8 @@ The event is also recorded in the CodeImportEvent audit trail.
235 START ~vcs-imports/gnome-terminal/import bazaar-importer243 START ~vcs-imports/gnome-terminal/import bazaar-importer
236244
237245
238== Recording progress on a job ==246Recording progress on a job
247---------------------------
239248
240As the code import worker progresses, it calls the updateHeartbeat249As the code import worker progresses, it calls the updateHeartbeat
241method at least every minute to indicate that it is still progressing.250method at least every minute to indicate that it is still progressing.
diff --git a/lib/lp/code/doc/codeimport-result.txt b/lib/lp/code/doc/codeimport-result.txt
index 0e0fc26..402de61 100644
--- a/lib/lp/code/doc/codeimport-result.txt
+++ b/lib/lp/code/doc/codeimport-result.txt
@@ -1,4 +1,5 @@
1= Code Import Results =1Code Import Results
2===================
23
3A CodeImportResult is a record of a completed code import job. They4A CodeImportResult is a record of a completed code import job. They
4are accessed via a utility registered for the ICodeImportResultSet5are accessed via a utility registered for the ICodeImportResultSet
@@ -19,7 +20,8 @@ member of the vcs-imports team and can access the objects freely.
1920
20 >>> login('david.allouche@canonical.com')21 >>> login('david.allouche@canonical.com')
2122
22== Creating CodeImportResults ==23Creating CodeImportResults
24--------------------------
2325
24Creating CodeImportResult objects is usually done by the finishJob()26Creating CodeImportResult objects is usually done by the finishJob()
25method of the CodeImportWorkflow utility, but here we use the object27method of the CodeImportWorkflow utility, but here we use the object
@@ -85,7 +87,8 @@ A helper property exists to give the duration of the job run.
85 4:00:0087 4:00:00
8688
8789
88== Retrieving CodeImportResults ==90Retrieving CodeImportResults
91----------------------------
8992
90The CodeImportResult objects for a given import can be retrieved in93The CodeImportResult objects for a given import can be retrieved in
91reverse chronological order with the results attribute on a code import.94reverse chronological order with the results attribute on a code import.
diff --git a/lib/lp/code/doc/codereviewcomment.txt b/lib/lp/code/doc/codereviewcomment.txt
index 950915f..8023afd 100644
--- a/lib/lp/code/doc/codereviewcomment.txt
+++ b/lib/lp/code/doc/codereviewcomment.txt
@@ -1,4 +1,5 @@
1= Code review comments =1Code review comments
2====================
23
3When code is proposed to be merged, it's common to perform a review of4When code is proposed to be merged, it's common to perform a review of
4that code, which is often in the form of a conversation. The reviewer5that code, which is often in the form of a conversation. The reviewer
@@ -13,7 +14,8 @@ It has an IMessage as a member (in a one-to-one relationship), a vote
13about.14about.
1415
1516
16== Creating CodeReviewComments ==17Creating CodeReviewComments
18---------------------------
1719
18CodeReviewComments are created from their BranchMergeProposals:20CodeReviewComments are created from their BranchMergeProposals:
1921
@@ -101,7 +103,8 @@ Now run the pending job to send the email.
101 True103 True
102104
103105
104== Interfaces ==106Interfaces
107----------
105108
106The CodeReviewComment must implement the ICodeReviewComment interface.109The CodeReviewComment must implement the ICodeReviewComment interface.
107110
diff --git a/lib/lp/code/doc/revision.txt b/lib/lp/code/doc/revision.txt
index e514d69..054aa34 100644
--- a/lib/lp/code/doc/revision.txt
+++ b/lib/lp/code/doc/revision.txt
@@ -1,10 +1,12 @@
1= Bazaar Revisions =1Bazaar Revisions
2================
23
3Branches are collection of revisions, and a revision can exist independently4Branches are collection of revisions, and a revision can exist independently
4from any branch. Revisions are created automatically by scanning branches,5from any branch. Revisions are created automatically by scanning branches,
5they have no creation interface and Launchpad cannot create or modify them.6they have no creation interface and Launchpad cannot create or modify them.
67
7== Interfaces ==8Interfaces
9----------
810
9 >>> from lp.services.database.interfaces import IStore11 >>> from lp.services.database.interfaces import IStore
10 >>> from lp.testing import verifyObject12 >>> from lp.testing import verifyObject
@@ -27,7 +29,8 @@ they have no creation interface and Launchpad cannot create or modify them.
27 ... IStore(BranchRevision).find(BranchRevision).any())29 ... IStore(BranchRevision).find(BranchRevision).any())
28 True30 True
2931
30== Creating revisions ==32Creating revisions
33------------------
3134
32The creator of a revision is identified by a RevisionAuthor. A RevisionAuthor35The creator of a revision is identified by a RevisionAuthor. A RevisionAuthor
33is not a person because that is only an informational attribute, and even if36is not a person because that is only an informational attribute, and even if
@@ -61,7 +64,8 @@ while the date_created is the time when the database record was created.
61 ... revision_author=author, revision_id=revision_id_1,64 ... revision_author=author, revision_id=revision_id_1,
62 ... revision_date=date)65 ... revision_date=date)
6366
64== Parents ==67Parents
68-------
6569
66Bazaar revisions can have multiple parents, the "leftmost" parent is the70Bazaar revisions can have multiple parents, the "leftmost" parent is the
67revision that was used as a base when committing, other parents are used to71revision that was used as a base when committing, other parents are used to
@@ -78,7 +82,8 @@ we can represent revisions whose at least one parent is a ghost revision.
78 >>> rev2_parent = RevisionParent(sequence=0, revision=revision_2,82 >>> rev2_parent = RevisionParent(sequence=0, revision=revision_2,
79 ... parent_id=revision_1.revision_id)83 ... parent_id=revision_1.revision_id)
8084
81== Branch ancestry ==85Branch ancestry
86---------------
8287
83Revisions are associated to branches through the BranchRevision table. A given88Revisions are associated to branches through the BranchRevision table. A given
84revision may appear in different positions in different branches thanks to89revision may appear in different positions in different branches thanks to
@@ -98,7 +103,8 @@ BranchRevision rows are created using `Branch.createBranchRevision`.
98 >>> rev_no_1.branch == rev_no_2.branch == branch103 >>> rev_no_1.branch == rev_no_2.branch == branch
99 True104 True
100105
101=== Accessing BranchRevision ===106Accessing BranchRevision
107........................
102108
103 >>> branch = getUtility(IBranchLookup).getByUniqueName(109 >>> branch = getUtility(IBranchLookup).getByUniqueName(
104 ... '~name12/+junk/junk.contrib')110 ... '~name12/+junk/junk.contrib')
@@ -161,7 +167,8 @@ history of the branch.
161 foo@localhost-20051031170357-1301ad6d387feb23167 foo@localhost-20051031170357-1301ad6d387feb23
162168
163169
164=== Deleting BranchRevisions ===170Deleting BranchRevisions
171........................
165172
166If a branch gets overwritten or some revisions get uncommitted,173If a branch gets overwritten or some revisions get uncommitted,
167Launchpad's view of the branch will differ from the actual state of the174Launchpad's view of the branch will differ from the actual state of the
@@ -211,7 +218,8 @@ may be referenced by some other branch):
211 foo@localhost-20051031170357-1301ad6d387feb23218 foo@localhost-20051031170357-1301ad6d387feb23
212219
213220
214== IRevisionSet.new() ==221IRevisionSet.new()
222------------------
215223
216Revision objects can be created using the IRevisionSet utility.224Revision objects can be created using the IRevisionSet utility.
217Associated RevisionAuthor and RevisionParent objects will be created225Associated RevisionAuthor and RevisionParent objects will be created
diff --git a/lib/lp/code/stories/branches/package-branch-merge-proposals.txt b/lib/lp/code/stories/branches/package-branch-merge-proposals.txt
index aa63f94..298659e 100644
--- a/lib/lp/code/stories/branches/package-branch-merge-proposals.txt
+++ b/lib/lp/code/stories/branches/package-branch-merge-proposals.txt
@@ -1,4 +1,5 @@
1= Package branch merge proposals =1Package branch merge proposals
2==============================
23
3Package branches can be used for merge proposals just like normal upstream4Package branches can be used for merge proposals just like normal upstream
4branches.5branches.
diff --git a/lib/lp/code/stories/branches/package-branch-merges-with-product-branches.txt b/lib/lp/code/stories/branches/package-branch-merges-with-product-branches.txt
index fd71f6a..9dfe4e0 100644
--- a/lib/lp/code/stories/branches/package-branch-merges-with-product-branches.txt
+++ b/lib/lp/code/stories/branches/package-branch-merges-with-product-branches.txt
@@ -1,4 +1,5 @@
1= Package branch merging with product branches =1Package branch merging with product branches
2============================================
23
3If the source package is linked to the product, then package branches for that4If the source package is linked to the product, then package branches for that
4source package are allowed to be proposed for merging into product branches5source package are allowed to be proposed for merging into product branches
diff --git a/lib/lp/code/stories/branches/xx-branch-listings-merge-proposal-badge.txt b/lib/lp/code/stories/branches/xx-branch-listings-merge-proposal-badge.txt
index ce25e5c..63ab38c 100644
--- a/lib/lp/code/stories/branches/xx-branch-listings-merge-proposal-badge.txt
+++ b/lib/lp/code/stories/branches/xx-branch-listings-merge-proposal-badge.txt
@@ -1,4 +1,5 @@
1= Check if the merge proposal badge is shown =1Check if the merge proposal badge is shown
2==========================================
23
3 >>> def branchSummary(browser):4 >>> def branchSummary(browser):
4 ... table = find_tag_by_id(browser.contents, 'branchtable')5 ... table = find_tag_by_id(browser.contents, 'branchtable')
diff --git a/lib/lp/code/stories/branches/xx-branch-listings.txt b/lib/lp/code/stories/branches/xx-branch-listings.txt
index b1e0399..1df95ae 100644
--- a/lib/lp/code/stories/branches/xx-branch-listings.txt
+++ b/lib/lp/code/stories/branches/xx-branch-listings.txt
@@ -1,4 +1,5 @@
1= Branch Listing Pages =1Branch Listing Pages
2====================
23
3Pages that want to display lists of branches use the branch-listing4Pages that want to display lists of branches use the branch-listing
4page template, and views derived from BranchListingView.5page template, and views derived from BranchListingView.
@@ -12,7 +13,8 @@ various kinds and badge decoration.
12 >>> reset_all_branch_last_modified()13 >>> reset_all_branch_last_modified()
1314
1415
15== Branch Batching ==16Branch Batching
17---------------
1618
17Batching is applied to branch listings where there are many items.19Batching is applied to branch listings where there are many items.
18Luckily for us, many is 5 in the tests.20Luckily for us, many is 5 in the tests.
@@ -73,7 +75,8 @@ needed, then the table is sortable and no batching navigation links are shown.
73 True75 True
7476
7577
76== Lifecycle Filtering for Person Branches ==78Lifecycle Filtering for Person Branches
79---------------------------------------
7780
78When the branches for a person is first loaded, only the 'Current' branches81When the branches for a person is first loaded, only the 'Current' branches
79are shown. Current branches are those that have a lifecycle status of82are shown. Current branches are those that have a lifecycle status of
@@ -206,7 +209,8 @@ first.
206209
207210
208211
209== Branch Badge Decoration ==212Branch Badge Decoration
213-----------------------
210214
211We display badges for associated bugs.215We display badges for associated bugs.
212216
@@ -268,7 +272,8 @@ Now the badge is still shown for Sample Person...
268 Linked to a bug272 Linked to a bug
269273
270274
271== Sorting Branch Listings ==275Sorting Branch Listings
276-----------------------
272277
273Aside from the implicitly sorted listings of recently registered,278Aside from the implicitly sorted listings of recently registered,
274imported and changed branches, all branch listings have a widget that279imported and changed branches, all branch listings have a widget that
@@ -361,7 +366,8 @@ Finally, sorting by a particular criterion has the desired effect.
361 lp://dev/~name12/gnome-terminal/mirrored Development ...366 lp://dev/~name12/gnome-terminal/mirrored Development ...
362367
363368
364== Highlighting the development focus branch ==369Highlighting the development focus branch
370-----------------------------------------
365371
366The branch associated with the development focus series is highlighted372The branch associated with the development focus series is highlighted
367on the branch listings using the same CSS style that is used to373on the branch listings using the same CSS style that is used to
@@ -415,7 +421,8 @@ The current development focus is shown first though.
415 lp://dev/gnome-terminal Series: trunk, alpha, pre-1.0 ...421 lp://dev/gnome-terminal Series: trunk, alpha, pre-1.0 ...
416422
417423
418== Lifecycle Filtering for Product Branches ==424Lifecycle Filtering for Product Branches
425----------------------------------------
419426
420When the branches for a product are first loaded, only the 'Current'427When the branches for a product are first loaded, only the 'Current'
421branches are shown. Current branches are those that have a428branches are shown. Current branches are those that have a
@@ -464,7 +471,8 @@ first.
464 lp://dev/gnome-terminal Series: trunk... Development ...471 lp://dev/gnome-terminal Series: trunk... Development ...
465472
466473
467== The last commit ==474The last commit
475---------------
468476
469The last commit column shows the revision number, and part of the477The last commit column shows the revision number, and part of the
470revision log for the last commit that Launchpad knows about. The478revision log for the last commit that Launchpad knows about. The
diff --git a/lib/lp/code/stories/branches/xx-branch-mirror-failures.txt b/lib/lp/code/stories/branches/xx-branch-mirror-failures.txt
index ac1ce8b..47b2a43 100644
--- a/lib/lp/code/stories/branches/xx-branch-mirror-failures.txt
+++ b/lib/lp/code/stories/branches/xx-branch-mirror-failures.txt
@@ -1,4 +1,5 @@
1= Branch mirror failure messages =1Branch mirror failure messages
2==============================
23
3If a branch fails to mirror, that information is displayed in the mirror's4If a branch fails to mirror, that information is displayed in the mirror's
4page, together with the last failure message we got when mirroring.5page, together with the last failure message we got when mirroring.
@@ -160,7 +161,8 @@ display any failure-related information.
160 None161 None
161162
162163
163== Errors for ssh protocols ==164Errors for ssh protocols
165------------------------
164166
165If a branch has a sftp or bzr+ssh URL, immediately display an error message167If a branch has a sftp or bzr+ssh URL, immediately display an error message
166(even before mirroring is attempted) and do not display the mirror failure168(even before mirroring is attempted) and do not display the mirror failure
@@ -182,7 +184,8 @@ or passwords, neither of which is currently supported.
182 Launchpad cannot mirror this branch because its URL uses sftp or bzr+ssh.184 Launchpad cannot mirror this branch because its URL uses sftp or bzr+ssh.
183185
184186
185== Remote branches don't error on ssh access ==187Remote branches don't error on ssh access
188-----------------------------------------
186189
187If a remote branch specifies a location with the scheme 'sftp' or 'bzr+ssh'190If a remote branch specifies a location with the scheme 'sftp' or 'bzr+ssh'
188then there is no error shown.191then there is no error shown.
diff --git a/lib/lp/code/stories/branches/xx-claiming-team-code-reviews.txt b/lib/lp/code/stories/branches/xx-claiming-team-code-reviews.txt
index 3cded73..41f91b3 100644
--- a/lib/lp/code/stories/branches/xx-claiming-team-code-reviews.txt
+++ b/lib/lp/code/stories/branches/xx-claiming-team-code-reviews.txt
@@ -1,4 +1,5 @@
1= Claiming Team Code Reviews =1Claiming Team Code Reviews
2==========================
23
3When a team has been requested to review a merge proposal, any member of that4When a team has been requested to review a merge proposal, any member of that
4team can claim that review. This can be done by clicking on the "[Review]"5team can claim that review. This can be done by clicking on the "[Review]"
diff --git a/lib/lp/code/stories/branches/xx-distribution-branches.txt b/lib/lp/code/stories/branches/xx-distribution-branches.txt
index b5d0038..fe2cde8 100644
--- a/lib/lp/code/stories/branches/xx-distribution-branches.txt
+++ b/lib/lp/code/stories/branches/xx-distribution-branches.txt
@@ -1,4 +1,5 @@
1= Branch listings for distributions =1Branch listings for distributions
2=================================
23
3All source package branches are associated with a distribution series, and4All source package branches are associated with a distribution series, and
4hence a distribution.5hence a distribution.
diff --git a/lib/lp/code/stories/branches/xx-distroseries-branches.txt b/lib/lp/code/stories/branches/xx-distroseries-branches.txt
index adebd1e..e80ff33 100644
--- a/lib/lp/code/stories/branches/xx-distroseries-branches.txt
+++ b/lib/lp/code/stories/branches/xx-distroseries-branches.txt
@@ -1,4 +1,5 @@
1= Branch listings for distroseries =1Branch listings for distroseries
2================================
23
3All source package branches are associated with a distribution series and a4All source package branches are associated with a distribution series and a
4source package name.5source package name.
diff --git a/lib/lp/code/stories/branches/xx-person-portlet-teambranches.txt b/lib/lp/code/stories/branches/xx-person-portlet-teambranches.txt
index b9886ed..c071545 100644
--- a/lib/lp/code/stories/branches/xx-person-portlet-teambranches.txt
+++ b/lib/lp/code/stories/branches/xx-person-portlet-teambranches.txt
@@ -1,4 +1,5 @@
1= Person Team Branches Portlet =1Person Team Branches Portlet
2============================
23
3The purpose of this portlet is to indiciate that there are teams4The purpose of this portlet is to indiciate that there are teams
4that this person participates in that has branches.5that this person participates in that has branches.
diff --git a/lib/lp/code/stories/branches/xx-product-overview.txt b/lib/lp/code/stories/branches/xx-product-overview.txt
index 7f9b8dd..28588f0 100644
--- a/lib/lp/code/stories/branches/xx-product-overview.txt
+++ b/lib/lp/code/stories/branches/xx-product-overview.txt
@@ -1,4 +1,5 @@
1== Latest branches ==1Latest branches
2---------------
23
3On the product overview page there is a portlet to show recently4On the product overview page there is a portlet to show recently
4registered branches.5registered branches.
diff --git a/lib/lp/code/stories/branches/xx-source-package-branches-empty.txt b/lib/lp/code/stories/branches/xx-source-package-branches-empty.txt
index b38fe32..70b29f4 100644
--- a/lib/lp/code/stories/branches/xx-source-package-branches-empty.txt
+++ b/lib/lp/code/stories/branches/xx-source-package-branches-empty.txt
@@ -1,4 +1,5 @@
1= Empty source package branch listings =1Empty source package branch listings
2====================================
23
3When you look at an empty source package branch listing, you see some nice,4When you look at an empty source package branch listing, you see some nice,
4helpful text.5helpful text.
diff --git a/lib/lp/code/stories/branches/xx-source-package-branches-listing.txt b/lib/lp/code/stories/branches/xx-source-package-branches-listing.txt
index 7f8a8f7..a90c1e9 100644
--- a/lib/lp/code/stories/branches/xx-source-package-branches-listing.txt
+++ b/lib/lp/code/stories/branches/xx-source-package-branches-listing.txt
@@ -1,4 +1,5 @@
1= Populated source package branch listings =1Populated source package branch listings
2========================================
23
3Going to a source package branch page shows a list of branches.4Going to a source package branch page shows a list of branches.
45
diff --git a/lib/lp/code/stories/branches/xx-upload-directions.txt b/lib/lp/code/stories/branches/xx-upload-directions.txt
index bbe8717..4e894dd 100644
--- a/lib/lp/code/stories/branches/xx-upload-directions.txt
+++ b/lib/lp/code/stories/branches/xx-upload-directions.txt
@@ -1,4 +1,5 @@
1= Directions to upload to branches =1Directions to upload to branches
2================================
23
3The branch ~name12/gnome-terminal/pushed is an upload branch. Its index page4The branch ~name12/gnome-terminal/pushed is an upload branch. Its index page
4shows contextual directions on how to upload to it.5shows contextual directions on how to upload to it.
@@ -41,7 +42,8 @@ We will also need a ssh key. Save it now.
41 ... '8nAA7z21wAukvE1Pl6AQyG0e7U1sYS8Pc8dtmzJvdtVZWBl02/gqQJ7f06mFvn'42 ... '8nAA7z21wAukvE1Pl6AQyG0e7U1sYS8Pc8dtmzJvdtVZWBl02/gqQJ7f06mFvn'
42 ... 'sN45rR1Uyxnrwl6rbFwqabZDlyD5Ac6Icbvz9SG1gBOiI= andrew@trogdor')43 ... 'sN45rR1Uyxnrwl6rbFwqabZDlyD5Ac6Icbvz9SG1gBOiI= andrew@trogdor')
4344
44== Branch owned by a person ==45Branch owned by a person
46------------------------
4547
46Initially, the user is not logged in, the branch page points to the owner of48Initially, the user is not logged in, the branch page points to the owner of
47the branch, and suggest logging in for directions.49the branch, and suggest logging in for directions.
@@ -79,7 +81,8 @@ URL for the branch.
79 bzr push --use-existing-dir lp://dev/~name12/gnome-terminal/pushed81 bzr push --use-existing-dir lp://dev/~name12/gnome-terminal/pushed
8082
8183
82== SSH key directions ==84SSH key directions
85------------------
8386
84If the user has the permission to upload to a branch, but does not have an SSH87If the user has the permission to upload to a branch, but does not have an SSH
85key registered, point to the SSH keys form.88key registered, point to the SSH keys form.
@@ -129,7 +132,8 @@ appear.
129 None132 None
130133
131134
132== Branch owned by a team ==
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches

to status/vote changes: