#
# Copyright (c) 2003,2004,2005 Alexander Taler (dissent@0--0.org)
#
# All rights reserved. This program is free software; you can redistribute it
# and/or modify it under the same terms as Perl itself.
#
package VCS::LibCVS::Datum::FileMode;
use strict;
use Carp;
=head1 NAME
VCS::LibCVS::Datum::FileMode - A CVS datum for the mode of a file
=head1 SYNOPSIS
$string = VCS::LibCVS::Datum::FileMode->new("u=rw,g=rw,o=r");
=head1 DESCRIPTION
The mode of a file, simple UNIX-style file permissions, like "u=rw,g=rw,o=r".
=head1 SUPERCLASS
VCS::LibCVS::Datum
=cut
###############################################################################
# Class constants
###############################################################################
use constant REVISION => '$Header: /cvsroot/libcvs-perl/libcvs-perl/VCS/LibCVS/Datum/FileMode.pm,v 1.10 2005/10/10 12:52:12 dissent Exp $ ';
use vars ('@ISA');
@ISA = ("VCS::LibCVS::Datum");
###############################################################################
# Class variables
###############################################################################
###############################################################################
# Private variables
###############################################################################
###############################################################################
# Class routines
###############################################################################
sub new {
my $class = shift;
my $that = $class->SUPER::new(@_);
if ($that->{Mode} !~ /^([ugo]+=[rwx]*)(,[ugo]+=[rwx]*)+$/) {
if (-e $that->{Mode}) {
$that->_from_filename();
} else {
confess "Bad mode: $that->{Mode}"
}
}
return $that;
}
###############################################################################
# Instance routines
###############################################################################
###############################################################################
# Private routines
###############################################################################
sub _data_names { return ("Mode"); }
# Get the mode of the file from its name
sub _from_filename {
my $self = shift;
my $num = (stat($self->{Mode}))[2] & 0777;
my $sym = "u=" . _n2s_digit($num >> 6) . ",";
$sym .= "g=" . _n2s_digit($num >> 3) . ",";
$sym .= "o=" . _n2s_digit($num);
$self->{Mode} = $sym;
}
# Convert a single digit from numerical to symbolic
sub _n2s_digit {
my $n = shift;
return (($n & 04)?"r":"") . (($n & 02)?"w":"") . (($n & 01)?"x":"");
}
=head1 SEE ALSO
VCS::LibCVS::Datum
=cut
1;