Add support for "persist" option
am: 42ce7943e1

Change-Id: Ia5bb64e5d99b29afcce5f0b1cd8f6c8ddcbc3559
diff --git a/README b/README
index eed9542..67c0b43 100644
--- a/README
+++ b/README
@@ -113,6 +113,10 @@
  flags:       A 64-bit integer (decimal or hexadecimal representations are
               accepted) for GPT flags. Default value is 0.
 
+ persist:     If 'true', the parition will be marked persistant. This will
+              set bit 0 of flags to 1. This will OR with the value of
+              'flags'.
+
  ignore:      If 'true', the partition will not be included in the final
               output.
 
diff --git a/bpt_unittest.py b/bpt_unittest.py
index f42b43a..814e122 100755
--- a/bpt_unittest.py
+++ b/bpt_unittest.py
@@ -322,6 +322,12 @@
                     disk_size=bpttool.ParseSize('10 GiB'),
                     disk_guid='01234567-89ab-cdef-0123-00000000002a')
 
+  def testPersist(self):
+    """Checks that persist flags are generated"""
+    self._MakeTable(['test/persist.bpt'],
+                    'test/expected_json_persist.bpt',
+                    disk_size=bpttool.ParseSize('10 GiB'))
+
   def testSuffixes(self):
     """Checks that A/B-suffixes can be changed on the command-line."""
     self._MakeTable(['test/base.bpt'],
@@ -459,6 +465,20 @@
             'userdata', 'flags', False),
         '0x0420000000000000')
 
+  def testQueryPersistTrue(self):
+    """Checks query for persist."""
+    self.assertEqual(
+        self.bpt.query_partition(
+            open('test/persist.bpt'),
+            'true_persist', 'persist', False), 'True')
+
+  def testQueryPersistFalse(self):
+    """Checks query for persist."""
+    self.assertEqual(
+        self.bpt.query_partition(
+            open('test/persist.bpt'),
+            'false_persist', 'persist', False), 'False')
+
   def testQuerySizeCollapse(self):
     """Checks query for size when collapsing A/B partitions."""
     self.assertEqual(
diff --git a/bpttool b/bpttool
index 53b4578..ae4bc8e 100755
--- a/bpttool
+++ b/bpttool
@@ -44,6 +44,7 @@
 JSON_KEYWORD_PARTITIONS_GUID = 'guid'
 JSON_KEYWORD_PARTITIONS_TYPE_GUID = 'type_guid'
 JSON_KEYWORD_PARTITIONS_FLAGS = 'flags'
+JSON_KEYWORD_PARTITIONS_PERSIST = 'persist'
 JSON_KEYWORD_PARTITIONS_IGNORE = 'ignore'
 JSON_KEYWORD_PARTITIONS_AB = 'ab'
 JSON_KEYWORD_PARTITIONS_AB_EXPANDED = 'ab_expanded'
@@ -56,7 +57,8 @@
                          'offset',
                          'guid',
                          'type_guid',
-                         'flags']
+                         'flags',
+                         'persist']
 
 BPT_VERSION_MAJOR = 1
 BPT_VERSION_MINOR = 0
@@ -231,6 +233,8 @@
     type_guid: Type GUID (RFC 4122 compliant) as a string or a known type
                from the |KNOWN_TYPE_GUIDS| map.
     flags: GUID flags.
+    persist: If true, sets bit 0 of flags indicating that this partition should
+             not be deleted by the bootloader.
     ab: If True, the partition is an A/B partition.
     ab_expanded: If True, the A/B partitions have been generated.
     ignore: If True, the partition should not be included in the final output.
@@ -246,6 +250,7 @@
     self.guid = None
     self.type_guid = None
     self.flags = 0
+    self.persist = False
     self.ab = False
     self.ab_expanded = False
     self.ignore = False
@@ -287,6 +292,11 @@
     value = pobj.get(JSON_KEYWORD_PARTITIONS_FLAGS)
     if value is not None:
       self.flags = ParseNumber(value)
+    value = pobj.get(JSON_KEYWORD_PARTITIONS_PERSIST)
+    if value is not None:
+      self.persist = value
+      if value:
+        self.flags = self.flags | 0x1
     value = pobj.get(JSON_KEYWORD_PARTITIONS_POSITION)
     if value is not None:
       self.position = ParseNumber(value)
@@ -508,6 +518,7 @@
               '      "' + JSON_KEYWORD_PARTITIONS_GUID + '": "{}",\n'
               '      "' + JSON_KEYWORD_PARTITIONS_TYPE_GUID + '": "{}",\n'
               '      "' + JSON_KEYWORD_PARTITIONS_FLAGS + '": "{:#018x}",\n'
