2013-05-11 2 views
4

Я планирую заменить использование git.exe из оконного пути на libgit2sharp для моего плагина GitDiffMargin, расширение Visual Studio 2012, чтобы отобразить Git Diff на краю текущего файла. - https://github.com/laurentkempe/GitDiffMarginЭквивалент git difftool -y с libgit2sharp?

Я хотел бы знать, есть ли эквивалент в libgit2sharp, чтобы запустить внешний diffftool с помощью git difftool -y filename?

ответ

2

Я не думаю, что ответственность за запуск внешнего процесса лежит на LibGit2Sharp. Цель LibGit2Sharp - предоставить возможность легко манипулировать репозиторием git.

Это означает, что вы можете использовать его для:

  • Получить различий между файлами в WORKDIR и предыдущей версии (в индексе). Для этого вы можете использовать перегрузку Repository.Diff.Compare(IEnumerable<string> paths, bool includeUntracked, ExplicitPathsOptions explicitPathsOptions), которая возвращает объект TreeChanges. Оттуда вы можете получить объект TreeEntryChanges через индексатор treeChanges, который соответствует изменениям данного файла (используйте свойство .Patch для получения фактического содержимого патча).

  • Получить настроенный инструмент сравнения с помощью Repository.Config пространства имен (например .: repo.Config.Get<string>("diff.tool").Value, хотя вы должны также проверить, если значение, возвращаемое методом Get() является недействительным в случае, если ни один инструмент различий не был настроен пользователем). Таким образом, вы можете запустить инструмент diff самостоятельно.

Дополнительные ресурсы (v0.11.0):

  • Diff WorkDir индексировать tests
  • example, показывающий, как использовать TreeChanges объект
  • Configuration fixture, довольно самообъясняющими

Примечание: кажется, что в какой-то момент вам нужно будет знать, изменилась ли линия или нет. Я не думаю, что есть простой способ сделать это прямо сейчас (кроме разбора содержимого патча вручную). Однако открытие проблемы на LibGit2Sharp issue tracker может спровоцировать некоторую дискуссию вокруг этого (не стесняйтесь взвесить, какой API вы хотели бы сделать!).


Edit: Перед запуском внешнего инструмент сравнения, вам нужно будет скопировать содержимое файла, который находится в индексе во временной папке. Вы можете найти blob файла в индексе, выполнив что-то вроде:

  • var indexEntry = repo.Index [fileName];
  • var blob = repo.Lookup (indexEntry.Id);

Однако ... фильтры не применяются, когда вы получаете контент blob, поэтому сравнение, вероятно, приведет к ложным срабатываниям из-за различий crlf. В настоящее время на libgit2 открыт issue, чтобы предложить API для применения фильтров.

+0

Спасибо, yorah! Тем временем я нашел о Repository.Config и у вас будет более подробная информация об этом! Что касается изменений в строке, у меня уже есть что-то, что анализирует diff, но я просто жду, чтобы это изменилось. Https://github.com/libgit2/libgit2sharp/pull/423 –

Смежные вопросы