also sprach Joey Hess <jo...@debian.org> [2013-11-21 18:59 +0100]:
> > When you have a moment could you please consider commit c070209
> > from https://github.com/mhameed/myrepos
> > 
> > Unfortunately most of github is unusable, so can't send a pull request
> > independantly.
> 
> It seems to me that if include commands are going to be run chdired to
> the directory that contains the mrconfig file, then this should also be
> done when loading ~/.mrconfig.
> 
> Also, chdir($oldDir) could fail and should be guarded.

How about the attached patch? I think it addresses both issues (and
also updates verbose output).

-- 
 .''`.   martin f. krafft <madduck@d.o> @martinkrafft
: :'  :  proud Debian developer
`. `'`   http://people.debian.org/~madduck
  `-  Debian - when you have better things to do than fixing systems
From fb436fec2ca98879769e4ac20d905ed9e717815b Mon Sep 17 00:00:00 2001
From: "martin f. krafft" <madd...@madduck.net>
Date: Tue, 9 Sep 2014 06:39:54 +0200
Subject: [PATCH] chdir() to config directory before including

Make mr try to chdir() to the dirname() of any .mrconfig files it's
supposed to load. If the chdir() is successful, then the filename is
truncated to basename(). If the chdir() is unsuccessful, then processing
happens as before.

Signed-off-by: martin f. krafft <madd...@madduck.net>
---
 mr | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/mr b/mr
index 18e8761..b7cd3cb 100755
--- a/mr
+++ b/mr
@@ -563,6 +563,7 @@ use warnings;
 use strict;
 use Getopt::Long;
 use Cwd qw(getcwd abs_path);
+use File::Basename;
 
 # things that can happen when mr runs a command
 use constant {
@@ -1278,6 +1279,7 @@ sub loadconfig {
 	my @toload;
 
 	my $in;
+	my $absf=abs_path($f);
 	my $trusted;
 	if (ref $f eq 'GLOB') {
 		$dir="";
@@ -1285,7 +1287,6 @@ sub loadconfig {
 		$trusted=1;
 	}
 	else {
-		my $absf=abs_path($f);
 		if ($loaded{$absf}) {
 			return;
 		}
@@ -1301,7 +1302,11 @@ sub loadconfig {
 		}
 
 		$dir=abs_path($dir)."/";
-		
+
+		if (chdir($dir)) {
+			$f=basename($f);
+		}
+
 		if (! exists $configfiles{$dir}) {
 			$configfiles{$dir}=$f;
 		}
@@ -1323,7 +1328,12 @@ sub loadconfig {
 			return;
 		}
 
-		print "mr: loading config $f\n" if $verbose;
+		if ($f =~ /\//) {
+			print "mr: loading config $f\n" if $verbose;
+		} else {
+			print "mr: loading config $f (from ".getcwd().")\n" if $verbose;
+		}
+
 		open($in, "<", $f) || die "mr: open $f: $!\n";
 	}
 	my @lines=<$in>;
@@ -1367,7 +1377,7 @@ sub loadconfig {
 				"this can allow arbitrary code execution!)\n";
 		}
 		else {
-			die "mr: $msg in untrusted $f line $lineno\n".
+			die "mr: $msg in untrusted $absf line $lineno\n".
 				"(To trust this file, list it in ~/.mrtrust.)\n";
 		}
 	};
-- 
2.1.0

Attachment: digital_signature_gpg.asc
Description: Digital signature (see http://martin-krafft.net/gpg/sig-policy/999bbcc4/current)

Reply via email to