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

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

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

Ответов (6)

Решение

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

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.cmd в папку хуков репозитория со следующей строкой:

[path]\PreCommit.exe %1 %2

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

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

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

Тогда возникает вопрос: помещаете ли вы эту программу на C# в svn и используете ли она версию :)

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

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

Проверьте CaptainHook , «простую платформу плагинов для написания перехватчиков Subversion с использованием .NET».

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

  1. Только определенные пользователи могут создавать папки в частях дерева SVN, но каждый может редактировать файлы там.
  2. Некоторые расширения файлов не могут содержать определенный текст в файле
  3. Определенные расширения файлов могут храниться только в подмножестве каталогов.
  4. А также несколько более простых, таких как: Должен быть комментарий к фиксации
  5. Регрессионный тест можно проверить, запустив новый хук против всех предыдущих коммитов SVN.

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

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

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

Если у вас есть исполняемый файл php с помощью простого класса php, вы можете написать скрипт перехвата на php, как показано здесь http://www.devhands.com/2010/01/subversion-hook-php-framework-in/