Как передать аргумент имени файла gitconfig diff textconv? - PullRequest
2 голосов
/ 10 апреля 2019

Документация по textconv в https://git.wiki.kernel.org/index.php/Textconv имеет краткую формулировку:

~/.gitconfig должен указывать команду для выполнения для драйвера textconv:

[diff "<driver_name>"]
    textconv=<command>

Я не могу найти никакой документации о том, как отформатировать команду, которая требует имя файла, переданное в качестве позиционного аргумента. Например, я хотел бы использовать следующую команду форматера pdf, для которой в качестве последнего аргумента для записи в stdout требуется тире:

[diff "pdf"]
    textconv = pdftotext -layout "$1" -

Пока что мне пришлось писать собственные однострочные сценарии оболочки в качестве обходного пути, но они начинают накапливаться, и это становится немного раздражающим.

Есть ли способ обойтись без этих скриптов? Соглашение "$1" или 1018 * для аргументов *1017*, похоже, не работает.

1 Ответ

3 голосов
/ 10 апреля 2019

К сожалению, эта информация просто недоступна. Здесь - это код, который фактически выполняет преобразование текста:

temp = prepare_temp_file(r, spec->path, spec);
*arg++ = pgm;
*arg++ = temp->name;
*arg = NULL;


child.use_shell = 1;
child.argv = argv;
child.out = -1;
if (start_command(&child)) {
    remove_tempfile();
    return NULL;
}

Два аргумента - это имя самой программы (как обычно argv [0]) и имя временногофайл, содержащий биты, извлеченные из тех мест, где они находятся (на основе параметра spec; для получения дополнительной информации перейдите по ссылке выше).

Спецификация, вероятно, содержит исходное имя пути в большинстве или во всех случаях (и еслинет, посмотрите на функцию чуть ниже этой), она просто не скопирована в аргументы программы.Код фильтра textconv может, но не использует технику % -расширения, используемую драйверами слияния Git, и если он это сделал (но не делает), он может иметь % -escape, который передал исходный файлназвание.Но, конечно, это не так.

(Вы можете создать свой собственный клон Git и поработать над ним, и, возможно, попытаться убедить людей Git принять ваши изменения в качестве вклада в публичный Git ...)

...