Source:
<code>public boolean postExecute(MavenBuildProxy build, MavenProject pom, MojoInfo mojo, final BuildListener listener, Throwable error) throws InterruptedException, IOException { TestMojo testMojo = getTestMojo(mojo); if (testMojo == null) return true; listener.getLogger().println(Messages.SurefireArchiver_Recording()); Iterable<File> fileSet; try { fileSet = testMojo.getReportFiles(pom, mojo); } catch (ComponentConfigurationException e) { e.printStackTrace(listener.fatalError(Messages.SurefireArchiver_NoReportsDir())); build.setResult(Result.FAILURE); return true; } if(fileSet != null) { synchronized (build) { if(result==null) result = new TestResult(); fileSet = Iterables.filter(fileSet, new Predicate<File>() { @Override public boolean apply(File input) { <START> return !parsedFiles.containsKey(input) || parsedFiles.get(input) < input.lastModified(); <END> } }); if (!fileSet.iterator().hasNext()) return true; result.parse(System.currentTimeMillis() - build.getMilliSecsSinceBuildStart(), fileSet); rememberCheckedFiles(fileSet); final TestResult r = result; int failCount = build.execute(new BuildCallable<Integer, IOException>() { private static final long serialVersionUID = -1023888330720922136L; public Integer call(MavenBuild build) throws IOException, InterruptedException { SurefireReport sr = build.getAction(SurefireReport.class); if(sr==null) build.getActions().add(new SurefireReport(build, r, listener)); else sr.setResult(r,listener); if(r.getFailCount()>0) build.setResult(Result.UNSTABLE); build.registerAsProjectAction(new FactoryImpl()); return r.getFailCount(); } }); if(failCount>0) { markBuildAsSuccess(error,build.getMavenBuildInformation()); hasTestFailures.set(true); } } } return true; }</code><technical_language>I doubt works reliably in cases, file technically replaced older (e.g. move operation). I expect Map<File, Set<Long>>, set stores modification times MD5s of files</technical_language>

Target:
public boolean postExecute(MavenBuildProxy build, MavenProject pom, MojoInfo mojo, final BuildListener listener, Throwable error) throws InterruptedException, IOException { TestMojo testMojo = getTestMojo(mojo); if (testMojo == null) return true; listener.getLogger().println(Messages.SurefireArchiver_Recording()); Iterable<File> fileSet; try { fileSet = testMojo.getReportFiles(pom, mojo); } catch (ComponentConfigurationException e) { e.printStackTrace(listener.fatalError(Messages.SurefireArchiver_NoReportsDir())); build.setResult(Result.FAILURE); return true; } if(fileSet != null) { synchronized (build) { if(result==null) result = new TestResult(); fileSet = Iterables.filter(fileSet, new Predicate<File>() { @Override public boolean apply(File input) { return !parsedFiles.containsKey(input) || parsedFiles.get(input) != input.lastModified(); } }); if (!fileSet.iterator().hasNext()) return true; result.parse(System.currentTimeMillis() - build.getMilliSecsSinceBuildStart(), fileSet); rememberCheckedFiles(fileSet); final TestResult r = result; int failCount = build.execute(new BuildCallable<Integer, IOException>() { private static final long serialVersionUID = -1023888330720922136L; public Integer call(MavenBuild build) throws IOException, InterruptedException { SurefireReport sr = build.getAction(SurefireReport.class); if(sr==null) build.getActions().add(new SurefireReport(build, r, listener)); else sr.setResult(r,listener); if(r.getFailCount()>0) build.setResult(Result.UNSTABLE); build.registerAsProjectAction(new FactoryImpl()); return r.getFailCount(); } }); if(failCount>0) { markBuildAsSuccess(error,build.getMavenBuildInformation()); hasTestFailures.set(true); } } } return true; }