Merge pull request #296 from shinji-s/devel

When fixing a path to have /multibootusb/{distro-name} prepended, con…
pull/309/head
multibootusb 6 years ago committed by GitHub
commit 2c43930c47
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -17,6 +17,43 @@ from . import grub
from . import menus
def fix_abspath_r(pattern, string, install_dir, iso_name):
"""Return a list of tuples consisting of 'string' with replaced path and a bool representing if /boot/ was prepended in the expression."""
m = pattern.search(string)
if not m:
return [(string, False)]
start, end = m.span()
prologue, specified_path = m.group(1), m.group(2)
# See if a path that has 'boot/' prepended is a better choice.
# E.g. Debian debian-live-9.4.0-amd64-cinnamon has a loopback.cfg
# which contains "source /grub/grub.cfg".
if os.path.exists(os.path.join(install_dir, 'boot', specified_path)) \
and not os.path.exists(os.path.join(install_dir, specified_path)):
selected_path, fixed = 'boot/' + specified_path, True
else:
selected_path, fixed = specified_path, False
out = string[:start] + prologue + '/multibootusb/' + iso_name + '/' \
+ selected_path.replace('\\', '/')
return [(out, fixed)] \
+ fix_abspath_r(pattern, string[end:], install_dir, iso_name)
def fix_abspath(string, install_dir, iso_name):
"""Rewrite what appear to be a path within 'string'. If a file does not exist with specified path, one with '/boot' prepended is tried."""
path_expression = re.compile(r'([ \t=])/(.*?)((?=[\s*])|$)')
chunks = fix_abspath_r(
path_expression, string, install_dir, iso_name)
num_boot_prefixing = len([c for c in chunks if c[1] is True])
if num_boot_prefixing == 0:
# Fallback to the legacy implementation so that
# this tweak brings as little breakage as possible.
replace_text = r'\1/multibootusb/' + iso_name + '/'
return re.sub(r'([ \t =,])/', replace_text, string)
else:
log("Prepended '/boot' to %s." %
(num_boot_prefixing==1 and 'a path' or
('%d paths' % num_boot_prefixing)))
return ''.join([c[0] for c in chunks])
def update_distro_cfg_files(iso_link, usb_disk, distro, persistence=0):
"""
Main function to modify/update distro specific strings on distro config files.
@ -28,7 +65,8 @@ def update_distro_cfg_files(iso_link, usb_disk, distro, persistence=0):
usb_label = usb_details['label']
# iso_cfg_ext_dir = os.path.join(multibootusb_host_dir(), "iso_cfg_ext_dir")
config.status_text = "Updating config files..."
install_dir = os.path.join(usb_mount, "multibootusb", iso_basename(iso_link))
_iso_name = iso_basename(iso_link)
install_dir = os.path.join(usb_mount, "multibootusb", _iso_name)
log('Updating distro specific config files...')
for dirpath, dirnames, filenames in os.walk(install_dir):
for f in filenames:
@ -40,8 +78,7 @@ def update_distro_cfg_files(iso_link, usb_disk, distro, persistence=0):
log("Unable to read %s" % cfg_file)
else:
if not distro == "generic":
replace_text = r'\1/multibootusb/' + iso_basename(iso_link) + '/'
string = re.sub(r'([ \t =,])/', replace_text, string)
string = fix_abspath(string, install_dir, _iso_name)
string = re.sub(r'linuxefi', 'linux', string)
string = re.sub(r'initrdefi', 'initrd', string)
if distro == "ubuntu":

Loading…
Cancel
Save