1
0
mirror of https://github.com/mon/ifstools.git synced 2025-02-17 10:48:37 +01:00

Fix some incorrect super file assumptions

This commit is contained in:
Will Toohey 2019-11-16 13:51:50 +10:00
parent 7e754826c1
commit 09e0804e52

View File

@ -1,5 +1,5 @@
from itertools import chain from itertools import chain
from os.path import getmtime, basename, dirname, join, realpath from os.path import getmtime, basename, dirname, join, realpath, isfile
from collections import OrderedDict from collections import OrderedDict
import lxml.etree as etree import lxml.etree as etree
@ -37,7 +37,11 @@ class GenericFolder(Node):
if filename == '_info_': # metadata if filename == '_info_': # metadata
continue continue
elif filename == '_super_': # sub-reference elif filename == '_super_': # sub-reference
self.supers.append(IFS(join(my_path, child.text)).data_blob) super_file = join(my_path, child.text)
if not isfile(super_file):
raise IOError('IFS references super-IFS {} but it does not exist'.format(child.text))
self.supers.append(IFS(super_file))
# folder: has children or timestamp only, and isn't a reference # folder: has children or timestamp only, and isn't a reference
elif (list(child) or len(child.text.split(' ')) == 1) and child[0].tag != 'i': elif (list(child) or len(child.text.split(' ')) == 1) and child[0].tag != 'i':
handler = self.folder_handlers.get(filename, GenericFolder) handler = self.folder_handlers.get(filename, GenericFolder)
@ -49,7 +53,15 @@ class GenericFolder(Node):
super_ref = int(child[0].text) super_ref = int(child[0].text)
if super_ref > len(self.supers): if super_ref > len(self.supers):
raise IOError('IFS references super-IFS {} but we only have {}'.format(super_ref, len(self.supers))) raise IOError('IFS references super-IFS {} but we only have {}'.format(super_ref, len(self.supers)))
self.files[filename].ifs_data = self.supers[super_ref - 1]
super_ifs = self.supers[super_ref - 1]
super_files = super_ifs.tree.all_files
try:
super_file = next(x for x in super_files if x.name == filename)
except StopIteration:
raise IOError('IFS references super-IFS entry {} in {} but it does not exist'.format(filename, super_ifs.ifs_out))
self.files[filename] = super_file
if not self.full_path: # root if not self.full_path: # root
self.tree_complete() self.tree_complete()