esoe
2 years ago
9 changed files with 204 additions and 155 deletions
@ -1 +1 @@
@@ -1 +1 @@
|
||||
Subproject commit 0ab4af2faa92b28085e13cf2789ec1652cb7f0a9 |
||||
Subproject commit d7baa10c82b3cca734c172b3428850454f3c6c70 |
@ -0,0 +1,161 @@
@@ -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 @@
@@ -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