| @@ -31,6 +31,8 @@ done: set[str] = set() | |||||
| done_lock = asyncio.Lock() | done_lock = asyncio.Lock() | ||||
| in_progress: set[str] = set() | in_progress: set[str] = set() | ||||
| in_progress_lock = asyncio.Lock() | in_progress_lock = asyncio.Lock() | ||||
| gradle_packages: set[str] = set() | |||||
| gradle_packages_lock = asyncio.Lock() | |||||
| num_workers = 50 | num_workers = 50 | ||||
| global_properties: dict[str, dict[str, str]] = {} | global_properties: dict[str, dict[str, str]] = {} | ||||
| @@ -94,78 +96,21 @@ class PackagePOM: | |||||
| self.is_bom = self.packaging == 'pom' | self.is_bom = self.packaging == 'pom' | ||||
| self.gradle_packages = [str(package)] | |||||
| if self.packaging == 'pom': | if self.packaging == 'pom': | ||||
| root_copy = copy.deepcopy(self.raw_root) | root_copy = copy.deepcopy(self.raw_root) | ||||
| dependencies = root_copy.find('dependencies', ns) or ET.SubElement(root_copy, 'dependencies') | dependencies = root_copy.find('dependencies', ns) or ET.SubElement(root_copy, 'dependencies') | ||||
| depman = root_copy.find('dependencyManagement', ns) | |||||
| if depman is not None: | |||||
| tmp_deps = depman.findall('dependencies/*', ns) | |||||
| dependencies.extend(tmp_deps) | |||||
| root_copy.remove(depman) | |||||
| tmpGroupId = f'tmp.{package.groupId}' | |||||
| tmpArtifactId = f'placeholder.{package.artifactId}' | |||||
| tmpVersion = package.version | |||||
| if (groupId := root_copy.find('groupId', ns)) is not None: | |||||
| groupId.text = tmpGroupId | |||||
| else: | |||||
| logger.info(f"{package}: Inserting new groupId tag in pom") | |||||
| ET.SubElement(root_copy, 'groupId').text = tmpGroupId | |||||
| if (artifactId := root_copy.find('artifactId', ns)) is not None: | |||||
| artifactId.text = tmpArtifactId | |||||
| else: | |||||
| logger.info(f"{package}: Inserting new artifactId tag in pom") | |||||
| ET.SubElement(root_copy, 'artifactId').text = tmpArtifactId | |||||
| if (version := root_copy.find('version', ns)) is not None: | |||||
| version.text = tmpVersion | |||||
| else: | |||||
| logger.info(f"{package}: Inserting new version tag in pom") | |||||
| ET.SubElement(root_copy, 'version').text = tmpVersion | |||||
| # Add a dependency for the pom itself | |||||
| self_dep = ET.SubElement(dependencies, 'dependency') | |||||
| ET.SubElement(self_dep, 'groupId').text = package.groupId | |||||
| ET.SubElement(self_dep, 'artifactId').text = package.artifactId | |||||
| ET.SubElement(self_dep, 'version').text = package.version | |||||
| self.generated_root = root_copy | |||||
| else: | |||||
| self.generated_root = ET.fromstring( | |||||
| f""" | |||||
| <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 | |||||
| https://maven.apache.org/xsd/maven-4.0.0.xsd" | |||||
| xmlns="http://maven.apache.org/POM/4.0.0" | |||||
| xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> | |||||
| <modelVersion>4.0.0</modelVersion> | |||||
| <groupId>tmp.{package.groupId}</groupId> | |||||
| <artifactId>placeholder-{package.artifactId}</artifactId> | |||||
| <version>{package.version}</version> | |||||
| <name>Package {package.artifactId}</name> | |||||
| <dependencies> | |||||
| <dependency> | |||||
| <groupId>{package.groupId}</groupId> | |||||
| <artifactId>{package.artifactId}</artifactId> | |||||
| <version>{package.version}</version> | |||||
| </dependency> | |||||
| </dependencies> | |||||
| </project> | |||||
| """ | |||||
| self.gradle_packages.extend( | |||||
| [ | |||||
| f'{dep.find("groupId").text}:{dep.find("artifactId").text}:{dep.find("version").text}' | |||||
| for dep in dependencies.findall('dependency') | |||||
| ] | |||||
| ) | ) | ||||
| logger.debug(f'{package}: POM parsed') | logger.debug(f'{package}: POM parsed') | ||||
| def write(self, f): | |||||
| tree = ET.ElementTree(self.generated_root) | |||||
| ET.indent(tree) | |||||
| tree.write(f) | |||||
| def resolve_props(self, initial: dict[str, str]): | def resolve_props(self, initial: dict[str, str]): | ||||
| props = initial | props = initial | ||||
| @@ -388,6 +333,7 @@ def load_package_list(list_path: Path, queue: asyncio.Queue) -> None: | |||||
| queue.put_nowait(package) | queue.put_nowait(package) | ||||
| continue | |||||
| if not package.artifactId.endswith('-jvm'): | if not package.artifactId.endswith('-jvm'): | ||||
| queue.put_nowait( | queue.put_nowait( | ||||
| Package( | Package( | ||||
| @@ -398,6 +344,47 @@ def load_package_list(list_path: Path, queue: asyncio.Queue) -> None: | |||||
| ) | ) | ||||
| ) | ) | ||||
| async def create_gradle_script() -> str: | |||||
| async with gradle_packages_lock: | |||||
| return """// Generated, do not edit | |||||
| plugins { | |||||
| kotlin("jvm") version "1.7.20" | |||||
| } | |||||
| repositories { | |||||
| maven { | |||||
| url=uri("http://localhost:9001/releases") | |||||
| isAllowInsecureProtocol=true | |||||
| } | |||||
| } | |||||
| val deps = listOf( | |||||
| """ + ',\n '.join(f'"{dep}"' for dep in sorted(gradle_packages)) + """ | |||||
| ).map { | |||||
| configurations.create(it.replace(':', '_')) to it | |||||
| } | |||||
| dependencies { | |||||
| deps.forEach { (conf, dep) -> | |||||
| conf(dep) | |||||
| } | |||||
| } | |||||
| tasks.register("downloadDependencies") { | |||||
| doLast { | |||||
| deps.forEach { (conf, dep) -> | |||||
| conf.files.forEach { file -> | |||||
| copy { | |||||
| from(file) | |||||
| into("data/") | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| """ | |||||
| async def download(package: Package, queue: asyncio.Queue) -> None: | async def download(package: Package, queue: asyncio.Queue) -> None: | ||||
| async with done_lock: | async with done_lock: | ||||
| is_done = str(package) in done | is_done = str(package) in done | ||||
| @@ -453,12 +440,8 @@ async def download(package: Package, queue: asyncio.Queue) -> None: | |||||
| logger.warn(f'{package}: No pom') | logger.warn(f'{package}: No pom') | ||||
| return | return | ||||
| pom_dir = base_pom_path / f'{package.groupId}-{package.artifactId}-{package.version}' | |||||
| pom_path = pom_dir / 'pom.xml' | |||||
| pom_dir.mkdir(exist_ok=True) | |||||
| pom.write(pom_path) | |||||
| logger.info(f'{package}: Downloaded') | |||||
| async with gradle_packages_lock: | |||||
| gradle_packages.update(pom.gradle_packages) | |||||
| if not pom.is_bom: | if not pom.is_bom: | ||||
| for dep in pom.dependency_management: | for dep in pom.dependency_management: | ||||
| @@ -524,9 +507,10 @@ async def main() -> None: | |||||
| await asyncio.gather(*tasks, return_exceptions=True) | await asyncio.gather(*tasks, return_exceptions=True) | ||||
| logger.info('Generating master POM') | |||||
| subprocess.call(['sh', 'generate_master_pom.sh']) | |||||
| logger.info('Generating build.gradle.kts') | |||||
| gradle_script = await create_gradle_script() | |||||
| Path("test/build.gradle.kts").write_text(gradle_script) | |||||
| logger = logging.getLogger(__name__) | logger = logging.getLogger(__name__) | ||||