insert-ubuntu-changes 1.45 KB
#!/usr/bin/perl

if ($#ARGV != 2 && $#ARGV != 3) {
	die "Usage: $0 <changelog> <stop at> <start at> [<source changelog>]\n";
}
if ($#ARGV == 2) {
	push(@ARGV, "debian.master/changelog")
}
my ($changelog, $end, $start, $source_changelog) = @ARGV;

$end =~ s/^\D+//;
$start =~ s/^\D+//;

sub version_cmp($$) {
	my @a = split(/[\.-]+/, $_[0]);
	my @b = split(/[\.-]+/, $_[1]);
	for (my $i = 1;; $i++) {
		if (!defined $a[$i]) {
			if (!defined $b[$i]) {
				return 0;
			}
			return -1;
		}
		if (!defined $b[$i]) {
			return 1;
		}
		if ($a[$i] < $b[$i]) {
			return -1;
		}
		if ($a[$i] > $b[$i]) {
			return 1;
		}
	}
}

my @changes = ();
my $output = 0;
open(CHG, "<$source_changelog") ||
	open(CHG, "<debian/changelog") ||
	die "$0: debian/changelog: open failed - $!\n";
while (<CHG>) {
	if (/^\S+\s+\((.*)\)/) {
		if (version_cmp($1, $end) <= 0) {
			last;
		}
		if ($1 eq $start) {
			$output = 1;
		}
		if ($output) {
			push(@changes, "\n  [ Ubuntu: $1 ]\n\n");
			next;
		}
	}
	next if ($output == 0);

	next if (/^\s*$/);
	next if (/^\s--/);
	next if (/^\s\s[^\*\s]/);

	push(@changes, $_);
}
close(CHG);

open(CHANGELOG, "< $changelog") or die "Cannot open changelog";
open(NEW, "> $changelog.new") or die "Cannot open new changelog";

$printed = 3;
while (<CHANGELOG>) {
	if (/^  CHANGELOG: /) {
		$printed--;
		print NEW;
		if ($printed == 0) {
			print NEW @changes;
		}
		next;
	}
	print NEW;
}

close(NEW);
close(CHANGELOG);

rename("$changelog.new", "$changelog");