]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
binman: Update Entry.WriteData() to handle special sections
authorSimon Glass <sjg@chromium.org>
Sat, 20 Jul 2019 18:24:05 +0000 (12:24 -0600)
committerSimon Glass <sjg@chromium.org>
Mon, 29 Jul 2019 15:38:06 +0000 (09:38 -0600)
At present this method assumes that the parent section does not need
to recalculate its position or adjust any metadata it may contain. But
when the entry changes size this may not be true. Also if the parent
section is more than just a container (e.g. it is a CBFS) then the
section may need to regenerate its output.

Add a new WriteChildData() method to sections and call this from the
WriteData() method, to handle this situation.

Signed-off-by: Simon Glass <sjg@chromium.org>
tools/binman/entry.py
tools/binman/etype/cbfs.py
tools/binman/etype/section.py

index 8416214fc93fab4f9bf500591c1539f7b8c2b4fe..6a2c6e0d92e5b0cb0fff2dcce436490f4e2cbc9f 100644 (file)
@@ -751,7 +751,26 @@ features to produce new behaviours.
         self.contents_size = self.size
         ok = self.ProcessContentsUpdate(data)
         self.Detail('WriteData: size=%x, ok=%s' % (len(data), ok))
-        return ok
+        section_ok = self.section.WriteChildData(self)
+        return ok and section_ok
+
+    def WriteChildData(self, child):
+        """Handle writing the data in a child entry
+
+        This should be called on the child's parent section after the child's
+        data has been updated. It
+
+        This base-class implementation does nothing, since the base Entry object
+        does not have any children.
+
+        Args:
+            child: Child Entry that was written
+
+        Returns:
+            True if the section could be updated successfully, False if the
+                data is such that the section could not updat
+        """
+        return True
 
     def GetSiblingOrder(self):
         """Get the relative order of an entry amoung its siblings
index 2bcdf2fd433f4da2ab61b7489cc183deae34759b..0109fdbb918cdabd28d1bc4c5ac3d7c52e701e6b 100644 (file)
@@ -169,7 +169,7 @@ class Entry_cbfs(Entry):
         self._cbfs_entries = OrderedDict()
         self._ReadSubnodes()
 
-    def ObtainContents(self):
+    def ObtainContents(self, skip=None):
         arch = cbfs_util.find_arch(self._cbfs_arg)
         if arch is None:
             self.Raise("Invalid architecture '%s'" % self._cbfs_arg)
@@ -179,7 +179,7 @@ class Entry_cbfs(Entry):
         for entry in self._cbfs_entries.values():
             # First get the input data and put it in a file. If not available,
             # try later.
-            if not entry.ObtainContents():
+            if entry != skip and not entry.ObtainContents():
                 return False
             data = entry.GetData()
             cfile = None
@@ -274,3 +274,7 @@ class Entry_cbfs(Entry):
         reader = self.reader
         cfile = reader.files.get(child.name)
         return cfile.data if decomp else cfile.orig_data
+
+    def WriteChildData(self, child):
+        self.ObtainContents(skip=child)
+        return True
index 855e291bc43f0409978a37804babbf3ef206af6b..5d34fc546afd7ea9140e530b2c4a25564a7b9285 100644 (file)
@@ -520,3 +520,6 @@ class Entry_section(Entry):
                             (child.GetPath(), len(indata), child.compress,
                             len(data)))
         return data
+
+    def WriteChildData(self, child):
+        return True