Загрузка всех файлов в каждом Resivision из репозитория SVN с помощью SVNkit - ПОМОГИТЕ - PullRequest
1 голос
/ 18 сентября 2011

Вот моя проблема:

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

Например, допустим, у нас есть проект с начальной структурой каталогов:

  • dirA /

    - file1.java

    - file2.java

Первый коммит вносит изменения в dirA / file1.java, а второй в dirA / file2.java и file1.java. Мы хотим проанализировать код двух файлов (file1.java и file2.java) в начальном состоянии, а затем изменения, которые были сделаны в file1.java во время первого и второго принятия, и изменения, сделанные в file2.java во время второго принятия.

Третий коммит создает каталоги и файлы:

  • dirB /

    - file3.java

  • dirA / dirC

    - file4.java

Таким же образом, как описано выше, мы хотим проанализировать код для dirB / file3.java и dirA / dirC / file4.java, а также проанализировать, как изменяется (основная) структура каталогов.

4-й коммит копирует файл file3.java в каталог dirA / dirC / и вносит изменения в этот файл. Таким же образом мы хотим проанализировать, как операция копирования изменила структуру каталогов, и проанализировать содержимое файла file3.java до и после фиксации.

Поскольку мы ориентированы на код, мы хотим получить все исходные файлы из репозитория и все их ревизии. Для каждой ревизии определенного файла нам нужно содержимое текущей ревизии (начиная с самой первой ревизии) и предыдущей, до последней ревизии. Поскольку файл не обязательно изменяется при каждой фиксации (он может быть скопирован или удален), нет необходимости загружать дубликаты файлов с одинаковым содержимым.

Я знаю, что есть способ получить исходное состояние файла, только имея его содержимое в последней ревизии, путем рекурсивного выполнения обратного сравнения с его содержимым. Например, имея содержимое dirA / file1.java в последней ревизии (созданной во время второй фиксации) и имея вывод diff, мы можем получить состояние файла, которое было до этой ревизии (до второй фиксации). Таким образом, нет необходимости загружать содержимое каждого файла для каждой ревизии. Таким образом, нам нужно только загрузить содержимое файла с самой первой ревизии, а затем каждый вывод diff (если есть) для каждой ревизии и выполнить прямую разность, чтобы получить состояние после фиксации.

Объяснение:

1 - в редакции 1 file1.java содержит следующее:

"Content at revision 1 (initial state)"

2 - в редакции 2 этот файл изменен и имеет следующее содержимое:

"Content at revision 1 (initial state)
 Modification at revision 2 (line added)"

3 - в редакции 3 этот файл изменен и имеет следующее содержимое:

"Modification at revision 2 (line added)
 Modification at revision 3 (line added)
 First line from revision 1 was removed"

Если мы получим журналы для file1.java, у нас будет три записи, по одной для каждой модификации (что соответствует rev 1, 2, 3). Для всех трех ревизий мы хотим получить содержимое файла, потому что мы анализируем модификацию кода каждый раз, когда делается коммит (изменение) для исходного файла.Мы знаем, как это сделать простым способом: SVNRepository.getFile (...). Проблема с этим подходом состоит в том, что если у нас есть 1 файл, который был изменен 1000, мы должны загрузить его содержимое 1000 раз (каждый раз для другого числа оборотов). То есть для небольшого проекта со 100 исходными файлами и примерно 1000 модификаций на каждый файл мы должны получить 100 000 разного содержимого !!! Другой подход состоит в том, чтобы получить содержимое файла для самой последней ревизии и для каждой предыдущей ревизии получить вывод diff. Чем мы можем применить вывод diff (в обратном направлении), чтобы получить содержимое файла для всех предыдущих ревизий. То есть мы минимизируем пропускную способность. Это решение, которое я ищу, или, если есть лучшее решение, которое вы готовы внести.

Не могли бы вы помочь мне с реализацией такой функциональности с помощью SVNKit. Было бы очень полезно, если бы вы предоставили некоторый пример короткого кода и / или какие классы и методы я должен использовать, чтобы я мог читать документацию по Java. Любая помощь будет оценена.

Заранее спасибо, Элвис.

1 Ответ

0 голосов
/ 18 сентября 2011

Запустить журнал / историю изменений. Начните с начала проекта и посмотрите на измененные файлы в каждом коммите. Когда вы видите изменение файла / добавление / удаление / копирование / перемещение (вы можете увидеть это в информации о коммите), загрузите содержимое файла для этой ревизии и запомните его при следующем изменении файла. Тогда вы получаете только содержимое файлов при каждом изменении.

Вы видели примеры / учебник по комплекту SVN?

...