esoe
2 years ago
9 changed files with 204 additions and 155 deletions
@ -1 +1 @@ |
|||||||
Subproject commit 0ab4af2faa92b28085e13cf2789ec1652cb7f0a9 |
Subproject commit d7baa10c82b3cca734c172b3428850454f3c6c70 |
@ -0,0 +1,161 @@ |
|||||||
|
package ru.molokoin.sourceListener.git; |
||||||
|
|
||||||
|
import java.io.File; |
||||||
|
import java.io.IOException; |
||||||
|
import java.nio.file.Path; |
||||||
|
import java.nio.file.Paths; |
||||||
|
|
||||||
|
import org.eclipse.jgit.api.CheckoutCommand; |
||||||
|
import org.eclipse.jgit.api.Git; |
||||||
|
import org.eclipse.jgit.api.PullCommand; |
||||||
|
import org.eclipse.jgit.api.errors.CheckoutConflictException; |
||||||
|
import org.eclipse.jgit.api.errors.GitAPIException; |
||||||
|
import org.eclipse.jgit.api.errors.InvalidRefNameException; |
||||||
|
import org.eclipse.jgit.api.errors.InvalidRemoteException; |
||||||
|
import org.eclipse.jgit.api.errors.NoHeadException; |
||||||
|
import org.eclipse.jgit.api.errors.RefAlreadyExistsException; |
||||||
|
import org.eclipse.jgit.api.errors.RefNotFoundException; |
||||||
|
import org.eclipse.jgit.errors.TransportException; |
||||||
|
import org.eclipse.jgit.lib.Repository; |
||||||
|
import org.eclipse.jgit.revwalk.RevCommit; |
||||||
|
|
||||||
|
/** |
||||||
|
* Интерфейс взаимодействия с git |
||||||
|
* предусматривает локальные и удаленные операции |
||||||
|
* В качестве аргументов по большей части передается репозитарий, |
||||||
|
* так же и возвращают методы обработанные репозитарии с уже проведенными изменениями |
||||||
|
*/ |
||||||
|
public interface GitServiceFace { |
||||||
|
|
||||||
|
/** |
||||||
|
* Метод предусматривает наличие в классе реализации механизма создания новых репозитариев |
||||||
|
* !!! создавать новые репозитарии под текущие задачи не нужно |
||||||
|
* @param localPath |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static Repository create(String localPath){ |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Метод клонирует удаленный репозитарий, и размещает исходники на локальном устройстве |
||||||
|
* @param gitLink |
||||||
|
* @param localPath |
||||||
|
* @return |
||||||
|
* @throws GitAPIException |
||||||
|
* @throws TransportException |
||||||
|
* @throws InvalidRemoteException |
||||||
|
* @throws IOException |
||||||
|
*/ |
||||||
|
public static Git copy(String gitLink, String localPath) throws IOException, InvalidRemoteException, TransportException, GitAPIException{ |
||||||
|
// подготовка локальных директорий для клонирования репозитария
|
||||||
|
File localFile = new File(localPath); |
||||||
|
if(!localFile.delete()) { |
||||||
|
throw new IOException("!!! файл уже существует: " + localPath + " ..."); |
||||||
|
} |
||||||
|
// непосредственно клонирование репозитария
|
||||||
|
System.out.println("Клонирование репозитария: " + gitLink); |
||||||
|
System.out.println(); |
||||||
|
Git result = Git.cloneRepository() |
||||||
|
.setURI(gitLink) |
||||||
|
.setDirectory(localFile) |
||||||
|
.setCloneAllBranches(true) |
||||||
|
.call(); |
||||||
|
System.out.println("Копия репозитария создана в директории:\n>>>>>>> " |
||||||
|
+ result.getRepository().getDirectory()); |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Метод открывает размещенный по указанному пути репозитарий, |
||||||
|
* возвращает его в готовом, для обработки виде. |
||||||
|
* Далее: |
||||||
|
* Git git = new Git(repo); |
||||||
|
* и можно формировать команды для Гита |
||||||
|
* @param localPath |
||||||
|
* @return |
||||||
|
* @throws IOException |
||||||
|
*/ |
||||||
|
public static Git open(String localPath) throws IOException{ |
||||||
|
Path repoPath = Paths.get(localPath); |
||||||
|
Git git = Git.open(repoPath.toFile()); |
||||||
|
return git; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Закрывает полученную Git "команду"/командную строку |
||||||
|
* @param git |
||||||
|
*/ |
||||||
|
public static void close(Git git){ |
||||||
|
git.close(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Метод сравнивает комиты в локальном репозитарии с данными удаленной ветки, |
||||||
|
* в случае обнаружения разночтений возвращает true |
||||||
|
* если список комитов остался прежним, возвращает false |
||||||
|
* {Получили данные о локальных комитах -> подгрузили удаленные комиты -> прочитали данные удаленных комитов -> сравнили локальные с удаленными -> вернули ответ} |
||||||
|
* !!! возможно стоит разбить на отдельные методы, но для текущей задачи это не нужно ... |
||||||
|
* @throws GitAPIException |
||||||
|
* @throws NoHeadException |
||||||
|
* @throws IOException |
||||||
|
*/ |
||||||
|
public static boolean isChenged(Git git) throws NoHeadException, GitAPIException, IOException{ |
||||||
|
long old = 0; |
||||||
|
long last = 0; |
||||||
|
|
||||||
|
/** |
||||||
|
* Определяем время последнего комита в локальном репозитарии |
||||||
|
*/ |
||||||
|
System.out.println("Определяем время последнего комита в локальном репозитарии ... "); |
||||||
|
Iterable<RevCommit> list = git.log().all().call(); |
||||||
|
for (RevCommit c : list){ |
||||||
|
long commitTime = c.getCommitTime(); |
||||||
|
if (old < commitTime){ |
||||||
|
old = commitTime; |
||||||
|
} |
||||||
|
} |
||||||
|
System.out.println("Время последнего комита в локальном репозитарии: " + old); |
||||||
|
|
||||||
|
//получаем сведения об удаленных комитах
|
||||||
|
System.out.println("получаем сведения об удаленных комитах ..."); |
||||||
|
System.out.println("Текущая ветка удаленного репозитария: " + git.fetch().getRemote()); |
||||||
|
git.fetch().call(); |
||||||
|
|
||||||
|
//Определяем время последнего комита в удаленном репозитарии
|
||||||
|
System.out.println("Определяем время последнего комита в локальном репозитарии ... "); |
||||||
|
list = git.log().all().call(); |
||||||
|
for (RevCommit c : list){ |
||||||
|
long commitTime = c.getCommitTime(); |
||||||
|
if (last < commitTime){ |
||||||
|
last = commitTime; |
||||||
|
} |
||||||
|
} |
||||||
|
System.out.println("Время последнего комита в удаленном репозитарии: " + last); |
||||||
|
//возвращает true, если время различается
|
||||||
|
return (old != last); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Обновляет локальный репозитарий, синхронизирует с удаленным |
||||||
|
* !!! в рамках текущей задачи: |
||||||
|
* это наверно и не нужно, достаточно увидеть, что на удаленном репозитарии произошли изменения и отреагировать на них, загружать еще одну версию удаленного репозитария для этого не обязательно, достаточно только сведений о комитах. |
||||||
|
* git pull |
||||||
|
* @param git |
||||||
|
* @return |
||||||
|
* @throws GitAPIException |
||||||
|
* @throws CheckoutConflictException |
||||||
|
* @throws InvalidRefNameException |
||||||
|
* @throws RefNotFoundException |
||||||
|
* @throws RefAlreadyExistsException |
||||||
|
*/ |
||||||
|
public static Git update(Git git) throws RefAlreadyExistsException, RefNotFoundException, InvalidRefNameException, CheckoutConflictException, GitAPIException{ |
||||||
|
System.out.println("забираем обновления с удаленного репозитария ..."); |
||||||
|
CheckoutCommand checkout = git.checkout(); |
||||||
|
checkout.setName("master"); |
||||||
|
checkout.call(); |
||||||
|
PullCommand pullCmd = git.pull(); |
||||||
|
pullCmd.call(); |
||||||
|
return git; |
||||||
|
} |
||||||
|
} |
@ -1,55 +0,0 @@ |
|||||||
package ru.molokoin.sourceListener.git; |
|
||||||
|
|
||||||
import java.io.File; |
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
import org.eclipse.jgit.api.Git; |
|
||||||
import org.eclipse.jgit.api.errors.GitAPIException; |
|
||||||
import org.eclipse.jgit.api.errors.InvalidRemoteException; |
|
||||||
import org.eclipse.jgit.api.errors.TransportException; |
|
||||||
import org.eclipse.jgit.lib.Repository; |
|
||||||
import org.eclipse.jgit.storage.file.FileRepositoryBuilder; |
|
||||||
|
|
||||||
public class RepoCrafter { |
|
||||||
|
|
||||||
public static Repository open() throws IOException { |
|
||||||
FileRepositoryBuilder builder = new FileRepositoryBuilder(); |
|
||||||
return builder |
|
||||||
.readEnvironment() // scan environment GIT_* variables
|
|
||||||
.findGitDir() // scan up the file system tree
|
|
||||||
.build(); |
|
||||||
} |
|
||||||
|
|
||||||
public static Repository create() throws IOException { |
|
||||||
// prepare a new folder
|
|
||||||
File localPath = File.createTempFile("TestGitRepository", ""); |
|
||||||
if(!localPath.delete()) { |
|
||||||
throw new IOException("Could not delete temporary file " + localPath); |
|
||||||
} |
|
||||||
|
|
||||||
// create the directory
|
|
||||||
Repository repository = FileRepositoryBuilder.create(new File(localPath, ".git")); |
|
||||||
repository.create(); |
|
||||||
|
|
||||||
return repository; |
|
||||||
} |
|
||||||
public static Repository copy(String gitLink, String localPath) throws IOException, InvalidRemoteException, TransportException, GitAPIException{ |
|
||||||
// prepare a new folder for the cloned repository
|
|
||||||
File localFile = new File(localPath); |
|
||||||
if(!localFile.delete()) { |
|
||||||
throw new IOException("Could not delete temporary file " + localPath); |
|
||||||
} |
|
||||||
|
|
||||||
// then clone
|
|
||||||
System.out.println("Cloning from " + gitLink + " to " + localPath); |
|
||||||
Git result = Git.cloneRepository() |
|
||||||
.setURI(gitLink) |
|
||||||
.setDirectory(localFile) |
|
||||||
.setCloneAllBranches(true) |
|
||||||
//.setProgressMonitor(new SimpleProgressMonitor())
|
|
||||||
.call(); |
|
||||||
// Note: the call() returns an opened repository already which needs to be closed to avoid file handle leaks!
|
|
||||||
System.out.println("Having repository: " + result.getRepository().getDirectory()); |
|
||||||
return result.getRepository(); |
|
||||||
} |
|
||||||
} |
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in new issue