import zipfile
import blockimgdiff
+from rangelib import *
try:
from hashlib import sha1 as sha1
class BlockDifference:
- def __init__(self, partition, tgt, src=None):
+ def __init__(self, partition, tgt, src=None, check_first_block=False):
self.tgt = tgt
self.src = src
self.partition = partition
+ self.check_first_block = check_first_block
version = 1
if OPTIONS.info_dict:
self._WriteUpdate(script, output_zip)
else:
+ if self.check_first_block:
+ self._CheckFirstBlock(script)
+
script.AppendExtra('if range_sha1("%s", "%s") == "%s" then' %
(self.device, self.src.care_map.to_string_raw(),
self.src.TotalSha1()))
(self.device, partition, partition, partition))
script.AppendExtra(script._WordWrap(call))
+ def _CheckFirstBlock(self, script):
+ r = RangeSet((0, 1))
+ h = sha1()
+ for data in self.src.ReadRangeSet(r):
+ h.update(data)
+ h = h.hexdigest()
+
+ script.AppendExtra(('(range_sha1("%s", "%s") == "%s") || '
+ 'abort("%s has been remounted R/W; '
+ 'reflash device to reenable OTA updates");')
+ % (self.device, r.to_string_raw(), h, self.device))
+
DataImage = blockimgdiff.DataImage
system_src = GetImage("system", OPTIONS.source_tmp, OPTIONS.source_info_dict)
system_tgt = GetImage("system", OPTIONS.target_tmp, OPTIONS.target_info_dict)
- system_diff = common.BlockDifference("system", system_tgt, system_src)
+ system_diff = common.BlockDifference("system", system_tgt, system_src,
+ check_first_block=True)
if HasVendorPartition(target_zip):
if not HasVendorPartition(source_zip):
raise RuntimeError("can't generate incremental that adds /vendor")
vendor_src = GetImage("vendor", OPTIONS.source_tmp, OPTIONS.source_info_dict)
vendor_tgt = GetImage("vendor", OPTIONS.target_tmp, OPTIONS.target_info_dict)
- vendor_diff = common.BlockDifference("vendor", vendor_tgt, vendor_src)
+ vendor_diff = common.BlockDifference("vendor", vendor_tgt, vendor_src,
+ check_first_block=True)
else:
vendor_diff = None