Merge lp:~wgrant/launchpad/bug-1524316 into lp:launchpad

Proposed by William Grant
Status: Merged
Merged at revision: 17868
Proposed branch: lp:~wgrant/launchpad/bug-1524316
Merge into: lp:launchpad
Diff against target: 136 lines (+83/-17)
2 files modified
lib/lp/code/model/gitrepository.py (+12/-11)
lib/lp/code/model/tests/test_gitrepository.py (+71/-6)
To merge this branch: bzr merge lp:~wgrant/launchpad/bug-1524316
Reviewer Review Type Date Requested Status
Colin Watson (community) Approve
Review via email: mp+280096@code.launchpad.net

Commit message

Fix setDefaultRepository(ForOwner) to cope with replacing an existing default.

Description of the change

Fix setDefaultRepository(ForOwner) to cope with replacing an existing default.

The owner variant also didn't handle no-ops, though this would never have been hit on production.

To post a comment you must log in.
Revision history for this message
Colin Watson (cjwatson) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/lp/code/model/gitrepository.py'
2--- lib/lp/code/model/gitrepository.py 2015-10-09 16:56:45 +0000
3+++ lib/lp/code/model/gitrepository.py 2015-12-10 00:33:48 +0000
4@@ -1241,16 +1241,16 @@
5 raise GitTargetError(
6 "Cannot set a default Git repository for a person, only "
7 "for a project or a package.")
8- if repository is not None:
9- if repository.target != target:
10- raise GitTargetError(
11- "Cannot set default Git repository to one attached to "
12- "another target.")
13- repository.setTargetDefault(True)
14- else:
15- previous = self.getDefaultRepository(target)
16+ if repository is not None and repository.target != target:
17+ raise GitTargetError(
18+ "Cannot set default Git repository to one attached to "
19+ "another target.")
20+ previous = self.getDefaultRepository(target)
21+ if previous != repository:
22 if previous is not None:
23 previous.setTargetDefault(False)
24+ if repository is not None:
25+ repository.setTargetDefault(True)
26
27 def setDefaultRepositoryForOwner(self, owner, target, repository, user):
28 """See `IGitRepositorySet`."""
29@@ -1276,11 +1276,12 @@
30 raise GitTargetError(
31 "Cannot set a person's default Git repository to one "
32 "owned by somebody else.")
33- repository.setOwnerDefault(True)
34- else:
35- previous = self.getDefaultRepositoryForOwner(owner, target)
36+ previous = self.getDefaultRepositoryForOwner(owner, target)
37+ if previous != repository:
38 if previous is not None:
39 previous.setOwnerDefault(False)
40+ if repository is not None:
41+ repository.setOwnerDefault(True)
42
43 def empty_list(self):
44 """See `IGitRepositorySet`."""
45
46=== modified file 'lib/lp/code/model/tests/test_gitrepository.py'
47--- lib/lp/code/model/tests/test_gitrepository.py 2015-11-02 15:31:39 +0000
48+++ lib/lp/code/model/tests/test_gitrepository.py 2015-12-10 00:33:48 +0000
49@@ -2074,16 +2074,81 @@
50 self.repository_set.setDefaultRepositoryForOwner,
51 person, person, repository, user)
52
53- def test_setDefaultRepository_for_same_targetdefault_noops(self):
54- # If a repository is already the target default,
55- # setting the defaultRepository again should no-op.
56+ def test_setDefaultRepositoryForOwner_noop(self):
57+ # If a repository is already the target owner default, setting
58+ # the default again should no-op.
59+ owner = self.factory.makePerson()
60+ target = self.factory.makeProduct()
61+ repo = self.factory.makeGitRepository(owner=owner, target=target)
62+ with person_logged_in(owner):
63+ self.repository_set.setDefaultRepositoryForOwner(
64+ owner, target, repo, owner)
65+ self.assertEqual(
66+ repo,
67+ self.repository_set.getDefaultRepositoryForOwner(
68+ owner, target))
69+ self.repository_set.setDefaultRepositoryForOwner(
70+ owner, target, repo, owner)
71+ self.assertEqual(
72+ repo,
73+ self.repository_set.getDefaultRepositoryForOwner(
74+ owner, target))
75+
76+ def test_setDefaultRepositoryForOwner_replaces_old(self):
77+ # If another repository is already the target owner default,
78+ # setting it overwrites.
79+ owner = self.factory.makePerson()
80+ target = self.factory.makeProduct()
81+ repo1 = self.factory.makeGitRepository(owner=owner, target=target)
82+ repo2 = self.factory.makeGitRepository(owner=owner, target=target)
83+ with person_logged_in(owner):
84+ self.repository_set.setDefaultRepositoryForOwner(
85+ owner, target, repo1, owner)
86+ self.assertEqual(
87+ repo1,
88+ self.repository_set.getDefaultRepositoryForOwner(
89+ owner, target))
90+ self.assertTrue(repo1.owner_default)
91+ self.assertFalse(repo2.owner_default)
92+ self.repository_set.setDefaultRepositoryForOwner(
93+ owner, target, repo2, owner)
94+ self.assertEqual(
95+ repo2,
96+ self.repository_set.getDefaultRepositoryForOwner(
97+ owner, target))
98+ self.assertFalse(repo1.owner_default)
99+ self.assertTrue(repo2.owner_default)
100+
101+ def test_setDefaultRepository_noop(self):
102+ # If a repository is already the target default, setting the
103+ # default again should no-op.
104 project = self.factory.makeProduct()
105 repository = self.factory.makeGitRepository(target=project)
106 with person_logged_in(project.owner):
107 self.repository_set.setDefaultRepository(project, repository)
108- result = self.repository_set.setDefaultRepository(
109- project, repository)
110- self.assertEqual(None, result)
111+ self.assertEqual(
112+ repository, self.repository_set.getDefaultRepository(project))
113+ self.repository_set.setDefaultRepository(project, repository)
114+ self.assertEqual(
115+ repository, self.repository_set.getDefaultRepository(project))
116+
117+ def test_setDefaultRepository_replaces_old(self):
118+ # If another repository is already the target default, setting
119+ # it overwrites.
120+ project = self.factory.makeProduct()
121+ repo1 = self.factory.makeGitRepository(target=project)
122+ repo2 = self.factory.makeGitRepository(target=project)
123+ with person_logged_in(project.owner):
124+ self.repository_set.setDefaultRepository(project, repo1)
125+ self.assertEqual(
126+ repo1, self.repository_set.getDefaultRepository(project))
127+ self.assertTrue(repo1.target_default)
128+ self.assertFalse(repo2.target_default)
129+ self.repository_set.setDefaultRepository(project, repo2)
130+ self.assertEqual(
131+ repo2, self.repository_set.getDefaultRepository(project))
132+ self.assertFalse(repo1.target_default)
133+ self.assertTrue(repo2.target_default)
134
135
136 class TestGitRepositorySetDefaultsMixin: