Подтвердить что ты не робот

Лучшая стратегия написания крючков для подрывной работы в Windows

Каков наилучший подход для написания крючков для Subversion в Windows? Насколько мне известно, могут использоваться только исполняемые файлы. Итак, что является лучшим выбором?

  • Обычные пакетные файлы (очень ограниченные, но, возможно, ОК для очень простых решений)
  • Выделенные скомпилированные исполняемые приложения (кувалда для взлома?)
  • Некоторые другие гибридные варианты (например, пакетный файл с Powershell script)
4b9b3361

Ответ 1

Я только что провел несколько дней, откладывая именно на этот вопрос. Есть сторонние продукты и множество скриптов PERL и Python, но мне нужно было что-то простое, и язык, с которым я был знаком, закончил тем, что просто написал крючки в консольном приложении С#. Его очень прямолинейно:

public void Main(string[] args)
{
  string repositories = args[0];
  string transaction = args[1];

  var processStartInfo = new ProcessStartInfo
                           {
                             FileName = "svnlook.exe",
                             UseShellExecute = false,
                             CreateNoWindow = true,
                             RedirectStandardOutput = true,
                             RedirectStandardError = true,
                             Arguments = String.Format("log -t \"{0}\" \"{1}\"", transaction, repositories)
                           };

  var p = Process.Start(processStartInfo);
  var s = p.StandardOutput.ReadToEnd();
  p.WaitForExit();

  if (s == string.Empty)
  {
    Console.Error.WriteLine("Message must be provided");
    Environment.Exit(1);
  }

  Environment.Exit(0);
}

Затем вы можете вызвать это в pre commit, добавив файл pre-commit.cmd в папку hooks репо со следующей строкой:

[path]\PreCommit.exe %1 %2

Вы можете подумать об этом, но в конечном счете это всего лишь несколько минут кодирования. Более того, вы получаете преимущество языкового пакета .NET, который ИМХО гораздо предпочтительнее альтернатив. Я значительно расширь свои крючки и напишу соответствующие тесты против них - немного сложно сделать это с помощью командного файла DOS!

BTW, код был адаптирован из этого сообщения.

Ответ 2

У нас есть сложные требования, такие как:

  • Только определенные пользователи могут создавать папки в частях дерева SVN, но каждый может редактировать файлы там.
  • Некоторые расширения файлов не могут содержать определенный текст в файле
  • Некоторые расширения файлов могут храниться только в подкаталоге каталогов
  • Как и несколько более простых, таких как, Должен иметь комментарий фиксации
  • Регрессию можно проверить, запустив новый захват против всех предыдущих компиляций SVN

# 5 для нас огромна, нет лучшего способа узнать, что вы не собираетесь прерывать движение вперед, чем иметь возможность продвигать все предыдущие коммиты через ваш новый крючок. Подводя крючок, понимаем, что 1234 была ревизией, а 1234-1 была транзакцией и внесение соответствующих изменений аргументов при вызове svnlook и т.д. Было лучшим решением, которое мы приняли во время процесса.

Для нас гайка была достаточно большой, чтобы полностью испытанный, регрессионный тест, С# console exe имел наибольший смысл. У нас есть файлы конфигурации, которые кормят ограничения каталога, анализируют существующий файл httpd_authz, чтобы получить "привилегированных" пользователей и т.д. Если бы мы не работали в Windows с рабочей силой разработки .NET, я бы, вероятно, написал все это на Python, но так как другим может потребоваться поддержка в будущем, я пошел .NET поверх .BAT,.VBS, Powershell глупость.

Лично я считаю, что Powershell отличается от .NET тем, что в большинстве своем бесполезен как "скриптовый" язык. Это хорошо, если единственная поддержка линии cmd для продукта приходит через PS (Exchange, Windows 2k8) и т.д., Но если все, что вы хотите сделать, это разобрать какой-либо текст или получить доступ к обычным объектам .NET. PS просто добавляет сумасшедший синтаксис и глупое Iron Iron Занавес к тому, что может быть быстрым и легким маленьким .NET-приложением.

Ответ 3

Отметьте CaptainHook, "простую структуру плагинов для написания крючков Subversion с использованием .NET".

Ответ 4

В зависимости от сложности каждая ситуация отличается, если я просто перемещаю файлы, я напишу быстрый командный файл. Если я хочу сделать что-то более сложное, я обычно просто пропущу часть сценария и напишу быструю программу С#, которая может ее обработать.

Вопрос в том, поставил ли вы эту С# -программу в svn и ее версию:)

edit:. Преимущества специального приложения С# - это то, что я могу повторно использовать фрагменты кода для создания новых перехватов позже, включая простой выход журнала, который я создал для обработки регистрации крюка.

Ответ 5

Я написал перехваты в Python в Windows, поскольку в сети много примеров (обычно для Linux, но различия невелики). Мы также используем Trac, интегрированный с SVN, и есть API-интерфейс Trac, доступный через Python, который позволяет нам автоматически создавать/изменять билеты Trac из SVN-крючка скрипты.