#!/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 $/; }; $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 = ''; } }