Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1859)

Unified Diff: dashboard/dashboard/pinpoint/models/change/commit.py

Issue 3013713002: [pinpoint] Calculate distances between Changes.
Patch Set: Created 3 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: dashboard/dashboard/pinpoint/models/change/commit.py
diff --git a/dashboard/dashboard/pinpoint/models/change/commit.py b/dashboard/dashboard/pinpoint/models/change/commit.py
index f7357279de5c7bc9385e39d07640f0d188d42657..513541031e2e715c57bcf627644ee4e35318a694 100644
--- a/dashboard/dashboard/pinpoint/models/change/commit.py
+++ b/dashboard/dashboard/pinpoint/models/change/commit.py
@@ -101,6 +101,11 @@ class Commit(collections.namedtuple('Commit', ('repository', 'git_hash'))):
def Midpoint(cls, commit_a, commit_b):
"""Return a Commit halfway between the two given Commits.
+ If the range has an even number of Commits, the midpoint is the Commit just
+ before the halfway point. The range includes both commit_a and commit_b;
+ i.e. if commit_a and commit_b are adjacent or the same, the midpoint is
+ commit_a.
+
Uses Gitiles to look up the commit range.
Args:
@@ -108,16 +113,15 @@ class Commit(collections.namedtuple('Commit', ('repository', 'git_hash'))):
commit_b: The last Commit in the range.
Returns:
- A new Commit representing the midpoint.
- The commit before the midpoint if the range has an even number of commits.
- commit_a if the Commits are the same or adjacent.
+ A tuple of (Commit, (left, right)). left and right are the distances
+ between the midpoint and commit_a and commit_b, respectively.
Raises:
NonLinearError: The Commits are in different repositories or commit_a does
not come before commit_b.
"""
if commit_a == commit_b:
- return commit_a
+ return commit_a, (0, 0)
if commit_a.repository != commit_b.repository:
raise NonLinearError('Repositories differ between Commits: %s vs %s' %
@@ -130,11 +134,12 @@ class Commit(collections.namedtuple('Commit', ('repository', 'git_hash'))):
if len(commits) == 0:
raise NonLinearError('Commit "%s" does not come before commit "%s".' %
commit_a, commit_b)
- if len(commits) == 1:
- return commit_a
- commits.pop(0) # Remove commit_b from the range.
+ # Include both commit_a and commit_b in the range.
perezju 2017/09/19 15:58:05 nit: Add a short reminder that the list of commits
+ commits.append({'commit': commit_a.git_hash})
perezju 2017/09/19 15:58:05 I'm wondering whether gitiles_service.CommitRange
- return cls(commit_a.repository, commits[len(commits) / 2]['commit'])
+ midpoint_index = len(commits) / 2
+ midpoint = cls(commit_a.repository, commits[midpoint_index]['commit'])
+ return midpoint, (len(commits) - midpoint_index - 1, midpoint_index)
def _Repository(repository_url):

Powered by Google App Engine
This is Rietveld 408576698