package Padre::Util::SVN;
# Isolate the subversion-specific functions, because in some situations
# we need them early in the load process and we want to avoid loading
# a whole ton of dependencies.
use 5.010;
use strict;
use warnings;
use File::Spec ();
use File::Which ();
our $VERSION = '1.00';
my $PADRE = undef;
# TODO: A much better variant would be a constant set by svn.
sub padre_revision {
unless ($PADRE) {
if ( $0 =~ /padre$/ ) {
my $dir = $0;
$dir =~ s/padre$//;
my $svn_client_info_ref =
Padre::Util::run_in_directory_two( cmd => 'svn info', dir => $dir, option => '0' );
$svn_client_info_ref->{output} =~ /(?:^Revision:\s)(?<svn_version>\d+)/m;
$PADRE = $+{svn_version};
}
}
return $PADRE;
}
# This is pretty hacky
sub directory_revision {
my $dir = shift;
# Find the entries file
my $entries;
if ( !local_svn_ver() ) {
$entries = File::Spec->catfile( $dir, '.svn', 'entries' );
} elsif ( local_svn_ver() ) {
#check for one dir back as svn 1.7.x
$entries = File::Spec->catfile( $dir, '..', '.svn', 'entries' );
}
return unless -f $entries;
# Find the headline revision
local $/ = undef;
open( my $fh, '<', $entries ) or return;
my $buffer = <$fh>;
close $fh;
# Find the first number after the first occurance of "dir".
unless ( $buffer =~ /\bdir\b\s+(\d+)/m ) {
return;
}
# Quote this to prevent certain aliasing bugs
return "$1";
}
#######
# Composed Method test_svn
#######
sub local_svn_ver {
my $required_svn_version = '1.6.2';
if ( File::Which::which('svn') ) {
# test svn version
require Padre::Util;
my $svn_client_info_ref = Padre::Util::run_in_directory_two( cmd => 'svn --version --quiet', option => '0' );
# p $svn_client_info_ref;
my %svn_client_info = %{$svn_client_info_ref};
require Sort::Versions;
# This is so much better, now we are testing for version as well
if ( Sort::Versions::versioncmp( $svn_client_info{output}, $required_svn_version, ) == -1 ) {
say 'Info: you are using an svn version 1.6.2, please consider upgrading';
}
#return 1 if we are using svn 1.7.x
return 1 if Sort::Versions::versioncmp( $svn_client_info{output}, '1.7' );
}
return 0;
}
1;
=pod
=head1 COPYRIGHT & LICENSE
Copyright 2008-2013 The Padre development team as listed in Padre.pm.
This program is free software; you can redistribute
it and/or modify it under the same terms as Perl itself.
The full text of the license can be found in the
LICENSE file included with this module.
=cut
# Copyright 2008-2013 The Padre development team as listed in Padre.pm.
# LICENSE
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Perl 5 itself.