Merge lp:~cjwatson/launchpad/git-repository-getRule into lp:launchpad

Proposed by Colin Watson
Status: Merged
Merged at revision: 18805
Proposed branch: lp:~cjwatson/launchpad/git-repository-getRule
Merge into: lp:launchpad
Diff against target: 72 lines (+26/-3)
4 files modified
lib/lp/code/interfaces/gitrepository.py (+7/-0)
lib/lp/code/model/gitref.py (+1/-3)
lib/lp/code/model/gitrepository.py (+4/-0)
lib/lp/code/model/tests/test_gitrepository.py (+14/-0)
To merge this branch: bzr merge lp:~cjwatson/launchpad/git-repository-getRule
Reviewer Review Type Date Requested Status
Tom Wardill (community) Approve
Launchpad code reviewers Pending
Review via email: mp+357625@code.launchpad.net

Commit message

Add IGitRepository.getRule.

Description of the change

This may be handy for the UI (GitRef:+permissions will want to distinguish a rule that matches the ref path exactly), but it also seems like a reasonable thing to have in general.

To post a comment you must log in.
Revision history for this message
Tom Wardill (twom) :
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/interfaces/gitrepository.py'
2--- lib/lp/code/interfaces/gitrepository.py 2018-10-22 10:37:03 +0000
3+++ lib/lp/code/interfaces/gitrepository.py 2018-10-22 12:52:35 +0000
4@@ -622,6 +622,13 @@
5 :return: The diff as a binary string.
6 """
7
8+ def getRule(ref_pattern):
9+ """Get the access rule for this repository with a given pattern.
10+
11+ :param ref_pattern: The reference pattern that the rule should have.
12+ :return: An `IGitRule`, or None.
13+ """
14+
15 def getActivity(changed_after=None):
16 """Get activity log entries for this repository.
17
18
19=== modified file 'lib/lp/code/model/gitref.py'
20--- lib/lp/code/model/gitref.py 2018-10-16 15:29:37 +0000
21+++ lib/lp/code/model/gitref.py 2018-10-22 12:52:35 +0000
22@@ -434,9 +434,7 @@
23
24 def setGrants(self, grants, user):
25 """See `IGitRef`."""
26- rule = Store.of(self).find(
27- GitRule, GitRule.repository_id == self.repository_id,
28- GitRule.ref_pattern == self.path).one()
29+ rule = self.repository.getRule(self.path)
30 if rule is None:
31 # We don't need to worry about position, since this is an
32 # exact-match rule and therefore has a canonical position.
33
34=== modified file 'lib/lp/code/model/gitrepository.py'
35--- lib/lp/code/model/gitrepository.py 2018-10-22 10:37:03 +0000
36+++ lib/lp/code/model/gitrepository.py 2018-10-22 12:52:35 +0000
37@@ -1156,6 +1156,10 @@
38 if rule.position != position:
39 removeSecurityProxy(rule).position = position
40
41+ def getRule(self, ref_pattern):
42+ """See `IGitRepository`."""
43+ return self.rules.find(GitRule.ref_pattern == ref_pattern).one()
44+
45 def addRule(self, ref_pattern, creator, position=None):
46 """See `IGitRepository`."""
47 rules = list(self.rules)
48
49=== modified file 'lib/lp/code/model/tests/test_gitrepository.py'
50--- lib/lp/code/model/tests/test_gitrepository.py 2018-10-22 10:37:03 +0000
51+++ lib/lp/code/model/tests/test_gitrepository.py 2018-10-22 12:52:35 +0000
52@@ -2375,6 +2375,20 @@
53 ref_pattern="refs/heads/stable/*"),
54 ]))
55
56+ def test_getRule(self):
57+ repository = self.factory.makeGitRepository()
58+ self.factory.makeGitRefs(
59+ repository=repository, paths=["refs/heads/master"])
60+ other_repository = self.factory.makeGitRepository()
61+ master_rule = self.factory.makeGitRule(
62+ repository=repository, ref_pattern="refs/heads/master")
63+ self.factory.makeGitRule(
64+ repository=repository, ref_pattern="refs/heads/*")
65+ self.factory.makeGitRule(
66+ repository=other_repository, ref_pattern="refs/heads/master")
67+ self.assertEqual(master_rule, repository.getRule("refs/heads/master"))
68+ self.assertIsNone(repository.getRule("refs/heads/other"))
69+
70 def test_addRule_append(self):
71 repository = self.factory.makeGitRepository()
72 initial_rule = self.factory.makeGitRule(