yarkov
@yarkov
Помог ответ? Отметь решением.

Как получить только родительские каталоги из массива с путями?

Всем привет.
Есть задача в github action получить массив каталогов, где были изменены файлы. Массив я получил:
jobs:
  check-files-changes:
    runs-on: ubuntu-latest
    permissions:
      pull-requests: read
    steps:
      - uses: actions/checkout@v4.1.7
      - name: Получаем перечень изменённых spfx пакетов
        id: changed-files-specific
        uses: tj-actions/changed-files@v44.5.7
        with:
          json: 'true'
          dir_names: 'true'
          files: monorepo/spfx-packages/**
          files_ignore: monorepo/spfx-packages/**/*.md
      - name: Выводим перечень изменённых spfx пакетов
        env:
          ALL_CHANGED_FILES: ${{ steps.changed-files-specific.outputs.all_changed_files }}
        run: |
          echo "**************************************"
          echo "${ALL_CHANGED_FILES}"
          echo "**************************************"

В переменной ALL_CHANGED_FILES получаю массив:
[
  "monorepo/spfx-packages/news/src/webparts/news",
  "monorepo/spfx-packages/news/config",
  "monorepo/spfx-packages/news",
  "monorepo/spfx-packages/news/src/webparts/news/loc",
  "monorepo/spfx-packages/alert/src/webparts/alert",
  "monorepo/spfx-packages/alert/config",
  "monorepo/spfx-packages/alert",
  "monorepo/spfx-packages/alert/src/webparts/alert/loc"
]

надо как-то, желательно силами bash, получить из этого массива массив с родительскими каталогами верхнего уровня. В конкретном случае результат должен выглядеть так:
[
  "monorepo/spfx-packages/news",
  "monorepo/spfx-packages/alert"
]
  • Вопрос задан
  • 44 просмотра
Решения вопроса 1
@xibir
#!/bin/bash
ALL_CHANGED_FILES='[
  "monorepo/spfx-packages/news/src/webparts/news",
  "monorepo/spfx-packages/news/config",
  "monorepo/spfx-packages/news",
  "monorepo/spfx-packages/news/src/webparts/news/loc",
  "monorepo/spfx-packages/alert/src/webparts/alert",
  "monorepo/spfx-packages/alert/config",
  "monorepo/spfx-packages/alert",
  "monorepo/spfx-packages/alert/src/webparts/alert/loc"
]'
echo "$ALL_CHANGED_FILES" | sed -rn 's@([^/]+/[^/]+/[^/]+)/.+@\1"@p' | sort -u | sed -r '$!s/.+/&,/'
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
yarkov
@yarkov Автор вопроса
Помог ответ? Отметь решением.
Оставлю для истории способ, который нашёл я до того, как тут дали ответ на вопрос
jobs:
  check-files-changes:
    runs-on: ubuntu-latest
    permissions:
      pull-requests: read
    outputs:
      changes: ${{ steps.changed-packages-name.outputs.result }}
    steps:
      - uses: actions/checkout@v4.1.7
      - name: Получаем перечень изменённых файлов spfx пакетов
        id: changed-files-specific
        uses: tj-actions/changed-files@v44.5.7
        with:
          json: 'true'
          dir_names: 'true'
          files: monorepo/spfx-packages/**
          files_ignore: monorepo/spfx-packages/**/*.md
      - name: Получаем имена изменённых spfx пакетов
        id: changed-packages-name
        uses: actions/github-script@v7.0.1
        env:
          ALL_CHANGED_FILES: ${{ steps.changed-files-specific.outputs.all_changed_files }}
        with:
          script: |
            const getChangedPackagesOrLibs = require('./.gitea/scripts/js/getChangedPackagesOrLibs.js');
            return getChangedPackagesOrLibs('spfx-packages');

// ./.gitea/scripts/js/getChangedPackagesOrLibs.js
/**
 * Возвращает массив имён изменённых пакетов или библиотек.
 *
 * @param {(libs|spfx-packages)} type - Тип: библиотека или spfx-пакет
 * @return {Promise<string[]>} - Массив имён изменённых пакетов или библиотек
 */
module.exports = (type) => {
  const { ALL_CHANGED_FILES } = process.env;
  const changedDirPaths = JSON.parse(JSON.parse(`"${ALL_CHANGED_FILES}"`));
  const regex = new RegExp(`(monorepo\/${type}\/)([^\/]+)(.+)?`, 'gm');

  const parentDirPaths = [
    ...(new Set(
      changedDirPaths
        .map((dirPath) => dirPath.replace(regex, '$2'))
    ))
  ];

  return parentDirPaths;
}


Получаем на выходе из массива
[
  "monorepo/spfx-packages/news/src/webparts/news",
  "monorepo/spfx-packages/news/config",
  "monorepo/spfx-packages/news",
  "monorepo/spfx-packages/news/src/webparts/news/loc",
  "monorepo/spfx-packages/alert/src/webparts/alert",
  "monorepo/spfx-packages/alert/config",
  "monorepo/spfx-packages/alert",
  "monorepo/spfx-packages/alert/src/webparts/alert/loc"
]

вот такой результат
[
  "news",
  "alert"
]
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы