During an internship in 2016 the task “Introduce a tool-based review tool” was assigned to me. We decided to use Atlassian Crucible – although it is a great tool to do reviews it lacks of proper way to document the review process and the results of it. To improve this I developed a plugin to generate reports like this:
At the end the document is generated as pdf.
While the document generation all data are gathered from a specific review session. The data is then merged into a velocity template (latex):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | \begin{document} \newpage % Page header \markboth{Author et al.}{Short title} % Title \title{ Review of \enquote{$reviewTemplate.getTitle()}} %Authors, affiliations address. \dedication{$reviewTemplate.getReviewersEnumerated()} \maketitle \begin{tabularx}{\textwidth}{ |G|X| } \hline Version & $reviewTemplate.getVersion().getTime() \\ \hline Date & \today \\ \hline Author \newline \vbox to 2cm { \vfil } \textit{(Date and Signature)} & $reviewTemplate.getAuthor().getDisplayName() \\ \hline Approved by \newline \vbox to 2cm { \vfil } \textit{(Date and Signature)} & \\ \hline \end{tabularx} \thispagestyle {empty} \newpage %Table of Contents \newpage \renewcommand*\contentsname{Table of Contents} \tableofcontents \thispagestyle {empty} \newpage \setcounter{page}{1} % Heading 1 \section{Summary} Review start date: $reviewTemplate.getStartDate()\\ Latest svn qualification branch revision: $reviewTemplate.getLatestRevision()\\ #if ( !$reviewTemplate.getDescription().isEmpty() ) \subsection{Objectives} $reviewTemplate.getDescription() #end #if ( !$reviewTemplate.getReviewers().isEmpty() ) \subsection{Reviewer} \begin{itemize} #foreach( $reviewer in $reviewTemplate.getReviewers()) \item{$reviewer.getDisplayName()} #end \end{itemize} #end \section{Reviewed Changes} #foreach( $reviewItem in $reviewTemplate.getReviewItems()) \subsection{$reviewItem.getToPath().replaceAll("branches/([^/]+/)", "").replaceAll("/", "\\slash ").replaceAll("\$", "\\\$")} From revision $reviewItem.getFromRevision() to revision $reviewItem.getToRevision()\\ Commited by: $reviewItem.getAuthorName()\\ Commit Type: $reviewItem.getCommitType()\\ Commit Date: $reviewItem.getCommitDate()\\ #if ( !$reviewItem.getParticipants().isEmpty() ) Reviewer: \begin{itemize} #foreach( $participantStatus in $reviewItem.getParticipants()) #set($completed = "#if($participantStatus.isCompleted())completed#{else}uncomplete#end") \item{$participantStatus.getUser().getDisplayName() ($completed)} #end \end{itemize} #end #set ($versionedComments = $reviewTemplate.getVersionedCommentsRendered($reviewItem.getPermId().getId())) #if ( !$versionedComments.isEmpty() ) Comments $versionedComments #end #end \section{General Comments} $reviewTemplate.getGeneralCommentsRendered() \end{document} |
In the next step all variables are replaced with the actual content. You can also make changes and remove sensitive comments or fix typos in the comments.
After the pdf is generated with the actual content:
All comments on a reviewed item are printed in a structured way.
This way you can document your review process.
We made the plugin public on GitHub so it’s OSS – I want to support it on a spare time job basis.
Spelling error report
The following text will be sent to our editors: