summaryrefslogtreecommitdiffstats
path: root/maint
diff options
context:
space:
mode:
Diffstat (limited to 'maint')
-rw-r--r--maint/README18
-rwxr-xr-xmaint/gen-zone52
-rwxr-xr-xmaint/release58
-rw-r--r--maint/release.pm328
-rwxr-xr-xmaint/tag-release6
5 files changed, 462 insertions, 0 deletions
diff --git a/maint/README b/maint/README
new file mode 100644
index 0000000..b1ab665
--- /dev/null
+++ b/maint/README
@@ -0,0 +1,18 @@
+How to release pciutils
+~~~~~~~~~~~~~~~~~~~~~~~
+(a couple of hints for the forgetful maintainer)
+
+Update pci.ids.
+
+Check version numbers in Makefile and lib/pci.h.
+
+ssh-add ~/.ssh/id_korg
+
+maint/tag-release vX.Y.Z
+git push --tags
+
+maint/release
+
+Update progs/pciutils at Jabberwock.
+
+Check that everything was pushed to both kernel.org and github.com.
diff --git a/maint/gen-zone b/maint/gen-zone
new file mode 100755
index 0000000..b3591f8
--- /dev/null
+++ b/maint/gen-zone
@@ -0,0 +1,52 @@
+#!/usr/bin/perl -w
+# Create a DNS zone with PCI ID records
+
+use strict;
+
+my %ids = ();
+my %comments = ();
+foreach our $file (@ARGV) {
+ my $fn = ($file =~ /\.gz$/) ? "zcat $file |" : ($file =~ /\.bz2$/) ? "bzcat $file |" : $file;
+ open F, $fn or die "Unable to open $file: $!";
+ my @id = ();
+ my $comm = "";
+ sub err($) {
+ print STDERR "Error in $file, line $.: @_\n";
+ exit 1;
+ }
+ while (<F>) {
+ if (/^(#.*)/) {
+ $comm .= $_;
+ next;
+ }
+ chomp;
+ if (my ($indent, $id, $ignored, $name) = /^(\t*)(([0-9a-fA-Z]+ ?)*)(( |\t|$)\s*(.*))$/) {
+ my $depth = length $indent;
+ $depth <= @id or err "Mismatched indentation";
+ @id = (@id[0..$depth-1], $id);
+ my $i = join(":", @id);
+ if ($i ne "") {
+ !exists $ids{$i} or die "ID $i defined twice";
+ $ids{$i} = $name;
+ $comments{$i} = $comm if $comm;
+ }
+ } elsif (!/^$/) {
+ err "Parse error";
+ }
+ $comm = "";
+ }
+ close F;
+}
+
+sub esc($) {
+ my ($x) = @_;
+ $x =~ s/^\s+//;
+ $x =~ s/"/\\"/g;
+ return $x;
+}
+
+foreach my $i (keys %ids) {
+ my $j = join(".", reverse split(/[: ]/, $i));
+ print "$j.pci\tTXT \"i=", esc($ids{$i}), "\"\n";
+ # print "$j.pci\tTXT \"c=", esc($comments{$i}), "\"\n"
+}
diff --git a/maint/release b/maint/release
new file mode 100755
index 0000000..9c2521b
--- /dev/null
+++ b/maint/release
@@ -0,0 +1,58 @@
+#!/usr/bin/perl
+# A simple script for making releases of the pciutils
+# (c) 2003--2012 Martin Mares <mj@ucw.cz>
+
+use strict;
+use warnings;
+require "./maint/release.pm";
+
+# Check API version
+my $apiver = "???";
+open X, "lib/pci.h" or die;
+while (<X>) {
+ /^#define PCI_LIB_VERSION 0x(.{6})$/ and $apiver = $1;
+}
+print "API version is $apiver ... <confirm> "; <STDIN>;
+
+#print "Updating public GIT tree\n";
+#`git push --tags public`; die if $?;
+
+my $r = new UCW::Release("pciutils");
+my $ver = $r->GetVersionFromFile("Makefile", "VERSION=(.*)");
+$r->GetVersionsFromChangelog("ChangeLog", "Released as (.*)\.");
+push @{$r->{"rules"}}, '^win32/config.h' => 's';
+if ($ver =~ /-/) {
+ $r->{"ALPHADIR"} = "alpha/";
+ $r->{"conditions"}->{"ALPHA_VERSION"} = 1;
+} else {
+ $r->{"ALPHADIR"} = "";
+ $r->{"conditions"}->{"ALPHA_VERSION"} = -1;
+}
+push @{$r->{"uploads"}}, {
+ "url" => "scp://jabberwock.ucw.cz/home/ftp/pub/mj/linux/pci/" . $r->{"ALPHADIR"}
+## },{
+## "url" => "scp://master.kernel.org/pub/software/utils/pciutils/" . $r->{"ALPHADIR"}
+ };
+$r->ParseOptions;
+$r->InitDist("maint/dist");
+my $reldir = $r->GenPackage;
+$r->GenFile("README");
+$r->GenFile("pciutils.lsm");
+$r->Dispatch;
+if ($r->{"do_upload"}) {
+ print "Uploading pci.ids to Jabberwock\n";
+ `scp -C pci.ids pciids\@jabberwock.ucw.cz:05-pciutils.new`; die if $?;
+ `ssh pciids\@jabberwock.ucw.cz mv 05-pciutils.new origs/05-pciutils`; die if $?;
+}
+
+# Hacks for kernel.org
+print "Preparing kernel.org package\n";
+my $dd = $r->{"DISTDIR"};
+my $pkg = $r->{"PKG"};
+`gzip -d <$dd/$pkg.tar.gz >$dd/$pkg.tar`; die if $?;
+system "gpg", "--armor", "--detach-sig", "-o", "$dd/$pkg.tar.sig", "$dd/$pkg.tar"; die if $?;
+if ($r->{"do_upload"}) {
+ print "Uploading to kernel.org\n";
+ print "<confirm> "; <STDIN>;
+ system '/home/mj/tree/kup/kup', 'put', "$dd/$pkg.tar", "$dd/$pkg.tar.sig", "/pub/software/utils/pciutils/$pkg.tar.gz"; die if $?;
+}
diff --git a/maint/release.pm b/maint/release.pm
new file mode 100644
index 0000000..33f64d7
--- /dev/null
+++ b/maint/release.pm
@@ -0,0 +1,328 @@
+#!/usr/bin/perl
+# A simple system for making software releases
+# (c) 2003--2011 Martin Mares <mj@ucw.cz>
+
+package UCW::Release;
+use strict;
+use warnings;
+use Getopt::Long;
+
+our $verbose = 0;
+
+sub new($$) {
+ my ($class,$basename) = @_;
+ my $s = {
+ "PACKAGE" => $basename,
+ "rules" => [
+ # p=preprocess, s=subst, -=discard
+ '(^|/)(CVS|\.arch-ids|{arch}|\.git|tmp)/' => '-',
+ '\.sw[a-z]$' => '-',
+ '\.(lsm|spec)$' => 'ps',
+ '(^|/)README$' => 's'
+ ],
+ "directories" => [
+ ],
+ "conditions" => {
+ },
+ "DATE" => `date '+%Y-%m-%d' | tr -d '\n'`,
+ "LSMDATE" => `date '+%y%m%d' | tr -d '\n'`,
+ "distfiles" => [
+ ],
+ "archivedir" => $ENV{HOME} . "/archives/sw/$basename",
+ "uploads" => [
+ ],
+ # Options
+ "do_test" => 1,
+ "do_patch" => 1,
+ "diff_against" => "",
+ "do_upload" => 1,
+ "do_sign" => 1,
+ };
+ bless $s;
+ return $s;
+}
+
+sub GetVersionFromFile($) {
+ my ($s,$file,$rx) = @_;
+ open F, $file or die "Unable to open $file for version autodetection";
+ while (<F>) {
+ chomp;
+ if (/$rx/) {
+ $s->{"VERSION"} = $1;
+ print "Detected version $1 from $file\n" if $verbose;
+ last;
+ }
+ }
+ close F;
+ if (!defined $s->{"VERSION"}) { die "Failed to auto-detect version"; }
+ return $s->{"VERSION"};
+}
+
+sub GetVersionsFromChangelog($) {
+ my ($s,$file,$rx) = @_;
+ open F, $file or die "Unable to open $file for version autodetection";
+ while (<F>) {
+ chomp;
+ if (/$rx/) {
+ if (!defined $s->{"VERSION"}) {
+ $s->{"VERSION"} = $1;
+ print "Detected version $1 from $file\n" if $verbose;
+ } elsif ($s->{"VERSION"} eq $1) {
+ # do nothing
+ } else {
+ $s->{"OLDVERSION"} = $1;
+ print "Detected previous version $1 from $file\n" if $verbose;
+ last;
+ }
+ }
+ }
+ close F;
+ if (!defined $s->{"VERSION"}) { die "Failed to auto-detect version"; }
+ return $s->{"VERSION"};
+}
+
+sub InitDist($) {
+ my ($s,$dd) = @_;
+ $s->{"DISTDIR"} = $dd;
+ print "Initializing dist directory $dd\n" if $verbose;
+ `rm -rf $dd`; die if $?;
+ `mkdir -p $dd`; die if $?;
+}
+
+sub ExpandVar($$) {
+ my ($s,$v) = @_;
+ if (defined $s->{$v}) {
+ return $s->{$v};
+ } else {
+ die "Reference to unknown variable $v";
+ }
+}
+
+sub CopyFile($$$$) {
+ my ($s,$f,$dir,$action) = @_;
+
+ (my $d = $f) =~ s@(^|/)[^/]*$@@;
+ $d = "$dir/$d";
+ -d $d || `mkdir -p $d`; die if $?;
+
+ my $preprocess = ($action =~ /p/);
+ my $subst = ($action =~ /s/);
+ if ($preprocess || $subst) {
+ open I, "$f" or die "open($f): $?";
+ open O, ">$dir/$f" or die "open($dir/$f): $!";
+ my @ifs = (); # stack of conditions, 1=satisfied
+ my $empty = 0; # last line was empty
+ my $is_makefile = ($f =~ /(Makefile|.mk)$/);
+ while (<I>) {
+ if ($subst) {
+ s/@([0-9A-Za-z_]+)@/$s->ExpandVar($1)/ge;
+ }
+ if ($preprocess) {
+ if (/^#/ || $is_makefile) {
+ if (/^#?ifdef\s+(\w+)/) {
+ if (defined ${$s->{"conditions"}}{$1}) {
+ push @ifs, ${$s->{"conditions"}}{$1};
+ next;
+ }
+ push @ifs, 0;
+ } elsif (/^#ifndef\s+(\w+)/) {
+ if (defined ${$s->{"conditions"}}{$1}) {
+ push @ifs, -${$s->{"conditions"}}{$1};
+ next;
+ }
+ push @ifs, 0;
+ } elsif (/^#if\s+/) {
+ push @ifs, 0;
+ } elsif (/^#?endif/) {
+ my $x = pop @ifs;
+ defined $x or die "Improper nesting of conditionals";
+ $x && next;
+ } elsif (/^#?else/) {
+ my $x = pop @ifs;
+ defined $x or die "Improper nesting of conditionals";
+ push @ifs, -$x;
+ $x && next;
+ }
+ }
+ @ifs && $ifs[$#ifs] < 0 && next;
+ if (/^$/) {
+ $empty && next;
+ $empty = 1;
+ } else { $empty = 0; }
+ }
+ print O;
+ }
+ close O;
+ close I;
+ ! -x $f or chmod(0755, "$dir/$f") or die "chmod($dir/$f): $!";
+ } else {
+ `cp -a "$f" "$dir/$f"`; die if $?;
+ }
+}
+
+sub GenPackage($) {
+ my ($s) = @_;
+ $s->{"PKG"} = $s->{"PACKAGE"} . "-" . $s->{"VERSION"};
+ my $dd = $s->{"DISTDIR"};
+ my $pkg = $s->{"PKG"};
+ my $dir = "$dd/$pkg";
+ print "Generating $dir\n";
+
+ FILES: foreach my $f (`find . -type f`) {
+ chomp $f;
+ $f =~ s/^\.\///;
+ my $action = "";
+ my @rules = @{$s->{"rules"}};
+ while (@rules) {
+ my $rule = shift @rules;
+ my $act = shift @rules;
+ if ($f =~ $rule) {
+ $action = $act;
+ last;
+ }
+ }
+ ($action =~ /-/) && next FILES;
+ print "$f ($action)\n" if $verbose;
+ $s->CopyFile($f, $dir, $action);
+ }
+
+ foreach my $d (@{$s->{"directories"}}) {
+ `mkdir -p $dir/$d`; die if $?;
+ }
+
+ if (-f "$dir/Makefile") {
+ print "Cleaning up\n";
+ `cd $dir && make distclean >&2`; die if $?;
+ }
+
+ print "Creating $dd/$pkg.tar.gz\n";
+ my $tarvv = $verbose ? "vv" : "";
+ `cd $dd && tar cz${tarvv}f $pkg.tar.gz $pkg >&2`; die if $?;
+ push @{$s->{"distfiles"}}, "$dd/$pkg.tar.gz";
+
+ if ($s->{'do_sign'}) {
+ print "Signing package\n";
+ system "gpg", "--armor", "--detach-sig", "$dd/$pkg.tar.gz";
+ die if $?;
+ rename "$dd/$pkg.tar.gz.asc", "$dd/$pkg.tar.gz.sign" or die "No signature produced!?\n";
+ push @{$s->{"distfiles"}}, "$dd/$pkg.tar.gz.sign";
+ }
+
+ my $adir = $s->{"archivedir"};
+ my $afile = "$adir/$pkg.tar.gz";
+ print "Archiving to $afile\n";
+ -d $adir or `mkdir -p $adir`;
+ `cp $dd/$pkg.tar.gz $afile`; die if $?;
+
+ return $dir;
+}
+
+sub GenFile($$) {
+ my ($s,$f) = @_;
+ my $sf = $s->{"DISTDIR"} . "/" . $s->{"PKG"} . "/$f";
+ my $df = $s->{"DISTDIR"} . "/$f";
+ print "Generating $df\n";
+ `cp $sf $df`; die if $?;
+ push @{$s->{"distfiles"}}, $df;
+}
+
+sub ParseOptions($) {
+ my ($s) = @_;
+ GetOptions(
+ "verbose!" => \$verbose,
+ "test!" => \$s->{"do_test"},
+ "patch!" => \$s->{"do_patch"},
+ "diff-against=s" => \$s->{"diff_against"},
+ "upload!" => \$s->{"do_upload"},
+ "sign!" => \$s->{"do_sign"},
+ ) || die "Syntax: release [--verbose] [--test] [--nopatch] [--diff-against=<version>] [--noupload] [--nosign]";
+}
+
+sub Test($) {
+ my ($s) = @_;
+ my $dd = $s->{"DISTDIR"};
+ my $pkg = $s->{"PKG"};
+ my $log = "$dd/$pkg.log";
+ print "Doing a test compilation\n";
+ `( cd $dd/$pkg && make ) >$log 2>&1`;
+ die "There were errors. Please inspect $log" if $?;
+ `grep -q [Ww]arning $log`;
+ $? or print "There were warnings! Please inspect $log.\n";
+ print "Cleaning up\n";
+ `cd $dd/$pkg && make distclean`; die if $?;
+}
+
+sub MakePatch($) {
+ my ($s) = @_;
+ my $dd = $s->{"DISTDIR"};
+ my $pkg1 = $s->{"PKG"};
+ my $oldver;
+ if ($s->{"diff_against"} ne "") {
+ $oldver = $s->{"diff_against"};
+ } elsif (defined $s->{"OLDVERSION"}) {
+ $oldver = $s->{"OLDVERSION"};
+ } else {
+ print "WARNING: No previous version known. No patch generated.\n";
+ return;
+ }
+ my $pkg0 = $s->{"PACKAGE"} . "-" . $oldver;
+
+ my $oldarch = $s->{"archivedir"} . "/" . $pkg0 . ".tar.gz";
+ -f $oldarch or die "MakePatch: $oldarch not found";
+ print "Unpacking $pkg0 from $oldarch\n";
+ `cd $dd && tar xzf $oldarch`; die if $?;
+
+ my $diff = $s->{"PACKAGE"} . "-" . $oldver . "-" . $s->{"VERSION"} . ".diff.gz";
+ print "Creating a patch from $pkg0 to $pkg1: $diff\n";
+ `cd $dd && diff -ruN $pkg0 $pkg1 | gzip >$diff`; die if $?;
+ push @{$s->{"distfiles"}}, "$dd/$diff";
+}
+
+sub Upload($) {
+ my ($s) = @_;
+ foreach my $u (@{$s->{"uploads"}}) {
+ my $url = $u->{"url"};
+ print "Upload to $url :\n";
+ my @files = ();
+ my $filter = $u->{"filter"} || ".*";
+ foreach my $f (@{$s->{"distfiles"}}) {
+ if ($f =~ $filter) {
+ print "\t$f\n";
+ push @files, $f;
+ }
+ }
+ print "<confirm> "; <STDIN>;
+ if ($url =~ m@^scp://([^/]+)(.*)@) {
+ $, = " ";
+ my $host = $1;
+ my $dir = $2;
+ $dir =~ s@^/~@~@;
+ $dir =~ s@^/\./@@;
+ my $cmd = "scp @files $host:$dir\n";
+ `$cmd`; die if $?;
+ } elsif ($url =~ m@ftp://([^/]+)(.*)@) {
+ my $host = $1;
+ my $dir = $2;
+ open FTP, "|ftp -v $host" or die;
+ print FTP "cd $dir\n";
+ foreach my $f (@files) {
+ (my $ff = $f) =~ s@.*\/([^/].*)@$1@;
+ print FTP "put $f $ff\n";
+ }
+ print FTP "bye\n";
+ close FTP;
+ die if $?;
+ } else {
+ die "Don't know how to handle this URL scheme";
+ }
+ }
+}
+
+sub Dispatch($) {
+ my ($s) = @_;
+ $s->Test if $s->{"do_test"};
+ $s->MakePatch if $s->{"do_patch"};
+ $s->Upload if $s->{"do_upload"};
+}
+
+1;
diff --git a/maint/tag-release b/maint/tag-release
new file mode 100755
index 0000000..59b3777
--- /dev/null
+++ b/maint/tag-release
@@ -0,0 +1,6 @@
+#!/bin/sh
+if [ -z "$1" -o -n "$2" ] ; then
+ echo >&2 'Usage: tag-release vX.Y.Z'
+ exit 1
+fi
+git tag -u 1F3D0761D9B65F0B $1