Скачивание всех файлов в каждой реорганизации из репозитория SVN с помощью SVNkit - ПОМОГИТЕ

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

Я работаю над проектом в рамках своей дипломной работы. Я пытаюсь подключиться к различным репозиториям проектов с открытым исходным кодом и получить информацию из исходных файлов. Фактически мы анализируем код этих проектов и изменения, внесенные в него с течением времени. Другими словами, мы хотим увидеть, как развивается программное обеспечение, и указать, какие изменения вносятся в него. Следовательно, нам нужно подключиться к репозиторию с помощью 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-документ. Любая помощь будет оценена.

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


person Elvis    schedule 17.09.2011    source источник


Ответы (1)


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

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

person Daniel Von Fange    schedule 17.09.2011
comment
Спасибо за ваш повтор. Я уже видел эти примеры. И я знаю, как получить содержимое файла для конкретной ревизии (SVNRepository.getFile (...)). Моя проблема очень специфическая: допустим, у нас есть файл с ревизией 100000, и он присутствует с 0 ревизии. Мы хотим получать содержимое этого файла для каждой изменяемой ревизии. Как указано в приведенном выше примере: мы хотим, чтобы содержимое file1.java (см. Пример выше) перед первой фиксацией, и содержимое после первой фиксации, и содержимое после второй фиксации. - person Elvis; 18.09.2011
comment
Вот почему вы запускаете журнал / историю ревизий. Начните с начала проекта и посмотрите на измененные файлы в каждой фиксации. Когда вы видите изменение файла, загрузите его содержимое и запомните его в следующий раз, когда увидите это изменение файла. Тогда у вас будет только содержимое файлов при каждом изменении. - person Daniel Von Fange; 18.09.2011
comment
Даниэль еще раз спасибо за ответ и извините за опоздание. У меня есть несколько вопросов: - person Elvis; 25.09.2011
comment
Даниэль еще раз спасибо за ответ и извините за опоздание. У меня несколько вопросов: 1) Что вы имели в виду в начале проекта? Вы имеете в виду первую ревизию проекта? Если да, то как мне найти эту версию? 2) Как обнаружить изменения в файлах? Видя тип пути к записи журнала (в данном случае это SVNLogEntryPath.TYPE_MODIFIED)? (продолжается ...) - person Elvis; 25.09.2011
comment
3) Что делать, если у меня есть проект с 1000 исходными файлами, и каждый файл изменяется примерно 100 раз. В этом случае мне нужно вызвать 100000 SVNRepository.getFile (...), и это не очень эффективно. Я знаю другое решение для минимизации полосы пропускания, получая каждый раз только дельту diff, но проблема все еще существует, для этого должно быть 100000 вызовов. Есть ли какой-либо другой метод, например List ‹Delta› getDeltasForRevisionRange (String path, long startR, long endR). В случае, если такой метод есть, то будет вызываться только 1000 раз. - person Elvis; 25.09.2011
comment
1) Да, первый коммит. В Subversion коммит №1 будет первым. 2) Я так думаю. 3) Не беспокойтесь об этом сейчас. Не стоит тратить лишнюю неделю на кодирование чего-то, что может сэкономить вам 10-20 минут на загрузку проекта. - person Daniel Von Fange; 28.09.2011
comment
Спасибо за повтор. Хорошо, я думаю, что нашел решение на случай, если оно кому-то понадобится. Вот: - person Elvis; 03.10.2011
comment
1) Для проекта в ../../myproject укажите SVNRepository в это место (setLocation ()). - person Elvis; 03.10.2011
comment
2) Получить текущее дерево каталогов. Вы можете обнаружить дерево каталогов, запустив SVNRepository.status (), на их сайте есть очень хороший пример. 3) Загрузите все журналы для всех путей этого проекта (SVNRepository.log (), где начальная версия = 0 и endRevision = -1). 3) Для каждого пути к файлу, который мы получили на втором этапе, загрузите сразу всю ревизию: SVNRepository.getFileRevisions, где первая ревизия может быть 0, а последняя должна быть ревизией, которая имеет журнал (ранее загруженный) того пути, где путь изменен (не УДАЛЕН). Таким образом, нам нужно только установить соединение для каждого файла. - person Elvis; 03.10.2011