import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.logging.Log; import org.apache.maven.plugins.annotations.Component; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.project.MavenProject; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.storage.file.FileRepositoryBuilder; /** * Maven plugin to create property with YaCy release number, * a 4 digit number based on commits to the Git repository * * @phase initialize */ @Mojo(name = "create") public class GitRevMavenTask extends AbstractMojo { @Component private MavenProject project; /** * Name of the buildNumber property * * parameter expression="${maven.buildNumber.buildNumberPropertyName}" * default-value="releaseNr" */ @Parameter private String branchPropertyName = "branch"; @Parameter private String buildNumberPropertyName = "releaseNr"; @Parameter private String commitDatePropertyName = "DSTAMP"; Log log = this.getLog(); public void setBuildNumberPropertyName(String revprop) { this.buildNumberPropertyName = revprop; } public void setCommitDatePropertyName(String dateprop) { this.commitDatePropertyName = dateprop; } @Override public void execute() throws MojoExecutionException { String branch = null; String revision = null; String lastTag = null; String commitDate = null; Repository repo = null; Git git = null; RevWalk walk = null; try { final File src = project.getBasedir(); // set Git root path to project root repo = new FileRepositoryBuilder().readEnvironment() .findGitDir(src).build(); branch = repo.getBranch(); branch = "master".equals(branch) ? "" : "_" + branch; final ObjectId head = repo.resolve("HEAD"); git = new Git(repo); final List<Ref> tags = git.tagList().call(); walk = new RevWalk(repo); final RevCommit headCommit = walk.parseCommit(head); final SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd"); commitDate = df.format(headCommit.getAuthorIdent().getWhen()); walk.markStart(headCommit); int distance = 0; /* Peel known tags */ final List<Ref> peeledTags = new ArrayList<>(); for (final Ref tag : tags) { peeledTags.add(repo.peel(tag)); } /* Look for the last tag commit and calculate distance with the HEAD commit */ for (final RevCommit commit : walk) { for (final Ref tag : peeledTags) { if (commit.equals(tag.getPeeledObjectId()) || commit.equals(tag.getObjectId())) { lastTag = commit.getShortMessage(); break; } } if (lastTag != null || distance++ > 90999) { break; } } walk.dispose(); if (lastTag == null) { revision = "0000"; } else { revision = Integer.toString(distance + 9000); } } catch (final IOException e) { e.printStackTrace(); } catch (GitAPIException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { /* In all cases, properly release resources */ if(walk != null) { walk.close(); } if(git != null) { git.close(); } if(repo != null) { repo.close(); } } if (project != null) { project.getProperties().put(this.branchPropertyName, branch); log.info("GitrevMavenTask: set property " + this.branchPropertyName + "='" + branch + "'"); project.getProperties().put(this.buildNumberPropertyName, revision); log.info("GitrevMavenTask: set property " + this.buildNumberPropertyName + "=" + revision); project.getProperties().put(this.commitDatePropertyName, commitDate); log.info("GitrevMavenTask: set property " + this.commitDatePropertyName + "=" + commitDate); } else { log.error("GitrevMavenTask: no Maven project"); System.out.println(this.branchPropertyName + "=" + branch); System.out.println(this.buildNumberPropertyName + "=" + revision); System.out.println(this.commitDatePropertyName + "=" + commitDate); } } }