From 57a3d4a0411f40ebfd0b44799873ffca87449b55 Mon Sep 17 00:00:00 2001 From: Paul Wise Date: Wed, 20 Feb 2013 12:03:38 +0800 Subject: [PATCH] Pass a fake terminal to subcommands when mr is run in a terminal. This is needed so that programs that print color to terminals but not to pipes continue to do so when mr redirects output to a variable before printing it or not printing it. --- debian/control | 2 +- mr | 47 ++++++++++++++++++++++++++++++++--------------- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/debian/control b/debian/control index 8548be6..2518539 100644 --- a/debian/control +++ b/debian/control @@ -14,7 +14,7 @@ Depends: ${misc:Depends} Suggests: subversion, git-core | git (>= 1:1.7), cvs, bzr, mercurial, darcs, fossil, vcsh, liburi-perl, curl, ack-grep Provides: mr Replaces: mr -Recommends: libwww-perl, libhtml-parser-perl, perl +Recommends: libwww-perl, libhtml-parser-perl, libio-pty-easy-perl, perl Description: tool to manage all your version control repos The mr(1) command can checkout, update, or perform other actions on a set of repositories as if they were one combined respository. It diff --git a/mr b/mr index afac24d..9bcc1ea 100755 --- a/mr +++ b/mr @@ -578,6 +578,7 @@ my $no_chdir=0; my $jobs=1; my $trust_all=0; my $directory=getcwd(); +my $terminal=-t STDOUT && eval{require IO::Pty::Easy;IO::Pty::Easy->import();1;} eq 1; my $HOME_MR_CONFIG = "$ENV{HOME}/.mrconfig"; $ENV{MR_CONFIG}=find_mrconfig(); @@ -721,6 +722,33 @@ sub fulldir { return $subdir =~ /^\// ? $subdir : $topdir.$subdir; } +sub terminal_friendly_spawn { + my $actionmsg = shift; + my $sh = shift; + my $quiet = shift; + my $output = ""; + if ($terminal) { + my $pty = IO::Pty::Easy->new; + $pty->spawn($sh); + while ($pty->is_active) { + my $data = $pty->read(); + $output .= $data if defined $data; + } + $pty->close; + } else { + $output = qx/$sh 2>&1/; + } + my $ret = $?; + if ($quiet && $ret != 0) { + print "$actionmsg\n" if $actionmsg; + print STDERR $output; + } elsif (!$quiet) { + print "$actionmsg\n" if $actionmsg; + print $output; + } + return $ret; +} + sub action { my ($action, $dir, $topdir, $subdir, $force_checkout) = @_; my $fulldir=fulldir($topdir, $subdir); @@ -822,14 +850,8 @@ sub action { my $ret=runsh $action, $topdir, $subdir, $command, \@ARGV, sub { my $sh=shift; - if ($quiet) { - my $output = qx/$sh 2>&1/; - my $ret = $?; - if ($ret != 0) { - print "$actionmsg\n"; - print STDERR $output; - } - return $ret; + if (!$jobs || $jobs > 1 || $quiet) { + return terminal_friendly_spawn($actionmsg, $sh, $quiet); } else { system($sh); @@ -893,13 +915,8 @@ sub hook { return OK unless defined $command; my $ret=runsh $hook, $topdir, $subdir, $command, [], sub { my $sh=shift; - if ($quiet) { - my $output = qx/$sh 2>&1/; - my $ret = $?; - if ($ret != 0) { - print STDERR $output; - } - return $ret; + if (!$jobs || $jobs > 1 || $quiet) { + return terminal_friendly_spawn(undef, $sh, $quiet); } else { system($sh); -- 2.39.2