Skip to content

Action Output Results interpret ansi color codes and break render #300

@llaville

Description

@llaville

For example ansi style color code on action output results is interpreted by CaptainHook and break render.

   '  <fg=cyan>Applied: ' .

I've tested Mago 1.9.0 with my plugin

Capt'n config file examples/pre-push.mago.json

{
    "pre-push": {
        "enabled": true,
        "actions": [
            {
                "action": "{$ENV|value-of:VENDOR_BIN_DIR|default:vendor/bin/}mago lint",
                "config": {
                    "label": "Static Analysis (with Mago)"
                },
                "options": {
                    "configuration-path": "mago.toml",
                    "colors": "never"
                },
                "conditions": [
                    {
                        "exec": "\\Bartlett\\CaptainHookBinPlugin\\Condition\\PackageInstalled",
                        "args": ["carthage-software/mago", "^1"]
                    }
                ]
            }
        ]
    }
}

Note

The mago.toml config file is generated to answered all default values to vendor/bin/mago init command

My Plugin (under tests pressure)

<?php

declare(strict_types=1);

namespace Bartlett\CaptainHookBinPlugin;

use CaptainHook\App\Config;
use CaptainHook\App\Plugin;
use CaptainHook\App\Runner\Hook as RunnerHook;

class BinPlugin extends Plugin\Hook\Base implements Plugin\Hook
{
    public function beforeHook(RunnerHook $hook): void
    {
        $this->io->write("Do debug before hook {$hook->getName()} runs");
    }

    public function beforeAction(RunnerHook $hook, Config\Action $action): void
    {
        $actionOptions = $action->getOptions();

        $configPath = $actionOptions->get('configuration-path');
        if (null !== $configPath && \file_exists($configPath)) {
            \putenv('XDG_CONFIG_HOME=' . $configPath);
        }

        $colorized = match($actionOptions->get('colors', 'auto')) {
            'never' => false,
            default => true  // always or auto values are acceptable
        };
        \putenv('NO_COLOR=' . !$colorized);

        $this->io->write("Do debug before action {$action->getLabel()} runs");
    }

    public function afterAction(RunnerHook $hook, Config\Action $action): void
    {
        $this->io->write("Do debug after action {$action->getLabel()} runs");
        \putenv('XDG_CONFIG_HOME');
    }

    public function afterHook(RunnerHook $hook): void
    {
        $this->io->write("Do debug after hook {$hook->getName()} runs");
    }
}

Mago accept both XDG_CONFIG_HOME and NO_COLOR environment variables : see https://mago.carthage.software/guide/environment-variables

Direct invocation of Mago

XDG_CONFIG_HOME=mago.toml NO_COLOR=1 vendor/bin/mago lint

Gave something like (with current state source code)

Image

Capt'n invocation of Mago

vendor/bin/captainhook hook:pre-push -vv

Important

Due to issue #299, I cannot invoke only one action by config file, so I've disabled all others (PHPStan, PHPUnit) confirmed by command

vendor/bin/captainhook config:info
Hooks:
  commit-msg
  pre-push
   - {$ENV|value-of:VENDOR_BIN_DIR|default:vendor/bin/}mago lint
  pre-commit
  prepare-commit-msg
  post-commit
  post-merge
  post-checkout
  post-rewrite
  post-change

Gave something like (with current state source code)

Image Image

And if I've other actions, the color render is still broken: i.e

Image

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions