From f7c69c206e9e6fee99315f795ef230c29be7c621 Mon Sep 17 00:00:00 2001 From: esoe Date: Sat, 12 Nov 2022 18:06:04 +0300 Subject: [PATCH] qq --- out/repos | 2 +- .../molokoin/sourceListener/GitListener.java | 139 +++++---------- .../sourceListener/git/GitServiceFace.java | 161 ++++++++++++++++++ .../sourceListener/git/RepoCrafter.java | 55 ------ .../net/{Service.java => NetService.java} | 2 +- .../molokoin/sourceListener/GitListener.class | Bin 7245 -> 5473 bytes .../sourceListener/git/GitServiceFace.class | Bin 0 -> 5608 bytes .../sourceListener/git/RepoCrafter.class | Bin 2880 -> 0 bytes .../net/{Service.class => NetService.class} | Bin 2678 -> 2687 bytes 9 files changed, 204 insertions(+), 155 deletions(-) create mode 100644 src/main/java/ru/molokoin/sourceListener/git/GitServiceFace.java delete mode 100644 src/main/java/ru/molokoin/sourceListener/git/RepoCrafter.java rename src/main/java/ru/molokoin/sourceListener/net/{Service.java => NetService.java} (95%) create mode 100644 target/classes/ru/molokoin/sourceListener/git/GitServiceFace.class delete mode 100644 target/classes/ru/molokoin/sourceListener/git/RepoCrafter.class rename target/classes/ru/molokoin/sourceListener/net/{Service.class => NetService.class} (82%) diff --git a/out/repos b/out/repos index 0ab4af2..d7baa10 160000 --- a/out/repos +++ b/out/repos @@ -1 +1 @@ -Subproject commit 0ab4af2faa92b28085e13cf2789ec1652cb7f0a9 +Subproject commit d7baa10c82b3cca734c172b3428850454f3c6c70 diff --git a/src/main/java/ru/molokoin/sourceListener/GitListener.java b/src/main/java/ru/molokoin/sourceListener/GitListener.java index 95c5ef9..c068bc9 100644 --- a/src/main/java/ru/molokoin/sourceListener/GitListener.java +++ b/src/main/java/ru/molokoin/sourceListener/GitListener.java @@ -4,42 +4,29 @@ import java.io.BufferedInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.net.URI; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Collection; import java.util.Enumeration; -import java.util.Set; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import org.eclipse.jgit.api.CheckoutCommand; -import org.eclipse.jgit.api.FetchCommand; import org.eclipse.jgit.api.Git; -import org.eclipse.jgit.api.LsRemoteCommand; import org.eclipse.jgit.api.PullCommand; -import org.eclipse.jgit.api.Status; 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.diff.DiffEntry; -import org.eclipse.jgit.lib.Ref; -import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.revwalk.RevCommit; -import org.eclipse.jgit.transport.FetchResult; import com.fasterxml.jackson.core.exc.StreamReadException; import com.fasterxml.jackson.databind.DatabindException; import com.fasterxml.jackson.databind.ObjectMapper; -import ru.molokoin.sourceListener.git.RepoCrafter; -import ru.molokoin.sourceListener.net.Service; +import ru.molokoin.sourceListener.git.GitServiceFace; +import ru.molokoin.sourceListener.net.NetService; import ru.molokoin.sourceListener.opt.Options; public class GitListener { public Options opt; public String optionsPath = "options-home.json"; - private Repository repo; + public GitListener(){ try { opt = readOptions(); @@ -54,48 +41,14 @@ public class GitListener { e.printStackTrace(); } } + /** * Метод запускает бесконечный цикл проверки обновлений в репозитарии. */ public void live(){ //TODO live() } - /** - * Метод инициирует репозиторий / клонирует репозиторий - * по сути не нужный метод, реализующий одну команду. - * в коде надо использовать сразу клонирующую команду. - */ - public void initRepo(){ - try { - setRepo(RepoCrafter.copy(opt.getGitLink(), opt.getGitLocalPath())); - //repo.close(); - } catch (InvalidRemoteException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (TransportException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (GitAPIException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - /** - * Открываем репозитарий, ранее склонированный - * по хорошему делать статическим методом, возвращающим открытый репозитарий - * @throws IOException - */ - public void openRepo() throws IOException{ - Path repoPath = Paths.get("C:\\Users\\Strannik\\Documents\\esoe\\code\\sourceListener\\out\\repos"); - try (Git git = Git.open(repoPath.toFile())) { - this.repo = git.getRepository(); - git.close(); - } - - } + /** * Извлечение данных из options.json * @return @@ -109,9 +62,11 @@ public class GitListener { opt = mapper.readValue(new File(optionsPath), Options.class); return opt; } + public Options getOpt() { return opt; } + /** * распаковка архива */ @@ -135,57 +90,45 @@ public class GitListener { } } } - public void setRepo(Repository repo) { - this.repo = repo; - } - public Repository getRepo() { - return repo; - } - public static void main(String[] args) throws InvalidRemoteException, TransportException, GitAPIException { + + public static void main(String[] args) throws InvalidRemoteException, TransportException, GitAPIException, IOException { + //создаем объект класса, читаем файл с опциями GitListener ear = new GitListener(); - // try { - // Service.download(ear.opt.getZipLink(), ear.opt.getDownloadPath());; - // ear.extract(); - // } catch (IOException e) { - // System.out.println(e.getMessage()); - // } + Git git; - //клонируем репозитарий - // ear.initRepo(); - // Git git = new Git(ear.getRepo()); - - //открываем репозитарий из локального хранилища - try { - ear.openRepo(); - } catch (IOException e) { - System.out.println("Epic fail with >>>>> openRepo() ... "); - e.printStackTrace(); + /** + * инициализируем git: открываем существующий репозиратий или клонируем новый с удаленного репозитария + */ + Boolean isRepoExists = false; + if(isRepoExists){ + //открываем существующий репозиторий + git = GitServiceFace.open(ear.opt.getGitLocalPath()); + } else{ + //клонируем репозитарий + git = GitServiceFace.copy(ear.getOpt().getGitLink(), ear.getOpt().getGitLocalPath()); } - Git git = new Git(ear.getRepo()); - //получаем сведения об удаленных комитах - git.fetch().call(); - //System.out.println(">>>>>>>>>>>>>>>>>>>" + git.fetch().getRemote()); - Status status = git.status().call(); - System.out.println("Git Change: " + status.getChanged()); - System.out.println("Git Modified: " + status.getModified()); - System.out.println("Git UncommittedChanges: " + status.getUncommittedChanges()); - System.out.println("Git Untracked: " + status.getUntracked()); + Boolean isChanged = GitServiceFace.isChenged(git); + //если удаленная версия отличается от локальной, обновляем локальный репозитарий + if (isChanged){ + //забираем обновления с удаленного репозитария + System.out.println("забираем обновления с удаленного репозитария ..."); + CheckoutCommand checkout = git.checkout(); + checkout.setName("master"); + checkout.call(); + PullCommand pullCmd = git.pull(); + pullCmd.call(); + git.close(); + } - //выводим список комитов - try { - for (RevCommit c : git.log().all().call()) - System.out.println(c + ": " + c.getShortMessage()); - } catch (IOException e) { - System.out.println("git.log().all().call() >>>>>>> " + e.getMessage()); - e.printStackTrace(); + if (isChanged){ + //скачиваем и извлекаем архив репозитория + try { + NetService.download(ear.opt.getZipLink(), ear.opt.getDownloadPath()); + ear.extract(); + } catch (IOException e) { + System.out.println(e.getMessage()); + } } - //забираем обновления с удаленного репозитария - // CheckoutCommand checkout = git.checkout(); - // checkout.setName("master"); - // checkout.call(); - // PullCommand pullCmd = git.pull(); - // pullCmd.call(); - git.close(); } } diff --git a/src/main/java/ru/molokoin/sourceListener/git/GitServiceFace.java b/src/main/java/ru/molokoin/sourceListener/git/GitServiceFace.java new file mode 100644 index 0000000..6cbcfaf --- /dev/null +++ b/src/main/java/ru/molokoin/sourceListener/git/GitServiceFace.java @@ -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 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; + } +} diff --git a/src/main/java/ru/molokoin/sourceListener/git/RepoCrafter.java b/src/main/java/ru/molokoin/sourceListener/git/RepoCrafter.java deleted file mode 100644 index eab691e..0000000 --- a/src/main/java/ru/molokoin/sourceListener/git/RepoCrafter.java +++ /dev/null @@ -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(); - } -} \ No newline at end of file diff --git a/src/main/java/ru/molokoin/sourceListener/net/Service.java b/src/main/java/ru/molokoin/sourceListener/net/NetService.java similarity index 95% rename from src/main/java/ru/molokoin/sourceListener/net/Service.java rename to src/main/java/ru/molokoin/sourceListener/net/NetService.java index 1b1d5a5..10a18be 100644 --- a/src/main/java/ru/molokoin/sourceListener/net/Service.java +++ b/src/main/java/ru/molokoin/sourceListener/net/NetService.java @@ -7,7 +7,7 @@ import java.net.http.HttpResponse; import java.nio.file.Path; import java.nio.file.StandardOpenOption; -public class Service { +public class NetService { /** * Метод cкачивает файл c удаленного ресурса и размещает в указанной папке на локальном устройстве * @param sourceLink diff --git a/target/classes/ru/molokoin/sourceListener/GitListener.class b/target/classes/ru/molokoin/sourceListener/GitListener.class index 65d036f78efe7ce5a6123246637c305e87ff5489..19c9fee5f847d9a41e1fbf9a9b268158bcb8b5dc 100644 GIT binary patch literal 5473 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 aXBP$(9CC(U#WJ>=SystFA?rwq(Ebm`veSP6 literal 7245 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 OrF{9jhMJVAJ^uyqTTglb diff --git a/target/classes/ru/molokoin/sourceListener/git/GitServiceFace.class b/target/classes/ru/molokoin/sourceListener/git/GitServiceFace.class new file mode 100644 index 0000000000000000000000000000000000000000..ac154e61fd4a85b3df58ff0f4fc86f7cc996c41a GIT binary patch literal 5608 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 GpZ^6%X*VPQ literal 0 HcmV?d00001 diff --git a/target/classes/ru/molokoin/sourceListener/git/RepoCrafter.class b/target/classes/ru/molokoin/sourceListener/git/RepoCrafter.class deleted file mode 100644 index eef5fe06b179d7f2eea0f49739027a37998015d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2880 zcma)8YgZFj6x|n*Nzy?eh!3T5Uh~H?>{eH*nzN)ov0INNLY@%kxS1?Z_=E#r9d>{CQWh!uhD_R4CM%6ah26Gh3;45^?|LiT9JzcaDKoz1I#~@-f#w1k z%QZ$u*H<*`7C2eqD@zyVyfo%4TN+pRP>Bf~59Ta8CA|om5mt}AI`&~dd3(}KU3Qi& z&vnw$VWxT>hH}u%RyrI|&JO4}sGLRSEGIQ=`IoFhpr>>kLW980SruGBEBs4OpuaK? z+hb>L>XL-(%MhLxXquE+pTRabhHzW}5ya7EWXD6pGnzZE?9HsN##gVb>k6|1;kQur<_MQ_earLjWWjA0!| za8;mp%l_@_A%Yi>&~Q!QP=(w#myQa-LJr%iY{yK0frq^r9R=#G7lgp!N)c}M$n@4v z_-1nHx|u1}f6~pY2n?4e`w^nq2J(Q0n*x0myUdJbNY8Vs{j#j%lf19i}+l~7(*T6<-S#EPsd^-_{p7_Y(9@cO29 zJh8&Ioz^jnBn!sPvEQ_;AJQ0$&!=B$rUyb`Mb!`4uET3uq!nr8Lq6w2^_1|3)Sf;U~$D6prvdv2W=J<%fnJP-EQWaHWzNOPdal2_jG_{`(t`cTJ5_?TzKLbL@AJ}imMJkR-4M!ae+ zt7G1%&T~9t2cPTsLR}#B^RleXtCsMUj<4|zsdJ@_dSj`7l^Qi=z?Q|keMw#D6|Jq* zE`qC|&Xd`kO-Z&^b_SI(g_k{KqVNF{m^7-}r}*j7quk>#C~SVa0JVJMw*{XXM+X0S zJ7H(XDnh^VrG_^Z3d=w}p5VJ4Y~X)AM`7$j19vs@UAby1xVgm{uM3|W- zOkxTz6|(a$;ns5guENo|ika(ORqztl?IPaa@M?iZDxh&YI>)u*dL9c8kS4h-ovhU6 z@lGBe+$dRmLW}M^KFj0FfIhdY@dn*K9wcy_fZGT*&R-XX(M|RCkf1>tCkVU`)0~^Z xDJ+w+N<&9L0pH>tM