X-Git-Url: https://git.madduck.net/code/myrepos.git/blobdiff_plain/5097a496c82a645c0afdfff2f2835395b108365c..b7a3b1615f17991e400b5fa93c7e8a8cfffd348c:/mr?ds=inline diff --git a/mr b/mr index 642aa6f..41a5362 100755 --- a/mr +++ b/mr @@ -400,26 +400,28 @@ the action that is performed for a given revision control system, you can override these rcs specific actions. To add a new revision control system, you can just add rcs specific actions for it. -The ~/.mrlog file contains commands that mr has remembered to run later, -due to being offline. You can delete or edit this file to remove commands, -or even to add other commands for 'mr online' to run. If the file is -present, mr assumes it is in offline mode. - =head1 UNTRUSTED MRCONFIG FILES Since mrconfig files can contain arbitrary shell commands, they can do anything. This flexibility is good, but it also allows a malicious mrconfig file to delete your whole home directory. Such a file might be contained -inside a repository that your main ~/.mrconfig checks out and chains to. To -avoid worries about evil commands in a mrconfig file, mr -has the ability to read mrconfig files in untrusted mode. Such files are -limited to running only known safe commands (like "git clone") in a -carefully checked manner. +inside a repository that your main ~/.mrconfig checks out. To +avoid worries about evil commands in a mrconfig file, mr defaults to +reading all mrconfig files other than the main ~/.mrconfig in untrusted +mode. In untrusted mode, mrconfig files are limited to running only known +safe commands (like "git clone") in a carefully checked manner. -By default, mr trusts all mrconfig files. (This default will change in a -future release!) But if you have a ~/.mrtrust file, mr will only trust -mrconfig files that are listed within it. (One file per line.) All other -files will be treated as untrusted. +To configure mr to trust other mrconfig files, list them in ~/.mrtrust. +One mrconfig file should be listed per line. Either the full pathname +should be listed, or the pathname can start with "~/" to specify a file +relative to your home directory. + +=head1 OFFLINE LOG FILE + +The ~/.mrlog file contains commands that mr has remembered to run later, +due to being offline. You can delete or edit this file to remove commands, +or even to add other commands for 'mr online' to run. If the file is +present, mr assumes it is in offline mode. =head1 EXTENSIONS @@ -427,9 +429,13 @@ mr can be extended to support things such as unison and git-svn. Some files providing such extensions are available in /usr/share/mr/. See the documentation in the files for details about using them. +=head1 EXIT STATUS + +mr returns nonzero if a command failed in any of the repositories. + =head1 AUTHOR -Copyright 2007-2010 Joey Hess +Copyright 2007-2011 Joey Hess Licensed under the GNU GPL version 2 or higher. @@ -921,22 +927,16 @@ sub is_trusted_config { my $trustfile=$ENV{HOME}."/.mrtrust"; - if (! -e $trustfile) { - print "mr: Assuming $config is trusted.\n"; - print "mr: For better security, you are encouraged to create ~/.mrtrust\n"; - print "mr: and list all trusted mrconfig files in it.\n"; - return 1; - } - if (! %trusted) { $trusted{"$ENV{HOME}/.mrconfig"}=1; - open (TRUST, "<", $trustfile) || die "$trustfile: $!"; - while () { - chomp; - s/^~\//$ENV{HOME}\//; - $trusted{abs_path($_)}=1; + if (open (TRUST, "<", $trustfile)) { + while () { + chomp; + s/^~\//$ENV{HOME}\//; + $trusted{abs_path($_)}=1; + } + close TRUST; } - close TRUST; } return $trusted{$config}; @@ -1020,6 +1020,11 @@ sub is_trusted_checkout { return 0; } +sub trusterror { + die shift()."\n". + "(To trust this file, list it in ~/.mrtrust.)\n"; +} + my %loaded; sub loadconfig { my $f=shift; @@ -1093,7 +1098,7 @@ sub loadconfig { if (! is_trusted_repo($section) || $section eq 'ALIAS' || $section eq 'DEFAULT') { - die "mr: illegal section \"[$section]\" in untrusted $f line $line\n"; + trusterror "mr: illegal section \"[$section]\" in untrusted $f line $line"; } } $section=expandenv($section) if $trusted; @@ -1120,10 +1125,10 @@ sub loadconfig { # Untrusted files can only contain checkout # parameters. if ($parameter ne 'checkout') { - die "mr: illegal setting \"$parameter=$value\" in untrusted $f line $line\n"; + trusterror "mr: illegal setting \"$parameter=$value\" in untrusted $f line $line"; } if (! is_trusted_checkout($value)) { - die "mr: illegal checkout command \"$value\" in untrusted $f line $line\n"; + trusterror "mr: illegal checkout command \"$value\" in untrusted $f line $line"; } } @@ -1548,9 +1553,6 @@ sub exitstats { if (@failed) { exit 1; } - elsif (! @ok && @skipped) { - exit 1; - } else { exit 0; }