William Grant has proposed merging lp:~wgrant/launchpad/ppa-pub-skip into
lp:launchpad.
Commit message:
Fix a couple of issues causing deleted PPAs to get their directories recreated
on disk.
Requested reviews:
Launchpad code reviewers (launchpad-reviewers)
For more details, see:
https://code.launchpad.net/~wgrant/launchpad/ppa-pub-skip/+merge/150264
Fix a couple of issues causing deleted PPAs to get their directories recreated
on disk. One or the other fix is sufficient, but one is the sensible fix and
the other has been bugging me for years.
- Calling getPublisher creates the archive directory tree on disk. This is
rather counterintuitive, since the returned Publisher object has methods for
deleting the archive and other similar things. I moved it to a
Publisher.setupArchiveDirs method that's called in the relevant places.
- Distribution.getPendingPublicationPPAs assumed that a PPA had pending
deletions as long as scheduleddeletiondate was unset, when in fact both
scheduleddeletiondate and dateremoved need to be unset. It could be argued that
scheduleddeletiondate should be set whenever dateremoved is, but sometimes
(mostly PPA deletion) the deletion is executed immediately. This should also
fix some performance issues in the PPA publisher.
--
https://code.launchpad.net/~wgrant/launchpad/ppa-pub-skip/+merge/150264
Your team Launchpad code reviewers is requested to review the proposed merge of
lp:~wgrant/launchpad/ppa-pub-skip into lp:launchpad.
=== modified file 'lib/lp/archivepublisher/domination.py'
--- lib/lp/archivepublisher/domination.py 2012-08-17 11:15:35 +0000
+++ lib/lp/archivepublisher/domination.py 2013-02-25 04:45:26 +0000
@@ -517,6 +517,7 @@
binarypackagepublishinghistory.distroarchseries =
distroarchseries.id AND
binarypackagepublishinghistory.scheduleddeletiondate IS NULL AND
+ binarypackagepublishinghistory.dateremoved IS NULL AND
binarypackagepublishinghistory.archive = %s AND
binarypackagebuild.source_package_release = %s AND
distroarchseries.distroseries = %s AND
@@ -786,7 +787,8 @@
sourcepackagepublishinghistory.archive = %s AND
sourcepackagepublishinghistory.pocket = %s AND
sourcepackagepublishinghistory.status IN %s AND
- sourcepackagepublishinghistory.scheduleddeletiondate is NULL
+ sourcepackagepublishinghistory.scheduleddeletiondate is NULL AND
+ sourcepackagepublishinghistory.dateremoved is NULL
""" % sqlvalues(
distroseries, self.archive, pocket,
inactive_publishing_status))
@@ -798,7 +800,8 @@
binarypackagepublishinghistory.archive = %s AND
binarypackagepublishinghistory.pocket = %s AND
binarypackagepublishinghistory.status IN %s AND
- binarypackagepublishinghistory.scheduleddeletiondate is NULL
+ binarypackagepublishinghistory.scheduleddeletiondate is NULL AND
+ binarypackagepublishinghistory.dateremoved is NULL
""" % sqlvalues(
distroseries, self.archive, pocket,
inactive_publishing_status),
=== modified file 'lib/lp/archivepublisher/publishing.py'
--- lib/lp/archivepublisher/publishing.py 2013-02-20 04:02:11 +0000
+++ lib/lp/archivepublisher/publishing.py 2013-02-25 04:45:26 +0000
@@ -96,9 +96,6 @@
It ensures the given archive location matches the minimal structure
required.
"""
- log.debug("Making directories as needed.")
- pubconf.setupArchiveDirs()
-
log.debug("Preparing on-disk pool representation.")
dp = DiskPool(pubconf.poolroot, pubconf.temproot,
logging.getLogger("DiskPool"))
@@ -145,8 +142,6 @@
disk_pool = _getDiskPool(pubconf, log)
- _setupHtaccess(archive, pubconf, log)
-
if distsroot is not None:
log.debug("Overriding dists root with %s." % distsroot)
pubconf.distsroot = distsroot
@@ -197,9 +192,6 @@
self.archive = archive
self.allowed_suites = allowed_suites
- if not os.path.isdir(config.poolroot):
- raise ValueError("Root %s is not a directory or does "
- "not exist" % config.poolroot)
self._diskpool = diskpool
if library is None:
@@ -217,6 +209,11 @@
# This is a set of tuples in the form (distroseries.name, pocket)
self.release_files_needed = set()
+ def setupArchiveDirs(self):
+ self.log.debug("Setting up archive directories.")
+ self._config.setupArchiveDirs()
+ _setupHtaccess(self.archive, self._config, self.log)
+
def isDirty(self, distroseries, pocket):
"""True if a publication has happened in this release and pocket."""
return (distroseries.name, pocket) in self.dirty_pockets
=== modified file 'lib/lp/archivepublisher/tests/test_publisher.py'
--- lib/lp/archivepublisher/tests/test_publisher.py 2013-02-20 04:02:11 +0000
+++ lib/lp/archivepublisher/tests/test_publisher.py 2013-02-25 04:45:26 +0000
@@ -167,6 +167,7 @@
dead_bpph.supersede()
publisher = getPublisher(test_archive, None, self.logger)
+ publisher.setupArchiveDirs()
self.assertTrue(os.path.exists(publisher._config.archiveroot))
@@ -212,6 +213,7 @@
purpose=ArchivePurpose.PPA)
logger = BufferLogger()
publisher = getPublisher(test_archive, None, logger)
+ publisher.setupArchiveDirs()
self.assertTrue(os.path.exists(publisher._config.archiveroot))
@@ -1134,7 +1136,7 @@
# Set up the publisher for it and publish its repository.
# 'getPublisher' is what actually configures the htaccess file.
- getPublisher(ppa, [], self.logger)
+ getPublisher(ppa, [], self.logger).setupArchiveDirs()
pubconf = getPubConfig(ppa)
htaccess_path = os.path.join(pubconf.htaccessroot, ".htaccess")
self.assertTrue(os.path.exists(htaccess_path))
=== modified file 'lib/lp/registry/model/distribution.py'
--- lib/lp/registry/model/distribution.py 2013-02-06 09:15:36 +0000
+++ lib/lp/registry/model/distribution.py 2013-02-25 04:45:26 +0000
@@ -1275,7 +1275,8 @@
Archive.purpose = %s AND
Archive.distribution = %s AND
SourcePackagePublishingHistory.archive = archive.id AND
- SourcePackagePublishingHistory.scheduleddeletiondate is null AND
+ SourcePackagePublishingHistory.scheduleddeletiondate IS NULL AND
+ SourcePackagePublishingHistory.dateremoved IS NULL AND
SourcePackagePublishingHistory.status IN (%s, %s)
""" % sqlvalues(ArchivePurpose.PPA, self,
PackagePublishingStatus.PENDING,
@@ -1289,7 +1290,8 @@
Archive.purpose = %s AND
Archive.distribution = %s AND
BinaryPackagePublishingHistory.archive = archive.id AND
- BinaryPackagePublishingHistory.scheduleddeletiondate is null AND
+ BinaryPackagePublishingHistory.scheduleddeletiondate IS NULL AND
+ BinaryPackagePublishingHistory.dateremoved IS NULL AND
BinaryPackagePublishingHistory.status IN (%s, %s)
""" % sqlvalues(ArchivePurpose.PPA, self,
PackagePublishingStatus.PENDING,
=== modified file 'lib/lp/soyuz/doc/distribution.txt'
--- lib/lp/soyuz/doc/distribution.txt 2012-12-05 16:16:20 +0000
+++ lib/lp/soyuz/doc/distribution.txt 2013-02-25 04:45:26 +0000
@@ -236,11 +236,20 @@
>>> pending_ppa.id == cprov.archive.id
True
+If scheduleddeletiondate or dateremoved are set then the PPA is no
+longer pending. process-death-row will do the rest.
+
>>> login('[email protected]')
>>> from lp.services.database.constants import UTC_NOW
>>> src_pub.scheduleddeletiondate = UTC_NOW
>>> ubuntu.getPendingPublicationPPAs().count()
0
+ >>> src_pub.scheduleddeletiondate = None
+ >>> ubuntu.getPendingPublicationPPAs().count()
+ 1
+ >>> src_pub.dateremoved = UTC_NOW
+ >>> ubuntu.getPendingPublicationPPAs().count()
+ 0
A binary pending publication also moves a PPA to the pending-publication
state. In order to test this behaviour we will copy some binaries within
@@ -285,6 +294,12 @@
>>> bin_pub.scheduleddeletiondate = UTC_NOW
>>> ubuntu.getPendingPublicationPPAs().count()
0
+ >>> bin_pub.scheduleddeletiondate = None
+ >>> ubuntu.getPendingPublicationPPAs().count()
+ 1
+ >>> bin_pub.dateremoved = UTC_NOW
+ >>> ubuntu.getPendingPublicationPPAs().count()
+ 0
Distribution Archives
=== modified file 'lib/lp/soyuz/scripts/publishdistro.py'
--- lib/lp/soyuz/scripts/publishdistro.py 2012-06-29 08:40:05 +0000
+++ lib/lp/soyuz/scripts/publishdistro.py 2013-02-25 04:45:26 +0000
@@ -300,6 +300,7 @@
Commits transactions along the way.
"""
+ publisher.setupArchiveDirs()
publisher.A_publish(self.isCareful(self.options.careful_publishing))
self.txn.commit()
_______________________________________________
Mailing list: https://launchpad.net/~launchpad-reviewers
Post to : [email protected]
Unsubscribe : https://launchpad.net/~launchpad-reviewers
More help : https://help.launchpad.net/ListHelp