Merge ~cjwatson/launchpad:py3-stable-branch-target-related-branches into launchpad:master

Proposed by Colin Watson
Status: Merged
Approved by: Colin Watson
Approved revision: dbc2730cdaa9d81c558528b40f82a3a96275dddb
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~cjwatson/launchpad:py3-stable-branch-target-related-branches
Merge into: launchpad:master
Diff against target: 73 lines (+38/-5)
2 files modified
lib/lp/code/model/branchtarget.py (+2/-2)
lib/lp/services/webapp/sorting.py (+36/-3)
Reviewer Review Type Date Requested Status
Cristian Gonzalez (community) Approve
Review via email: mp+398783@code.launchpad.net

Commit message

Stabilize sorting of branch target related branches

Description of the change

Tie-break the sort on the branch ID. This required extending sorted_version_numbers a bit to allow for tie-breaking.

To post a comment you must log in.
Revision history for this message
Cristian Gonzalez (cristiangsp) wrote :

Looks good!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/lib/lp/code/model/branchtarget.py b/lib/lp/code/model/branchtarget.py
index 9c32ad2..2b84a8f 100644
--- a/lib/lp/code/model/branchtarget.py
+++ b/lib/lp/code/model/branchtarget.py
@@ -177,7 +177,7 @@ class PackageBranchTarget(_BaseBranchTarget):
177 distroseries.status != SeriesStatus.OBSOLETE)])177 distroseries.status != SeriesStatus.OBSOLETE)])
178178
179 result = sorted_version_numbers(result, key=lambda branch_info: (179 result = sorted_version_numbers(result, key=lambda branch_info: (
180 getattr(branch_info[1], 'name')))180 getattr(branch_info[1], 'name'), branch_info[0].id))
181181
182 if limit_results is not None:182 if limit_results is not None:
183 # We only want the most recent branches183 # We only want the most recent branches
@@ -416,7 +416,7 @@ class ProductBranchTarget(_BaseBranchTarget):
416 pass416 pass
417417
418 result = sorted_version_numbers(result, key=lambda branch_info: (418 result = sorted_version_numbers(result, key=lambda branch_info: (
419 getattr(branch_info[1], 'name')))419 getattr(branch_info[1], 'name'), branch_info[0].id))
420420
421 if limit_results is not None:421 if limit_results is not None:
422 # We only want the most recent branches422 # We only want the most recent branches
diff --git a/lib/lp/services/webapp/sorting.py b/lib/lp/services/webapp/sorting.py
index 052c669..81a907f 100644
--- a/lib/lp/services/webapp/sorting.py
+++ b/lib/lp/services/webapp/sorting.py
@@ -98,10 +98,43 @@ def sorted_version_numbers(sequence, key=_identity):
98 bzr-0.998 bzr-0.9
99 foo99 foo
100100
101 Items in the sequence can also be tuples or lists, allowing for
102 tie-breaking. In such cases, only the first element in each item is
103 considered as a version.
104
105 >>> bzr_versions = [
106 ... (series('0.9'), 8), (series('0.9'), 9), (series('0.9'), 10),
107 ... (series('1.0'), 1)]
108 >>> for version, tiebreak in sorted_version_numbers(
109 ... bzr_versions, key=lambda item: item[0].name):
110 ... print(version.name, tiebreak)
111 1.0 1
112 0.9 8
113 0.9 9
114 0.9 10
115
116 >>> bzr_versions = [
117 ... [series('0.9'), 8], [series('0.9'), 9], [series('0.9'), 10],
118 ... [series('1.0'), 1]]
119 >>> for version, tiebreak in sorted_version_numbers(
120 ... bzr_versions, key=lambda item: item[0].name):
121 ... print(version.name, tiebreak)
122 1.0 1
123 0.9 8
124 0.9 9
125 0.9 10
126
101 """127 """
102 return sorted(128 def sort_key(item):
103 sequence,129 k = key(item)
104 key=lambda x: _reversed_number_sort_key(expand_numbers(key(x))))130 if isinstance(k, (tuple, list)):
131 return (
132 (_reversed_number_sort_key(expand_numbers(k[0])),) +
133 tuple(k[1:]))
134 else:
135 return _reversed_number_sort_key(expand_numbers(k))
136
137 return sorted(sequence, key=sort_key)
105138
106139
107def sorted_dotted_numbers(sequence, key=_identity):140def sorted_dotted_numbers(sequence, key=_identity):

Subscribers

People subscribed via source and target branches

to status/vote changes: