• 
      

    Fix Mercurial support when Mercurial config/extension errors are present.

    Review Request #12243 — Created April 20, 2022 and submitted

    Information

    RBTools
    release-3.x

    Reviewers

    Most of our Mercurial code assumes that the command we invoked has gone
    right and that the outputted results are suitable for whatever we
    queried.

    This isn't always the case. If configuration is wrong (say, an extension
    failed to load), any usable output could be prefixed with something like:

    *** failed to import extension hgsubversion: No module named 'hgsubversion'
    

    This went to stderr, but we redirected all errors by default to stdout.
    That meant that we'd end up with a lot of bad output, which wasn't
    necessarily caught until piped to another Mercurial command.

    We now default any execute() calls to keeping error output on its own
    stream and out of our standard output. There are some commands that do
    need to check error output (such as the hgsubversion checks), so they go
    through the normal behavior, but the rest will only capture usable
    standard output now.

    In the process, most calls to execute() have been changed to
    self._execute(). That function itself has had a small logic tweak to
    avoid a potentially unnecessary hg call for a capability check.

    All unit tests passed in my environment with the error listed in the
    description.

    Summary ID
    Fix Mercurial support when Mercurial config/extension errors are present.
    Most of our Mercurial code assumes that the command we invoked has gone right and that the outputted results are suitable for whatever we queried. This isn't always the case. If configuration is wrong (say, an extension failed to load), any usable output could be prefixed with something like: ``` *** failed to import extension hgsubversion: No module named 'hgsubversion' ``` This went to stderr, but we redirected all errors by default to stdout. That meant that we'd end up with a lot of bad output, which wasn't necessarily caught until piped to another Mercurial command. We now default any `execute()` calls to keeping error output on its own stream and out of our standard output. There are some commands that do need to check error output (such as the hgsubversion checks), so they go through the normal behavior, but the rest will only capture usable standard output now. In the process, most calls to `execute()` have been changed to `self._execute()`. That function itself has had a small logic tweak to avoid a potentially unnecessary `hg` call for a capability check.
    d27ff31ca110f2090b6583dcfc782b46a0875c99
    david
    1. Ship It!
    2. 
        
    chipx86
    Review request changed
    Status:
    Completed
    Change Summary:
    Pushed to release-3.x (07c1290)