Merge lp:~thumper/launchpad/permission-fail into lp:launchpad/db-devel

Proposed by Tim Penhey
Status: Merged
Merged at revision: not available
Proposed branch: lp:~thumper/launchpad/permission-fail
Merge into: lp:launchpad/db-devel
Diff against target: 178 lines
4 files modified
database/schema/security.cfg (+1/-0)
lib/canonical/librarian/ftests/test_gc.py (+53/-29)
lib/canonical/librarian/librariangc.py (+1/-0)
lib/lp/code/mail/tests/test_codehandler.py (+21/-0)
To merge this branch: bzr merge lp:~thumper/launchpad/permission-fail
Reviewer Review Type Date Requested Status
Francis J. Lacoste (community) release-critical Disapprove
Michael Hudson-Doyle Approve
Brad Crittenden release-critical Pending
Review via email: mp+12329@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Tim Penhey (thumper) wrote :

Fix a permission bug.

Revision history for this message
Tim Penhey (thumper) wrote :

Added the test now too.

Revision history for this message
Michael Hudson-Doyle (mwhudson) wrote :

Looks fine.

review: Approve
Revision history for this message
Francis J. Lacoste (flacoste) wrote :

Since this is actually a DB change and the re-roll won't update the DB, and the permission has been manually granted, I don't think we should land this change "release-critical".

review: Disapprove (release-critical)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'database/schema/security.cfg'
--- database/schema/security.cfg 2009-10-01 01:18:55 +0000
+++ database/schema/security.cfg 2009-10-01 11:45:25 +0000
@@ -1482,6 +1482,7 @@
1482public.distroseries = SELECT1482public.distroseries = SELECT
1483public.job = SELECT, INSERT, UPDATE1483public.job = SELECT, INSERT, UPDATE
1484public.mergedirectivejob = SELECT, INSERT1484public.mergedirectivejob = SELECT, INSERT
1485public.previewdiff = SELECT
1485public.staticdiff = SELECT, INSERT, UPDATE1486public.staticdiff = SELECT, INSERT, UPDATE
1486public.sourcepackagename = SELECT1487public.sourcepackagename = SELECT
1487public.seriessourcepackagebranch = SELECT1488public.seriessourcepackagebranch = SELECT
14881489
=== modified file 'lib/canonical/librarian/ftests/test_gc.py'
--- lib/canonical/librarian/ftests/test_gc.py 2009-09-26 09:06:13 +0000
+++ lib/canonical/librarian/ftests/test_gc.py 2009-10-01 11:45:25 +0000
@@ -5,6 +5,7 @@
55
6__metaclass__ = type6__metaclass__ = type
77
8import shutil
8import sys9import sys
9import os10import os
10from subprocess import Popen, PIPE, STDOUT11from subprocess import Popen, PIPE, STDOUT
@@ -15,6 +16,7 @@
15from pytz import utc16from pytz import utc
16from sqlobject import SQLObjectNotFound17from sqlobject import SQLObjectNotFound
17from storm.locals import SQL, AutoReload18from storm.locals import SQL, AutoReload
19import transaction
18from zope.component import getUtility20from zope.component import getUtility
1921
20from canonical.config import config22from canonical.config import config
@@ -529,37 +531,59 @@
529 # Long non-hexadecimal number531 # Long non-hexadecimal number
530 noisedir3_path = os.path.join(config.librarian_server.root, '11.bak')532 noisedir3_path = os.path.join(config.librarian_server.root, '11.bak')
531533
532 os.mkdir(noisedir1_path)
533 os.mkdir(noisedir2_path)
534 os.mkdir(noisedir3_path)
535
536 # Files in the noise directories.
537 noisefile1_path = os.path.join(noisedir1_path, 'abc')
538 noisefile2_path = os.path.join(noisedir2_path, 'def')
539 noisefile3_path = os.path.join(noisedir2_path, 'ghi')
540 open(noisefile1_path, 'w').write('hello')
541 open(noisefile2_path, 'w').write('there')
542 open(noisefile3_path, 'w').write('testsuite')
543
544 # Pretend it is tomorrow to ensure the files don't count as
545 # recently created, and run the delete_unwanted_files process.
546 org_time = librariangc.time
547 def tomorrow_time():
548 return org_time() + 24 * 60 * 60 + 1
549 try:534 try:
550 librariangc.time = tomorrow_time535 os.mkdir(noisedir1_path)
551 librariangc.delete_unwanted_files(self.con)536 os.mkdir(noisedir2_path)
537 os.mkdir(noisedir3_path)
538
539 # Files in the noise directories.
540 noisefile1_path = os.path.join(noisedir1_path, 'abc')
541 noisefile2_path = os.path.join(noisedir2_path, 'def')
542 noisefile3_path = os.path.join(noisedir2_path, 'ghi')
543 open(noisefile1_path, 'w').write('hello')
544 open(noisefile2_path, 'w').write('there')
545 open(noisefile3_path, 'w').write('testsuite')
546
547 # Pretend it is tomorrow to ensure the files don't count as
548 # recently created, and run the delete_unwanted_files process.
549 org_time = librariangc.time
550 def tomorrow_time():
551 return org_time() + 24 * 60 * 60 + 1
552 try:
553 librariangc.time = tomorrow_time
554 librariangc.delete_unwanted_files(self.con)
555 finally:
556 librariangc.time = org_time
557
558 # None of the rubbish we created has been touched.
559 self.assert_(os.path.isdir(noisedir1_path))
560 self.assert_(os.path.isdir(noisedir2_path))
561 self.assert_(os.path.isdir(noisedir3_path))
562 self.assert_(os.path.exists(noisefile1_path))
563 self.assert_(os.path.exists(noisefile2_path))
564 self.assert_(os.path.exists(noisefile3_path))
552 finally:565 finally:
553 librariangc.time = org_time566 # We need to clean this up ourselves, as the standard librarian
554567 # cleanup only removes files it knows where valid to avoid
555 # None of the rubbish we created has been touched.568 # accidents.
556 self.assert_(os.path.isdir(noisedir1_path))569 shutil.rmtree(noisedir1_path)
557 self.assert_(os.path.isdir(noisedir2_path))570 shutil.rmtree(noisedir2_path)
558 self.assert_(os.path.isdir(noisedir3_path))571 shutil.rmtree(noisedir3_path)
559 self.assert_(os.path.exists(noisefile1_path))572
560 self.assert_(os.path.exists(noisefile2_path))573 def test_delete_unwanted_files_bug437084(self):
561 self.assert_(os.path.exists(noisefile3_path))574 # There was a bug where delete_unwanted_files() would die
562575 # if the last file found on disk was unwanted.
576 self.layer.switchDbUser(dbuser='testadmin')
577 content='foo'
578 self.client.addFile(
579 'foo.txt', len(content), StringIO(content), 'text/plain')
580 # Roll back the database changes, leaving the file on disk.
581 transaction.abort()
582
583 self.layer.switchDbUser(config.librarian_gc.dbuser)
584
585 # This should cope.
586 librariangc.delete_unwanted_files(self.con)
563587
564 def test_cronscript(self):588 def test_cronscript(self):
565 script_path = os.path.join(589 script_path = os.path.join(
566590
=== modified file 'lib/canonical/librarian/librariangc.py'
--- lib/canonical/librarian/librariangc.py 2009-09-26 08:43:07 +0000
+++ lib/canonical/librarian/librariangc.py 2009-10-01 11:45:25 +0000
@@ -578,6 +578,7 @@
578 next_wanted_content_id = get_next_wanted_content_id()578 next_wanted_content_id = get_next_wanted_content_id()
579579
580 if (config.librarian_server.upstream_host is None580 if (config.librarian_server.upstream_host is None
581 and next_wanted_content_id is not None
581 and next_wanted_content_id < content_id):582 and next_wanted_content_id < content_id):
582 log.error(583 log.error(
583 "LibraryFileContent %d exists in the database but "584 "LibraryFileContent %d exists in the database but "
584585
=== modified file 'lib/lp/code/mail/tests/test_codehandler.py'
--- lib/lp/code/mail/tests/test_codehandler.py 2009-09-15 14:32:47 +0000
+++ lib/lp/code/mail/tests/test_codehandler.py 2009-10-01 11:45:24 +0000
@@ -5,6 +5,7 @@
55
6__metaclass__ = type6__metaclass__ = type
77
8from difflib import unified_diff
8from textwrap import dedent9from textwrap import dedent
9import transaction10import transaction
10import unittest11import unittest
@@ -30,6 +31,7 @@
30from canonical.launchpad.database import MessageSet31from canonical.launchpad.database import MessageSet
31from lp.code.model.branchmergeproposaljob import (32from lp.code.model.branchmergeproposaljob import (
32 CreateMergeProposalJob, MergeProposalCreatedJob)33 CreateMergeProposalJob, MergeProposalCreatedJob)
34from lp.code.model.diff import PreviewDiff
33from canonical.launchpad.interfaces.mail import (35from canonical.launchpad.interfaces.mail import (
34 EmailProcessingError, IWeaklyAuthenticatedPrincipal)36 EmailProcessingError, IWeaklyAuthenticatedPrincipal)
35from lp.code.mail.codehandler import (37from lp.code.mail.codehandler import (
@@ -590,6 +592,25 @@
590 # Ensure the DB operations violate no constraints.592 # Ensure the DB operations violate no constraints.
591 transaction.commit()593 transaction.commit()
592594
595 def test_reviewer_with_diff(self):
596 """Requesting a review with a diff works."""
597 diff_text = ''.join(unified_diff('', 'Fake diff'))
598 preview_diff = PreviewDiff.create(
599 diff_text,
600 unicode(self.factory.getUniqueString('revid')),
601 unicode(self.factory.getUniqueString('revid')),
602 None, None)
603 # To record the diff in the librarian.
604 transaction.commit()
605 bmp = self.factory.makeBranchMergeProposal(preview_diff=preview_diff)
606 eric = self.factory.makePerson(name="eric", email="eric@example.com")
607 mail = self.factory.makeSignedMessage(body=' reviewer eric')
608 email_addr = bmp.address
609 self.switchDbUser(config.processmail.dbuser)
610 self.code_handler.process(mail, email_addr, None)
611 [vote] = bmp.votes
612 self.assertEqual(eric, vote.reviewer)
613
593 def test_processMergeProposalDefaultReviewer(self):614 def test_processMergeProposalDefaultReviewer(self):
594 # If no reviewer was requested in the comment body, then the default615 # If no reviewer was requested in the comment body, then the default
595 # reviewer of the target branch is used.616 # reviewer of the target branch is used.

Subscribers

People subscribed via source and target branches

to status/vote changes: