Хук предварительной фиксации Husky завершается после фиксации

Следующий скрипт был написан для сортировки файлов JSON по ключу на хуке перед фиксацией:

 /*
 * Will reorder all files in given path.
 */

const sortJson = require("sort-json");
const fs = require("fs");
const chalk = require("chalk");

const log = console.log;
const translationsPath = process.argv.slice(2).join(" ");

function readFiles(dirname) {
  try {
    return fs.readdirSync(dirname);
  } catch (e) {
    log(chalk.red(`Failed reading files from path; ${e}`));
  }
}

log(
  chalk.bgGreen(
    `Running json sort pre-commit hook on path: ${translationsPath}`
  )
);

const files = readFiles(translationsPath);
files.forEach((file) => {
  log(chalk.yellow(`Sorting ${file}...`));
  try {
    sortJson.overwrite(`${translationsPath}\\${file}`);
    log(chalk.green(`Finished sorting ${file}`));
  } catch (e) {
    log(chalk.red(`Failed sorting file ${file}; ${e}`));
  }
});

log(
  chalk.bgGreen(
    `Finished sorting files`
  )
);

Я прикрепляю скрипт к своему package.json с помощью husky precommit hook:

  "scripts": {
    "sort-translations": "node ./scripts/husky/json-sort src/assets/translations",
    ...
  },
  "husky": {
    "hooks": {
      "pre-commit": "npm run sort-translations"
    }
  },

В результате фиксация завершается, и только после этого сценарий завершает работу с созданными неэтапными изменениями. Сам сценарий запускается синхронно с Finished sorting files сообщением, напечатанным последним.

Мой вопрос в том, как сделать это синхронным; сначала завершите запуск node ./scripts/husky/json-sort src/assets/translations, затем git commit.

Спасибо!


person noamyg    schedule 16.08.2020    source источник
comment
Поскольку это просто ловушка перед фиксацией, безопасно использовать sync функции. Так что, если вы используете fs.readdirSync(), он должен работать. Использование версии async, скорее всего, ничего не улучшит в этом сценарии.   -  person adelriosantiago    schedule 16.08.2020
comment
Спасибо @adelriosantiago, я изменил его на readdirSync (), но я все равно выполняю фиксацию до того, как файлы будут изменены. Я отредактирую свой пост с новым кодом   -  person noamyg    schedule 17.08.2020


Ответы (1)


Благодаря комментарию @adelriosantiago я понял это.

  1. Во-первых, я начал использовать readdirSync() вместо readdir(). Затем я смог убедиться (с помощью регистрации), что сценарий действительно завершается только тогда, когда файлы редактируются. К сожалению, этого было недостаточно - ловушка по-прежнему заканчивалась незафиксированными файлами.
  2. Тут я понял - дело не в хуке, а в постановке git! Сценарий завершает это время, но измененные изменения остаются неустановленными, поэтому они не фиксируются. Итак, я добавил && git add src/assets/translations в pre-commit крючок.

Теперь все работает как надо.

person noamyg    schedule 17.08.2020