Hi. I've rewiten patchfs in Perl - now it can properly handle all
patches in unified diff format (the most common format for patches).

Methods supported: list, copyout

The algorithm isn't too fast (yet), but I think it's quite usable,
especialy for smaller patches. When I've tested it on 27MB kernel
patch 'list' took 4s and 'copyout' (in the worst case) 6s (duron
900mhz).

I have some issues on my todo list (info about size, date), but I
think this extfs is already ready for inclusion.

Entry to add to mc.ext:

regex/\.(diff|patch)(\.(bz|bz2|gz|z|Z))?$
        Open=%cd %p#patchfs


Regards
alpha

PS. The latest mc snapshot segfaults after pressing f4 to edit file.
Don't have time to check if it's fixed in cvs.

-- 

  _.|._ |_  _.    : Adam Byrtek, alpha@(irc.pl|debian.org)
 (_|||_)| |(_|    : gg 1802819, pgp 0xB25952C0
     |            : jid alpha.jabberpl.org
#! /usr/bin/perl
#
# Written by Adam Byrtek <[EMAIL PROTECTED]>, 2002
# 
# extfs to handle patches in unified diff format

my $bzcat = "bzip2 -dc";
my $gzcat = "zcat";
my $file = "file";

sub now
{
    my @time = localtime;
    return sprintf "%02d-%02d-%02d %02d:%02d", $time[4]+1, $time[3], $time[5]%100, 
$time[2], $time[1];
}

sub list
{
    my ($archive)=@_;
    my ($uid,$gid)=(`id -nu` || "0",`id -ng` || "0");
    my ($len,$f);
    chomp ($uid, $gid);

    while (<I>) {
        if (/^--- /) {
            printf "-rw-r--r-- 1 %s %s %d %s %s\n", $uid, $gid, $len-1, now, $f
              if $f;
            s/^--- ([^\s]+).*$/$1/;
            chomp;
            $f=$_;
            $len=0;
        } elsif (/^[+\-]/) {
            $len=0;
            $len++;
        }
    }
    printf "-rw-r--r-- 1 %s %s %d %s %s\n", $uid, $gid, $len-1, now, $f
      if $f;
    close I;
}

sub copyout
{
    my ($archive,$file,$out)=@_;
    my ($f,$state,$notebuf,$diffbuf,$note);

    open O, "> $out";
    while (<I>) {
        if (/^--- /) {
            last if ($f eq $file);
            # switch to diff mode
            $state=1;
            $note=$notebuf;
            $notebuf=$diffbuf="";
            $f=$_;
            $f=~s/^--- ([^\s]+).*$/$1/;
            chomp $f;
        } elsif (!/^([+\- ]|@@)/) {
            # switch to normal mode
            $state=0;
        }
        
        if ($state==0) {
            $notebuf.=$_;
        } elsif ($state==1) {
            $diffbuf.=$_;
        }
    }
    print O ($note, $diffbuf) if ($f eq $file);
    close O;
}

$_=`$file $ARGV[1]`;
if (/bzip/) {
    open I, "$bzcat $ARGV[1] |";
} elsif (/gzip/) {
    open I, "$gzcat $ARGV[1] |";
} else {
    open I, "< $ARGV[1]";
}

if ($ARGV[0] eq "list") {
    list $ARGV[1];
    exit(0);
} if ($ARGV[0] eq "copyout") {
    copyout ($ARGV[1], $ARGV[2], $ARGV[3]);
    exit(0);
}
exit(1);

Reply via email to