<reponame>Biangkerok32/termux-packages<gh_stars>1-10
#!/usr/bin/python3
##
##  Script to parse texlive.tlpdb and get list of files in a package
##
##  Copyright (C) 2019 <NAME>
##
##  This program is free software: you can redistribute it and/or modify
##  it under the terms of the GNU General Public License as published by
##  the Free Software Foundation, either version 3 of the License, or
##  (at your option) any later version.
##
##  This program is distributed in the hope that it will be useful,
##  but WITHOUT ANY WARRANTY; without even the implied warranty of
##  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
##  GNU General Public License for more details.
##
##  You should have received a copy of the GNU General Public License
##  along with this program.  If not, see <https://www.gnu.org/licenses/>.

def parse_tlpdb_to_dict(tlpdb_path):
    """Reads given tlpdb database and creates dict with packages and their dependencies and files
    """

    with open(tlpdb_path, "r") as f:
        packages = f.read().split("\n\n")

    pkg_dict = {}
    for pkg in packages:
        if not pkg == "":
            pkg_lines = pkg.split("\n")
            pkg_name = pkg_lines[0].split(" ")[1]
            # We only care about getting all the files so only check for "depend" and files
            pkg_dict[pkg_name] = {"depends" : [], "files" : []}
            for line in pkg_lines:
                line_description = line.split(" ")[0]
                if line_description == "":
                    pkg_dict[pkg_name]["files"].append(line.split(" ")[1])
                elif line_description == "depend":
                    pkg_dict[pkg_name]["depends"].append(line.split(" ")[1])
    return pkg_dict

def get_files_in_package(package, files_in_package, visited_pkgs, visit_collections=False):
    """Prints files in package and then run itself on each dependency. Doesn't visit collections unless argument visit_collections=True is passed.
    """
    for f in pkg_dict[package]["files"]:
        files_in_package.append(f)
    for dep in pkg_dict[package]["depends"]:
        # skip arch dependent packages, which we lack since we build our own binaries:
        if not dep.split(".")[-1] == "ARCH":
            # skip collections unless explicitly told to go through them
            if not dep.split("-")[0] == "collection" or visit_collections:
                # avoid duplicates:
                if not dep in visited_pkgs:
                    visited_pkgs.append(dep)
                    files_in_package, visited_pkgs = get_files_in_package(dep, files_in_package, visited_pkgs)
    return files_in_package, visited_pkgs

def Files(*args, **kwargs):
    """Wrapper around function get_files. Prepends "collection-" to package unless prepend_collection=False is passed. Also uses visit_collections=False per default.
    """
    prefix = "collection-"
    bool_visit_collections = False
    for k,v in kwargs.items():
        if k == "prepend_collection" and not v:
            prefix = ""
        elif k == "visit_collections" and v:
            bool_visit_collections = True

    files = []
    for pkg in args[0]:
        files += get_files_in_package(prefix+pkg, [], [], visit_collections=bool_visit_collections)[0]
    return files

def get_conflicting_pkgs(package):
    """Returns list of packages that contain some files that are also found in 'package'.
    These packages should be listed as dependencies.
    """
    if package in ["basic", "fontsrecommended", "games", "luatex",
                   "music", "plaingeneric", "publishers", "texworks", "wintools"]:
        return []
    elif package in ["latex", "langeuropean", "langenglish", "langfrench",
                     "langgerman", "binextra", "fontutils", "langarabic",
                     "langgreek", "langitalian", "langother", "langpolish",
                     "langportuguese", "langspanish", "metapost"]:
        return ["basic"]
    elif package == "langczechslovak":
        return ["basic", "latex", "fontsextra", "luatex"]
    elif package == "langcyrillic":
        return ["basic", "latex", "fontsextra", "fontsrecommended",
                "langgreek", "latexrecommended"]
    elif package == "formatsextra":
        return ["basic", "latex", "langcyrillic", "mathscience",
                "fontsrecommended", "plaingeneric"]
    elif package == "context":
        return ["basic", "latex", "mathscience", "fontsrecommended",
                "metapost", "xetex"]
    elif package == "langjapanese":
        return ["basic", "latex", "langcjk", "langchinese"]
    elif package == "langchinese":
        return ["basic", "langcjk", "fontutils"]
    elif package == "bibtexextra":
        return ["basic", "binextra"]
    elif package == "langcjk":
        return ["basic", "langother"]
    elif package == "latexrecommended":
        return ["basic", "fontsrecommended", "latexextra", "pictures", "plaingeneric"]
    elif package == "mathscience":
        return ["basic", "langgreek"]
    elif package == "langkorean":
        return ["langjapanese", "langcjk", "latexrecommended"]
    elif package == "latexextra":
        return ["fontsextra"]
    elif package == "humanities":
        return ["latexextra"]
    elif package == "pictures":
        return ["latexextra"]
    elif package == "fontsextra":
        return ["plaingeneric"]
    elif package == "pstricks":
        return ["plaingeneric"]
    elif package == "xetex":
        return ["latex"]
    else:
        raise ValueError(sys.argv[1]+" isn't a known package name")


import sys
tlpdb = sys.argv[2]
pkg_dict = parse_tlpdb_to_dict(tlpdb)

if len(sys.argv) > 2 and sys.argv[-1] == "print_names":
    """Generate dependencies to put into TERMUX_SUBPKG_DEPENDS"""
    # Strip latex and basic since those collections are part of termux package "texlive"
    dependencies = ["texlive-"+pkg for pkg in get_conflicting_pkgs(sys.argv[1]) if not pkg in ["latex", "basic"]];
    if len(dependencies) > 0:
        print("texlive, "+", ".join(dependencies))
    else:
        print("texlive")
else:
    """Print files which should be included in the subpackage"""
    print("\n".join(["share/texlive/"+line for line in
                     list( set(Files([sys.argv[1]])) - set(Files(get_conflicting_pkgs(sys.argv[1]))) )]))

#!/usr/bin/python3
##
##  Script to parse texlive.tlpdb and get list of files in a package
##
##  Copyright (C) 2019 <NAME>
##
##  This program is free software: you can redistribute it and/or modify
##  it under the terms of the GNU General Public License as published by
##  the Free Software Foundation, either version 3 of the License, or
##  (at your option) any later version.
##
##  This program is distributed in the hope that it will be useful,
##  but WITHOUT ANY WARRANTY; without even the implied warranty of
##  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
##  GNU General Public License for more details.
##
##  You should have received a copy of the GNU General Public License
##  along with this program.  If not, see <https://www.gnu.org/licenses/>.

def parse_tlpdb_to_dict(tlpdb_path):
    """Reads given tlpdb database and creates dict with packages and their dependencies and files
    """

    with open(tlpdb_path, "r") as f:
        packages = f.read().split("\n\n")

    pkg_dict = {}
    for pkg in packages:
        if not pkg == "":
            pkg_lines = pkg.split("\n")
            pkg_name = pkg_lines[0].split(" ")[1]
            # We only care about getting all the files so only check for "depend" and files
            pkg_dict[pkg_name] = {"depends" : [], "files" : []}
            for line in pkg_lines:
                line_description = line.split(" ")[0]
                if line_description == "":
                    pkg_dict[pkg_name]["files"].append(line.split(" ")[1])
                elif line_description == "depend":
                    pkg_dict[pkg_name]["depends"].append(line.split(" ")[1])
    return pkg_dict

def get_files_in_package(package, files_in_package, visited_pkgs, visit_collections=False):
    """Prints files in package and then run itself on each dependency. Doesn't visit collections unless argument visit_collections=True is passed.
    """
    for f in pkg_dict[package]["files"]:
        files_in_package.append(f)
    for dep in pkg_dict[package]["depends"]:
        # skip arch dependent packages, which we lack since we build our own binaries:
        if not dep.split(".")[-1] == "ARCH":
            # skip collections unless explicitly told to go through them
            if not dep.split("-")[0] == "collection" or visit_collections:
                # avoid duplicates:
                if not dep in visited_pkgs:
                    visited_pkgs.append(dep)
                    files_in_package, visited_pkgs = get_files_in_package(dep, files_in_package, visited_pkgs)
    return files_in_package, visited_pkgs

def Files(*args, **kwargs):
    """Wrapper around function get_files. Prepends "collection-" to package unless prepend_collection=False is passed. Also uses visit_collections=False per default.
    """
    prefix = "collection-"
    bool_visit_collections = False
    for k,v in kwargs.items():
        if k == "prepend_collection" and not v:
            prefix = ""
        elif k == "visit_collections" and v:
            bool_visit_collections = True

    files = []
    for pkg in args[0]:
        files += get_files_in_package(prefix+pkg, [], [], visit_collections=bool_visit_collections)[0]
    return files

