diff piecrust/baking/baker.py @ 50:2fec3ee1298f

Properly override pages between realms.
author Ludovic Chabant <ludovic@chabant.com>
date Fri, 22 Aug 2014 23:41:17 -0700
parents fce061f8c2ed
children 3471ffa059b2
line wrap: on
line diff
--- a/piecrust/baking/baker.py	Fri Aug 22 20:26:05 2014 -0700
+++ b/piecrust/baking/baker.py	Fri Aug 22 23:41:17 2014 -0700
@@ -79,8 +79,6 @@
         return os.path.normpath(os.path.join(*bake_path))
 
     def bake(self, factory, route, taxonomy_name=None, taxonomy_term=None):
-        page = factory.buildPage()
-
         pagination_filter = None
         custom_data = None
         if taxonomy_name and taxonomy_term:
@@ -110,8 +108,31 @@
             # Normal page bake.
             uri = route.getUri(factory.metadata)
 
+        override = self.record.getOverrideEntry(factory, uri)
+        if override is not None:
+            override_source = self.app.getSource(override.source_name)
+            if override_source.realm == factory.source.realm:
+                raise Exception(
+                        "Page '%s' maps to URL '%s' but is overriden by page"
+                        "'%s:%s'." % (factory.ref_spec, uri,
+                            override.source_name, override.rel_path))
+            logger.debug("'%s' [%s] is overriden by '%s:%s'. Skipping" %
+                    (factory.ref_spec, uri, override.source_name,
+                        override.rel_path))
+            entry = BakeRecordPageEntry()
+            entry.path = factory.path
+            entry.rel_path = factory.rel_path
+            entry.source_name = factory.source.name
+            entry.was_overriden = True
+
+            if self.record:
+                self.record.addEntry(entry)
+
+            return entry
+
         cur_sub = 1
         has_more_subs = True
+        page = factory.buildPage()
         cur_record_entry = BakeRecordPageEntry(page)
         cur_record_entry.taxonomy_name = taxonomy_name
         cur_record_entry.taxonomy_term = taxonomy_term
@@ -540,6 +561,8 @@
                 self.ctx.abort_event.set()
                 self.abort_exception = ex
                 logger.debug("[%d] Critical error, aborting." % self.wid)
+                if self.ctx.app.debug:
+                    logger.exception(ex)
                 break
 
     def _unsafeRun(self, job):