<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[201123] trunk/Websites/perf.webkit.org</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/201123">201123</a></dd>
<dt>Author</dt> <dd>rniwa@webkit.org</dd>
<dt>Date</dt> <dd>2016-05-18 19:39:54 -0700 (Wed, 18 May 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Analysis task should look for a git commit based on abridged hashes
https://bugs.webkit.org/show_bug.cgi?id=157877
&lt;rdar://problem/26254374&gt;

Reviewed by Chris Dumez.

Made /privileged-api/associate-commit look for commits using LIKE instead of an exact match.
Associate the commit when there is exactly one match.

* public/include/commit-log-fetcher.php:
(CommitLogFetcher::fetch_between):
* public/include/db.php:
(Database::escape_for_like): Extracted from CommitLogFetcher::fetch_between.
* public/privileged-api/associate-commit.php:
(main): Look for the commits using LIKE. Reject whenever there are multiple commits. We limit the number of
matches to two for performance when the user specifies something that almost thousands of commits: e.g. &quot;1&quot;.
* public/v3/pages/analysis-task-page.js:
(AnalysisTaskPage.prototype._associateCommit): Added human friendly error messages for mismatching commits.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkWebsitesperfwebkitorgChangeLog">trunk/Websites/perf.webkit.org/ChangeLog</a></li>
<li><a href="#trunkWebsitesperfwebkitorgpublicincludecommitlogfetcherphp">trunk/Websites/perf.webkit.org/public/include/commit-log-fetcher.php</a></li>
<li><a href="#trunkWebsitesperfwebkitorgpublicincludedbphp">trunk/Websites/perf.webkit.org/public/include/db.php</a></li>
<li><a href="#trunkWebsitesperfwebkitorgpublicprivilegedapiassociatecommitphp">trunk/Websites/perf.webkit.org/public/privileged-api/associate-commit.php</a></li>
<li><a href="#trunkWebsitesperfwebkitorgpublicv3pagesanalysistaskpagejs">trunk/Websites/perf.webkit.org/public/v3/pages/analysis-task-page.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkWebsitesperfwebkitorgChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/ChangeLog (201122 => 201123)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/ChangeLog        2016-05-19 01:27:49 UTC (rev 201122)
+++ trunk/Websites/perf.webkit.org/ChangeLog        2016-05-19 02:39:54 UTC (rev 201123)
</span><span class="lines">@@ -1,5 +1,26 @@
</span><span class="cx"> 2016-05-18  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
</span><span class="cx"> 
</span><ins>+        Analysis task should look for a git commit based on abridged hashes
+        https://bugs.webkit.org/show_bug.cgi?id=157877
+        &lt;rdar://problem/26254374&gt;
+
+        Reviewed by Chris Dumez.
+
+        Made /privileged-api/associate-commit look for commits using LIKE instead of an exact match.
+        Associate the commit when there is exactly one match.
+
+        * public/include/commit-log-fetcher.php:
+        (CommitLogFetcher::fetch_between):
+        * public/include/db.php:
+        (Database::escape_for_like): Extracted from CommitLogFetcher::fetch_between.
+        * public/privileged-api/associate-commit.php:
+        (main): Look for the commits using LIKE. Reject whenever there are multiple commits. We limit the number of
+        matches to two for performance when the user specifies something that almost thousands of commits: e.g. &quot;1&quot;.
+        * public/v3/pages/analysis-task-page.js:
+        (AnalysisTaskPage.prototype._associateCommit): Added human friendly error messages for mismatching commits.
+
+2016-05-18  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
+
</ins><span class="cx">         Unreviewed build fix. Use --date-order so that every child commit appears after its parent.
</span><span class="cx">         Otherwise we'll hit a FailedToFindParentCommit error while submitting a commit that appears before its parent.
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgpublicincludecommitlogfetcherphp"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/public/include/commit-log-fetcher.php (201122 => 201123)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/public/include/commit-log-fetcher.php        2016-05-19 01:27:49 UTC (rev 201122)
+++ trunk/Websites/perf.webkit.org/public/include/commit-log-fetcher.php        2016-05-19 02:39:54 UTC (rev 201123)
</span><span class="lines">@@ -65,7 +65,7 @@
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if ($keyword) {
</span><del>-            array_push($values, '%' . str_replace(array('\\', '_', '%'), array('\\\\', '\\_', '\\%'), $keyword) . '%');
</del><ins>+            array_push($values, '%' . Database::escape_for_like($keyword) . '%');
</ins><span class="cx">             $keyword_index = '$' . count($values);
</span><span class="cx">             array_push($values, ltrim($keyword, 'r'));
</span><span class="cx">             $revision_index = '$' . count($values);
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgpublicincludedbphp"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/public/include/db.php (201122 => 201123)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/public/include/db.php        2016-05-19 01:27:49 UTC (rev 201122)
+++ trunk/Websites/perf.webkit.org/public/include/db.php        2016-05-19 02:39:54 UTC (rev 201123)
</span><span class="lines">@@ -84,6 +84,10 @@
</span><span class="cx">         return intval($timestamp_in_s * 1000);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    static function escape_for_like($string) {
+        return str_replace(array('\\', '_', '%'), array('\\\\', '\\_', '\\%'), $string);
+    }
+
</ins><span class="cx">     function connect() {
</span><span class="cx">         $databaseConfig = config('database');
</span><span class="cx">         $this-&gt;connection = @pg_connect('host=' . $databaseConfig['host'] . ' port=' . $databaseConfig['port']
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgpublicprivilegedapiassociatecommitphp"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/public/privileged-api/associate-commit.php (201122 => 201123)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/public/privileged-api/associate-commit.php        2016-05-19 01:27:49 UTC (rev 201122)
+++ trunk/Websites/perf.webkit.org/public/privileged-api/associate-commit.php        2016-05-19 02:39:54 UTC (rev 201123)
</span><span class="lines">@@ -29,13 +29,18 @@
</span><span class="cx">         require_format('Kind', $kind, '/^(cause|fix)$/');
</span><span class="cx"> 
</span><span class="cx">         $commit_info = array('repository' =&gt; $repository_id, 'revision' =&gt; $revision);
</span><del>-        $commit_row = $db-&gt;select_first_row('commits', 'commit', $commit_info);
-        if (!$commit_row) {
</del><ins>+        $commit_rows = $db-&gt;query_and_fetch_all('SELECT commit_id FROM commits WHERE commit_repository = $1 AND commit_revision LIKE $2 LIMIT 2',
+            array($repository_id, '%' . Database::escape_for_like($revision) . '%'));
+        if (count($commit_rows) &gt; 1) {
</ins><span class="cx">             $db-&gt;rollback_transaction();
</span><ins>+            exit_with_error('AmbiguousRevision', $commit_info);            
+        } else if (!$commit_rows) {
+            $db-&gt;rollback_transaction();
</ins><span class="cx">             exit_with_error('CommitNotFound', $commit_info);
</span><span class="cx">         }
</span><del>-        $commit_id = $commit_row['commit_id'];
</del><span class="cx"> 
</span><ins>+        $commit_id = $commit_rows[0]['commit_id'];
+
</ins><span class="cx">         $association = array('task' =&gt; $analysis_task_id, 'commit' =&gt; $commit_id, 'is_fix' =&gt; Database::to_database_boolean($kind == 'fix'));
</span><span class="cx">         $commit_id = $db-&gt;update_or_insert_row('task_commits', 'taskcommit',
</span><span class="cx">             array('task' =&gt; $analysis_task_id, 'commit' =&gt; $commit_id), $association, 'commit');
</span></span></pre></div>
<a id="trunkWebsitesperfwebkitorgpublicv3pagesanalysistaskpagejs"></a>
<div class="modfile"><h4>Modified: trunk/Websites/perf.webkit.org/public/v3/pages/analysis-task-page.js (201122 => 201123)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Websites/perf.webkit.org/public/v3/pages/analysis-task-page.js        2016-05-19 01:27:49 UTC (rev 201122)
+++ trunk/Websites/perf.webkit.org/public/v3/pages/analysis-task-page.js        2016-05-19 02:39:54 UTC (rev 201123)
</span><span class="lines">@@ -496,7 +496,12 @@
</span><span class="cx">         var render = this.render.bind(this);
</span><span class="cx">         return this._task.associateCommit(kind, repository, revision).then(render, function (error) {
</span><span class="cx">             render();
</span><del>-            alert('Failed to associate the commit: ' + error);
</del><ins>+            if (error == 'AmbiguousRevision')
+                alert('There are multiple revisions that match the specified string: ' + revision);
+            else if (error == 'CommitNotFound')
+                alert('There are no revisions that match the specified string:' + revision);
+            else
+                alert('Failed to associate the commit: ' + error);
</ins><span class="cx">         });
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>