+              '      "' + JSON_KEYWORD_PARTITIONS_PERSIST + '": {},\n'
               '      "' + JSON_KEYWORD_PARTITIONS_IGNORE + '": {},\n'
               '      "' + JSON_KEYWORD_PARTITIONS_AB + '": {},\n'
               '      "' + JSON_KEYWORD_PARTITIONS_AB_EXPANDED + '": {},\n'
@@ -519,6 +530,7 @@
                                    p.guid,
                                    p.type_guid,
                                    p.flags,
+                                   'true' if p.persist else 'false',
                                    'true' if p.ignore else 'false',
                                    'true' if p.ab else 'false',
                                    'true' if p.ab_expanded else 'false',
diff --git a/test/expected_json_alignment.bpt b/test/expected_json_alignment.bpt
index 1996359..f34b9ed 100644
--- a/test/expected_json_alignment.bpt
+++ b/test/expected_json_alignment.bpt
@@ -15,6 +15,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000001",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -28,6 +29,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000002",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -41,6 +43,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000003",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -54,6 +57,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000004",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -67,6 +71,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000005",
       "type_guid": "e99d84d7-2c1b-44cf-8c58-effae2dc2558",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -80,6 +85,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000006",
       "type_guid": "e99d84d7-2c1b-44cf-8c58-effae2dc2558",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -93,6 +99,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000007",
       "type_guid": "0bb7e6ed-4424-49c0-9372-7fbab465ab4c",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": false,
       "ab_expanded": false,
diff --git a/test/expected_json_base.bpt b/test/expected_json_base.bpt
index 189684a..2a135f1 100644
--- a/test/expected_json_base.bpt
+++ b/test/expected_json_base.bpt
@@ -15,6 +15,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000001",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -28,6 +29,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000002",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -41,6 +43,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000003",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -54,6 +57,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000004",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -67,6 +71,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000005",
       "type_guid": "e99d84d7-2c1b-44cf-8c58-effae2dc2558",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -80,6 +85,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000006",
       "type_guid": "e99d84d7-2c1b-44cf-8c58-effae2dc2558",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -93,6 +99,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000007",
       "type_guid": "0bb7e6ed-4424-49c0-9372-7fbab465ab4c",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": false,
       "ab_expanded": false,
diff --git a/test/expected_json_disk_guid.bpt b/test/expected_json_disk_guid.bpt
index 82265e7..9246ebf 100644
--- a/test/expected_json_disk_guid.bpt
+++ b/test/expected_json_disk_guid.bpt
@@ -15,6 +15,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000001",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -28,6 +29,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000002",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -41,6 +43,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000003",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -54,6 +57,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000004",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -67,6 +71,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000005",
       "type_guid": "e99d84d7-2c1b-44cf-8c58-effae2dc2558",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -80,6 +85,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000006",
       "type_guid": "e99d84d7-2c1b-44cf-8c58-effae2dc2558",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -93,6 +99,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000007",
       "type_guid": "0bb7e6ed-4424-49c0-9372-7fbab465ab4c",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": false,
       "ab_expanded": false,
diff --git a/test/expected_json_partitions_offset_begin.bpt b/test/expected_json_partitions_offset_begin.bpt
index bb66b19..4964dab 100644
--- a/test/expected_json_partitions_offset_begin.bpt
+++ b/test/expected_json_partitions_offset_begin.bpt
@@ -15,6 +15,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000001",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -28,6 +29,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000002",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -41,6 +43,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000003",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -54,6 +57,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000004",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -67,6 +71,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000005",
       "type_guid": "e99d84d7-2c1b-44cf-8c58-effae2dc2558",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -80,6 +85,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000006",
       "type_guid": "e99d84d7-2c1b-44cf-8c58-effae2dc2558",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -93,6 +99,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000007",
       "type_guid": "0bb7e6ed-4424-49c0-9372-7fbab465ab4c",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": false,
       "ab_expanded": false,
