import os
from subprocess import check_output

from furl import furl


def get_command_output(command, path=None, strip=True):
    """
    Run a command and return its output
    :raises CalledProcessError: when command execution fails
    :raises UnicodeDecodeError: when output decoding fails
    """
    with open(os.devnull, "wb") as devnull:
        result = check_output(command, cwd=path, stderr=devnull).decode()
        return result.strip() if strip else result


def remove_user_pass_from_url(url):
    # remove user / password, if we have it embedded in the git repo
    url = str(url)
    # noinspection PyBroadException
    try:
        url = furl(url).remove(username=True, password=True).tostr()
    except ValueError:
        # check if for any reason we have two @
        # (e.g. ssh://user@abc.com@domain.com/path or ssh://user@abc.com:pass@domain.com/path)
        if len(url.split('@')) >= 3:
            # noinspection PyBroadException
            try:
                url = furl(url.replace('@', '_', 1)).remove(username=True, password=True).tostr()
            except Exception:
                pass
    except Exception:
        pass
    return url