update_payload: Fix IsDelta to support payload v2.

Added check for the old_partition_info field which is used by major
version 2 payload.

Other changes are needed in order to pass presubmit lint check.

BUG=None
TEST=Run devserver with a v2 delta payload.

Change-Id: I3d7057fde44bd24d768177d5ed5c36bc2d4ca94b
Reviewed-on: https://chromium-review.googlesource.com/312952
Commit-Ready: Sen Jiang <senj@chromium.org>
Tested-by: Sen Jiang <senj@chromium.org>
Reviewed-by: Alex Deymo <deymo@chromium.org>
Reviewed-by: Gilad Arnold <garnold@chromium.org>
diff --git a/scripts/update_payload/payload.py b/scripts/update_payload/payload.py
index ccd3240..f76c0de 100644
--- a/scripts/update_payload/payload.py
+++ b/scripts/update_payload/payload.py
@@ -4,6 +4,8 @@
 
 """Tools for reading, verifying and applying Chrome OS update payloads."""
 
+from __future__ import print_function
+
 import hashlib
 import struct
 
@@ -30,11 +32,12 @@
     size: the integer size in bytes (2, 4 or 8)
     is_unsigned: whether it is signed or not
     hasher: an optional hasher to pass the value through
+
   Returns:
     An "unpacked" (Python) integer value.
+
   Raises:
     PayloadError if an read error occurred.
-
   """
   return struct.unpack(common.IntPackingFmtStr(size, is_unsigned),
                        common.Read(file_obj, size, hasher=hasher))[0]
@@ -71,8 +74,10 @@
       Args:
         payload_file: a file object
         hasher: an optional hasher to pass the value through
+
       Returns:
         None.
+
       Raises:
         PayloadError if a read error occurred or the header is invalid.
       """
@@ -101,7 +106,6 @@
 
     Args:
       payload_file: update payload file object open for reading
-
     """
     self.payload_file = payload_file
     self.manifest_hasher = None
@@ -117,9 +121,9 @@
 
     Returns:
       A payload header object.
+
     Raises:
       PayloadError if a read error occurred.
-
     """
     header = self._PayloadHeader()
     header.ReadFromPayload(self.payload_file, self.manifest_hasher)
@@ -130,9 +134,9 @@
 
     Returns:
       A string containing the payload manifest in binary form.
+
     Raises:
       PayloadError if a read error occurred.
-
     """
     if not self.header:
       raise PayloadError('payload header not present')
@@ -146,9 +150,9 @@
     Returns:
       A string containing the metadata signatures protobuf in binary form or
       an empty string if no metadata signature found in the payload.
+
     Raises:
       PayloadError if a read error occurred.
-
     """
     if not self.header:
       raise PayloadError('payload header not present')
@@ -163,11 +167,12 @@
     Args:
       offset: offset to the beginning of the blob from the end of the manifest
       length: the blob's length
+
     Returns:
       A string containing the raw blob data.
+
     Raises:
       PayloadError if a read error occurred.
-
     """
     return common.Read(self.payload_file, length,
                        offset=self.data_offset + offset)
@@ -180,7 +185,6 @@
     Raises:
       PayloadError if object already initialized or fails to initialize
       correctly.
-
     """
     if self.is_init:
       raise PayloadError('payload object already initialized')
@@ -212,9 +216,9 @@
     """Emits the payload embedded description data to standard output."""
     def _DescribeImageInfo(description, image_info):
       def _DisplayIndentedValue(name, value):
-        print '  {:<14} {}'.format(name+':', value)
+        print('  {:<14} {}'.format(name+':', value))
 
-      print '%s:' % description
+      print('%s:' % description)
       _DisplayIndentedValue('Channel', image_info.channel)
       _DisplayIndentedValue('Board', image_info.board)
       _DisplayIndentedValue('Version', image_info.version)
@@ -247,7 +251,9 @@
     """Returns True iff the payload appears to be a delta."""
     self._AssertInit()
     return (self.manifest.HasField('old_kernel_info') or
-            self.manifest.HasField('old_rootfs_info'))
+            self.manifest.HasField('old_rootfs_info') or
+            any(partition.HasField('old_partition_info')
+                for partition in self.manifest.partitions))
 
   def IsFull(self):
     """Returns True iff the payload appears to be a full."""
@@ -269,9 +275,9 @@
       kernel_part_size: the size of (physical) kernel partitions in bytes
       allow_unhashed: allow unhashed operation blobs
       disabled_tests: list of tests to disable
+
     Raises:
       PayloadError if payload verification failed.
-
     """
     self._AssertInit()
 
@@ -300,9 +306,9 @@
       truncate_to_expected_size: whether to truncate the resulting partitions
                                  to their expected sizes, as specified in the
                                  payload (optional)
+
     Raises:
       PayloadError if payload application failed.
-
     """
     self._AssertInit()
 
@@ -327,7 +333,6 @@
       skip: the number of first origin mappings to skip
       trace_out_file: file object to dump the trace to
       is_kernel: trace through kernel (True) or rootfs (False) operations
-
     """
     self._AssertInit()