84 lines
2.0 KiB
Perl
Executable File
84 lines
2.0 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
use strict;
|
|
use warnings;
|
|
use XML::Parser;
|
|
|
|
my $parser = XML::Parser->new(Handlers => {
|
|
Start => \&handle_start,
|
|
End => \&handle_end,
|
|
Char => \&handle_char,
|
|
});
|
|
|
|
my $current_element = '';
|
|
my $current_package_attrs = {};
|
|
my $scmsync_content = '';
|
|
|
|
my %devel_pkgs;
|
|
open(my $dfh, "curl -s https://src.opensuse.org/openSUSE/Factory/raw/branch/main/pkgs/_meta/devel_packages |") or die $!;
|
|
while(<$dfh>) {
|
|
chomp;
|
|
$devel_pkgs{$_} = 1;
|
|
}
|
|
close($dfh);
|
|
|
|
my $xml_content = do { local $/; <STDIN> };
|
|
$parser->parse($xml_content);
|
|
|
|
sub handle_start {
|
|
my ($expat, $element, %attrs) = @_;
|
|
$current_element = $element;
|
|
|
|
if ($element eq 'package') {
|
|
$current_package_attrs = \%attrs;
|
|
}
|
|
if ($element eq 'scmsync') {
|
|
$scmsync_content = '';
|
|
}
|
|
}
|
|
|
|
sub handle_char {
|
|
my ($expat, $string) = @_;
|
|
if ($current_element eq 'scmsync') {
|
|
$scmsync_content .= $string;
|
|
}
|
|
}
|
|
|
|
sub handle_end {
|
|
my ($expat, $element) = @_;
|
|
|
|
if ($element eq 'scmsync') {
|
|
my $project = $current_package_attrs->{project};
|
|
my $name = $current_package_attrs->{name};
|
|
my $scmsync = $scmsync_content;
|
|
|
|
# Use checks
|
|
$project = '' unless defined $project;
|
|
$name = '' unless defined $name;
|
|
$scmsync = '' unless defined $scmsync;
|
|
|
|
# Trim
|
|
$project =~ s/^\s+|\s+$//g;
|
|
$name =~ s/^\s+|\s+$//g;
|
|
$scmsync =~ s/^\s+|\s+$//g;
|
|
|
|
my $has_error = 0;
|
|
foreach my $val ($project, $name, $scmsync) {
|
|
if ($val =~ /\s/) {
|
|
print STDERR "Error: Value '$val' contains whitespace.\n";
|
|
$has_error = 1;
|
|
}
|
|
}
|
|
|
|
unless ($has_error) {
|
|
if ($devel_pkgs{"$name $project"}) {
|
|
print "$name $project $scmsync\n";
|
|
}
|
|
}
|
|
}
|
|
|
|
# Reset current element if we are closing it
|
|
if ($current_element eq $element) {
|
|
$current_element = '';
|
|
}
|
|
}
|