All patches and comments are welcome. Please squash your changes to logical
commits before using git-format-patch and git-send-email to
patches@git.madduck.net.
If you'd read over the Git project's submission guidelines and adhered to them,
I'd be especially grateful.
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.
Suggests: subversion, git-core | git (>= 1:1.7), cvs, bzr, mercurial, darcs, fossil, vcsh, liburi-perl, curl, ack-grep
Provides: mr
Replaces: mr
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
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
my $jobs=1;
my $trust_all=0;
my $directory=getcwd();
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();
my $HOME_MR_CONFIG = "$ENV{HOME}/.mrconfig";
$ENV{MR_CONFIG}=find_mrconfig();
return $subdir =~ /^\// ? $subdir : $topdir.$subdir;
}
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);
sub action {
my ($action, $dir, $topdir, $subdir, $force_checkout) = @_;
my $fulldir=fulldir($topdir, $subdir);
my $ret=runsh $action, $topdir, $subdir,
$command, \@ARGV, sub {
my $sh=shift;
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);
return OK unless defined $command;
my $ret=runsh $hook, $topdir, $subdir, $command, [], sub {
my $sh=shift;
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);