]> git.vpit.fr Git - perl/modules/rgit.git/commitdiff
Only apply abs_path() to paths that are either relative or that contains ..
authorVincent Pit <vince@profvince.com>
Fri, 5 Mar 2010 23:55:33 +0000 (00:55 +0100)
committerVincent Pit <vince@profvince.com>
Fri, 5 Mar 2010 23:55:33 +0000 (00:55 +0100)
lib/App/Rgit/Config.pm
lib/App/Rgit/Repository.pm
lib/App/Rgit/Utils.pm

index 66548af9fd0d2a03eaa4b9296549d7f2757f8e70..23874c5f0784a94c8d19508f1459d7011ac477c6 100644 (file)
@@ -4,11 +4,11 @@ use strict;
 use warnings;
 
 use Carp       (); # confess
-use Cwd        (); # cwd, abs_path
+use Cwd        (); # cwd
 use File::Spec (); # canonpath, catfile, path
 
 use App::Rgit::Repository;
-use App::Rgit::Utils qw/:levels/;
+use App::Rgit::Utils qw/:levels/; # :levels, abs_path
 
 use constant IS_WIN32 => $^O eq 'MSWin32';
 
@@ -50,7 +50,7 @@ sub new {
                   ? $ENV{GIT_DIR}
                   : Cwd::cwd;
  Carp::confess("Invalid root directory") unless -d $root;
- $root = File::Spec->canonpath(Cwd::abs_path($root));
+ $root = File::Spec->canonpath(App::Rgit::Utils::abs_path($root));
 
  my $git;
  my @candidates = (
@@ -74,7 +74,7 @@ sub new {
   }
  }
  Carp::confess("Couldn't find a proper git executable") unless defined $git;
- $git = File::Spec->canonpath(Cwd::abs_path($git));
+ $git = File::Spec->canonpath(App::Rgit::Utils::abs_path($git));
 
  my $conf = 'App::Rgit::Config::Default';
  eval "require $conf; 1" or Carp::confess("Couldn't load $conf: $@");
index ec08d4b45e316c235e5b851fbc852f9beb1ff1eb..c340942a820487e1df2650270a1255b423e45b43 100644 (file)
@@ -3,10 +3,12 @@ package App::Rgit::Repository;
 use strict;
 use warnings;
 
-use Cwd        (); # cwd, abs_path
+use Cwd        (); # cwd
 use File::Spec (); # canonpath, catdir, splitdir, abs2rel
 use POSIX      (); # WIFEXITED WEXITSTATUS WIFSIGNALED WTERMSIG SIGINT SIGQUIT
 
+use App::Rgit::Utils (); # abs_path
+
 my ($WIFEXITED, $WEXITSTATUS, $WIFSIGNALED, $WTERMSIG);
 
 BEGIN {
@@ -55,7 +57,7 @@ sub new {
 
  my $dir = $args{dir};
  if (defined $dir) {
-  $dir = Cwd::abs_path($dir);
+  $dir = App::Rgit::Utils::abs_path($dir);
  } else {
   $dir = Cwd::cwd;
  }
index 75fe11e78853d65fd24da99726e13b85ca3c6b52..21004ded2730d2b2196c92a48355ddb4bcdc43c7 100644 (file)
@@ -3,6 +3,9 @@ package App::Rgit::Utils;
 use strict;
 use warnings;
 
+use Cwd        (); # abs_path
+use File::Spec (); # file_name_is_absolute, updir, splitdir, splitpath
+
 =head1 NAME
 
 App::Rgit::Utils - Miscellaneous utilities for App::Rgit classes.
@@ -21,6 +24,29 @@ Miscellaneous utilities for L<App::Rgit> classes.
 
 This is an internal module to L<rgit>.
 
+=head1 FUNCTIONS
+
+=head2 C<abs_path $path>
+
+Forcefully make a path C<$path> absolute (in L<Cwd/abs_path>'s meaning of the term) when it isn't already absolute or when it contains C<'..'>.
+
+=cut
+
+sub abs_path {
+ my ($path) = @_;
+
+ if (File::Spec->file_name_is_absolute($path)) {
+  my $updir  = File::Spec->updir;
+  my @chunks = File::Spec->splitdir((File::Spec->splitpath($path))[1]);
+
+  unless (grep $_ eq $updir, @chunks) {
+   return $path;
+  }
+ }
+
+ return Cwd::abs_path($path);
+}
+
 =head1 CONSTANTS
 
 =head2 C<NEXT>, C<REDO>, C<LAST>, C<SAVE>
@@ -51,6 +77,8 @@ use constant {
 
 =head1 EXPORT
 
+L<abs_path> is only exported on request.
+
 C<NEXT> C<REDO>, C<LAST> and C<SAVE> are only exported on request, either by their name or by the C<'codes'> tags.
 
 C<INFO>, C<WARN>, C<ERR> and C<CRIT> are only exported on request, either by their name or by the C<'levels'> tags.
@@ -61,6 +89,7 @@ use base qw/Exporter/;
 
 our @EXPORT         = ();
 our %EXPORT_TAGS    = (
+ funcs  => [ qw/abs_path/ ],
  codes  => [ qw/SAVE NEXT REDO LAST/ ],
  levels => [ qw/INFO WARN ERR CRIT/ ],
 );