import functools
import subprocess

from doit.exceptions import TaskFailed


def capture_subprocess_error(fn):
    @functools.wraps(fn)
    def wrapper(*args, **kwargs):
        try:
            return fn(*args, **kwargs)
        except subprocess.CalledProcessError as e:
            return TaskFailed(
                'Error while executing {}:\nstdout:\n{}\n\nstderr:\n{}'.format(
                    ' '.join(e.cmd),
                    e.stdout.decode('utf8') if e.stdout else '',
                    e.stderr.decode('utf8') if e.stderr else ''))
    return wrapper

import functools
import subprocess

from doit.exceptions import TaskFailed


def capture_subprocess_error(fn):
    @functools.wraps(fn)
    def wrapper(*args, **kwargs):
        try:
            return fn(*args, **kwargs)
        except subprocess.CalledProcessError as e:
            command_string = e.cmd if isinstance(e.cmd, str) else ' '.join(e.cmd)
            return TaskFailed(
                'Error while executing {}:\nstdout:\n{}\n\nstderr:\n{}'.format(
                    command_string,
                    e.stdout.decode('utf8') if e.stdout else '',
                    e.stderr.decode('utf8') if e.stderr else ''))
    return wrapper

Clean error output when command is a string
Clean error output when command is a string

  import functools
  import subprocess
  
  from doit.exceptions import TaskFailed
  
  
  def capture_subprocess_error(fn):
      @functools.wraps(fn)
      def wrapper(*args, **kwargs):
          try:
              return fn(*args, **kwargs)
          except subprocess.CalledProcessError as e:
+             command_string = e.cmd if isinstance(e.cmd, str) else ' '.join(e.cmd)
              return TaskFailed(
                  'Error while executing {}:\nstdout:\n{}\n\nstderr:\n{}'.format(
-                     ' '.join(e.cmd),
+                     command_string,
                      e.stdout.decode('utf8') if e.stdout else '',
                      e.stderr.decode('utf8') if e.stderr else ''))
      return wrapper
  
Clean error output when command is a string
## Code Before:
import functools
import subprocess

from doit.exceptions import TaskFailed


def capture_subprocess_error(fn):
    @functools.wraps(fn)
    def wrapper(*args, **kwargs):
        try:
            return fn(*args, **kwargs)
        except subprocess.CalledProcessError as e:
            return TaskFailed(
                'Error while executing {}:\nstdout:\n{}\n\nstderr:\n{}'.format(
                    ' '.join(e.cmd),
                    e.stdout.decode('utf8') if e.stdout else '',
                    e.stderr.decode('utf8') if e.stderr else ''))
    return wrapper

## Instruction:
Clean error output when command is a string
## Code After:
import functools
import subprocess

from doit.exceptions import TaskFailed


def capture_subprocess_error(fn):
    @functools.wraps(fn)
    def wrapper(*args, **kwargs):
        try:
            return fn(*args, **kwargs)
        except subprocess.CalledProcessError as e:
            command_string = e.cmd if isinstance(e.cmd, str) else ' '.join(e.cmd)
            return TaskFailed(
                'Error while executing {}:\nstdout:\n{}\n\nstderr:\n{}'.format(
                    command_string,
                    e.stdout.decode('utf8') if e.stdout else '',
                    e.stderr.decode('utf8') if e.stderr else ''))
    return wrapper
