From 5df74ac5785de73c7de88cc6011279611633216d Mon Sep 17 00:00:00 2001 From: Alexandre Delaunay Date: Mon, 24 Jun 2024 12:33:11 +0200 Subject: [PATCH 1/8] devcontainer: replace adminer by dbgate --- .devcontainer/devcontainer.json | 2 +- .devcontainer/docker-compose.yaml | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 1db4953b14e..9a22c3f857f 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -12,7 +12,7 @@ "label": "GLPI" }, "8090": { - "label": "Adminer" + "label": "DBGate" }, "8025": { "label": "Mailpit" diff --git a/.devcontainer/docker-compose.yaml b/.devcontainer/docker-compose.yaml index 9dcd27bc2d8..a88224027a8 100644 --- a/.devcontainer/docker-compose.yaml +++ b/.devcontainer/docker-compose.yaml @@ -37,15 +37,22 @@ services: ports: - "8025:8025" - adminer: - container_name: "glpi-adminer" - image: "adminer:latest" + dbgate: + container_name: "glpi-dbgate" + image: "dbgate/dbgate:latest" restart: "unless-stopped" ports: - - "8090:8080" + - "8090:3000" environment: - - "ADMINER_DEFAULT_SERVER=db" - command: ["php", "-S", "0.0.0.0:8080", "-t", "/var/www/html"] + CONNECTIONS: con_glpi + + LABEL_con_glpi: GLPI Mysql Server + SERVER_con_glpi: db + USER_con_glpi: root + PASSWORD_con_glpi: glpi + PORT_con_glpi: 3306 + ENGINE_con_glpi: mysql@dbgate-plugin-mysql + volumes: db: From 6d37fc668949792941b08369dae2e41390a6514e Mon Sep 17 00:00:00 2001 From: Thetsmr Date: Sun, 23 Jun 2024 11:35:22 +0200 Subject: [PATCH 2/8] Impact : Permit use only one asset to create a compound --- js/impact.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/impact.js b/js/impact.js index 6ae0d974d84..ea530ea6e4f 100644 --- a/js/impact.js +++ b/js/impact.js @@ -2477,8 +2477,8 @@ var GLPIImpact = { */ addCompoundFromSelection: _.debounce(function(){ // Check that there is enough selected nodes - if (GLPIImpact.eventData.boxSelected.length < 2) { - alert(__("You need to select at least 2 assets to make a group")); + if (GLPIImpact.eventData.boxSelected.length < 1) { + alert(__("You need to select at least 1 asset to make a group")); } else { // Create the compound var newCompound = GLPIImpact.cy.add({ From d8dafd642a0c25844d69a18c00b8c521ee0fc1ac Mon Sep 17 00:00:00 2001 From: Johan Cwiklinski Date: Mon, 24 Jun 2024 16:37:10 +0200 Subject: [PATCH 3/8] Replace usage of deprecated `UnifiedArchive::archiveFiles()` method --- tests/InventoryTestCase.php | 2 +- tests/functional/Glpi/Inventory/Inventory.php | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/InventoryTestCase.php b/tests/InventoryTestCase.php index 854b6ac8f16..9863cf3dcf4 100644 --- a/tests/InventoryTestCase.php +++ b/tests/InventoryTestCase.php @@ -35,7 +35,7 @@ class InventoryTestCase extends \DbTestCase { - protected const INV_FIXTURES = GLPI_ROOT . '/vendor/glpi-project/inventory_format/examples/'; + protected const INV_FIXTURES = GLPI_ROOT . 'vendor/glpi-project/inventory_format/examples/'; /** * Path to use to test inventory archive manipulations. diff --git a/tests/functional/Glpi/Inventory/Inventory.php b/tests/functional/Glpi/Inventory/Inventory.php index d3b3648076a..fde98fa21fb 100644 --- a/tests/functional/Glpi/Inventory/Inventory.php +++ b/tests/functional/Glpi/Inventory/Inventory.php @@ -4584,12 +4584,12 @@ public function testArchive() $nbnetequps = countElementsInTable(\NetworkEquipment::getTable()); $json_paths = [ - self::INV_FIXTURES . 'computer_1.json', - self::INV_FIXTURES . 'networkequipment_1.json', - self::INV_FIXTURES . 'printer_1.json', + realpath(self::INV_FIXTURES . 'computer_1.json'), + realpath(self::INV_FIXTURES . 'networkequipment_1.json'), + realpath(self::INV_FIXTURES . 'printer_1.json'), ]; - UnifiedArchive::archiveFiles($json_paths, self::INVENTORY_ARCHIVE_PATH); + UnifiedArchive::create($json_paths, self::INVENTORY_ARCHIVE_PATH); $conf = new \Glpi\Inventory\Conf(); $result = $conf->importFiles(['to_inventory.zip' => self::INVENTORY_ARCHIVE_PATH]); From 7b1b206f70e9f988eb6d3a309589742db7338516 Mon Sep 17 00:00:00 2001 From: Lainow Date: Tue, 25 Jun 2024 11:13:07 +0200 Subject: [PATCH 4/8] Fix cluster items count --- src/Item_Cluster.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Item_Cluster.php b/src/Item_Cluster.php index 19a4fdb795c..3fc81e143b1 100644 --- a/src/Item_Cluster.php +++ b/src/Item_Cluster.php @@ -55,7 +55,7 @@ public function getTabNameForItem(CommonGLPI $item, $withtemplate = 0) if ($_SESSION['glpishow_count_on_tabs']) { $nb = self::countForMainItem($item); } - return self::createTabEntry(_n('Item', 'Items', $nb)); + return self::createTabEntry(_n('Item', 'Items', $nb), $nb); } public static function displayTabContentForItem(CommonGLPI $item, $tabnum = 1, $withtemplate = 0) From 80831b233ee81fb8ce57bbcea3b653a63cb66068 Mon Sep 17 00:00:00 2001 From: Curtis Conard Date: Tue, 25 Jun 2024 06:23:38 -0400 Subject: [PATCH 5/8] Fix CronTaskLog access in legacy API --- src/CronTaskLog.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/CronTaskLog.php b/src/CronTaskLog.php index 5b63704debb..fc86dc22c51 100644 --- a/src/CronTaskLog.php +++ b/src/CronTaskLog.php @@ -44,6 +44,8 @@ class CronTaskLog extends CommonDBTM const STATE_STOP = 2; const STATE_ERROR = 3; + public static $rightname = 'config'; + /** * Clean old event for a task From 6d9f81bdb8ec40c1afa660bd437b78b436b75f88 Mon Sep 17 00:00:00 2001 From: Romain Lecouvreur <102067890+RomainLvr@users.noreply.github.com> Date: Wed, 26 Jun 2024 14:21:57 +0200 Subject: [PATCH 6/8] Add missing 'getIcon()' function to the AllAssets class (#17356) * Add missing 'getIcon' function to the AllAssets class * Change from fa icon to tabler icon * Change icon * Apply icon to Global menu --- src/AllAssets.php | 5 +++++ src/Html.php | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/AllAssets.php b/src/AllAssets.php index ba75f8c353e..e2e2520f721 100644 --- a/src/AllAssets.php +++ b/src/AllAssets.php @@ -44,4 +44,9 @@ public static function getTypeName($nb = 0) { return _n('Asset', 'Assets', $nb); } + + public static function getIcon() + { + return 'ti ti-packages'; + } } diff --git a/src/Html.php b/src/Html.php index 1b2ea5884ac..f365fbaea49 100644 --- a/src/Html.php +++ b/src/Html.php @@ -1522,7 +1522,7 @@ public static function generateMenuSession($force = false) $menu['assets']['content']['allassets']['title'] = __('Global'); $menu['assets']['content']['allassets']['shortcut'] = ''; $menu['assets']['content']['allassets']['page'] = '/front/allassets.php'; - $menu['assets']['content']['allassets']['icon'] = 'fas fa-list'; + $menu['assets']['content']['allassets']['icon'] = AllAssets::getIcon(); $menu['assets']['content']['allassets']['links']['search'] = '/front/allassets.php'; break; } From aa4ad2c782a95130625131ddc1c7654d5c2dc9a6 Mon Sep 17 00:00:00 2001 From: btry Date: Wed, 26 Jun 2024 14:28:37 +0200 Subject: [PATCH 7/8] fix ticket list ignoring validation role --- src/Ticket.php | 252 ++++++++++++++++++++++-------------- tests/functional/Ticket.php | 67 ++++++++++ 2 files changed, 224 insertions(+), 95 deletions(-) diff --git a/src/Ticket.php b/src/Ticket.php index de5df696077..ae328f4f3c3 100644 --- a/src/Ticket.php +++ b/src/Ticket.php @@ -5395,6 +5395,7 @@ public static function showListForItem(CommonDBTM $item, $withtemplate = 0) self::$rightname, [self::READALL, self::READMY, self::READASSIGN, CREATE] ) + && !Session::haveRightsOr(TicketValidation::$rightname, TicketValidation::getValidateRights()) ) { return false; } @@ -5404,65 +5405,23 @@ public static function showListForItem(CommonDBTM $item, $withtemplate = 0) } $criteria = self::getCommonCriteria(); - $restrict = []; - $options = [ - 'criteria' => [], - 'reset' => 'reset', - ]; + $restrict = self::getListForItemRestrict($item); + $criteria['WHERE'] = $restrict + getEntitiesRestrictCriteria(self::getTable()); + $criteria['WHERE']['glpi_tickets.is_deleted'] = 0; + $criteria['LIMIT'] = (int)$_SESSION['glpilist_limit']; switch (get_class($item)) { - case User::class: - $restrict['glpi_tickets_users.users_id'] = $item->getID(); - $restrict['glpi_tickets_users.type'] = CommonITILActor::REQUESTER; - - $options['criteria'][0]['field'] = 4; // status - $options['criteria'][0]['searchtype'] = 'equals'; - $options['criteria'][0]['value'] = $item->getID(); - $options['criteria'][0]['link'] = 'AND'; - break; - case SLA::class: - $restrict[] = [ - 'OR' => [ - 'slas_id_tto' => $item->getID(), - 'slas_id_ttr' => $item->getID() - ] - ]; $criteria['ORDERBY'] = 'glpi_tickets.time_to_resolve DESC'; - - $options['criteria'][0]['field'] = 30; - $options['criteria'][0]['searchtype'] = 'equals'; - $options['criteria'][0]['value'] = $item->getID(); - $options['criteria'][0]['link'] = 'AND'; break; case OLA::class: - $restrict[] = [ - 'OR' => [ - 'olas_id_tto' => $item->getID(), - 'olas_id_ttr' => $item->getID() - ] - ]; $criteria['ORDERBY'] = 'glpi_tickets.internal_time_to_resolve DESC'; - - $options['criteria'][0]['field'] = 30; - $options['criteria'][0]['searchtype'] = 'equals'; - $options['criteria'][0]['value'] = $item->getID(); - $options['criteria'][0]['link'] = 'AND'; - break; - - case Supplier::class: - $restrict['glpi_suppliers_tickets.suppliers_id'] = $item->getID(); - $restrict['glpi_suppliers_tickets.type'] = CommonITILActor::ASSIGN; - - $options['criteria'][0]['field'] = 6; - $options['criteria'][0]['searchtype'] = 'equals'; - $options['criteria'][0]['value'] = $item->getID(); - $options['criteria'][0]['link'] = 'AND'; break; case Group::class: - // Mini search engine + // Mini search engine + /** @var Group $item */ if ($item->haveChildren()) { $tree = Session::getSavedOption(__CLASS__, 'tree', 0); echo ""; @@ -5479,56 +5438,10 @@ public static function showListForItem(CommonDBTM $item, $withtemplate = 0) $tree = 0; } echo "
"; - - $restrict['glpi_groups_tickets.groups_id'] = ($tree ? getSonsOf('glpi_groups', $item->getID()) : $item->getID()); - $restrict['glpi_groups_tickets.type'] = CommonITILActor::REQUESTER; - - $options['criteria'][0]['field'] = 71; - $options['criteria'][0]['searchtype'] = ($tree ? 'under' : 'equals'); - $options['criteria'][0]['value'] = $item->getID(); - $options['criteria'][0]['link'] = 'AND'; - break; - - default: - $restrict['glpi_items_tickets.items_id'] = $item->getID(); - $restrict['glpi_items_tickets.itemtype'] = $item->getType(); - - // you can only see your tickets - if (!Session::haveRight(self::$rightname, self::READALL)) { - $or = [ - 'glpi_tickets.users_id_recipient' => Session::getLoginUserID(), - [ - 'AND' => [ - 'glpi_tickets_users.tickets_id' => new \QueryExpression('glpi_tickets.id'), - 'glpi_tickets_users.users_id' => Session::getLoginUserID() - ] - ] - ]; - if (count($_SESSION['glpigroups'])) { - $or['glpi_groups_tickets.groups_id'] = $_SESSION['glpigroups']; - } - $restrict[] = ['OR' => $or]; - } - - $options['criteria'][0]['field'] = 12; - $options['criteria'][0]['searchtype'] = 'equals'; - $options['criteria'][0]['value'] = 'all'; - $options['criteria'][0]['link'] = 'AND'; - - $options['metacriteria'][0]['itemtype'] = $item->getType(); - $options['metacriteria'][0]['field'] = Search::getOptionNumber( - $item->getType(), - 'id' - ); - $options['metacriteria'][0]['searchtype'] = 'equals'; - $options['metacriteria'][0]['value'] = $item->getID(); - $options['metacriteria'][0]['link'] = 'AND'; + /** @var CommonDBTM $item */ break; } - $criteria['WHERE'] = $restrict + getEntitiesRestrictCriteria(self::getTable()); - $criteria['WHERE']['glpi_tickets.is_deleted'] = 0; - $criteria['LIMIT'] = (int)$_SESSION['glpilist_limit']; $iterator = $DB->request($criteria); $number = count($iterator); @@ -5590,6 +5503,7 @@ public static function showListForItem(CommonDBTM $item, $withtemplate = 0) ) ); + $options = self::getListForItemSearchOptionsCriteria($item); echo ""; $title = sprintf(_n('Last %d ticket', 'Last %d tickets', $number), $number); $link = " [ + self::getTable() => 'id', + 'glpi_ticketvalidations' => 'tickets_id' + ] + ]; + return $criteria; } @@ -7077,4 +6998,145 @@ public static function getContentTemplatesParametersClass(): string { return TicketParameters::class; } + + public static function getListForItemRestrict(CommonDBTM $item) + { + $restrict = []; + + switch (get_class($item)) { + case User::class: + $restrict['glpi_tickets_users.users_id'] = $item->getID(); + $restrict['glpi_tickets_users.type'] = CommonITILActor::REQUESTER; + break; + + case SLA::class: + $restrict[] = [ + 'OR' => [ + 'slas_id_tto' => $item->getID(), + 'slas_id_ttr' => $item->getID() + ] + ]; + break; + + case OLA::class: + $restrict[] = [ + 'OR' => [ + 'olas_id_tto' => $item->getID(), + 'olas_id_ttr' => $item->getID() + ] + ]; + break; + + case Supplier::class: + $restrict['glpi_suppliers_tickets.suppliers_id'] = $item->getID(); + $restrict['glpi_suppliers_tickets.type'] = CommonITILActor::ASSIGN; + break; + + case Group::class: + /** @var Group $item */ + if ($item->haveChildren()) { + $tree = Session::getSavedOption(__CLASS__, 'tree', 0); + } else { + $tree = 0; + } + $restrict['glpi_groups_tickets.groups_id'] = ($tree ? getSonsOf('glpi_groups', $item->getID()) : $item->getID()); + $restrict['glpi_groups_tickets.type'] = CommonITILActor::REQUESTER; + /** @var CommonDBTM $item */ + break; + + default: + $restrict['glpi_items_tickets.items_id'] = $item->getID(); + $restrict['glpi_items_tickets.itemtype'] = $item->getType(); + // you can only see your tickets + if (!Session::haveRight(self::$rightname, self::READALL)) { + $or = [ + 'glpi_tickets.users_id_recipient' => Session::getLoginUserID(), + [ + 'AND' => [ + 'glpi_tickets_users.tickets_id' => new \QueryExpression('glpi_tickets.id'), + 'glpi_tickets_users.users_id' => Session::getLoginUserID() + ] + ] + ]; + if (Session::haveRightsOr(TicketValidation::$rightname, [TicketValidation::VALIDATEINCIDENT, TicketValidation::VALIDATEREQUEST])) { + $or[] = [ + 'AND' => [ + 'glpi_ticketvalidations.tickets_id' => new \QueryExpression('glpi_tickets.id'), + 'glpi_ticketvalidations.users_id_validate' => Session::getLoginUserID(), + ] + ]; + } + if (count($_SESSION['glpigroups'])) { + $or['glpi_groups_tickets.groups_id'] = $_SESSION['glpigroups']; + } + $restrict[] = ['OR' => $or]; + } + } + + return $restrict; + } + + private static function getListForItemSearchOptionsCriteria(CommonDBTM $item): array + { + $options = [ + 'criteria' => [], + 'reset' => 'reset', + ]; + + switch (get_class($item)) { + case User::class: + $options['criteria'][0]['field'] = 4; // status + $options['criteria'][0]['searchtype'] = 'equals'; + $options['criteria'][0]['value'] = $item->getID(); + $options['criteria'][0]['link'] = 'AND'; + break; + + case SLA::class: + case OLA::class: + $options['criteria'][0]['field'] = 30; + $options['criteria'][0]['searchtype'] = 'equals'; + $options['criteria'][0]['value'] = $item->getID(); + $options['criteria'][0]['link'] = 'AND'; + break; + + case Supplier::class: + $options['criteria'][0]['field'] = 6; + $options['criteria'][0]['searchtype'] = 'equals'; + $options['criteria'][0]['value'] = $item->getID(); + $options['criteria'][0]['link'] = 'AND'; + break; + + case Group::class: + /** @var Group $item */ + if ($item->haveChildren()) { + $tree = Session::getSavedOption(__CLASS__, 'tree', 0); + } else { + $tree = 0; + } + $options['criteria'][0]['field'] = 71; + $options['criteria'][0]['searchtype'] = ($tree ? 'under' : 'equals'); + $options['criteria'][0]['value'] = $item->getID(); + $options['criteria'][0]['link'] = 'AND'; + /** @var CommonDBTM $item */ + break; + + default: + $options['criteria'][0]['field'] = 12; + $options['criteria'][0]['searchtype'] = 'equals'; + $options['criteria'][0]['value'] = 'all'; + $options['criteria'][0]['link'] = 'AND'; + + $options['metacriteria'][0]['itemtype'] = $item->getType(); + $options['metacriteria'][0]['field'] = Search::getOptionNumber( + $item->getType(), + 'id' + ); + $options['metacriteria'][0]['searchtype'] = 'equals'; + $options['metacriteria'][0]['value'] = $item->getID(); + $options['metacriteria'][0]['link'] = 'AND'; + break; + } + + return $options; + } } diff --git a/tests/functional/Ticket.php b/tests/functional/Ticket.php index 54501692afe..271445f623e 100644 --- a/tests/functional/Ticket.php +++ b/tests/functional/Ticket.php @@ -54,6 +54,7 @@ use Ticket_User; use TicketValidation; use User; +use Session; /* Test for inc/ticket.class.php */ @@ -6984,4 +6985,70 @@ public function testRestrictedDropdownValues() $this->array($values['results'])->size->isGreaterThan(1); $this->boolean($fn_dropdown_has_id($values['results'], $not_my_tickets_id))->isTrue(); } + + public function testGetCommonCriteria() + { + global $DB; + + $this->login('tech', 'tech'); + + $item = new \Project(); + $item->add([ + 'name' => $this->getUniqueString(), + ]); + $this->boolean($item->isNewItem())->isFalse(); + + // Find tickets already in the entity + $request = \Ticket::getCommonCriteria(); + $request['WHERE'] = $this->callPrivateMethod(new \Ticket(), 'getListForItemRestrict', $item); + $request['WHERE'] = $request['WHERE'] + getEntitiesRestrictCriteria(\Ticket::getTable()); + $result = $DB->request($request); + $existing_tickets = $result->count(); + + // Create a ticket with no actor and a valdiator + $ticket = new \Ticket(); + $ticket->add([ + 'name' => __FUNCTION__, + 'content' => __FUNCTION__, + 'entities_id' => $this->getTestRootEntity(true), + 'users_id_recipient' => getItemByTypeName(User::class, 'tech', true), + ]); + $this->boolean($ticket->isNewItem())->isFalse(); + + $item_ticket = new \Item_Ticket(); + $item_ticket->add([ + 'tickets_id' => $ticket->getID(), + 'itemtype' => $item->getType(), + 'items_id' => $item->getID(), + ]); + $this->boolean($item_ticket->isNewItem())->isFalse(); + + $user = new \Ticket_User(); + $users = $user->find([ + 'tickets_id' => $ticket->getID(), + ]); + $this->integer(count($users))->IsEqualTo(0); + + $this->login('post-only', 'postonly'); + $_SESSION['glpiactiveprofile'][\TicketValidation::$rightname] = \TicketValidation::VALIDATEINCIDENT + \TicketValidation::VALIDATEREQUEST; + + // Check the ticket is not found + $request['WHERE'] = $this->callPrivateMethod(new \Ticket(), 'getListForItemRestrict', $item); + $request['WHERE'] = $request['WHERE'] + getEntitiesRestrictCriteria(\Ticket::getTable()); + $result = $DB->request($request); + $this->integer($result->count())->isEqualTo($existing_tickets); + + $ticket_valdiation = new TicketValidation(); + $ticket_valdiation->add([ + 'tickets_id' => $ticket->getID(), + 'entities_id' => $ticket->fields['entities_id'], + 'users_id_validate' => Session::getLoginUserID(), + 'timeline_position' => 1, + ]); + $this->boolean($ticket_valdiation->isNewItem())->isFalse(); + + // Check the ticket under valdiation is found + $result = $DB->request($request); + $this->integer($result->count())->isEqualTo($existing_tickets + 1); + } } From 79ae6e22243e772c908ad3c9b051011cffcf2685 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Anne?= Date: Thu, 27 Jun 2024 08:56:48 +0200 Subject: [PATCH 8/8] Ensure the coverage workflow uses the config from its own branch --- .github/workflows/coverage-schedule.yml | 12 ++++++++++++ .github/workflows/coverage.yml | 26 +++++++++++++------------ 2 files changed, 26 insertions(+), 12 deletions(-) create mode 100644 .github/workflows/coverage-schedule.yml diff --git a/.github/workflows/coverage-schedule.yml b/.github/workflows/coverage-schedule.yml new file mode 100644 index 00000000000..9cba117fcb3 --- /dev/null +++ b/.github/workflows/coverage-schedule.yml @@ -0,0 +1,12 @@ +name: "Code coverage schedule" + +on: + schedule: + - cron: '0 0 * * *' + +jobs: + run-coverage-workflow: + name: "Run coverage workflow" + uses: "glpi-project/glpi/.github/workflows/coverage.yml@main" + with: + branch: "main" diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 3a5aa4dc935..06890a2e061 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -1,27 +1,29 @@ name: "GLPI test code coverage" on: - # Runs coverage suite when a pull request updates workflow file - pull_request: - paths: - - ".github/workflows/coverage.yml" - # Runs coverage suite every night - schedule: - - cron: '0 0 * * *' + # Enable execution from the "Code coverage schedule" workflow + workflow_call: + inputs: + branch: + required: true + type: string # Enable manual run workflow_dispatch: + inputs: + branch: + description: "Target branch" + required: true + type: string jobs: coverage: - # Do not run scheduled coverage on tier repositories - if: github.repository == 'glpi-project/glpi' || github.event_name != 'schedule' name: "Code coverage" runs-on: "ubuntu-latest" strategy: fail-fast: false matrix: include: - - {branch: "main", php-version: "8.2", db-image: "mariadb:11.0"} + - {php-version: "8.2", db-image: "mariadb:11.0"} env: COMPOSE_FILE: ".github/actions/docker-compose-app.yml:.github/actions/docker-compose-services.yml" APPLICATION_ROOT: "${{ github.workspace }}" @@ -36,7 +38,7 @@ jobs: - name: "Checkout" uses: "actions/checkout@v4" with: - ref: ${{ matrix.branch }} + ref: ${{ inputs.branch }} - name: "Restore dependencies cache" uses: actions/cache@v4 with: @@ -76,4 +78,4 @@ jobs: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} with: files: ./tests/coverage-functional/clover.xml,./tests/coverage-ldap/clover.xml,./tests/coverage-imap/clover.xml - override_branch: ${{ matrix.branch }} + override_branch: ${{ inputs.branch }}