def get_conflicting_pkgs(package):
    """Returns list of packages that contain some files that are also found in 'package'.
    These packages should be listed as dependencies.
    """
    if package in ["basic", "fontsrecommended", "games", "luatex",
                   "music", "plaingeneric", "publishers", "texworks", "wintools"]:
        return []
    elif package in ["latex", "langeuropean", "langenglish", "langfrench",
                     "langgerman", "binextra", "fontutils", "langarabic",
                     "langgreek", "langitalian", "langother", "langpolish",
                     "langportuguese", "langspanish", "metapost"]:
        return ["basic"]
    elif package == "langczechslovak":
        return ["basic", "latex", "fontsextra", "luatex"]
    elif package == "langcyrillic":
        return ["basic", "latex", "fontsextra", "fontsrecommended",
                "langgreek", "latexrecommended"]
    elif package == "formatsextra":
        return ["basic", "latex", "langcyrillic", "mathscience",
                "fontsrecommended", "plaingeneric"]
    elif package == "context":
        return ["basic", "latex", "mathscience", "fontsrecommended",
                "metapost", "xetex"]
    elif package == "langjapanese":
        return ["basic", "latex", "langcjk", "langchinese"]
    elif package == "langchinese":
        return ["basic", "langcjk", "fontutils"]
    elif package == "bibtexextra":
        return ["basic", "binextra"]
    elif package == "langcjk":
        return ["basic", "langother"]
    elif package == "latexrecommended":
        return ["basic", "fontsrecommended", "latexextra", "pictures", "plaingeneric"]
    elif package == "mathscience":
        return ["basic", "langgreek"]
    elif package == "langkorean":
        return ["langjapanese", "langcjk", "latexrecommended"]
    elif package == "latexextra":
        return ["fontsextra"]
    elif package == "humanities":
        return ["latexextra"]
    elif package == "pictures":
        return ["latexextra"]
    elif package == "fontsextra":
        return ["plaingeneric"]
    elif package == "pstricks":
        return ["plaingeneric"]
    elif package == "xetex":
        return ["latex"]
    else:
        raise ValueError(sys.argv[1]+" isn't a known package name")


import sys
tlpdb = sys.argv[2]
pkg_dict = parse_tlpdb_to_dict(tlpdb)

if len(sys.argv) > 2 and sys.argv[-1] == "print_names":
    """Generate dependencies to put into TERMUX_SUBPKG_DEPENDS"""
    # Strip latex and basic since those collections are part of termux package "texlive"
    dependencies = ["texlive-"+pkg for pkg in get_conflicting_pkgs(sys.argv[1]) if not pkg in ["latex", "basic"]];
    if len(dependencies) > 0:
        print("texlive, "+", ".join(dependencies))
    else:
        print("texlive")
else:
    """Print files which should be included in the subpackage"""
    print("\n".join(["share/texlive/"+line for line in
                     list( set(Files([sys.argv[1]])) - set(Files(get_conflicting_pkgs(sys.argv[1]))) )]))
#!/usr/bin/python3 ## ##  Script to parse texlive.tlpdb and get list of files in a package ## ##  Copyright (C) 2019 <NAME> ## ##  This program is free software: you can redistribute it and/or modify ##  it under the terms of the GNU General Public License as published by ##  the Free Software Foundation, either version 3 of the License, or ##  (at your option) any later version. ## ##  This program is distributed in the hope that it will be useful, ##  but WITHOUT ANY WARRANTY; without even the implied warranty of ##  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the ##  GNU General Public License for more details. ## ##  You should have received a copy of the GNU General Public License ##  along with this program.  If not, see <https://www.gnu.org/licenses/>. Reads given tlpdb database and creates dict with packages and their dependencies and files # We only care about getting all the files so only check for "depend" and files Prints files in package and then run itself on each dependency. Doesn't visit collections unless argument visit_collections=True is passed. # skip arch dependent packages, which we lack since we build our own binaries: # skip collections unless explicitly told to go through them # avoid duplicates: Wrapper around function get_files. Prepends "collection-" to package unless prepend_collection=False is passed. Also uses visit_collections=False per default. Returns list of packages that contain some files that are also found in 'package'.     These packages should be listed as dependencies. Generate dependencies to put into TERMUX_SUBPKG_DEPENDS # Strip latex and basic since those collections are part of termux package "texlive" Print files which should be included in the subpackage