diff --git a/test/expected_json_persist.bpt b/test/expected_json_persist.bpt
new file mode 100644
index 0000000..0d3b263
--- /dev/null
+++ b/test/expected_json_persist.bpt
@@ -0,0 +1,81 @@
+{
+  "settings": {
+    "ab_suffixes": ["_a", "_b"],
+    "partitions_offset_begin": 0,
+    "disk_size": 10737418240,
+    "disk_alignment": 4096,
+    "disk_guid": "01234567-89ab-cdef-0123-000000000000"
+  },
+  "partitions": [
+    {
+      "label": "no_persist",
+      "offset": 20480,
+      "size": 134217728,
+      "grow": false,
+      "guid": "01234567-89ab-cdef-0123-000000000001",
+      "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
+      "flags": "0x0000000000000000",
+      "persist": false,
+      "ignore": false,
+      "ab": false,
+      "ab_expanded": false,
+      "position": 1
+    },
+    {
+      "label": "false_persist",
+      "offset": 134238208,
+      "size": 134217728,
+      "grow": false,
+      "guid": "01234567-89ab-cdef-0123-000000000002",
+      "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
+      "flags": "0x0000000000000000",
+      "persist": false,
+      "ignore": false,
+      "ab": false,
+      "ab_expanded": false,
+      "position": 2
+    },
+    {
+      "label": "true_persist",
+      "offset": 268455936,
+      "size": 134217728,
+      "grow": false,
+      "guid": "01234567-89ab-cdef-0123-000000000003",
+      "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
+      "flags": "0x0000000000000001",
+      "persist": true,
+      "ignore": false,
+      "ab": false,
+      "ab_expanded": false,
+      "position": 3
+    },
+    {
+      "label": "false_persist_with_flags",
+      "offset": 402673664,
+      "size": 134217728,
+      "grow": false,
+      "guid": "01234567-89ab-cdef-0123-000000000004",
+      "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
+      "flags": "0x0000000000000010",
+      "persist": false,
+      "ignore": false,
+      "ab": false,
+      "ab_expanded": false,
+      "position": 4
+    },
+    {
+      "label": "true_persist_with_flags",
+      "offset": 536891392,
+      "size": 134217728,
+      "grow": false,
+      "guid": "01234567-89ab-cdef-0123-000000000005",
+      "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
+      "flags": "0x0000000000000011",
+      "persist": true,
+      "ignore": false,
+      "ab": false,
+      "ab_expanded": false,
+      "position": 5
+    }
+  ]
+}
diff --git a/test/expected_json_size.bpt b/test/expected_json_size.bpt
index b72452f..d31ab10 100644
--- a/test/expected_json_size.bpt
+++ b/test/expected_json_size.bpt
@@ -15,6 +15,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000001",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -28,6 +29,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000002",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -41,6 +43,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000003",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -54,6 +57,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000004",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -67,6 +71,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000005",
       "type_guid": "e99d84d7-2c1b-44cf-8c58-effae2dc2558",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -80,6 +85,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000006",
       "type_guid": "e99d84d7-2c1b-44cf-8c58-effae2dc2558",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -93,6 +99,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000007",
       "type_guid": "0bb7e6ed-4424-49c0-9372-7fbab465ab4c",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": false,
       "ab_expanded": false,
diff --git a/test/expected_json_stacked_change_ab_size.bpt b/test/expected_json_stacked_change_ab_size.bpt
index be02d8f..0d16099 100644
--- a/test/expected_json_stacked_change_ab_size.bpt
+++ b/test/expected_json_stacked_change_ab_size.bpt
@@ -15,6 +15,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000001",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -28,6 +29,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000002",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -41,6 +43,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000003",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -54,6 +57,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000004",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -67,6 +71,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000005",
       "type_guid": "e99d84d7-2c1b-44cf-8c58-effae2dc2558",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -80,6 +85,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000006",
       "type_guid": "e99d84d7-2c1b-44cf-8c58-effae2dc2558",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -93,6 +99,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000007",
       "type_guid": "0bb7e6ed-4424-49c0-9372-7fbab465ab4c",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": false,
       "ab_expanded": false,
diff --git a/test/expected_json_stacked_change_flags.bpt b/test/expected_json_stacked_change_flags.bpt
index 0ae8461..094e4bb 100644
--- a/test/expected_json_stacked_change_flags.bpt
+++ b/test/expected_json_stacked_change_flags.bpt
@@ -15,6 +15,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000001",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -28,6 +29,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000002",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -41,6 +43,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000003",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -54,6 +57,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000004",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -67,6 +71,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000005",
       "type_guid": "e99d84d7-2c1b-44cf-8c58-effae2dc2558",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -80,6 +85,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000006",
       "type_guid": "e99d84d7-2c1b-44cf-8c58-effae2dc2558",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -93,6 +99,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000007",
       "type_guid": "0bb7e6ed-4424-49c0-9372-7fbab465ab4c",
       "flags": "0x0420000000000000",
+      "persist": false,
       "ignore": false,
       "ab": false,
       "ab_expanded": false,
