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
1diff --git a/lib/lp/code/model/branchtarget.py b/lib/lp/code/model/branchtarget.py
2index 9c32ad2..2b84a8f 100644
3--- a/lib/lp/code/model/branchtarget.py
4+++ b/lib/lp/code/model/branchtarget.py
5@@ -177,7 +177,7 @@ class PackageBranchTarget(_BaseBranchTarget):
6 distroseries.status != SeriesStatus.OBSOLETE)])
7
8 result = sorted_version_numbers(result, key=lambda branch_info: (
9- getattr(branch_info[1], 'name')))
10+ getattr(branch_info[1], 'name'), branch_info[0].id))
11
12 if limit_results is not None:
13 # We only want the most recent branches
14@@ -416,7 +416,7 @@ class ProductBranchTarget(_BaseBranchTarget):
15 pass
16
17 result = sorted_version_numbers(result, key=lambda branch_info: (
18- getattr(branch_info[1], 'name')))
19+ getattr(branch_info[1], 'name'), branch_info[0].id))
20
21 if limit_results is not None:
22 # We only want the most recent branches
23diff --git a/lib/lp/services/webapp/sorting.py b/lib/lp/services/webapp/sorting.py
24index 052c669..81a907f 100644
25--- a/lib/lp/services/webapp/sorting.py
26+++ b/lib/lp/services/webapp/sorting.py
27@@ -98,10 +98,43 @@ def sorted_version_numbers(sequence, key=_identity):
28 bzr-0.9
29 foo
30
31+ Items in the sequence can also be tuples or lists, allowing for
32+ tie-breaking. In such cases, only the first element in each item is
33+ considered as a version.
34+
35+ >>> bzr_versions = [
36+ ... (series('0.9'), 8), (series('0.9'), 9), (series('0.9'), 10),
37+ ... (series('1.0'), 1)]
38+ >>> for version, tiebreak in sorted_version_numbers(
39+ ... bzr_versions, key=lambda item: item[0].name):
40+ ... print(version.name, tiebreak)
41+ 1.0 1
42+ 0.9 8
43+ 0.9 9
44+ 0.9 10
45+
46+ >>> bzr_versions = [
47+ ... [series('0.9'), 8], [series('0.9'), 9], [series('0.9'), 10],
48+ ... [series('1.0'), 1]]
49+ >>> for version, tiebreak in sorted_version_numbers(
50+ ... bzr_versions, key=lambda item: item[0].name):
51+ ... print(version.name, tiebreak)
52+ 1.0 1
53+ 0.9 8
54+ 0.9 9
55+ 0.9 10
56+
57 """
58- return sorted(
59- sequence,
60- key=lambda x: _reversed_number_sort_key(expand_numbers(key(x))))
61+ def sort_key(item):
62+ k = key(item)
63+ if isinstance(k, (tuple, list)):
64+ return (
65+ (_reversed_number_sort_key(expand_numbers(k[0])),) +
66+ tuple(k[1:]))
67+ else:
68+ return _reversed_number_sort_key(expand_numbers(k))
69+
70+ return sorted(sequence, key=sort_key)
71
72
73 def sorted_dotted_numbers(sequence, key=_identity):

Subscribers

People subscribed via source and target branches

to status/vote changes: