This is an automated email from the ASF dual-hosted git repository. kwin pushed a commit to branch feature/scm-last-modification-date in repository https://gitbox.apache.org/repos/asf/maven-doxia-sitetools.git
commit 644d33f2c438b965108ab28ae93d6b4d419b1b5b Author: Konrad Windszus <[email protected]> AuthorDate: Sun Mar 1 20:51:28 2026 +0100 Expose SCM last modification date from Markup source in Velocity The new Velocity property "scmModifiedDate" is receiving the value. Site descriptor has new format settings for "modificationDate" similar to the existing "publishDate" to affect rendering in supporting Skins. This closes #279 --- doxia-site-model/src/main/mdo/site.mdo | 69 +++++++++++++--- doxia-site-renderer/pom.xml | 21 +++++ .../doxia/siterenderer/DefaultSiteRenderer.java | 91 +++++++++++++++++++++- .../siterenderer/DocumentRenderingContext.java | 44 +++++++++++ .../doxia/siterenderer/SiteRenderingContext.java | 3 + .../doxia/siterenderer/sink/SiteRendererSink.java | 1 + .../src/main/resources/site-renderer.properties | 1 + .../src/main/resources/site-renderer_de.properties | 1 + doxia-site-renderer/src/site/apt/index.apt.vm | 4 +- .../siterenderer/DefaultSiteRendererTest.java | 14 +++- .../siterenderer/velocity-toolmanager.expected.txt | 15 ++-- 11 files changed, 238 insertions(+), 26 deletions(-) diff --git a/doxia-site-model/src/main/mdo/site.mdo b/doxia-site-model/src/main/mdo/site.mdo index 9d04432..7392d0b 100644 --- a/doxia-site-model/src/main/mdo/site.mdo +++ b/doxia-site-model/src/main/mdo/site.mdo @@ -103,6 +103,15 @@ under the License. </association> <identifier>true</identifier> </field> + <field java.getter="false"> + <name>modificationDate</name> + <description>Modify the date modified display properties.</description> + <version>2.1.0+</version> + <association> + <type>ModificationDate</type> + </association> + <identifier>true</identifier> + </field> <field java.getter="false"> <name>version</name> <description>Modify the version published display properties.</description> @@ -204,6 +213,19 @@ under the License. return publishDate == null; } + public ModificationDate getModificationDate() + { + if ( modificationDate == null ) + return new ModificationDate(); + else + return modificationDate; + } + + public boolean isDefaultModificationDate() + { + return modificationDate == null; + } + public Version getVersion() { if ( version == null ) @@ -335,18 +357,9 @@ under the License. </class> <class java.clone="deep"> - <name>PublishDate</name> - <description>Modify display properties for date published.</description> - <version>1.0.0+</version> + <name>SiteDateFormat</name> + <description>Modify display properties for a date field.</description> <fields> - <field xml.attribute="true"> - <name>position</name> - <description>Where to place the date published ("left", "right", "navigation-top", "navigation-bottom", "bottom" or "none" to hide it).</description> - <version>1.0.0+</version> - <type>String</type> - <identifier>true</identifier> - <defaultValue>left</defaultValue> - </field> <field xml.attribute="true"> <name>format</name> <description>Date format to use.</description> @@ -371,6 +384,40 @@ under the License. </fields> </class> + <class java.clone="deep"> + <name>PublishDate</name> + <description>Modify display properties for date published.</description> + <version>1.0.0+</version> + <superClass>SiteDateFormat</superClass> + <fields> + <field xml.attribute="true"> + <name>position</name> + <description>Where to place the date published ("left", "right", "navigation-top", "navigation-bottom", "bottom" or "none" to hide it).</description> + <version>1.0.0+</version> + <type>String</type> + <identifier>true</identifier> + <defaultValue>left</defaultValue> + </field> + </fields> + </class> + + <class java.clone="deep"> + <name>ModificationDate</name> + <description>Modify display properties for date modified.</description> + <version>2.1.0+</version> + <superClass>SiteDateFormat</superClass> + <fields> + <field xml.attribute="true"> + <name>position</name> + <description>Where to place the date published ("left", "right", "navigation-top", "navigation-bottom", "bottom" or "none" to hide it).</description> + <version>2.1.0+</version> + <type>String</type> + <identifier>true</identifier> + <defaultValue>none</defaultValue> + </field> + </fields> + </class> + <class java.clone="deep"> <name>Version</name> <description>Modify display properties for version published.</description> diff --git a/doxia-site-renderer/pom.xml b/doxia-site-renderer/pom.xml index 5cbbd3d..3783428 100644 --- a/doxia-site-renderer/pom.xml +++ b/doxia-site-renderer/pom.xml @@ -36,6 +36,7 @@ under the License. <velocityEngineVersion>2.4.1</velocityEngineVersion> <velocityToolsVersion>3.1</velocityToolsVersion> <mermaidVersion>11.12.2</mermaidVersion> + <scmVersion>2.2.1</scmVersion> </properties> <dependencies> <dependency> @@ -135,6 +136,26 @@ under the License. <version>3.20.0</version> </dependency> + <!-- scm dependencies --> + <dependency> + <groupId>org.apache.maven.scm</groupId> + <artifactId>maven-scm-api</artifactId> + <version>${scmVersion}</version> + </dependency> + <dependency> + <groupId>org.apache.maven.scm</groupId> + <artifactId>maven-scm-providers-standard</artifactId> + <version>${scmVersion}</version> + <type>pom</type> + <scope>runtime</scope> + </dependency> + <dependency> + <groupId>org.apache.maven.scm</groupId> + <artifactId>maven-scm-manager-plexus</artifactId> + <version>${scmVersion}</version> + <scope>runtime</scope> + </dependency> + <!-- test --> <dependency> <groupId>org.codehaus.plexus</groupId> diff --git a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DefaultSiteRenderer.java b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DefaultSiteRenderer.java index 82ed93e..ba45bff 100644 --- a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DefaultSiteRenderer.java +++ b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DefaultSiteRenderer.java @@ -37,6 +37,7 @@ import java.net.URLClassLoader; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.Date; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; @@ -46,9 +47,11 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Map.Entry; +import java.util.Optional; import java.util.Properties; import java.util.TimeZone; import java.util.function.Function; +import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipException; import java.util.zip.ZipFile; @@ -74,6 +77,12 @@ import org.apache.maven.doxia.site.skin.io.xpp3.SkinXpp3Reader; import org.apache.maven.doxia.siterenderer.SiteRenderingContext.SiteDirectory; import org.apache.maven.doxia.siterenderer.sink.SiteRendererSink; import org.apache.maven.doxia.util.XmlValidator; +import org.apache.maven.scm.ScmException; +import org.apache.maven.scm.ScmFileSet; +import org.apache.maven.scm.command.info.InfoItem; +import org.apache.maven.scm.command.info.InfoScmResult; +import org.apache.maven.scm.manager.ScmManager; +import org.apache.maven.scm.repository.ScmRepository; import org.apache.velocity.Template; import org.apache.velocity.app.Velocity; import org.apache.velocity.context.Context; @@ -143,6 +152,9 @@ public class DefaultSiteRenderer implements Renderer { @Inject private PlexusContainer plexus; + @Inject + private ScmManager scmManager; + private static final String SKIN_TEMPLATE_LOCATION = "META-INF/maven/site.vm"; private static final String TOOLS_LOCATION = "META-INF/maven/site-tools.xml"; @@ -179,12 +191,38 @@ public class DefaultSiteRenderer implements Renderer { // SiteRenderer implementation // ---------------------------------------------------------------------- + private Optional<ScmRepository> getScmRepository(File directory) { + Optional<ScmRepository> scmRepository = scmManager.makeProviderScmRepository(directory); + if (scmRepository.isPresent()) { + LOGGER.debug("Found SCM repository for directory {}: {}", directory, scmRepository.get()); + } else { + LOGGER.debug("No SCM repository found for directory {}", directory); + File parentDirectory = directory.getParentFile(); + if (parentDirectory != null) { + return getScmRepository(parentDirectory); + } + } + return scmRepository; + } + /** {@inheritDoc} */ public Map<String, DocumentRenderer> locateDocumentFiles(SiteRenderingContext siteRenderingContext) throws IOException, RendererException { Map<String, DocumentRenderer> files = new LinkedHashMap<>(); Map<String, String> moduleExcludes = siteRenderingContext.getModuleExcludes(); + final Optional<ScmRepository> scmRepository; + if (siteRenderingContext.getSiteModel() != null + && !siteRenderingContext + .getSiteModel() + .getModificationDate() + .getPosition() + .equals("none")) { + scmRepository = getScmRepository(siteRenderingContext.getRootDirectory()); + } else { + LOGGER.debug("SCM info won't be gathered since modificationDate position is 'none'"); + scmRepository = Optional.empty(); + } // look in every site directory (in general src/site or target/generated-site) for (SiteDirectory siteDirectory : siteRenderingContext.getSiteDirectories()) { File siteDirectoryPath = siteDirectory.getPath(); @@ -203,7 +241,8 @@ public class DefaultSiteRenderer implements Renderer { excludes, files, siteDirectory.isEditable(), - siteDirectory.isSkipDuplicates()); + siteDirectory.isSkipDuplicates(), + scmRepository); } } } @@ -224,6 +263,20 @@ public class DefaultSiteRenderer implements Renderer { return filtered; } + private Map<String, InfoItem> getScmInfos( + ScmRepository scmRepository, File baseDirectory, String includes, String excludes) { + try { + ScmFileSet fileSet = new ScmFileSet(baseDirectory, includes, excludes); + InfoScmResult infos = scmManager + .getProviderByRepository(scmRepository) + .info(scmRepository.getProviderRepository(), fileSet, null); + return infos.getInfoItems().stream().collect(Collectors.toMap(InfoItem::getPath, Function.identity())); + } catch (ScmException | IOException e) { + LOGGER.warn("Failed to get SCM info for files in directory {}", baseDirectory, e); + } + return Collections.emptyMap(); + } + /** * Populates the files map with {@link DocumentRenderer}s per output name in parameter {@code files} for all files in the moduleBasedir matching the module extensions, * taking care of duplicates if needed. @@ -238,6 +291,7 @@ public class DefaultSiteRenderer implements Renderer { * @throws IOException * @throws RendererException */ + @SuppressWarnings("checkstyle:ParameterNumber") private void addModuleFiles( File rootDir, File moduleBasedir, @@ -245,7 +299,8 @@ public class DefaultSiteRenderer implements Renderer { String excludes, Map<String, DocumentRenderer> files, boolean editable, - boolean skipDuplicates) + boolean skipDuplicates, + Optional<ScmRepository> scmRepository) throws IOException, RendererException { if (!moduleBasedir.exists() || ArrayUtils.isEmpty(module.getExtensions())) { return; @@ -254,6 +309,12 @@ public class DefaultSiteRenderer implements Renderer { String moduleRelativePath = PathTool.getRelativeFilePath(rootDir.getAbsolutePath(), moduleBasedir.getAbsolutePath()); + Map<String, InfoItem> scmInfos; + if (scmRepository.isPresent()) { + scmInfos = getScmInfos(scmRepository.get(), new File(moduleRelativePath), "**/*", excludes); + } else { + scmInfos = Collections.emptyMap(); + } List<String> allFiles = FileUtils.getFileNames(moduleBasedir, "**/*", excludes, false); for (String extension : module.getExtensions()) { @@ -267,8 +328,16 @@ public class DefaultSiteRenderer implements Renderer { docs.addAll(velocityFiles); for (String doc : docs) { + DocumentRenderingContext docRenderingContext = new DocumentRenderingContext( - moduleBasedir, moduleRelativePath, doc, module.getParserId(), extension, editable); + moduleBasedir, + moduleRelativePath, + doc, + module.getParserId(), + extension, + editable, + null, + scmInfos.get(doc)); // TODO: DOXIA-111: we need a general filter here that knows how to alter the context if (endsWithIgnoreCase(doc, ".vm")) { @@ -589,6 +658,16 @@ public class DefaultSiteRenderer implements Renderer { context.put("alignedFilePath", alignedFilePath); // TODO Deprecated -- will be removed! context.put("alignedFileName", alignedFilePath); + + if (docRenderingContext.getScmInfo() != null + && docRenderingContext.getScmInfo().getLastChangedDateTime() != null) { + // Velocity can only deal with Date/Calendar + Date scmModifiedDate = Date.from(docRenderingContext + .getScmInfo() + .getLastChangedDateTime() + .toInstant()); + context.put("scmModifiedDate", scmModifiedDate); + } } context.put("site", siteRenderingContext.getSiteModel()); // TODO Deprecated -- will be removed! @@ -672,7 +751,11 @@ public class DefaultSiteRenderer implements Renderer { context.put("bodyContent", content.getBody()); // document date (got from Doxia Sink date() API) - context.put("documentDate", content.getDate()); + if (content.getDate() != null) { + context.put("documentDate", content.getDate()); + } else { + context.put("documentDate", context.get("scmModifiedDate")); + } // document rendering context, to get eventual inputPath context.put("docRenderingContext", content.getRenderingContext()); diff --git a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DocumentRenderingContext.java b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DocumentRenderingContext.java index b176c83..b83ed44 100644 --- a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DocumentRenderingContext.java +++ b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DocumentRenderingContext.java @@ -22,6 +22,7 @@ import java.io.File; import java.util.HashMap; import java.util.Map; +import org.apache.maven.scm.command.info.InfoItem; import org.codehaus.plexus.util.PathTool; /** @@ -52,6 +53,8 @@ public class DocumentRenderingContext { private final String generator; + private final InfoItem scmInfo; + /** * <p> * Constructor for rendering context when document is not rendered from a Doxia markup source. @@ -101,6 +104,36 @@ public class DocumentRenderingContext { String extension, boolean editable, String generator) { + this(basedir, basedirRelativePath, document, parserId, extension, editable, generator, null); + } + + /** + * <p> + * Constructor for document rendering context. + * </p> + * + * @param basedir the source base directory (not null, pseudo value when not a Doxia source). + * @param basedirRelativePath the relative path from root (null if not Doxia source) + * @param document the source document path. + * @param parserId the Doxia module parser id associated to this document, may be null if document not rendered from + * a Doxia source. + * @param extension the source document filename extension, may be null if document not rendered from + * a Doxia source. + * @param editable is the document editable as source, i.e. not generated? + * @param generator the generator (in general a reporting goal: <code>groupId:artifactId:version:goal</code>) + * @param scmInfo the SCM info to use for this document, or <code>null</code> if no SCM info to use + * @since 2.1.0 + */ + @SuppressWarnings("checkstyle:parameternumber") + public DocumentRenderingContext( + File basedir, + String basedirRelativePath, + String document, + String parserId, + String extension, + boolean editable, + String generator, + InfoItem scmInfo) { this.basedir = basedir; this.parserId = parserId; this.extension = extension; @@ -133,6 +166,7 @@ public class DocumentRenderingContext { this.relativePath = PathTool.getRelativePath(basedir.getPath(), new File(basedir, inputPath).getPath()) .replace('\\', '/'); + this.scmInfo = scmInfo; } /** @@ -286,4 +320,14 @@ public class DocumentRenderingContext { public String getDoxiaSourcePath(String base) { return PathTool.calculateLink(getDoxiaSourcePath(), base); } + + /** + * Get the SCM info to use for this document. + * + * @return the SCM info to use for this document, or <code>null</code> if no SCM info to use + * @since 2.1.0 + */ + public InfoItem getScmInfo() { + return scmInfo; + } } diff --git a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/SiteRenderingContext.java b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/SiteRenderingContext.java index 64db4c7..75f7b02 100644 --- a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/SiteRenderingContext.java +++ b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/SiteRenderingContext.java @@ -30,6 +30,7 @@ import org.apache.maven.artifact.Artifact; import org.apache.maven.doxia.parser.Parser; import org.apache.maven.doxia.site.SiteModel; import org.apache.maven.doxia.site.skin.SkinModel; +import org.apache.maven.scm.repository.ScmRepository; import org.codehaus.plexus.util.ReaderFactory; import org.codehaus.plexus.util.WriterFactory; @@ -111,6 +112,8 @@ public class SiteRenderingContext { private ParserConfigurator parserConfigurator; + private ScmRepository scmRepository; + /** * If input documents should be validated before parsing. * By default no validation is performed. diff --git a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/sink/SiteRendererSink.java b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/sink/SiteRendererSink.java index 332ce8a..37aa1c5 100644 --- a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/sink/SiteRendererSink.java +++ b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/sink/SiteRendererSink.java @@ -62,6 +62,7 @@ public class SiteRendererSink extends Xhtml5Sink implements DocumentContent { private boolean containsMermaidDiagram = false; private boolean insideMermaidCodeElement = false; + /** * Construct a new SiteRendererSink for a document. * diff --git a/doxia-site-renderer/src/main/resources/site-renderer.properties b/doxia-site-renderer/src/main/resources/site-renderer.properties index 793e4ea..8a1d8bc 100644 --- a/doxia-site-renderer/src/main/resources/site-renderer.properties +++ b/doxia-site-renderer/src/main/resources/site-renderer.properties @@ -16,6 +16,7 @@ # under the License. template.lastpublished=Last Published +template.lastmodified=Last Modified template.version=Version template.builtby=Built by template.externallinks=External Links diff --git a/doxia-site-renderer/src/main/resources/site-renderer_de.properties b/doxia-site-renderer/src/main/resources/site-renderer_de.properties index 1f8d8ec..cddf768 100644 --- a/doxia-site-renderer/src/main/resources/site-renderer_de.properties +++ b/doxia-site-renderer/src/main/resources/site-renderer_de.properties @@ -16,6 +16,7 @@ # under the License. template.lastpublished=Zuletzt ver\u00F6ffentlicht +template.lastmodified=Zuletzt ver\u00F6ndert template.builtby=Erstellt von template.externallinks=Externe Links template.edit=Bearbeiten diff --git a/doxia-site-renderer/src/site/apt/index.apt.vm b/doxia-site-renderer/src/site/apt/index.apt.vm index e97abd6..1be557b 100644 --- a/doxia-site-renderer/src/site/apt/index.apt.vm +++ b/doxia-site-renderer/src/site/apt/index.apt.vm @@ -75,6 +75,8 @@ Doxia Sitetools - Site Renderer *---------------------------------+----------------------+-------------------------------+ | <<<relativePath>>> | <<<String>>> | The path to the site root from the document being rendered. | *---------------------------------+----------------------+-------------------------------+ +| <<<scmModifiedDate>>> | <<<Date>>> | The last modified date as retrieved through Maven SCM from the underlying Doxia source. | +*---------------------------------+----------------------+-------------------------------+ | <<<site>>> | {{{../doxia-site-model/apidocs/org/apache/maven/doxia/site/SiteModel.html}<<<SiteModel>>>}} | This is a model that represents the data in your {{{../doxia-site-model/site.html}<<<site.xml>>>}}. | *---------------------------------+----------------------+-------------------------------+ | <<<supportedLocales>>> | <<<List\<Locale\>>>> | The list of locales that the site will contain. | @@ -170,7 +172,7 @@ Doxia Sitetools - Site Renderer *---------------------------------+----------------------+-------------------------------+ | <<<bodyContent>>> | <<<String>>> | HTML body content of the Doxia generated output. | *---------------------------------+----------------------+-------------------------------+ -| <<<documentDate>>> | <<<String>>> | The date specified in the source document: semantics has to be chosen by document writer (document creation date, or document last modification date, or ...), and format is not enforced. | +| <<<documentDate>>> | <<<String>>> | The date specified in the source document: semantics has to be chosen by document writer (document creation date, or document last modification date, or ...), and format is not enforced. If not set is equal to <<<scmModifiedDate>>> | *---------------------------------+----------------------+-------------------------------+ | <<<headContent>>> | <<<String>>> | HTML head content of the Doxia generated output. | *---------------------------------+----------------------+-------------------------------+ diff --git a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/DefaultSiteRendererTest.java b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/DefaultSiteRendererTest.java index d41ed81..4b97c6a 100644 --- a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/DefaultSiteRendererTest.java +++ b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/DefaultSiteRendererTest.java @@ -35,6 +35,7 @@ import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; +import java.time.OffsetDateTime; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -58,6 +59,7 @@ import org.apache.maven.doxia.site.io.xpp3.SiteXpp3Reader; import org.apache.maven.doxia.siterenderer.SiteRenderingContext.SiteDirectory; import org.apache.maven.doxia.siterenderer.sink.SiteRendererSink; import org.apache.maven.doxia.xsd.AbstractXmlValidator; +import org.apache.maven.scm.command.info.InfoItem; import org.codehaus.plexus.PlexusContainer; import org.codehaus.plexus.testing.PlexusTest; import org.codehaus.plexus.util.FileUtils; @@ -334,8 +336,11 @@ public class DefaultSiteRendererTest { siteRenderingContext.setTemplateProperties(attributes); siteRenderingContext.setTemplateName("org/apache/maven/doxia/siterenderer/velocity-toolmanager.vm"); - DocumentRenderingContext docRenderingContext = - new DocumentRenderingContext(new File(""), "document.html", "generator"); + + InfoItem infoItem = Mockito.mock(InfoItem.class); + Mockito.when(infoItem.getLastChangedDateTime()).thenReturn(OffsetDateTime.parse("2024-06-01T12:00:00Z")); + DocumentRenderingContext docRenderingContext = new DocumentRenderingContext( + new File(""), null, "document.html", null, null, false, "generator", infoItem); SiteRendererSink sink = new SiteRendererSink(docRenderingContext); siteRenderer.mergeDocumentIntoSite(writer, sink, siteRenderingContext); @@ -371,7 +376,10 @@ public class DefaultSiteRendererTest { skin.setFile(skinFile); SiteRenderingContext siteRenderingContext = siteRenderer.createContextForSkin(skin, attributes, new SiteModel(), "defaultitle", Locale.ROOT); - DocumentRenderingContext context = new DocumentRenderingContext(new File(""), "document.html", "generator"); + InfoItem infoItem = Mockito.mock(InfoItem.class); + Mockito.when(infoItem.getLastChangedDateTime()).thenReturn(OffsetDateTime.parse("2024-06-01T12:00:00Z")); + DocumentRenderingContext context = new DocumentRenderingContext( + new File(""), null, "document.html", null, null, false, "generator", infoItem); SiteRendererSink sink = new SiteRendererSink(context); siteRenderer.mergeDocumentIntoSite(writer, sink, siteRenderingContext); String renderResult = writer.toString(); diff --git a/doxia-site-renderer/src/test/resources/org/apache/maven/doxia/siterenderer/velocity-toolmanager.expected.txt b/doxia-site-renderer/src/test/resources/org/apache/maven/doxia/siterenderer/velocity-toolmanager.expected.txt index e67391d..8dcafa2 100644 --- a/doxia-site-renderer/src/test/resources/org/apache/maven/doxia/siterenderer/velocity-toolmanager.expected.txt +++ b/doxia-site-renderer/src/test/resources/org/apache/maven/doxia/siterenderer/velocity-toolmanager.expected.txt @@ -32,10 +32,11 @@ We have the following keys in the context: 28. publishDate 29. relativePath 30. render - 31. shortTitle - 32. site - 33. sorter - 34. supportedLocales - 35. text - 36. title - 37. xml + 31. scmModifiedDate + 32. shortTitle + 33. site + 34. sorter + 35. supportedLocales + 36. text + 37. title + 38. xml
