#!/usr/bin/perl -w use strict; use Parse::DebianChangelog; my $tmp = "/srv/debian/versionspy"; my $package = shift || die "no package given"; my $out = `apt-cache showsrc $package`; my @url = ($out =~ /^Vcs-.*/gmi); my ($version) = ($out =~ /^Version: (.*)/gmi); if (@url < 1) { print "No VCS found.\n"; exit; } if (@url > 1) { @url = grep { $_ !~ /^Vcs-Browser:/i } @url; } if (@url > 1) { print "Several Vcs headers found, not supported yet\n"; exit; } unless (-d "$tmp/$package") { mkdir "$tmp/$package"; } chdir "$tmp/$package"; $url[0] =~ /^Vcs-(\S+):\s*(.*)/i or die; my ($vcs, $url) = (lc $1, $2); if (-e "URL") { open F, "URL" or die "URL: $!"; my $oldurl = ; chomp $oldurl; close F; if ($oldurl ne $url[0]) { print "Removing old $oldurl checkout, URL changed\n"; system "rm -rf URL trunk"; } } if ($vcs eq "svn" or $vcs eq "browser") { # guess svn url suffix if ($url !~ /\/trunk\/?$/) { if ($url =~ /\/$/) { $url .= "trunk"; } else { $url .= "/trunk"; } } } if (not -d "trunk") { # checkout #print "Checking out package...\n"; if ($vcs eq "svn") { system "svn --quiet co $url trunk"; } elsif ($vcs eq "browser") { print "VCS is browser, assuming svn\n"; system "svn --quiet co $url trunk"; } elsif ($vcs eq "bzr") { system "bzr checkout --lightweight --quiet $url trunk"; } elsif ($vcs eq "hg") { system "hg --quiet clone $url trunk"; } else { print "Unsupported VCS $vcs\n"; exit 1; } open F, ">URL" or die "URL: $!"; print F "$url[0]\n"; close F; } else { # update #print "Updating checkout...\n"; if ($vcs eq "svn") { system "cd trunk && svn --quiet update"; } elsif ($vcs eq "browser") { print "VCS is browser, assuming svn\n"; system "cd trunk && svn --quiet update"; } elsif ($vcs eq "bzr") { system "cd trunk && bzr update --quiet"; } elsif ($vcs eq "hg") { system "cd trunk && hg --quiet pull -u"; } else { print "Unsupported VCS $vcs\n"; exit 1; } } print "Package: $package\n"; print "Version: $version\n"; print "$url[0]\n"; print "Date: " . scalar (localtime) . "\n"; my $chglog = Parse::DebianChangelog->init(); $chglog->parse( { infile => "trunk/debian/changelog" } ); my $changes = $chglog->data( { count => 1 } ); if ($changes->[0]->{Version} eq $version) { print "Changes: No outstanding changes\n"; exit; } my $dpkg = $chglog->dpkg( { since => $version } ); print "Changes: $dpkg->{Changes}\n"; print "Closes: $dpkg->{Closes}\n" if ($dpkg->{Closes});