diff --git a/test/expected_json_stacked_disable_ab.bpt b/test/expected_json_stacked_disable_ab.bpt
index e980b36..0558206 100644
--- a/test/expected_json_stacked_disable_ab.bpt
+++ b/test/expected_json_stacked_disable_ab.bpt
@@ -1,6 +1,7 @@
 {
   "settings": {
     "ab_suffixes": ["_a", "_b"],
+    "partitions_offset_begin": 0,
     "disk_size": 10737418240,
     "disk_alignment": 4096,
     "disk_guid": "01234567-89ab-cdef-0123-000000000000"
@@ -14,6 +15,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000001",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": false,
       "ab_expanded": false,
@@ -27,6 +29,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000002",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": false,
       "ab_expanded": false,
@@ -40,6 +43,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000003",
       "type_guid": "e99d84d7-2c1b-44cf-8c58-effae2dc2558",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": false,
       "ab_expanded": false,
@@ -53,6 +57,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000004",
       "type_guid": "0bb7e6ed-4424-49c0-9372-7fbab465ab4c",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": false,
       "ab_expanded": false,
diff --git a/test/expected_json_stacked_ignore.bpt b/test/expected_json_stacked_ignore.bpt
index 858162a..9fac092 100644
--- a/test/expected_json_stacked_ignore.bpt
+++ b/test/expected_json_stacked_ignore.bpt
@@ -15,6 +15,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000001",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -28,6 +29,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000002",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -41,6 +43,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000003",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -54,6 +57,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000004",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -67,6 +71,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000005",
       "type_guid": "e99d84d7-2c1b-44cf-8c58-effae2dc2558",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -80,6 +85,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000006",
       "type_guid": "e99d84d7-2c1b-44cf-8c58-effae2dc2558",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
diff --git a/test/expected_json_stacked_new_partition.bpt b/test/expected_json_stacked_new_partition.bpt
index 0ca2443..5553c60 100644
--- a/test/expected_json_stacked_new_partition.bpt
+++ b/test/expected_json_stacked_new_partition.bpt
@@ -15,6 +15,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000001",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -28,6 +29,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000002",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -41,6 +43,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000003",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -54,6 +57,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000004",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -67,6 +71,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000005",
       "type_guid": "e99d84d7-2c1b-44cf-8c58-effae2dc2558",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -80,6 +85,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000006",
       "type_guid": "e99d84d7-2c1b-44cf-8c58-effae2dc2558",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -93,6 +99,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000007",
       "type_guid": "0bb7e6ed-4424-49c0-9372-7fbab465ab4c",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": false,
       "ab_expanded": false,
@@ -106,6 +113,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000008",
       "type_guid": "ebd0a0a2-b9e5-4433-87c0-68b6b72699c7",
       "flags": "0x8000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": false,
       "ab_expanded": false,
diff --git a/test/expected_json_stacked_new_partition_on_top.bpt b/test/expected_json_stacked_new_partition_on_top.bpt
index 79c3fdc..cd1d18e 100644
--- a/test/expected_json_stacked_new_partition_on_top.bpt
+++ b/test/expected_json_stacked_new_partition_on_top.bpt
@@ -15,6 +15,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000001",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -28,6 +29,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000002",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -41,6 +43,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000003",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -54,6 +57,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000004",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -67,6 +71,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000005",
       "type_guid": "e99d84d7-2c1b-44cf-8c58-effae2dc2558",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -80,6 +85,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000006",
       "type_guid": "e99d84d7-2c1b-44cf-8c58-effae2dc2558",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -93,6 +99,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000007",
       "type_guid": "0bb7e6ed-4424-49c0-9372-7fbab465ab4c",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": false,
       "ab_expanded": false,
@@ -106,6 +113,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000008",
       "type_guid": "0fc63daf-8483-4772-8e79-3d69d8477de4",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": false,
       "ab_expanded": false,
diff --git a/test/expected_json_stacked_override_settings.bpt b/test/expected_json_stacked_override_settings.bpt
index d1c7b7d..ab40651 100644
--- a/test/expected_json_stacked_override_settings.bpt
+++ b/test/expected_json_stacked_override_settings.bpt
@@ -15,6 +15,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000001",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -28,6 +29,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000002",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -41,6 +43,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000003",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -54,6 +57,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000004",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -67,6 +71,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000005",
       "type_guid": "e99d84d7-2c1b-44cf-8c58-effae2dc2558",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -80,6 +85,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000006",
       "type_guid": "e99d84d7-2c1b-44cf-8c58-effae2dc2558",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -93,6 +99,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000007",
       "type_guid": "0bb7e6ed-4424-49c0-9372-7fbab465ab4c",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": false,
       "ab_expanded": false,
diff --git a/test/expected_json_stacked_positions.bpt b/test/expected_json_stacked_positions.bpt
index 0c11be3..8469bec 100644
--- a/test/expected_json_stacked_positions.bpt
+++ b/test/expected_json_stacked_positions.bpt
@@ -15,6 +15,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000001",
       "type_guid": "314f99d5-b2bf-4883-8d03-e2f2ce507d6a",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": false,
       "ab_expanded": false,
@@ -28,6 +29,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000002",
       "type_guid": "314f99d5-b2bf-4883-8d03-e2f2ce507d6a",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": false,
       "ab_expanded": false,
@@ -41,6 +43,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000003",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -54,6 +57,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000004",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -67,6 +71,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000005",
       "type_guid": "314f99d5-b2bf-4883-8d03-e2f2ce507d6a",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": false,
       "ab_expanded": false,
@@ -80,6 +85,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000006",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -93,6 +99,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000007",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -106,6 +113,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000008",
       "type_guid": "e99d84d7-2c1b-44cf-8c58-effae2dc2558",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -119,6 +127,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000009",
       "type_guid": "e99d84d7-2c1b-44cf-8c58-effae2dc2558",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -132,6 +141,7 @@
       "guid": "01234567-89ab-cdef-0123-00000000000a",
       "type_guid": "0bb7e6ed-4424-49c0-9372-7fbab465ab4c",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": false,
       "ab_expanded": false,
diff --git a/test/expected_json_stacked_size.bpt b/test/expected_json_stacked_size.bpt
index eb089da..43837cc 100644
--- a/test/expected_json_stacked_size.bpt
+++ b/test/expected_json_stacked_size.bpt
@@ -15,6 +15,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000001",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -28,6 +29,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000002",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -41,6 +43,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000003",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -54,6 +57,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000004",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -67,6 +71,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000005",
       "type_guid": "e99d84d7-2c1b-44cf-8c58-effae2dc2558",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -80,6 +85,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000006",
       "type_guid": "e99d84d7-2c1b-44cf-8c58-effae2dc2558",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -93,6 +99,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000007",
       "type_guid": "0bb7e6ed-4424-49c0-9372-7fbab465ab4c",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": false,
       "ab_expanded": false,
diff --git a/test/expected_json_suffixes.bpt b/test/expected_json_suffixes.bpt
index 1e15d5c..ec50d5d 100644
--- a/test/expected_json_suffixes.bpt
+++ b/test/expected_json_suffixes.bpt
@@ -15,6 +15,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000001",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -28,6 +29,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000002",
       "type_guid": "bb499290-b57e-49f6-bf41-190386693794",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -41,6 +43,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000003",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -54,6 +57,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000004",
       "type_guid": "0f2778c4-5cc1-4300-8670-6c88b7e57ed6",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -67,6 +71,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000005",
       "type_guid": "e99d84d7-2c1b-44cf-8c58-effae2dc2558",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -80,6 +85,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000006",
       "type_guid": "e99d84d7-2c1b-44cf-8c58-effae2dc2558",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": true,
       "ab_expanded": true,
@@ -93,6 +99,7 @@
       "guid": "01234567-89ab-cdef-0123-000000000007",
       "type_guid": "0bb7e6ed-4424-49c0-9372-7fbab465ab4c",
       "flags": "0x0000000000000000",
+      "persist": false,
       "ignore": false,
       "ab": false,
       "ab_expanded": false,
diff --git a/test/persist.bpt b/test/persist.bpt
new file mode 100644
index 0000000..06f39d4
--- /dev/null
+++ b/test/persist.bpt
@@ -0,0 +1,40 @@
+{
+    "partitions": [
+        {
+            "label": "no_persist",
+            "size": "128 MiB",
+            "position": 1,
+            "type_guid": "brillo_boot"
+        },
+        {
+            "label": "false_persist",
+            "size": "128 MiB",
+            "position": 2,
+            "persist": false,
+            "type_guid": "brillo_boot"
+        },
+        {
+            "label": "true_persist",
+            "size": "128 MiB",
+            "position": 3,
+            "persist": true,
+            "type_guid": "brillo_boot"
+        },
+        {
+            "label": "false_persist_with_flags",
+            "size": "128 MiB",
+            "flags": "0x10",
+            "persist": false,
+            "position": 4,
+            "type_guid": "brillo_boot"
+        },
+        {
+            "label": "true_persist_with_flags",
+            "size": "128 MiB",
+            "flags": "0x10",
+            "persist": true,
+            "position": 5,
+            "type_guid": "brillo_boot"
+        }
+    ]
+}