/usr/local/CPAN/VCS-Hms/VCS/Hms/File.pm


package VCS::Hms::File;
require Sort::Versions;

@ISA = qw(VCS::Hms);

use File::Basename;

sub new {
    my ($class, $url) = @_;
    my $self = $class->init($url);
    my $path = $self->path;
    die "$class->new: $path: $!\n" unless -f $path;
    die "$class->new: $path not in a CVS directory: $!\n"
        unless -d dirname($path) . '/HMS' or -f "$path,v";
    die "$class->new: $path failed to split log\n"
        unless $self->_split_log;
    $self;
}

# assumption - no query strings on URL
sub versions {
    my($self, $lastflag) = @_;
    my @rq_version = @_;
    my ($header, @log_revs) = $self->_split_log;
    my @revs= reverse sort Sort::Versions::versions map(/revision ([\d+\.]+)/, @log_revs);
    my $header_info = $self->_parse_log_header($header);
    my $last_rev = $header_info->{'head'};
#warn "last_rev: $last_rev\n";
    my ($rev_head, $rev_tail) = ($last_rev =~ /(.*)\.(\d+)$/);
    return VCS::Hms::Version->new("$self->{URL}/$rev_head.$rev_tail")
        if defined $lastflag;
    map { VCS::Hms::Version->new("$self->{URL}/$rev_head.$_") } @revs;
}

# UNTESTED!
sub tags {
    my $self = shift;
    my ($header, $log) = $self->_split_log($self->{VERSION});
    my $header_info = $self->_parse_log_header($header);
    my $tags_hash = {};
    my $tag_text = $header_info->{'symbolic names'};
    $tag_text =~ s#^\s+##gm;
    map {
        my ($tag, $rev) = split /:\s*/;
        $tags_hash->{$tag}=$rev;
    } split /\n/, $tag_text;
    return $tags_hash;
}

1;