Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix error handling when failing to install a deb package #11846

Merged

Commits on Aug 25, 2022

  1. Fix error handling when failing to install a deb package

    The current error handling code for when a deb package fails to be
    installed currently has a chain of commands linked together by && and
    ends with `exit 1`. The assumption is that the commands would succeed,
    and the last `exit 1` would end it with a non-zero return code, thus
    fully failing the target and causing the build to stop because of bash's
    -e flag.
    
    However, if one of the commands prior to `exit 1` returns a non-zero
    return code, then bash won't actually treat it as a terminating error.
    From bash's man page:
    
    ```
    -e      Exit immediately if a pipeline (which may consist of a single simple
    	command), a list, or a compound command (see SHELL GRAMMAR above),
            exits with a non-zero status.  The shell does not exit if the
            command that fails is part of the  command  list  immediately
            following a while or until keyword, part of the test following the
            if or elif reserved words, part of any command executed in a && or
            || list except the command following the final && or ||, any
            command in a pipeline but the last, or if the command's return
            value is being inverted with !.  If a compound command other than a
            subshell returns a non-zero status because a command failed while
            -e was being ignored, the shell does not exit.
    ```
    
    The part `part of any command executed in a && or || list except the
    command following the final && or ||` says that if the failing command
    is not the `exit 1` that we have at the end, then bash doesn't treat it
    as an error and exit immediately. Additionally, since this is a compound
    command, but isn't in a subshell (subshell are marked by `(` and `)`,
    whereas `{` and `}` just tells bash to run the commands in the current
    environment), bash doesn't exist. The result of this is that in the
    deb-install target, if a package installation fails, it may be
    infinitely stuck in that while-loop.
    
    There are two fixes for this: change to using a subshell, or use `;`
    instead of `&&`. Using a subshell would, I think, require exporting any
    shell variables used in the subshell, so I chose to change the `&&` to
    `;`. In addition, at the start of the subshell, `set +e` is added in,
    which removes the exit-on-error handling of bash. This makes sure that
    all commands are run (the output of which may help for debugging) and
    that it still exits with 1, which will then fully fail the target.
    
    Signed-off-by: Saikrishna Arcot <sarcot@microsoft.com>
    saiarcot895 committed Aug 25, 2022
    Configuration menu
    Copy the full SHA
    83ddca3 View commit details
    Browse the repository at this point in the history