Лучшая стратегия записать рычаги для подверсии в [закрывших] окнах

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

20
задан bahrep 18 October 2012 в 11:55
поделиться

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!

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

7
ответ дан 30 November 2019 в 01:18
поделиться

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

вопрос затем, делают Вас, помещает это c# программа в svn и присвоили версию ему :)

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

1
ответ дан 30 November 2019 в 01:18
поделиться

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

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

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

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

Лично я думаю, что Powershell достаточно отличается от.NET, чтобы быть главным образом бесполезным как язык "сценариев". Хорошо, если единственная cmd поддержка строки продукта приходит через PS (Exchange, Windows 2k8), и т.д. но если все, что Вы хотите сделать, проанализировать некоторый текст или доступ, регулярная.NET возражает, что PS просто добавляет сумасшедший синтаксис и глупую безопасность Железный занавес к тому, что могло быть быстрым и легким небольшим приложением.NET.

5
ответ дан 30 November 2019 в 01:18
поделиться

Проверьте CaptainHook, "простая сменная платформа для записи рычагов Подверсии с помощью.NET".

2
ответ дан 30 November 2019 в 01:18
поделиться

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

1
ответ дан 30 November 2019 в 01:18
поделиться

У вас, скорее всего, установило крючок «широкую нить», а не «широкую систему», что означает, что ключевой перевод будет происходить только для потока, установленного крюку.

Для того, чтобы установить его «широкую систему», вам понадобится два штуки: одна DLL, имеющая «поставщик хост-поставщика» и EXE, управляющий им. Вот хороший учебник http://www.codeproject.com/kb/system/hooksys.aspx И вот пример: http://www.codeguru.com/cpp/com-tech/shell/article.php/c4509/

Но: 1. Установка системы Широкие крюки могут серьезно зависать в системе (убедитесь, что вы пересылаете ключи, которые вы не переводите). 2. Пожалуйста, ... не создавайте другой кейлоггер

-121--3723823-- 3723823-

Если у вас есть исполняемый файл PHP с помощью простого класса PHP, вы можете написать скрипт крючка в PHP, как он отображается здесь http://whww.devhands.com/2010/ 01 / Subversion-House-Php-Framework-in /

1
ответ дан 30 November 2019 в 01:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: