OpenPKG CVS Repository
  http://cvs.openpkg.org/
  ____________________________________________________________________________

  Server: cvs.openpkg.org                  Name:   Ralf S. Engelschall
  Root:   /e/openpkg/cvs                   Email:  [EMAIL PROTECTED]
  Module: openpkg-tools                    Date:   09-Apr-2004 12:20:30
  Branch: HEAD                             Handle: 2004040911203000

  Added files:
    openpkg-tools/api/OpenPKG/RPM
                            Filename.pm

  Log:
    first cut for filename module

  Summary:
    Revision    Changes     Path
    1.1         +299 -0     openpkg-tools/api/OpenPKG/RPM/Filename.pm
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: openpkg-tools/api/OpenPKG/RPM/Filename.pm
  ============================================================================
  $ cvs diff -u -r0 -r1.1 Filename.pm
  --- /dev/null 2004-04-09 12:20:30.000000000 +0200
  +++ Filename.pm       2004-04-09 12:20:30.000000000 +0200
  @@ -0,0 +1,299 @@
  +##
  +##  OpenPKG Tool Chain
  +##  Copyright (c) 2000-2004 The OpenPKG Project <http://www.openpkg.org/>
  +##  Copyright (c) 2000-2004 Ralf S. Engelschall <[EMAIL PROTECTED]>
  +##  Copyright (c) 2000-2004 Cable & Wireless <http://www.cw.com>/
  +##
  +##  Permission to use, copy, modify, and distribute this software for
  +##  any purpose with or without fee is hereby granted, provided that
  +##  the above copyright notice and this permission notice appear in all
  +##  copies.
  +##
  +##  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  +##  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  +##  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  +##  IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
  +##  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  +##  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  +##  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  +##  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  +##  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  +##  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  +##  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  +##  SUCH DAMAGE.
  +##
  +##  api/OpenPKG/RPM/Filename.pm: RPM Filename Handling
  +##
  +
  +package OpenPKG::RPM::Filename;
  +
  +use OpenPKG::Obj;
  +use Carp;
  +use vars qw($AUTOLOAD);
  +
  [EMAIL PROTECTED]       = qw(OpenPKG::Obj);
  [EMAIL PROTECTED] = qw(parse format);
  +
  +sub new ($) {
  +    my $proto = shift;
  +    my $class = ref($proto) || $proto;
  +    my $self = {};
  +    bless ($self, $class);
  +
  +    $self->{-name}    = '';
  +    $self->{-version} = '';
  +    $self->{-release} = '';
  +    $self->{-type}    = '';
  +    $self->{-ext}     = '';
  +
  +    my $filename = shift;
  +    $self->parse($filename) if (defined($filename));
  +
  +    return $self;
  +}
  +
  +sub parse ($$) {
  +    my $self = shift;
  +    my ($filename) = @_;
  +
  +    my $croak_msg = "unable to parse OpenPKG RPM filename";
  +    if ($filename =~ 
m/^(.+?)-([^-]+)-([^-]+)\.((?:no)?src|[^-]+-[^-]+-[^-]+)\.(rpm)$/i) {
  +        my ($name, $version, $release, $type, $ext) = ($1, $2, $3, $4, $5);
  +
  +        #    parse name
  +        if ($name =~ m/^[a-z][a-zA-Z0-9_-]*$/) {
  +            $name = { -class => 'openpkg', -string => $name };
  +        }
  +        elsif ($name =~ m/^[A-Z][a-zA-Z0-9_-]*$/) {
  +            $name = { -class => 'vendor', -string => $name };
  +        }
  +        else {
  +            croak "$croak_msg: invalid name \"$name\"";
  +        }
  +
  +        #    parse version
  +        #    (nothing possible, because can be mostly arbitrary)
  +        $version = { -string => $version };
  +
  +        #    parse release
  +        #    (very strict because has to allow subtle decisions)
  +        my $r;
  +        my $vendor = 0;
  +        if ($release =~ 
s/^([2-9]\d\d\d)(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])//) {
  +            $r = { -class => 'CURRENT', -year => $1, -month => $2, -day => $3 };
  +        }
  +        elsif ($release =~ 
s/^([1-9]\d*)\.([2-9]\d\d\d)(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])//) {
  +            $r = { -class => 'STABLE', -major => $1, -year => $2, -month => $3, 
-day => $4 };
  +        }
  +        elsif ($release =~ s/^([1-9]\d*)\.(\d+)\.(\d+)//) {
  +            $r = { -class => 'RELEASE', -major => $1, -minor => $2, -revision => $3 
};
  +        }
  +        else {
  +            $r = { -class => 'VENDOR' };
  +            $vendor++;
  +        }
  +        $r->{-vendor} = undef;
  +        $release =~ s/^\.// if ($vendor == 0);
  +        if ($release =~ s/^([^.]+)//) {
  +            $vendor++;
  +            my $tag = $1;
  +            if ($tag !~ m|[a-zA-Z]|) {
  +                croak "$croak_msg: invalid vendor tag \"$tag\" in release part 
\"$release\""
  +            }
  +            $r->{-vendor} = { -tag => $tag, -release => '' };
  +            $release =~ s/^\.//;
  +            my $r2;
  +            if ($release =~ 
s/^([2-9]\d\d\d)(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])//) {
  +                $r2 = { -class => 'CURRENT', -year => $1, -month => $2, -day => $3 
};
  +            }
  +            elsif ($release =~ 
s/^([1-9]\d*)\.([2-9]\d\d\d)(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])//) {
  +                $r2 = { -class => 'STABLE', -major => $1, -year => $2, -month => 
$3, -day => $4 };
  +            }
  +            elsif ($release =~ s/^([1-9]\d*)(?:\.(\d+)(?:\.(\d+))?)?//) {
  +                $r2 = { -class => 'RELEASE', -major => $1, -minor => $2, -revision 
=> $3 };
  +            }
  +            else {
  +                croak "$croak_msg: invalid vendor release \"$release\"";
  +            }
  +            $r->{-vendor}->{-release} = $2;
  +        }
  +        $release = $r;
  +        if ($vendor == 1) {
  +            croak "$croak_msg: vendor part expected but not found";
  +        }
  +
  +        #   parse type
  +        if ($type eq 'src') {
  +            $type = { -class => 'src', -restriction => 0 };
  +        }
  +        elsif ($type eq 'nosrc') {
  +            $type = { -class => 'src', -restriction => 1 };
  +        }
  +        elsif ($type =~ m/^([^-]+)-([^-]+)-([^-]+)$/) {
  +            $type = { -class => 'bin', -arch => $1, -os => $2, -tag => $3 };
  +        }
  +        else {
  +            croak "$croak_msg: invalid type part \"$type\"";
  +        }
  +
  +        #   parse extension
  +        $ext = { -string => $ext };
  +
  +        #   take over assembled information into object
  +        $self->{-name}    = $name;
  +        $self->{-version} = $version;
  +        $self->{-release} = $release;
  +        $self->{-type}    = $type;
  +        $self->{-ext}     = $ext;
  +    }
  +    else {
  +        croak "$croak_msg: invalid general layout \"$filename\"";
  +    }
  +}
  +
  +sub format ($) {
  +    my $self = shift;
  +
  +    my $filename = '';
  +    $filename .= $self->{-name}->{-string} . "-";
  +    $filename .= $self->{-version}->{-string} . "-";
  +    $filename .=
  +        ( $self->{-release}->{-class} eq 'CURRENT'
  +          ? sprintf("%04d%02d%02d", $self->{-release}->{-year},
  +                $self->{-release}->{-month}, $self->{-release}->{-date})
  +          : ( $self->{-release}->{-class} eq 'STABLE'
  +              ? sprintf("%d.%04d%02d%02d", $self->{-release}->{-major}, 
$self->{-release}->{-year},
  +                    $self->{-release}->{-month}, $self->{-release}->{-date})
  +              : sprintf("%d.%d.%d", $self->{-release}->{-major}, 
  +                    $self->{-release}->{-minor}, $self->{-release}->{-revision})
  +            )
  +        );
  +    if (defined($self->{-release}->{-vendor})) {
  +        $filename .= $self->{-release}->{-vendor}->{-tag} . "-";
  +        if (defined($self->{-release}->{-vendor}->{-release})) {
  +            my $r = $self->{-release}->{-vendor}->{-release};
  +            $filename .=
  +                ( $r->{-class} eq 'CURRENT'
  +                  ? sprintf("%04d%02d%02d", $r->{-year}, $r->{-month}, $r->{-date})
  +                  : ( $r-{-class} eq 'STABLE'
  +                      ? sprintf("%d.%04d%02d%02d", $r->{-major}, $r->{-year}, 
$r->{-month}, $r->{-date})
  +                      : ( (defined($r->{-major})    ? sprintf("%d",  $r->{-major})  
  : '') .
  +                          (defined($r->{-minor})    ? sprintf(".%d", $r->{-minor})  
  : '') .
  +                          (defined($r->{-revision}) ? sprintf(".%d", 
$r->{-revision}) : '')
  +                        )
  +                    )
  +                );
  +        }
  +    }
  +    $filename .= ".";
  +    if ($self->{-type}->{-class} eq 'src') {
  +        $filename .= ($self->{-type}->{-restriction} ? "nosrc" : "src");
  +    }
  +    else {
  +        $filename .=
  +            $self->{-type}->{-arch} . "-" .
  +            $self->{-type}->{-os}   . "-" .
  +            $self->{-type}->{-tag};
  +    }
  +    $filename .= "." . $self->{-ext}->{-string};
  +    return $filename;
  +}
  +
  +sub comp ($;$) {
  +    my $self = shift;
  +    my ($name, $new) = @_;
  +
  +    my $var = $name;
  +    $var =~ s|^([^:]+)|\$self->{-$1}|s;
  +    $var =~ s|::([^:]+)|->{-$1}|sg;
  +
  +    my $exists;
  +    eval "\$exists = defined($var);";
  +    if (not $exists) {
  +        croak "variable \"$name\" does not exist";
  +    }
  +    my $old;
  +    eval "\$old = $var;";
  +    if (not defined($old)) {
  +        croak "variable \"$name\" resolved to undefined value";
  +    }
  +    if (ref($old)) {
  +        croak "variable \"$name\" resolved to non-scalar value";
  +    }
  +    if (defined($new)) {
  +        eval "$var = \$new;";
  +    }
  +    return $old;
  +}
  +
  +1;
  +
  +__END__
  +
  +=pod
  +
  +=head1 NAME
  +
  +B<OpenPKG::RPM::Filename> - OpenPKG RPM Filename Handling
  +
  +=head1 DESCRIPTION
  +
  +B<OpenPKG::RPM::Filename> is the RPM filename class of the OpenPKG Tool Chain Perl 
API.
  +It provides parsing and generating of RPM filenames.
  +
  +=head1 METHODS
  +
  +=over 4
  +
  +=item C<$fn = >B<new>C< OpenPKG::RPM::Filename> [C<$filename>]C<;>
  +
  +=item C<$fn-E<gt>>B<destroy>C<;>
  +
  +Create and destroy object.
  +
  +=item C<$path = $ctx-E<gt>>B<tool>C<;>
  +
  +=item C<$ctx-E<gt>>B<tool>C<($path);>
  +
  +Get and set path to the B<openpkg> execution frontend. This
  +is preinitialized to the value of environment variable
  +C<$OPENPKG_TOOLS_TOOL> as provided by the B<openpkg> execution frontend
  +initially.
  +
  +=item C<$path = $ctx-E<gt>>B<home>C<;>
  +
  +=item C<$ctx-E<gt>>B<home>C<($path);>
  +
  +Get and set path to OpenPKG Tool Chain home directory. This
  +is preinitialized to the value of environment variable
  +C<$OPENPKG_TOOLS_HOME> as provided by the B<openpkg> execution
  +frontend initially.
  +
  +=item C<$path = $ctx-E<gt>>B<instance>C<;>
  +
  +=item C<$ctx-E<gt>>B<instance>C<($path);>
  +
  +Get and set path to OpenPKG instance (prefix directory).
  +This is preinitialized to the value of environment variable
  +C<$OPENPKG_TOOLS_INST> as provided by the B<openpkg> execution frontend
  +initially if an OpenPKG instance was found.
  +
  +=item C<$path = $ctx-E<gt>>B<perl>C<;>
  +
  +=item C<$ctx-E<gt>>B<perl>C<($path);>
  +
  +Get and set path to Perl interpreter executable. This
  +is preinitialized to the value of environment variable
  +C<$OPENPKG_TOOLS_PERL> as provided by the B<openpkg> execution
  +frontend initially.
  +
  +=head1 SEE ALSO
  +
  +L<OpenPKG(3)>.
  +
  +=head1 AUTHOR
  +
  +The OpenPKG Project E<lt>http://www.openpkg.org/E<gt>
  +
  +=cut
  +
  @@ .
______________________________________________________________________
The OpenPKG Project                                    www.openpkg.org
CVS Repository Commit List                     [EMAIL PROTECTED]

Reply via email to