Вот моя проблема:
Я работаю над проектом в рамках своей дипломной работы. Я пытаюсь подключиться к различным репозиториям проектов с открытым исходным кодом и получить информацию из исходных файлов. Фактически мы анализируем код этих проектов и изменения, внесенные в него с течением времени. Другими словами, мы хотим увидеть, как развивается программное обеспечение, и указать, какие изменения вносятся в него. Следовательно, нам нужно подключиться к репозиторию с помощью 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, а также мы хотим проанализировать, как изменяется (основная) структура каталогов.
Четвертая фиксация копирует файл file3.java в каталог dirA / dirC / и вносит изменения в этот файл. Таким же образом мы хотим проанализировать, как операция копирования изменила структуру каталогов, и проанализировать содержимое file3.java до и после фиксации.
Поскольку мы ориентированы на код, мы хотим получить все исходные файлы из репозитория и все их версии. Для каждой ревизии конкретного файла нам нужно содержимое текущей ревизии (начиная с самой первой ревизии) и предыдущей до последней ревизии. Поскольку нет необходимости изменять файл при каждой фиксации (он может быть скопирован или удален), нет необходимости загружать дубликат файла с таким же содержимым.
Я знаю, что есть способ получить исходное состояние файла, только имея его содержимое в последней ревизии, рекурсивно выполняя обратное сравнение его содержимого. Например, имея содержимое dirA / file1.java в последней ревизии (созданное во время второй фиксации) и имея вывод diff, мы можем получить состояние файла, которое было до этой ревизии (перед второй фиксацией). Таким образом, нет необходимости загружать содержимое каждого файла для каждой ревизии. Таким образом, нам нужно только загрузить содержимое файла в самой первой ревизии, а затем каждый вывод 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, у нас будет три записи, по одной для каждой модификации (что соответствует версиям 1, 2, 3). Для всех трех ревизий мы хотим получить содержимое файла, потому что мы анализируем модификацию кода каждый раз, когда выполняется фиксация (изменение) исходного файла. Мы знаем, как это сделать просто: SVNRepository.getFile (...). Проблема с этим подходом заключается в том, что если у нас есть 1 файл, который был изменен 1000, мы должны загрузить его содержимое 1000 раз (каждый раз для другого номера версии). То есть для небольшого проекта со 100 исходными файлами и примерно 1000 модификаций на каждый файл мы должны получить 100 000 различного содержимого !!! Другой подход - получить содержимое файла для самой последней ревизии и для каждой предыдущей ревизии получить вывод diff. Затем мы можем применить вывод diff (в обратном направлении), чтобы получить содержимое файла для всех предыдущих ревизий. То есть мы минимизируем пропускную способность. Это решение, которое я ищу, или, если есть лучшее решение, вы с удовольствием внесете свой вклад.
Не могли бы вы помочь мне, как реализовать такую функциональность с помощью SVNKit. Было бы очень полезно, если бы вы предоставили небольшой пример кода и / или какие классы и методы я должен использовать, чтобы я мог прочитать java-документ. Любая помощь будет оценена.
Заранее спасибо, Элвис.