From e65576f8b950e2f593c1f66f109b876a8a503c93 Mon Sep 17 00:00:00 2001 From: nebrassy Date: Thu, 3 Jun 2021 12:36:00 +0200 Subject: [PATCH] fix and update roomservice Change-Id: I1f3839751c212d5a96d99483e8fff36265c2f2f8 --- build/tools/roomservice.py | 164 +++++++++++++++++++++++++++---------- 1 file changed, 120 insertions(+), 44 deletions(-) diff --git a/build/tools/roomservice.py b/build/tools/roomservice.py index 149cd79..915d6f5 100755 --- a/build/tools/roomservice.py +++ b/build/tools/roomservice.py @@ -51,8 +51,13 @@ gerrit_url = "gerrit.twrp.me" def check_repo_exists(git_data, device): - re_match = "^android_device_.*_{device}$".format(device=device) - matches = filter(lambda x: re.match(re_match, x), git_data) + if device.count("_") < 2: + re_match = "^android_device_.*_{device}$".format(device=device) + else: + re_match = "^android_device.*_{device}$".format(device=device) + + matches = list(filter(lambda x: re.match(re_match, x), git_data)) + if len(matches) != 1: raise Exception("{device} not found," "exiting roomservice".format(device=device)) @@ -69,10 +74,10 @@ def search_gerrit_for_device(device): git_req = urllib.request.Request(git_search_url) try: response = urllib.request.urlopen(git_req) - except urllib.request.HTTPError as e: + except urllib.request.HTTPError: print("There was an issue connecting to gerrit." - " Please try again in a minute") - except urllib.request.URLError as e: + " Please try again in a minute") + except urllib.request.URLError: print("WARNING: No network connection available.") else: # Skip silly gerrit "header" @@ -84,15 +89,27 @@ def search_gerrit_for_device(device): def parse_device_directory(device_url, device): - pattern = "^android_device_(?P.+)_{}$".format(device) + if device.count("_") < 2: + pattern = "^android_device_(?P.+)_{}$".format(device) + else: + pattern = "^android_device_{}$".format(device) + match = re.match(pattern, device_url) if match is None: raise Exception("Invalid project name {}".format(device_url)) - return "device/{vendor}/{device}".format( - vendor=match.group('vendor'), - device=device, - ) + + if device.count('_') < 2: + return "device/{vendor}/{device}".format( + vendor=match.group('vendor'), + device=device, + ) + else: + vendor = device.split('_')[0] + return "device/{vendor}/{device}".format( + vendor=vendor, + device=device, + ) # Thank you RaYmAn @@ -106,20 +123,44 @@ def iterate_manifests(): try: man = ES.parse(file) man = man.getroot() - except IOError, ES.ParseError: + except (IOError, ES.ParseError): print("WARNING: error while parsing %s" % file) else: for project in man.findall("project"): yield project +def iterate_manifests_remove_project(): + files = [] + for file in os.listdir(local_manifest_dir): + if file.endswith(".xml"): + files.append(os.path.join(local_manifest_dir, file)) + files.append('.repo/manifest.xml') + for file in files: + try: + man = ES.parse(file) + man = man.getroot() + except (IOError, ES.ParseError): + print("WARNING: error while parsing %s" % file) + else: + for project in man.findall("remove-project"): + yield project + def check_project_exists(url, revision, path): for project in iterate_manifests(): - if project.get("name") == url and project.get("revision") == revision and project.get("path") == path: + if project.get("name") == url \ + and project.get("revision") == revision \ + and project.get("path") == path: return True return False +def check_remove_project_exists(url): + for project in iterate_manifests_remove_project(): + if project.get("name") == url: + return True + return False + def check_target_exists(directory): return os.path.isdir(directory) @@ -158,12 +199,23 @@ def create_manifest_project(url, directory, }) return project +def create_remove_project(url): + remove_project_exists = check_remove_project_exists(url) + + if remove_project_exists: + return None + + project = ES.Element("remove-project", + attrib={ + "name": url + }) + return project def append_to_manifest(project): try: lm = ES.parse('/'.join([local_manifest_dir, "roomservice.xml"])) lm = lm.getroot() - except IOError, ES.ParseError: + except (IOError, ES.ParseError): lm = ES.Element("manifest") lm.append(project) return lm @@ -221,6 +273,7 @@ def parse_dependency_file(location): raise Exception("ERROR: malformed dependency file") return dependencies + # if there is any conflict with existing and new # delete the roomservice.xml file and create new def check_manifest_problems(dependencies): @@ -228,22 +281,26 @@ def check_manifest_problems(dependencies): repository = dependency.get("repository") target_path = dependency.get("target_path") revision = dependency.get("revision", default_rev) - remote = dependency.get("remote", default_rem) # check for existing projects for project in iterate_manifests(): - if project.get("revision") is not None and project.get("path") is not None: - if project.get("path") == target_path and project.get("revision") != revision: - print("WARNING: detected conflict in revisions for repository ", repository) - current_dependency = str(project.get(repository)) - file = ES.parse('/'.join([local_manifest_dir, "roomservice.xml"])) - file_root = file.getroot() - for current_project in file_root.findall('project'): - new_dependency = str(current_project.find('revision')) - if new_dependency == current_dependency: - file_root.remove(current_project) - file.write('/'.join([local_manifest_dir, "roomservice.xml"])) - return + if project.get("revision") is not None \ + and project.get("path") is not None \ + and project.get("path") == target_path \ + and project.get("revision") != revision: + print("WARNING: detected conflict in revisions for repository ", + repository) + current_dependency = str(project.get(repository)) + file = ES.parse('/'.join([local_manifest_dir, + "roomservice.xml"])) + file_root = file.getroot() + for current_project in file_root.findall('project'): + new_dependency = str(current_project.find('revision')) + if new_dependency == current_dependency: + file_root.remove(current_project) + file.write('/'.join([local_manifest_dir, "roomservice.xml"])) + return + def create_dependency_manifest(dependencies): projects = [] @@ -252,22 +309,40 @@ def create_dependency_manifest(dependencies): target_path = dependency.get("target_path") revision = dependency.get("revision", default_rev) remote = dependency.get("remote", default_rem) + override = dependency.get("override", None) + remove = dependency.get("remove", None) - # not adding an organization should default to android_team - # only apply this to github - if remote == "github": - if "/" not in repository: - repository = '/'.join([android_team, repository]) - project = create_manifest_project(repository, - target_path, - remote=remote, - revision=revision) - if project is not None: - manifest = append_to_manifest(project) - write_to_manifest(manifest) - projects.append(target_path) + if remove is not None: + #print("found remove in ", repository) + project = create_remove_project(remove) + if project is not None: + manifest = append_to_manifest(project) + #print(ES.tostring(manifest).decode()) + write_to_manifest(manifest) + else: + if override is not None: + #print("found override in ", repository) + project = create_remove_project(override) + if project is not None: + manifest = append_to_manifest(project) + #print(ES.tostring(manifest).decode()) + write_to_manifest(manifest) + + # not adding an organization should default to android_team + # only apply this to github + if remote == "github": + if "/" not in repository: + repository = '/'.join([android_team, repository]) + project = create_manifest_project(repository, + target_path, + remote=remote, + revision=revision) + if project is not None: + manifest = append_to_manifest(project) + write_to_manifest(manifest) + projects.append(target_path) if len(projects) > 0: - os.system("repo sync -f --no-clone-bundle %s" % " ".join(projects)) + os.system("repo sync --force-sync --no-clone-bundle %s" % " ".join(projects)) def create_common_dependencies_manifest(dependencies): @@ -293,7 +368,7 @@ def create_common_dependencies_manifest(dependencies): if common_deps is not None: print("Looking for dependencies on: ", - dependency['target_path']) + dependency['target_path']) check_manifest_problems(common_deps) create_dependency_manifest(common_deps) create_common_dependencies_manifest(common_deps) @@ -310,6 +385,7 @@ def fetch_dependencies(device): create_common_dependencies_manifest(dependencies) fetch_device(device) + def check_device_exists(device): location = parse_device_from_folder(device) if location is None: @@ -325,15 +401,15 @@ def fetch_device(device): device_url = git_data['id'] device_dir = parse_device_directory(device_url, device) project = create_manifest_project(device_url, - device_dir, - remote=default_team_rem) + device_dir, + remote=default_team_rem) if project is not None: manifest = append_to_manifest(project) write_to_manifest(manifest) # In case a project was written to manifest, but never synced if project is not None or not check_target_exists(device_dir): print("syncing the device config") - os.system('repo sync -f --no-clone-bundle %s' % device_dir) + os.system('repo sync --force-sync --no-clone-bundle %s' % device_dir) if __name__ == '__main__':