diff --git a/AUTHORS b/AUTHORS index f654b68..24f8020 100644 --- a/AUTHORS +++ b/AUTHORS @@ -14,6 +14,7 @@ Much appreciated contributors (in alphabetical order): David Feeney Patrick Georgi Ciaran Gultnieks + Matías Halles Julien Issler Jerry - Chinese translation Benjamin Jorand - Mercurial support diff --git a/NEWS.mdtext b/NEWS.mdtext index 96833bb..2c80002 100644 --- a/NEWS.mdtext +++ b/NEWS.mdtext @@ -35,6 +35,7 @@ - Sort the project list by the display name of the project (issue 477) - Project creation form now has a short description field as well (issue 479) - Add more file extensions supported by our in-tree prettify version (issues 490 and 567) +- Improve the parsing of hg's log output (issues 507 and 508) - Do not clean `` and `` HTML markup from user input (issue 509) - Improve HTML validation by switching from `strict` to `transitional` DOCTYPE (issue 511) - Ignore XML parsing problems when trying to retrieve commit messages for svn (issue 518) diff --git a/src/IDF/Scm/Mercurial.php b/src/IDF/Scm/Mercurial.php index 776e7fc..298c023 100644 --- a/src/IDF/Scm/Mercurial.php +++ b/src/IDF/Scm/Mercurial.php @@ -27,10 +27,13 @@ */ class IDF_Scm_Mercurial extends IDF_Scm { + protected $hg_log_template; + public function __construct($repo, $project=null) { $this->repo = $repo; $this->project = $project; + $this->hg_log_template = "'".'changeset: {rev}:{node|short}\nauthor: {author}\ndate: {date|isodate}\nfiles: {files}\n{desc}\n'."'"; } public function getRepositorySize() @@ -336,10 +339,14 @@ class IDF_Scm_Mercurial extends IDF_Scm if (!$this->isValidRevision($commit)) { return false; } - $tmpl = ($getdiff) ? - Pluf::f('hg_path', 'hg').' log -p -r %s -R %s' : Pluf::f('hg_path', 'hg').' log -r %s -R %s'; + $tmpl = ($getdiff) + ? Pluf::f('hg_path', 'hg').' log -p -r %s -R %s --template %s' + : Pluf::f('hg_path', 'hg').' log -r %s -R %s --template %s'; $cmd = sprintf($tmpl, - escapeshellarg($commit), escapeshellarg($this->repo)); + escapeshellarg($commit), + escapeshellarg($this->repo), + $this->hg_log_template); + $out = array(); $cmd = Pluf::f('idf_exec_cmd_prefix', '').$cmd; self::exec('IDF_Scm_Mercurial::getCommit', $cmd, $out); @@ -356,7 +363,7 @@ class IDF_Scm_Mercurial extends IDF_Scm $log[] = $line; } } - $out = self::parseLog($log, 6); + $out = self::parseLog($log, 4); $out[0]->diff = implode("\n", $change); return $out[0]; } @@ -381,11 +388,11 @@ class IDF_Scm_Mercurial extends IDF_Scm */ public function getChangeLog($commit='tip', $n=10) { - $cmd = sprintf(Pluf::f('hg_path', 'hg').' log -R %s -l%s ', escapeshellarg($this->repo), $n, $commit); + $cmd = sprintf(Pluf::f('hg_path', 'hg').' log -R %s -l%s --template %s', escapeshellarg($this->repo), $n, $this->hg_log_template, $commit); $out = array(); $cmd = Pluf::f('idf_exec_cmd_prefix', '').$cmd; self::exec('IDF_Scm_Mercurial::getChangeLog', $cmd, $out); - return self::parseLog($out, 6); + return self::parseLog($out, 4); } /** @@ -421,7 +428,7 @@ class IDF_Scm_Mercurial extends IDF_Scm continue; } $match = array(); - if (preg_match('/(\S+)\s*:\s*(.*)/', $line, $match)) { + if (preg_match('/^(\S+):\s*(.*)/', $line, $match)) { $match[1] = strtolower($match[1]); if ($match[1] == 'user') { $c['author'] = $match[2];