#!/usr/bin/env perl use strict; use File::Path; use XML::Parser; die("Usage: $0 maven-repo group-id package-name\n") if @ARGV < 3; my ($repo, $group_id, $pkg_name) = @ARGV; my $group_path = $group_id; $group_path =~ s/\./\//; my $portdir = "."; my $group_desc = "High Energy Physics Java library"; my $proto_ebuild = `cat $portdir/maven-proto.ebuild` or die; my (@deps, @portage_dep_atoms, @portage_env_pkgs); warn "$0: parsing $pkg_name\n"; my @versions; my $pkg_parser = new XML::Parser(Style=>'Tree'); my $pkg_tree = $pkg_parser->parse(scalar(`wget -q -O - $repo/$group_path/$pkg_name/maven-metadata.xml`)); foreach my $i (0..$#{$pkg_tree->[1]}) { next if $pkg_tree->[1]->[$i] ne 'versioning'; my @v = @{$pkg_tree->[1]->[$i+1]}; foreach my $j (0..$#v) { next if $v[$j] ne 'versions'; my @vers = @{$v[$j+1]}; foreach my $k (0..$#vers) { next if $vers[$k] ne 'version'; my $version = $vers[$k+1]->[2]; @versions = ($version) if $version =~ /^(\d\.)+\d$/; } } } foreach my $version (@versions) { my ($pkg_desc, $pkg_url); my $parser = new XML::Parser(Style=>'Tree'); my $tree = $parser->parse(scalar(`wget -q -O - $repo/$group_path/$pkg_name/$version/$pkg_name-$version.pom`)); foreach my $i (0..$#{$tree->[1]}) { if ($tree->[1]->[$i] eq 'description') { $pkg_desc = $tree->[1]->[$i+1]->[2]; } elsif ($tree->[1]->[$i] eq 'url') { $pkg_url = $tree->[1]->[$i+1]->[2]; } next if $tree->[1]->[$i] ne 'dependencies'; my @d = @{$tree->[1]->[$i+1]}; foreach my $j (0..$#d) { next if $d[$j] ne 'dependency'; my @dep = @{$d[$j+1]}; my %dep_info; foreach my $k (0..$#dep) { next if $dep[$k] !~ /groupId|artifactId|version/; my $value = $dep[$k+1]->[2]; $dep_info{$dep[$k]} = $value; } push(@deps, \%dep_info); } } print "$pkg_name-$version:\n"; foreach my $dep (@deps) { my ($portage_atom, $env_pkg); if ($$dep{artifactId} eq 'kxml2') { $portage_atom = '>=dev-java/kxml-2.3.0'; $env_pkg = 'kxml'; } elsif ($$dep{artifactId} eq 'cernlib') { $portage_atom = 'sci-physics/cernlib'; # needs runtime testing with higher cernlib version } elsif ($$dep{artifactId} eq 'aida') { $portage_atom = 'dev-java/hep-aida'; $env_pkg = 'aida'; } elsif ($$dep{artifactId} =~ /^(openide-lookup|pawdemo|JAS|jas-plotter|rowwise)$/) { $portage_atom = 'dev-java/freehep-misc-deps'; $env_pkg = 'freehep-misc-deps'; } elsif ($$dep{artifactId} eq 'cernlib') { $portage_atom = 'sci-physics/cernlib'; } elsif ($$dep{groupId} =~ /^(org.freehep|junit|commons-codec|jdom|bcel|org.apache.bcel|org.codehaus.plexus|org.apache.maven)$/) { if ($$dep{artifactId} ne 'fortran') { $portage_atom = "dev-java/$$dep{artifactId}"; $portage_atom = ">=$portage_atom-$$dep{version}" if $$dep{version}; $env_pkg = $$dep{artifactId} if $$dep{artifactId} =~ /^(junit|bcel|commons-codec)$/ or $$dep{groupId} =~ /^(org.freehep)$/; $env_pkg = 'jdom-1.0' if $$dep{artifactId} eq 'jdom'; } } push(@portage_dep_atoms, $portage_atom) if $portage_atom; push(@portage_env_pkgs, $env_pkg) if $env_pkg; warn "\tUNRESOLVED: $$dep{groupId}\t$$dep{artifactId}\t$$dep{version}\n" unless $portage_atom; } # freehep internal dependency matrix is incomplete. stupid. if ($pkg_name eq 'freehep-export') { push(@portage_dep_atoms, 'dev-java/freehep-util'); push(@portage_env_pkgs, 'freehep-util'); } elsif ($pkg_name eq 'freehep-graphicsio') { push(@portage_dep_atoms, 'dev-java/freehep-util'); push(@portage_env_pkgs, 'freehep-util'); push(@portage_dep_atoms, 'dev-java/freehep-swing'); push(@portage_env_pkgs, 'freehep-swing'); } elsif ($pkg_name =~ /^freehep-graphicsio-(tests|java|ps|pdf)$/) { (push(@portage_dep_atoms, "dev-java/$_"), push(@portage_env_pkgs, $_)) for qw(freehep-util freehep-swing freehep-graphics2d freehep-io freehep-export); } print "\t".join("\n\t", @portage_dep_atoms)."\n"; $proto_ebuild =~ s/DESCRIPTION=".*?"/DESCRIPTION="$group_desc - $pkg_desc"/s; $proto_ebuild =~ s/HOMEPAGE=".*?"/HOMEPAGE="$pkg_url"/s; my $deps_string = join("\n\t", @portage_dep_atoms); $proto_ebuild =~ s/CDEPEND=".*?"/CDEPEND="$deps_string"/s; my $env_pkgs_string = join(",", @portage_env_pkgs); $proto_ebuild =~ s/JAVA_GENTOO_CLASSPATH=".*?"/JAVA_GENTOO_CLASSPATH="$env_pkgs_string"/s; $proto_ebuild =~ s/GROUP_ID=".*?"/GROUP_ID="$group_id"/s; $proto_ebuild =~ s/MAVEN2_REPOSITORIES=".*?"/MAVEN2_REPOSITORIES="$repo"/s; mkdir "$portdir/$pkg_name"; open(OUT, '>', "$portdir/$pkg_name/$pkg_name-$version.ebuild") or die; print OUT $proto_ebuild; close OUT; system("ebuild $portdir/$pkg_name/$pkg_name-$version.ebuild digest"); die if $?; } warn "Ebuild generated ;)\n";