All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.danielflower.mavenplugins.gitlog.GenerateMojo Maven / Gradle / Ivy

package com.github.danielflower.mavenplugins.gitlog;

import com.github.danielflower.mavenplugins.gitlog.filters.CommitFilter;
import com.github.danielflower.mavenplugins.gitlog.filters.CommiterFilter;
import com.github.danielflower.mavenplugins.gitlog.renderers.*;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * Goal which generates a changelog based on commits made to the current git repo.
 */
@Mojo(
		name = "generate",
		defaultPhase = LifecyclePhase.PREPARE_PACKAGE,
		aggregator = true // the plugin should only run once against the aggregator pom
)
public class GenerateMojo extends AbstractMojo {

	/**
	 * The directory to put the reports in.  Defaults to the project build directory (normally target).
	 */
	@Parameter(property = "project.build.directory")
	private File outputDirectory;

	/**
	 * The title of the reports. Defaults to: ${project.name} v${project.version} changelog
	 */
	@Parameter(defaultValue = "${project.name} v${project.version} changelog")
	private String reportTitle;

	/**
	 * If true, then a plain text changelog will be generated.
	 */
	@Parameter(defaultValue = "true")
	private boolean generatePlainTextChangeLog;

	/**
	 * The filename of the plain text changelog, if generated.
	 */
	@Parameter(defaultValue = "changelog.txt")
	private String plainTextChangeLogFilename;


	/**
	 * If true, then a markdown changelog will be generated.
	 */
	@Parameter(defaultValue = "false")
	private boolean generateMarkdownChangeLog;

	/**
	 * The filename of the markdown changelog, if generated.
	 */
	@Parameter(defaultValue = "changelog.md")
	private String markdownChangeLogFilename;

	/**
	 * If true, then a simple HTML changelog will be generated.
	 */
	@Parameter(defaultValue = "true")
	private boolean generateSimpleHTMLChangeLog;

	/**
	 * The filename of the simple HTML changelog, if generated.
	 */
	@Parameter(defaultValue = "changelog.html")
	private String simpleHTMLChangeLogFilename;

	/**
	 * If true, then an HTML changelog which contains only a table element will be generated.
	 * This incomplete HTML page is suitable for inclusion in other webpages, for example you
	 * may want to embed it in a wiki page.
	 */
	@Parameter(defaultValue = "false")
	private boolean generateHTMLTableOnlyChangeLog;

	/**
	 * The filename of the HTML table changelog, if generated.
	 */
	@Parameter(defaultValue = "changelogtable.html")
	private String htmlTableOnlyChangeLogFilename;

	/**
	 * If true, then a JSON changelog will be generated.
	 */
	@Parameter(defaultValue = "true")
	private boolean generateJSONChangeLog;

	/**
	 * The filename of the JSON changelog, if generated.
	 */
	@Parameter(defaultValue = "changelog.json")
	private String jsonChangeLogFilename;

	/**
	 * If true, the changelog will be printed to the Maven build log during packaging.
	 */
	@Parameter(defaultValue = "false")
	private boolean verbose;

	/**
	 * Used to create links to your issue tracking system for HTML reports. If unspecified, it will try to use the value
	 * specified in the issueManagement section of your project's POM.  The following values are supported:
	 * a value containing the string "github" for the GitHub Issue tracking software;
	 * a value containing the string "jira" for Jira tracking software.
	 * Any other value will result in no links being made.
	 */
	@Parameter(property = "project.issueManagement.system")
	private String issueManagementSystem;

	/**
	 * Used to create links to your issue tracking system for HTML reports. If unspecified, it will try to use the value
	 * specified in the issueManagement section of your project's POM.
	 */
	@Parameter(property = "project.issueManagement.url")
	private String issueManagementUrl;

	/**
	 * Regexp pattern to extract the number from the message.
	 * 

* The default is: "Bug (\\d+)". * Group 1 (the number) is used in links, so "?:" must be used any non relevant group, * ex.: * (?:Bug|UPDATE|FIX|ADD|NEW|#) ?#?(\d+) */ @Parameter(defaultValue = "Bug (\\d+)") private String bugzillaPattern; /** * Used to set date format in log messages. */ @Parameter(defaultValue = "yyyy-MM-dd HH:mm:ss Z") private String dateFormat; /** * If true, the changelog will include the full git message rather that the short git message */ @Parameter(defaultValue = "false") private boolean fullGitMessage; /** * Include in the changelog the commits after this parameter value. */ @Parameter(defaultValue = "1970-01-01 00:00:00.0 AM") private Date includeCommitsAfter; /** * Exclude in the changelog all commits by a given commiter */ @Parameter private List excludeCommiters; public void execute() throws MojoExecutionException, MojoFailureException { getLog().info("Generating changelog in " + outputDirectory.getAbsolutePath() + " with title " + reportTitle); File f = outputDirectory; if (!f.exists()) { f.mkdirs(); } List renderers; try { renderers = createRenderers(); } catch (IOException e) { getLog().warn("Error while setting up gitlog renderers. No changelog will be generated.", e); return; } List commitFilters = new ArrayList(Defaults.COMMIT_FILTERS); if (excludeCommiters != null && !excludeCommiters.isEmpty()) { commitFilters.add(new CommiterFilter(excludeCommiters)); } Generator generator = new Generator(renderers, commitFilters, getLog()); try { generator.openRepository(); } catch (IOException e) { getLog().warn("Error opening git repository. Is this Maven project hosted in a git repository? " + "No changelog will be generated.", e); return; } catch (NoGitRepositoryException e) { getLog().warn("This maven project does not appear to be in a git repository, " + "therefore no git changelog will be generated."); return; } if (!"".equals(dateFormat)) { Formatter.setFormat(dateFormat, getLog()); } try { generator.generate(reportTitle, includeCommitsAfter); } catch (IOException e) { getLog().warn("Error while generating changelog. Some changelogs may be incomplete or corrupt.", e); } } private List createRenderers() throws IOException { ArrayList renderers = new ArrayList(); if (generatePlainTextChangeLog) { renderers.add(new PlainTextRenderer(getLog(), outputDirectory, plainTextChangeLogFilename, fullGitMessage)); } if (generateSimpleHTMLChangeLog || generateHTMLTableOnlyChangeLog || generateMarkdownChangeLog) { MessageConverter messageConverter = getCommitMessageConverter(); if (generateSimpleHTMLChangeLog) { renderers.add(new SimpleHtmlRenderer(getLog(), outputDirectory, simpleHTMLChangeLogFilename, fullGitMessage, messageConverter, false)); } if (generateHTMLTableOnlyChangeLog) { renderers.add(new SimpleHtmlRenderer(getLog(), outputDirectory, htmlTableOnlyChangeLogFilename, fullGitMessage, messageConverter, true)); } if (generateMarkdownChangeLog) { renderers.add(new MarkdownRenderer(getLog(), outputDirectory, markdownChangeLogFilename, fullGitMessage, messageConverter)); } } if (generateJSONChangeLog) { renderers.add(new JsonRenderer(getLog(), outputDirectory, jsonChangeLogFilename, fullGitMessage)); } if (verbose) { renderers.add(new MavenLoggerRenderer(getLog())); } return renderers; } private MessageConverter getCommitMessageConverter() { getLog().debug("Trying to load issue tracking info: " + issueManagementSystem + " / " + issueManagementUrl); MessageConverter converter = null; try { if (issueManagementUrl != null && issueManagementUrl.contains("://")) { String system = ("" + issueManagementSystem).toLowerCase(); if (system.toLowerCase().contains("jira")) { converter = new JiraIssueLinkConverter(getLog(), issueManagementUrl); } else if (system.toLowerCase().contains("github")) { converter = new GitHubIssueLinkConverter(getLog(), issueManagementUrl); } else if (system.toLowerCase().contains("bugzilla")) { converter = new BugzillaIssueLinkConverter(getLog(), issueManagementUrl, bugzillaPattern); } } } catch (Exception ex) { getLog().warn("Could not load issue management system information; no HTML links will be generated.", ex); } if (converter == null) { converter = new NullMessageConverter(); } getLog().debug("Using tracker " + converter.getClass().getSimpleName()); return converter; } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy