Browse Source

New utility: make_domsub_script.py

This is used to generate a standalone shell/Perl script that performs
the domain substitution.
Daniel Richard G 1 year ago
parent
commit
6eaa67b368
1 changed files with 99 additions and 0 deletions
  1. 99 0
      utils/make_domsub_script.py

+ 99 - 0
utils/make_domsub_script.py

@@ -0,0 +1,99 @@
+#!/usr/bin/env python3
+# -*- coding: UTF-8 -*-
+
+# Copyright (c) 2023 The ungoogled-chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+"""
+Generate standalone script that performs the domain substitution.
+"""
+
+from pathlib import Path
+import argparse
+import re
+
+
+def make_domain_substitution_script(regex_path, files_path, output_path):
+    """
+    Generate a standalone shell script (which uses Perl) that performs
+        domain substitution on the appropriate files.
+
+    regex_path is a pathlib.Path to domain_regex.list
+    files_path is a pathlib.Path to domain_substitution.list
+    output_path is a pathlib.Path to the output file.
+
+    Raises FileNotFoundError if the regex or file lists do not exist.
+    Raises FileExistsError if the output file already exists.
+    """
+    if not regex_path.exists():
+        raise FileNotFoundError(regex_path)
+    if not files_path.exists():
+        raise FileNotFoundError(files_path)
+    if output_path.exists():
+        raise FileExistsError(output_path)
+
+    regex_list = tuple(filter(len, regex_path.read_text().splitlines()))
+    files_list = tuple(filter(len, files_path.read_text().splitlines()))
+
+    # Convert the Python-style regexes into a Perl s/// op
+    perl_replace_list = ['s#' + re.sub(r'\\g<(\d+)>', r'${\1}', x) + '#g' for x in regex_list]
+
+    files_list_str = '\n'.join(files_list)
+    perl_replace_list_str = '\n'.join([f'    {x};' for x in perl_replace_list])
+
+    with open(output_path, 'w') as out:
+        out.write("""#!/bin/sh -e
+#
+# This script performs domain substitution on the Chromium source files.
+#
+# Generated by make_domsub_script.py, part of the ungoogled-chromium project:
+# https://github.com/ungoogled-software/ungoogled-chromium.git
+#
+
+# Check that we are inside the Chromium source tree
+test -f build/config/compiler/BUILD.gn
+
+# These filenames may contain spaces and/or other unusual characters
+print_file_list() {
+	cat <<'__END__'
+%s
+__END__
+}
+
+echo "Creating backup archive ..."
+
+backup=domain-substitution.orig.tar
+print_file_list | tar cf $backup --verbatim-files-from --files-from=-
+
+echo "Applying ungoogled-chromium domain substitution to %d files ..."
+
+print_file_list | xargs -d '\\n' perl -0777 -C0 -pwi -e '
+%s
+'
+
+# end
+""" % (files_list_str, len(files_list), perl_replace_list_str))
+
+
+def _callback(args):
+    """CLI Callback"""
+    make_domain_substitution_script(args.regex, args.files, args.output)
+
+
+def main():
+    """CLI Entrypoint"""
+    parser = argparse.ArgumentParser()
+    parser.set_defaults(callback=_callback)
+
+    parser.add_argument('-r', '--regex', type=Path, required=True, help='Path to domain_regex.list')
+    parser.add_argument(
+        '-f', '--files', type=Path, required=True, help='Path to domain_substitution.list')
+    parser.add_argument(
+        '-o', '--output', type=Path, required=True, help='Path to script file to create')
+
+    args = parser.parse_args()
+    args.callback(args)
+
+
+if __name__ == '__main__':
+    main()