/* * Copyright 2015 Shashank Tulsyan <shashaank at neembuu.com>. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package neembuu.uploader.zip.generator; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.io.FileUtils; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.ListBranchCommand; import org.eclipse.jgit.api.PullCommand; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.diff.DiffEntry; import org.eclipse.jgit.internal.storage.file.FileRepository; import org.eclipse.jgit.lib.AbbreviatedObjectId; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectReader; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.RepositoryCache; import org.eclipse.jgit.lib.TextProgressMonitor; import org.eclipse.jgit.treewalk.CanonicalTreeParser; import org.eclipse.jgit.util.FS; /** * The runnable class that will do all the job. * * @author davidepastore */ public class UpdaterGenerator implements Runnable { private File gitDirectory; private File outputDirectory; private final Environment env; private ArrayList<PluginToUpdate> pluginsToUpdate; private boolean diff = false; public UpdaterGenerator(Environment env) { this.env = env; } /** * The Git object. */ private Git git; @Override public void run() { /* File tmpDir = new File(System.getProperty("java.io.tmpdir"), "tmp" + System.currentTimeMillis()); */ /*gitDirectory = new File("C:\\xampp\\htdocs\\nutest"); outputDirectory = new File("C:\\xampp\\htdocs\\nutestoutput");*/ gitDirectory = new File(env.gitDirectory()); outputDirectory = new File(env.outputDirectory()); gitDirectory.mkdirs(); outputDirectory.mkdirs(); if(env.cleanUp()){ deleteAndMkdirGit(); } boolean gitUpdated = init_CheckDir_gitClone(); if (gitUpdated) {} else {System.out.println("No need to update");} generate(); } private void deleteAndMkdirGit(){ FileUtils.deleteQuietly(gitDirectory); gitDirectory.mkdir(); } private void generate(){ System.out.println("Updating plugins zip"); try { NUCompiler compiler = new NUCompiler(gitDirectory, env.modulesFolderName(),env.srcFolderName()); final String[]modules=env.sortedListOfModulesToCompile(); //Compile components in order of dependency for (String module : modules) { compiler.compileDirectory(module); } NUZipFileGenerator zipFileGenerator = new NUZipFileGenerator(env); /*gitDirectory, outputDirectory, modules, env.modulesToCheckForExportibles());*/ //Create the zip files zipFileGenerator.createZipFiles(/*pluginsToUpdate*/); } catch (Exception ex) { Logger.getLogger(UpdaterGenerator.class.getName()).log(Level.SEVERE, null, ex); } } /** * Davide you might notice that I have made functions smaller. * It makes code immensely more readable and you quickly are able * to resume the code from where you left. * Understanding takes lesser time, as number of lines are lesser. * @return */ private boolean init_CheckDir_gitClone(){ //Check if the given directory exists boolean gitUpdated = true; if (RepositoryCache.FileKey.isGitRepository(new File(gitDirectory.getAbsolutePath(), ".git"), FS.DETECTED)) { // Already cloned. Just need to pull a repository here. System.out.println("git pull"); gitUpdated = gitPull(gitDirectory); } else { // Not present or not a Git repository. System.out.println("git clone"); gitClone(gitDirectory); }return gitUpdated; } /** * Clone GIT repository from sourceforge. * * @param gitDirectory The directory of Git. */ private void gitClone(File gitDirectory) { try { git = Git.cloneRepository() .setDirectory(gitDirectory) .setURI(env.gitURI()) //.setURI("http://git.code.sf.net/p/neembuuuploader/gitcode") .setProgressMonitor(new TextProgressMonitor()).call(); for (Ref f : git.branchList().setListMode(ListBranchCommand.ListMode.ALL).call()) { git.checkout().setName(f.getName()).call(); System.out.println("checked out branch " + f.getName() + ". HEAD: " + git.getRepository().getRef("HEAD")); } // try to checkout branches by specifying abbreviated names git.checkout().setName("master").call(); } catch (GitAPIException | IOException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } } /** * Execute git pull command on the given repository. * It populates an ArrayList with all the updated files. * @param localPath The path where the project is. * @return Returns true if you should update plugins, false otherwise. */ private boolean gitPull(File localPath) { try { Repository localRepo = new FileRepository(localPath.getAbsolutePath() + "/.git"); git = new Git(localRepo); if(populateDiff()){ PullCommand pullCmd = git.pull(); pullCmd.call(); return true; } else{ return false; } } catch (GitAPIException | IOException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } return true; } /** * Populate all the files to update, if the system should update. */ private boolean populateDiff() { try { git.fetch().call(); Repository repo = git.getRepository(); ObjectId fetchHead = repo.resolve("FETCH_HEAD^{tree}"); ObjectId head = repo.resolve("HEAD^{tree}"); ObjectReader reader = repo.newObjectReader(); CanonicalTreeParser oldTreeIter = new CanonicalTreeParser(); oldTreeIter.reset(reader, head); CanonicalTreeParser newTreeIter = new CanonicalTreeParser(); newTreeIter.reset(reader, fetchHead); List<DiffEntry> diffs = git.diff().setShowNameAndStatusOnly(true) .setNewTree(newTreeIter) .setOldTree(oldTreeIter) .call(); if (diffs.isEmpty()) { System.out.println("No diff"); return false; }else{ return true; } } catch (GitAPIException | IOException ex) { Logger.getLogger(UpdaterGenerator.class.getName()).log(Level.SEVERE, null, ex); }return true;//assume true } }