diff --git a/dump_gui_apps b/dump_gui_apps index 377f4dc..28fc4d9 100755 --- a/dump_gui_apps +++ b/dump_gui_apps @@ -1,45 +1,150 @@ #!/usr/bin/perl use YAML::Syck; +use XML::Simple; -$media_info_dir = $ARGV[0]; - -if( ! -d $media_info_dir ) { +if (@ARGV == 0) { die "Usage: $0 \n the path must exist and be a directory"; } -@gui_groups = ( - "Graphical desktop", - "Graphics" +my %gui_groups = ( + "Graphical desktop" => 1, + "Graphics" => 1 ); -$grep_regex = ""; -foreach my $grp (@gui_groups) { - $grep_regex.= "\\|" if $grep_regex; - $grep_regex.= "^\@info\@.*\@".$grp; -} +%group_to_categories = ( +"Games/Adventure" => "games", +"Games/Arcade" => "games", +"Games/Boards" => "games", +"Games/Cards" => "games", +"Games/Other" => "games", +"Games/Puzzles" => "games", +"Games/Sports" => "games", +"Games/Strategy" => "games", +"Toys" => "games", -$synt_file = $media_info_dir."/synthesis.hdlist.cz"; +"Editors" => "office", +"Office" => "office", +"Publishing" => "office", +"Text tools" => "office", -open( SYNT, "zcat $synt_file | grep '$grep_regex' | " ); -while() { - if( /\@info\@([^@]+)\@[^@]+\@[^@]+\@([^@]+)/ ) { - my $fullname = $1; - my $pkgname = ""; - if( $fullname =~ /src.rpm$/ ) { - $pkgname = `echo $fullname | rev | cut -f3- -d- | rev`; - } - else { - $pkgname = `echo $fullname | rev | cut -f4- -d- | rev`; - } - chomp $pkgname; - $apps{$pkgname} = $2; +"Sound" => "audio and video", +"Video" => "audio and video", + +"Development/C" => "development", +"Development/C++" => "development", +"Development/Databases" => "development", +"Development/Debug" => "development", +"Development/GNOME and GTK+" => "development", +"Development/Java" => "development", +"Development/KDE and Qt" => "development", +"Development/Kernel" => "development", +"Development/Other" => "development", +"Development/Perl" => "development", +"Development/PHP" => "development", +"Development/Python" => "development", +"Development/Ruby" => "development", +"Development/X11" => "development", + +"Communications" => "internet", +"Networking/Chat" => "internet", +"Networking/File transfer" => "internet", +"Networking/IRC" => "internet", +"Networking/Instant messaging" => "internet", +"Networking/Mail" => "internet", +"Networking/News" => "internet", +"Networking/Other" => "internet", +"Networking/Remote access" => "internet", +"Networking/WWW" => "internet" +); + +#$grep_regex = ""; +#foreach my $grp (@gui_groups) { +# $grep_regex.= "\\|" if $grep_regex; +# $grep_regex.= "^\@info\@.*\@".$grp; +#} + +my $ignore_pkgs_regex = "\\-debuginfo\\|\\-devel"; + +foreach my $media_info_dir (@ARGV) { + if( ! -d $media_info_dir ) { + warn "Skipping $media_info_dir, doesn't seem to be a readable directory"; + next; } - chomp; + + $synt_file = $media_info_dir."/synthesis.hdlist.cz"; + if( ! -e $synt_file ) { + warn "Skipping $media_info_dir, failed to find synthesis.hdlist.cz there"; + next; + } + + $info_file = $media_info_dir."/info.xml.lzma"; + if( ! -e $info_file ) { + warn "$media_info_dir doesn't contain info.xml, package descriptions will be missing"; + %pkgs_info = (); + } + else { + system("cp $info_file ."); + system("rm -f info.xml"); + system("lzma -d info.xml.lzma"); + + $pkgs_info = XML::Simple->new()->XMLin("info.xml"); + + foreach $pkg_info (@{$pkgs_info->{info}}) { + my %pkg = %{$pkg_info}; + + $fullname = $pkg{fn}; + if( $pkg{fn} =~ /src$/ ) { + $pkgname = `echo $fullname | rev | cut -f3- -d- | rev`; + } + else { + $pkgname = `echo $fullname | rev | cut -f4- -d- | rev`; + } + chomp $pkgname; + + $pkg_desc{$pkgname} = $pkg{content}; + } + + } + + +# open( SYNT, "zcat $synt_file | grep '$grep_regex' | " ); + open( SYNT, "zcat $synt_file | grep '^\@info\@' | grep -v '$ignore_pkgs_regex' |" ); + while() { + if( /\@info\@([^@]+)\@[^@]+\@[^@]+\@([^@]+)/ ) { + my $fullname = $1; + my $group = $2; + my $pkgname = ""; + if( $fullname =~ /src.rpm$/ ) { + $pkgname = `echo $fullname | rev | cut -f3- -d- | rev`; + } + else { + $pkgname = `echo $fullname | rev | cut -f4- -d- | rev`; + } + chomp $pkgname; + + my $category = defined($group_to_categories{$group}) ? $group_to_categories{$group} : "other"; + $apps{applications}{$pkgname}{category} = $category; + + my $desc = defined($pkg_desc{$pkgname}) ? $pkg_desc{$pkgname} : ""; + $apps{applications}{$pkgname}{description} = $desc; + + if (defined($gui_groups{$group})) { + $apps{applications}{$pkgname}{gui} = "true"; + } + else { + $apps{applications}{$pkgname}{gui} = "false"; + } + } + chomp; + } + + my $gui_file = $media_info_dir."/gui_pkgs.yml"; + + open F, "> $gui_file"; + print F YAML::Syck::Dump( \%apps ); + close F; + + system ("rm -f ".$gui_file.".xz"); + system ("xz $gui_file"); } - -my $gui_file = $media_info_dir."/gui_pkgs.yml"; - -open F, "> $gui_file"; -print F YAML::Syck::Dump( \%apps ); -close F;