123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- #!/usr/bin/perl
- use Switch;
- sub trim;
- sub get_value;
- sub get_var;
- sub get_field;
- # trim($str)
- # input: a string
- # output: the trimmed string (without whitespace)
- sub trim {
- $ans = $_[0];
- $ans =~ s/^\s+//; #remove leading spaces
- $ans =~ s/\s+$//; #remove trailing spaces
- return $ans;
- }
- # get_value($str)
- # input: a XML tag
- # output: the tag name
- sub get_value {
- $start = 1 + index($_[0], ">");
- $end = rindex($_[0], "<");
- return substr($_[0], $start, ($end - $start));
- }
- # get_var($str, $var_name)
- # input: a XML tag and a variable name
- # output: the variable value
- sub get_var {
- ($str, $var_name) = @_;
-
- # trim everything until the requested variable's value
- $start = index($str, " ".$var_name."=");
- $ans = substr($str, 3 + length($var_name) + $start);
- # trim everything after the value
- $start = index($ans, "\"");
- $ans = substr($ans, 0, $start);
-
- return $ans
- }
- # get_field($str)
- # input: a XML tag
- # output: the tag value
- sub get_field {
- $ans = substr($_[0], 1, (index($_[0], ">") - 1));
- if (index($ans, " ") != -1) {
- $ans = substr($_[0], 1, (index($_[0], " ") - 1));
- }
- return $ans;
- }
- if ((! -e $ARGV[0]) || (-e $ARGV[1])) {
- print("Usage: rpm2ppm [FILE] [OUTPUT] [DISTRO] [VERSION]\n");
- exit(1);
- }
- open(rpm_package_list, $ARGV[0]);
- open(ppm_package_list, ">>$ARGV[1]");
- while ($line = <rpm_package_list>)
- {
- $line = trim($line);
- $field = get_field($line);
- switch ($field) {
-
- case "name" {
- $package_name = get_value($line);
- print $package_name." ";
- }
-
- case "version" {
- $package_version = get_var($line, "ver");
- $package_revision = get_var($line, "rel");
- }
-
- case "summary" {
- $package_description = get_value($line);
- }
-
- case "size" {
- $package_size = get_var($line, "installed")."K";
- }
-
- case "location" {
- $package_path = get_var($line, "href");
- $pos = rindex($package_path, "/");
- $package_file_name = substr($package_path, (1 + $pos));
- $package_path = substr($package_path, 0, $pos);
- }
-
- case "rpm:provides" {
- $package_provides = "";
- $provides = 1;
- }
-
- case "rpm:requires" {
- $package_dependencies = "";
- $requires = 1;
- }
-
- case "rpm:entry" {
- $entry_name = get_var($line, "name");
- # filter shared libraries, architecture names and files
- if ((index($entry_name, ".so") == -1) && (index($entry_name, "(") == -1) && (index($entry_name, "/") == -1)) {
- # process packages provided by the package
- if ($provides == 1) {
- if ($package_provides eq "") {
- $package_provides = "|".$entry_name."|";
- } else {
- $package_provides = $package_provides."|".$entry_name."|";
- }
- } else {
- # process dependencies
- if ($requires == 1) {
- # get rid of the package's dependencies provided by the package itself (e.g mktemp and coreutils)
- if (($entry_name ne $package_name) && (index($package_provides, "|".$entry_name."|")) == -1) {
- if ($package_dependencies eq "") {
- $package_dependencies = "+".$entry_name;
- } else {
- # make sure dependencies aren't added twice
- if ((index($package_dependencies, ",+".$entry_name) == -1) && (index($package_dependencies, "+".$entry_name.",") == -1)) {
- $package_dependencies = $package_dependencies.",+".$entry_name;
- }
- }
- }
- }
- }
- }
- }
-
- case "/rpm:provides" {
- $provides = 0;
- }
- case "/rpm:requires" {
- $requires = 0;
- }
-
- # the last tag of each entry
- case "/package" {
- print ppm_package_list $package_name."-".$package_version."|".$package_name."|".$package_version."|".$package_revision."|BuildingBlock|".$package_size."|".$package_path."|".$package_file_name."|".$package_dependencies."|".$package_description."|".$ARGV[2]."|".$ARGV[3]."|\n";
- }
-
- }
- }
- print "\n";
- close(rpm_package_list);
- close(ppm_package_list);
|