r2945 - trunk/scripts
Simon Horman
horms@costa.debian.org
Fri, 08 Apr 2005 05:44:15 +0000
Author: horms
Date: 2005-04-08 05:44:14 +0000 (Fri, 08 Apr 2005)
New Revision: 2945
Removed:
trunk/scripts/bk_get_patches
Log:
Zed's dead baby, Zed's dead.
Deleted: trunk/scripts/bk_get_patches
===================================================================
--- trunk/scripts/bk_get_patches 2005-04-08 05:41:30 UTC (rev 2944)
+++ trunk/scripts/bk_get_patches 2005-04-08 05:44:14 UTC (rev 2945)
@@ -1,1005 +0,0 @@
-#!/usr/bin/perl -w
-######################################################################
-# bk_get_patches November 2004
-# Horms horms@verge.net.au
-#
-# bk_get_patches
-# Retrieve Patches from bitkeeper either by changeset number of
-# by comparing files in a pristine source directory from a release
-# Copyright (C) 2004 Horms
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of the
-# License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-# 02111-1307 USA
-#
-######################################################################
-
-use strict;
-use Date::Format;
-#use Date::Fingers;
-use Digest::MD5;
-use DB_File;
-use IPC::Open2;
-
-my $MY_VERSION="0.1.0";
-
-my $PRISTINE_DIR = undef;
-my $OUT_DIR = ".";
-my $TMP_DIR = "$ENV{HOME}/tmp/bk_get_patches";
-my $CACHE_DIR = $TMP_DIR;
-my $CACHE_DB = "$CACHE_DIR/cache.db";
-my $CACHE_VOLATILE_DB = "$CACHE_DIR/cache_volatile.db";
-
-my $VERSION = undef;
-my $PATCHLEVEL = undef;
-my $SUBLEVEL = undef;
-my $EXTRAVERSION = undef;
-
-my $PRISTINE_VERSION = undef;
-my $PRISTINE_PATCHLEVEL = undef;
-my $PRISTINE_SUBLEVEL = undef;
-my $PRISTINE_EXTRAVERSION = undef;
-
-my $CACHE_DB_HASH = {};
-my $CACHE_VOLATILE_DB_HASH = {};
-
-sub check_tree
-{
- my ($cset, $exclude, $pfile) = (@_);
-
- for my $file (keys %$pfile) {
- if ( ! -f $file) {
- print STDERR "No such file or directory \"$file\". " .
- "Invalid command line argument?\n\n";
- usage(-1);
- }
- }
- if ( ! -f "SCCS/s.ChangeSet" or ! -f "Makefile") {
- print STDERR "Must be run from the root of a bitkeeper tree\n";
- return 1;
- }
- if ( defined $PRISTINE_DIR and !-d $PRISTINE_DIR) {
- print STDERR "Pristine source directory, \"$PRISTINE_DIR\" "
- ."is not a directory or does not exist\n";
- return 1;
- }
- if ( defined $OUT_DIR and !-d $OUT_DIR) {
- print STDERR "Out directory, \"$OUT_DIR\" "
- ."is not a directory or does not exist\n";
- return 1;
- }
- if ( ! -d "$TMP_DIR") {
- print STDERR "Tempoary directory, \"$TMP_DIR\""
- ."is not a directory or does not exist\n";
- return 1;
- }
- unless ( -d "$CACHE_DIR/") {
- mkdir "$CACHE_DIR/" || die;
- }
-
- open MAKEFILE, "<Makefile" || die;
- while (<MAKEFILE>) {
- if (/^VERSION\s*=\s*([0-9]+)\s*$/) {
- $VERSION=$1;
- }
- elsif (/^PATCHLEVEL\s*=\s*([0-9]+)\s*$/) {
- $PATCHLEVEL=$1;
- }
- elsif (/^SUBLEVEL\s*=\s*([0-9]+)\s*$/) {
- $SUBLEVEL=$1;
- }
- elsif (/^EXTRAVERSION\s*=\s*(\S*)\s*$/) {
- $EXTRAVERSION=$1;
- }
- if (defined $VERSION and defined $PATCHLEVEL and
- defined $SUBLEVEL and defined $EXTRAVERSION) {
- last;
- }
- }
- close MAKEFILE;
- #print "VERSION = $VERSION\n" .
- # "PATCHLEVEL = $PATCHLEVEL\n" .
- # "SUBLEVEL = $SUBLEVEL\n" .
- # "EXTRAVERSION = $EXTRAVERSION\n";
- unless (defined $VERSION and defined $PATCHLEVEL and
- defined $SUBLEVEL and defined $EXTRAVERSION) {
- print STDERR "Bogus Makefile in BK tree\n";
- return 1;
- }
-
- if (not defined $PRISTINE_DIR) {
- if (scalar keys %$pfile ne 0) {
- print STDERR "--pristine-dir must be specified if "
- . "FILES are given as arguments\n\n";
- usage(-1);
- }
- return 0;
- }
-
- open MAKEFILE, "<$PRISTINE_DIR/Makefile" || die;
- while (<MAKEFILE>) {
- if (/^VERSION\s*=\s*([0-9]+)\s*$/) {
- $PRISTINE_VERSION=$1;
- }
- elsif (/^PATCHLEVEL\s*=\s*([0-9]+)\s*$/) {
- $PRISTINE_PATCHLEVEL=$1;
- }
- elsif (/^SUBLEVEL\s*=\s*([0-9]+)\s*$/) {
- $PRISTINE_SUBLEVEL=$1;
- }
- elsif (/^EXTRAVERSION\s*=\s*(\S*)\s*$/) {
- $PRISTINE_EXTRAVERSION=$1;
- }
- if (defined $PRISTINE_VERSION and
- defined $PRISTINE_PATCHLEVEL and
- defined $PRISTINE_SUBLEVEL and
- defined $PRISTINE_EXTRAVERSION) {
- last;
- }
- }
- close MAKEFILE;
- unless (defined $PRISTINE_VERSION and defined $PRISTINE_PATCHLEVEL and
- defined $PRISTINE_SUBLEVEL and
- defined $PRISTINE_EXTRAVERSION) {
- print STDERR "Bogus Makefile in pristine tree\n";
- return 1;
- }
-
- if ($VERSION ne $PRISTINE_VERSION or
- $PATCHLEVEL ne $PRISTINE_PATCHLEVEL) {
- print STDERR "Version Missmatch: " .
- "BK tree is $VERSION.$PATCHLEVEL " .
- "Pristine tree is " .
- "$PRISTINE_VERSION.$PRISTINE_PATCHLEVEL\n\n";
- return 1;
- }
-
- return 0;
-}
-
-sub add_cache
-{
- my ($key, $value) = (@_);
- $key = "${VERSION}.${PATCHLEVEL}::$key";
- $CACHE_DB_HASH->{"$key"} = "$value";
-}
-
-sub get_cache
-{
- my ($key) = (@_);
- $key = "${VERSION}.${PATCHLEVEL}::$key";
- return $CACHE_DB_HASH->{"$key"};
-}
-
-sub delete_cache
-{
- my ($key) = (@_);
- $key = "${VERSION}.${PATCHLEVEL}::$key";
- delete $CACHE_DB_HASH->{"$key"};
-}
-
-sub add_cache_volatile
-{
- my ($key, $value) = (@_);
- $key = "${VERSION}.${PATCHLEVEL}::$key";
- $CACHE_VOLATILE_DB_HASH->{"$key"} = "$value";
-}
-
-sub get_cache_volatile
-{
- my ($key) = (@_);
- $key = "${VERSION}.${PATCHLEVEL}::$key";
- return $CACHE_VOLATILE_DB_HASH->{"$key"};
-}
-
-sub delete_cache_volatile
-{
- my ($key) = (@_);
- $key = "${VERSION}.${PATCHLEVEL}::$key";
- delete $CACHE_VOLATILE_DB_HASH->{"$key"};
-}
-
-#sub gnupatch
-#{
-# my ($rset) = (@_);
-#
-# my $patch = get_cache_volatile("RSET2gnupatch::${rset}");
-# if (defined $patch) {
-# return $patch;
-# }
-#
-# $patch = "";
-# my $pid = open2(\*PATCHR, \*PATCHW, "bk gnupatch");
-# print PATCHW $rset;
-# close PATCHW;
-# while (<PATCHR>) {
-# $patch .= $_;
-# }
-# close PATCHR;
-# waitpid $pid, 0;
-#
-# add_cache_volatile("RSET2gnupatch::${rset}", $patch);
-# return $patch;
-#}
-
-sub dopatch
-{
- my ($file, $start, $end) = (@_);
-
- my $patch;
- $patch = get_cache( "nrr2patch::${file}::${start}::${end}");
- if (defined $patch) {
- return $patch;
- }
-
- $patch = "";
- open PATCH, "bk diffs -pu -r$start..$end $file|";
- while (<PATCH>) {
- $patch .= $_;
- }
- close PATCH;
-
- add_cache("nrr2patch::${file}::${start}::${end}", $patch);
- return $patch;
-}
-
-sub __get_cset_patch
-{
- my ($cset_key, $cset_no, $exclude, $pfile) = (@_);
-
- my $cset_user = get_cache("MD5KEY2USER::${cset_key}");
- if (! defined $cset_user) {
- $cset_user = `bk prs -r$cset_key -hd :USER:` || return -1;
- chomp $cset_user;
- add_cache("MD5KEY2USER::${cset_key}", $cset_user)
- }
-
- my $cset_comment = get_cache("MD5KEY2COMMENTS::${cset_key}");
- if (!defined $cset_comment) {
- my @cset_comment = split /\n/,
- `bk prs -r$cset_key -hd :COMMENTS:` ||
- return -1;
- $cset_comment = $cset_comment[0];
- $cset_comment =~ s/C (.*)/$1/;
- chomp $cset_comment;
- add_cache("MD5KEY2COMMENTS::${cset_key}",
- $cset_comment);
- }
-
- my $cset_rset = get_cache("MD5KEY2RSET::${cset_key}");
- if (!defined $cset_rset) {
- $cset_rset = `bk rset -hr$cset_key` || return -1;
- add_cache("MD5KEY2RSET::${cset_key}", $cset_rset);
- }
-
- my $cset_rset_str;
- my $cset_patch = "";
- my @cset_rset = split /\n/, $cset_rset;
-
- for my $i (@cset_rset) {
- $i =~ m/(.*)\|.*\|(.*)\|.*\|(.*)/ || die;
- my $file = $1;
- my $start = $2;
- my $end = $3;
- my $rset_str = "$file|$start..$end";
- my $rset_str_full = "";
-
-
- if ($1 eq "ChangeSet") {
- $cset_rset_str .= "# S rset: $rset_str\n";
- next;
- }
-
- my $rev;
- if (defined $pfile->{"$file"}) {
- $rev = $pfile->{"$file"}->{"status"};
- }
- else {
- $rev = $pfile->{"$file"}->{"status"} =
- get_revision($file);
- $pfile->{"$file"}->{"flag"} = "discovered";
- }
-
- if (cmp_revision($rev, $end, $file) ge 0) {
- $cset_rset_str .= "# S rset: $rset_str\n";
- next;
- }
-
- if (cmp_revision($rev, $start, $file) gt 0) {
- $cset_rset_str .= "#(O rset: $rset_str)\n";
- $start = $rev;
- $rset_str = "$file|$start..$end";
- $rset_str_full = "# U rset: $rset_str\n";
- }
- else {
- $rset_str_full = "# I rset: $rset_str\n";
- }
-
- if (defined $exclude->{$rset_str}) {
- $rset_str_full = "# E rset: $rset_str\n";
- }
- else {
- $cset_patch .= dopatch($file, $start, $end);
- }
- $cset_rset_str .= $rset_str_full;
- $pfile->{"$file"}->{"status"} = $end;
- }
- print "\n";
- $cset_rset_str .=
- "#\n" .
- "# Key:\n" .
- "# S: Skipped ChangeSet file only\n" .
- "# O: Original Followed by Updated\n" .
- "# U: Updated Included with updated range of versions\n" .
- "# I: Included Included verbatim\n" .
- "# E: Excluded Excluded on request from user\n" .
- "# D: Deleted Manually deleted by subsequent user edit\n" .
- "# R: Revised Manually revised by subsequent user edit\n" .
- "#\n";
-
- my $cset_export = get_cache("MD5KEY2export::${cset_key}");
- if (! defined $cset_export) {
- $cset_export = `bk export -tpatch -r$cset_key` || return -1;
- add_cache("MD5KEY2export::${cset_key}", $cset_export);
- }
- my $cset_export_comment;
- for my $i (split /\n/, $cset_export) {
- if ($i !~ /^#/) {
- last;
- }
- $cset_export_comment .= $i . "\n";
- }
-
- my $patch =
- "# origin: $cset_user (BitKeeper)\n" .
- "# cset: $cset_no ($VERSION.$PATCHLEVEL) " .
- "key=$cset_key\n" .
- "# URL: http://linux.bkbits.net:8080/" .
- "linux-$VERSION.$PATCHLEVEL/" .
- #"gnupatch\@$cset_key\n" .
- "cset\@$cset_key\n" .
- "# inclusion: upstream\n" .
- "# descrition: $cset_comment\n" .
- "# revision date: " .
- time2str("%a, %d %b %Y %T %z", time) . "\n" .
- "#\n" .
- $cset_rset_str .
- "#\n" .
- $cset_export_comment .
- "#\n" .
- $cset_patch;
-
- return $patch;
-}
-
-#sub get_cset_patch_by_key
-#{
-# my ($cset_key, $exclude, $pfile) = (@_);
-#
-# my $cset_no = ` bk prs -r$cset_key -hnd :REV:` || return;
-# chomp $cset_no;
-#
-# return __get_cset_patch($cset_key, $cset_no, $exclude, $pfile);
-#}
-
-sub get_cset_patch_by_no
-{
- my ($cset_no, $exclude, $pfile) = (@_);
-
- my $cset_key = get_cache_volatile("c2MD5KEY::${cset_no}");
- if (! defined $cset_key) {
- $cset_key = `bk prs -r$cset_no -hd :MD5KEY:` || return;
- chomp $cset_key;
- add_cache_volatile("c2MD5KEY::${cset_no}", $cset_key);
- }
-
- return __get_cset_patch($cset_key, $cset_no, $exclude, $pfile);
-}
-sub system_wrapper
-{
- #print "system_wrapper: @_\n";
- system(@_);
- if ($? == -1) {
- die "Failed to execute";
- }
- elsif ($? & 127) {
- die "Child exited with signal";
- }
- return $? >> 8;
-}
-
-sub test_file
-{
- my ($file, $version) = (@_);
-
- my $ret;
- my $basename = $file;
-
- $basename =~ s/.*\///;
-
- unless ( -f "$PRISTINE_DIR/$file") {
- return -1;
- }
-
- # this is nasty crap
- system_wrapper("rm -f $TMP_DIR/$basename");
- system_wrapper("cp $file $TMP_DIR/$basename");
- system_wrapper("bk diffs -pu -r$version $file "
- . "| ( cd $TMP_DIR && patch -stR; )");
- $ret = system_wrapper("diff -q $PRISTINE_DIR/$file $TMP_DIR/$basename"
- . " > /dev/null");
- system_wrapper("rm -f $TMP_DIR/$basename");
-
- return $ret;
-}
-
-sub cset_get_pfile_revision
-{
- my ($cset_no, $file) = (@_);
-
- my $cset_key = get_cache_volatile("c2MD5KEY::${cset_no}");
- if (! defined $cset_key) {
- $cset_key = `bk prs -r$cset_no -hd :MD5KEY:` || return;
- chomp $cset_key;
- add_cache_volatile("c2MD5KEY::${cset_no}", $cset_key);
- }
-
- my $cset_rset = get_cache("MD5KEY2RSET::${cset_key}");
- if (!defined $cset_rset) {
- $cset_rset = `bk rset -hr$cset_key` || return -1;
- add_cache("MD5KEY2RSET::${cset_key}", $cset_rset);
- }
- my @cset_rset = split /\n/, $cset_rset;
- for my $i (@cset_rset) {
- $i =~ m/(.*)\|.*\|(.*)\|.*\|.*/;
- unless (defined $1) {
- print "i=$i\n";
- delete_cache("MD5KEY2RSET::${cset_key}");
- }
- if ($1 eq $file) {
- return $2;
- }
- }
-
- return undef;
-}
-
-
-sub get_revision_list_str
-{
- my ($file, $nocache) = (@_);
-
- my $rev_str;
-
- # XXX: Is this too volatile to cache?
- if (not defined $nocache) {
- $rev_str = get_cache_volatile("n2REV::${file}");
- }
- if (! defined $rev_str) {
- $rev_str = `bk prs -hnd:REV: $file` || return -1;
- chomp $rev_str;
- if (not defined $nocache) {
- add_cache_volatile("n2REV::${file}", $rev_str);
- }
- }
- return $rev_str;
-}
-
-sub get_revision_list
-{
- my ($file, $nocache) = (@_);
-
- my $rev_str;
-
- return split /\n/, get_revision_list_str($file, $nocache);
-}
-
-
-sub get_revision
-{
- my ($file) = (@_);
-
- my @rev;
- my $md5str;
- my $revision;
-
- print "O";
-
- if (not defined $PRISTINE_DIR or not -f "$PRISTINE_DIR/$file") {
- return "1.0";
- }
-
- @rev = get_revision_list($file);
-
- {
- my $md5 = Digest::MD5->new;
- open PRISTINE, "<$PRISTINE_DIR/$file" or die;
- while (<PRISTINE>) {
- $md5->add($_);
- }
- close(PRISTINE);
- $md5str = $md5->hexdigest;
- }
-
- $revision = get_cache("nh2r::${file}::${md5str}");
-
- if (defined $revision) {
- return $revision;
- }
-
- for my $i (@rev) {
- print "o";
-
- if (test_file($file, $i) != 0) {
- next;
- }
- $revision = $i;
- add_cache("nh2r::${file}::${md5str}", $i);
- last;
- }
-
- return $revision;
-}
-
-sub __cmp_revision_fast
-{
- my ($a, $b) = (@_);
-
- if (not defined $a and not defined $b) {
- return 0;
- }
- if (not defined $a) {
- return -1;
- }
- if (not defined $b) {
- return 1;
- }
-
- if ($a eq $b) {
- return 0;
- }
-
- return undef;
-}
-
-my $REVISION_CACHE = {};
-
-sub cmp_revision_index
-{
- my ($revision, $file) = (@_);
-
- my $index;
- $index = get_cache_volatile("r2index::${file}::${revision}");
- if (defined $index) {
- return $index;
- }
-
- $index = 0;
- my @rev = get_revision_list($file);
- for my $r (@rev) {
- if ($r eq $revision) {
- #if ($file eq "ChangeSet") {
- # print "$file $a $b $index\n";
- #}
- $REVISION_CACHE->{$file}->{$revision} = $index;
- add_cache_volatile("r2index::${file}::${revision}",
- $index);
- return $index;
- }
- $index++;
- }
-
- return undef;
-}
-
-sub cmp_revision
-{
- my ($a, $b, $file) = (@_);
-
- {
- my $ret = __cmp_revision_fast($a, $b);
- if (defined $ret) {
- return $ret;
- }
- }
-
- my $a_index = cmp_revision_index($a, $file);
- my $b_index = cmp_revision_index($b, $file);
-
- {
- my $ret = __cmp_revision_fast($a_index, $b_index);
- if (defined $ret) {
- return $ret;
- }
- }
-
- return ($b_index - $a_index);
-}
-
-#sub cmp_revision
-#{
-# my ($a, $b, $file) = (@_);
-#
-# {
-# my $ret = __cmp_revision_fast($a, $b);
-# if (defined $ret) {
-# return $ret;
-# }
-# }
-#
-# # N.B: @rev is from newest to oldest, so the test is reversed
-# my @rev = get_revision_list($file);
-# for my $r (@rev) {
-# if ($file eq "ChangeSet") {
-# print "$file $a $b $r\n";
-# }
-# if ($a eq $r) {
-# return 1;
-# }
-# elsif ($b eq $r) {
-# return -1;
-# }
-# }
-#
-# return undef;
-#}
-
-#sub cmp_revision_algorithmic
-#{
-# my ($a, $b) = (@_);
-#
-# {
-# my $ret = __cmp_revision_fast($a, $b);
-# if (defined $ret) {
-# return $ret;
-# }
-# }
-#
-# my @a_a = split /\./, $a;
-# my @b_a = split /\./, $b;
-#
-# while (1) {
-# my $x;
-# my $y;
-#
-# unless ($x = shift @a_a) { last; }
-# unless ($y = shift @b_a) { push @a_a, $x; last; }
-#
-# if ($x < $y) {
-# return -1;
-# }
-# elsif ($x > $y) {
-# return 1;
-# }
-#
-# }
-#
-# if ($#a_a ge 0) {
-# return 1;
-# }
-# elsif ($#b_a ge 0) {
-# return -1;
-# }
-#
-# return 0;
-#}
-#
-#sub cmp_cset
-#{
-# my ($a, $b) = (@_);
-#
-# # ChangeSets seem to be numerically ordered
-# # as opposed to file revisions which may be non-linear
-# # f there is a sub-revision). The ChangeSet list also turns
-# # out to be very long, so it should be both acurate
-# # and significantly faster to compare the the revision
-# # algorithmicly.
-# return cmp_revision_algorithmic($a, $b);
-#}
-
-sub cmp_cset {
- return cmp_revision($a, $b, "ChangeSet");
-}
-
-sub sort_cmp_cset
-{
- return cmp_cset($a, $b);
-}
-
-sub sort_cmp_cset_r
-{
- return cmp_cset($b, $a);
-}
-
-
-sub __get_csets
-{
- my ($cset, $exclude, $pfile, $file) = (@_);
-
- my $md5str;
-
- #print "file=$file\n";
- $pfile->{$file}->{"status"} = "no patch";
-
- my $revision = get_revision($file);
- my @rev = get_revision_list($file);
- $pfile->{$file}->{"status"} = $revision;
-
- my $cset_file;
- my $cset_no;
- my $started;
- for my $i (reverse @rev) {
- if (not defined $started) {
- if($i eq $revision) {
- $started = 1;
- }
- next;
- }
- print ".";
-
- $cset_no = get_cache_volatile("nr2c::${file}::${i}");
- if (! defined $cset_no) {
- $cset_no = `bk r2c -r$i $file` || return -1;
- chomp $cset_no;
- add_cache_volatile("nr2c::${file}::${i}", $cset_no);
- }
-
- if (defined $exclude->{$cset_no}) {
- next;
- }
-
- if (defined $revision) {
- if ($i eq $revision) {
- last;
- }
- }
- elsif (test_file($file, $i) == 0) {
- $revision = $i;
- add_cache("nh2r::${file}::${md5str}", $i);
- last;
- }
-
- $cset_file =
- { "start" => cset_get_pfile_revision($cset_no, $file),
- "end" => $i,
- "pfile" => $file,
- "cset" => $cset_no };
-
- if (! defined $pfile->{$file}->{"history"}) {
- $pfile->{$file}->{"history"} = ();
- }
- push @{$pfile->{$file}->{"history"}}, $cset_file;
-
- if (! defined $cset->{$cset_no}->{"history"}) {
- $cset->{$cset_no}->{"history"} = ();
- }
- push @{$cset->{$cset_no}->{"history"}}, $cset_file;
-
- unless (defined $cset->{$cset_no}->{"status"}) {
- $cset->{$cset_no}->{"status"} = "pending";
- }
-
- }
-}
-
-
-sub get_csets
-{
- my ($cset, $exclude, $pfile) = (@_);
-
- my $count = 0;
- for my $f (keys %$pfile) {
- if ($pfile->{$f}->{"status"} ne "pending") {
- next;
- }
- __get_csets($cset, $exclude, $pfile, $f);
- $count++;
- }
- print "\n";
-
- return $count;
-}
-
-#sub __get_pfiles
-#{
-# my ($cset, $pfile, $c) = (@_);
-#
-# my $cset_key = `bk prs -r$c -hnd :MD5KEY: ChangeSet`;
-# my @patch_f = split /\n/, `bk rset -r$cset_key`;
-#
-# #print "cset=$c\n";
-# $cset->{$c}->{"status"} = "processed";
-#
-# for my $f (@patch_f) {
-# my @tmp = split /\|/, $f;
-#
-# if (@tmp[0] eq "ChangeSet") {
-# next;
-# }
-#
-# unless (defined $pfile->{@tmp[0]}) {
-# $pfile->{@tmp[0]} = "pending";
-# }
-# #print " file=@tmp[0]\tfile_status=" . $pfile->{@tmp[0]} . "\n";
-# }
-#}
-#
-#sub get_pfiles
-#{
-# my ($cset, $pfile) = (@_);
-#
-# my $count = 0;
-# for my $c (keys %$cset) {
-# print "O";
-# if ($cset->{$c}->{"status"} ne "pending") {
-# next;
-# }
-# __get_pfiles($cset, $pfile, $c);
-# $count++;
-# }
-# print "\n";
-#
-# return $count;
-#}
-
-
-sub backport_files
-{
- my ($cset, $exclude, $pfile) = (@_);
-
- if (get_csets($cset, $exclude, $pfile) < 0) {
- return -1;
- }
-
- print scalar(keys(%$cset)) . " change sets\n";
- my $index = 1;
- for my $i (sort sort_cmp_cset keys(%$cset)) {
- printf " cset %04d $i\n", $index++;
- for my $x (@{$cset->{$i}->{"history"}}) {
- printf " cset=%12s %8s .. %-8s pfile=%s\n", $i,
- $x->{"start"}, $x->{"end"}, $x->{"pfile"};
- }
- }
- #print scalar(keys(%$pfile)) . " patched files\n";
- $index=1;
- for my $i (keys %$pfile) {
- printf " pfile %04d $i %s\n", $index++,
- $pfile->{$i}->{"status"};
-
- for my $x (@{$pfile->{$i}->{"history"}}) {
- printf " pfile=%s %8s .. %-8s cset=%s\n", $i,
- $x->{"start"}, $x->{"end"}, $x->{"cset"};
- }
- }
-
- return 0;
-}
-
-sub retrieve_changeset
-{
- my ($cset, $exclude, $pfile) = (@_);
-
- my $index = 0;
- for my $cset_no (sort sort_cmp_cset keys(%$cset)) {
- if (defined $exclude->{$cset_no}->{"status"}) {
- print "$cset_no skip!\n";
- next;
- }
-
- $index++;
- my $cset_patch = get_cset_patch_by_no($cset_no, $exclude,
- $pfile) ||
- die "Could not retrieve $cset_no";
-
- if ($OUT_DIR eq "-") {
- print $cset_patch;
- next;
- }
-
- my $file = sprintf "$OUT_DIR/%04d-%s.patch", $index, $cset_no;
- print "$file\n";
- open OUT, ">$file" || die;
- print OUT $cset_patch;
- close OUT;
- }
-
- return 0;
-}
-
-sub usage
-{
- my ($exit_status) = (@_);
-
- local *FILE = ($exit_status < 0) ? *STDERR : *STDOUT;
-
- print FILE
- "bk_get_patches version $MY_VERSION\n" .
- "Copyright 2004 Horms\n" .
- "\n" .
- "Usage: bk_get_patches OPTIONS " .
- "[CSET]... [FILE]...\n" .
- " --help Display this text\n" .
- " --pristine-dir=DIR Directory with pristine kernel\n" .
- " source. Required if any FILEs are\n" .
- " specified\n" .
- " --out-dir=DIR Directory to put patch files in.\n" .
- " - for stdout.\n".
- " --exclude=CSET Exclude changeset/rset.\n".
- "\n";
-
- exit $exit_status;
-}
-
-{
- my $pfile = {};
- my $cset = {};
- my $exclude = {};
-
- umask 0077;
-
-
- my $cmd ="";
- for (@ARGV) {
- if (/--help/) {
- usage(0);
- }
- elsif (/--pristine[-_]dir=(.*)/) {
- $PRISTINE_DIR = $1;
- }
- elsif (/--out[-_]dir=(.*)/) {
- $OUT_DIR = $1;
- }
- elsif (/--exclude=(.*)/) {
- $exclude->{$1} = "pending";
- }
- elsif (/^[0-9.]+$/) {
- $cset->{$_}->{"status"} = "pending";
- }
- else {
- # Assume a file
- m/(\.\/+)*(.*)/;
- $pfile->{$2}->{"status"} = "pending";
- }
- $cmd .= " \\\n\t$_";
- }
-
- unless (check_tree($cset, $exclude, $pfile) == 0) { exit 1; }
- print "${0}${cmd}\n";
-
- tie %$CACHE_DB_HASH, 'DB_File', $CACHE_DB,
- O_CREAT|O_RDWR, 0600, $DB_HASH;
- tie %$CACHE_VOLATILE_DB_HASH, 'DB_File', $CACHE_VOLATILE_DB,
- O_CREAT|O_RDWR, 0600, $DB_HASH;
-
- {
- my $r1 = get_revision_list_str("ChangeSet", "nocache");
- my $r2 = get_revision_list_str("ChangeSet");
- if ($r1 ne $r2) {
- print "Flushing volatile DB\n";
- untie %$CACHE_VOLATILE_DB_HASH;
- unlink $CACHE_VOLATILE_DB;
- tie %$CACHE_VOLATILE_DB_HASH, 'DB_File',
- $CACHE_VOLATILE_DB, O_CREAT|O_RDWR,
- 0600, $DB_HASH;
- }
- }
-
- unless (backport_files($cset, $exclude, $pfile) == 0) { die; }
- unless (retrieve_changeset($cset, $exclude, $pfile) == 0) { die; }
-
- untie %$CACHE_DB_HASH;
- untie %$CACHE_VOLATILE_DB_HASH;
-}
-
-0;