Show More
@@ -107,25 +107,46 b' class SimpleVCS(object):' | |||||
107 |
|
107 | |||
108 | def set_repo_names(self, environ): |
|
108 | def set_repo_names(self, environ): | |
109 | """ |
|
109 | """ | |
110 |
This will populate the attributes acl_repo_name, url_repo_name |
|
110 | This will populate the attributes acl_repo_name, url_repo_name, | |
111 | vcs_repo_name on the current instance. |
|
111 | vcs_repo_name and pr_id on the current instance. | |
112 | """ |
|
112 | """ | |
113 | # TODO: martinb: Move to class or module scope. |
|
113 | # TODO: martinb: Move to class or module scope. | |
|
114 | # TODO: martinb: Check if we have to use re.UNICODE. | |||
|
115 | # TODO: martinb: Check which chars are allowed for repo/group names. | |||
|
116 | # These chars are excluded: '`?=[]\;\'"<>,/~!@#$%^&*()+{}|: ' | |||
|
117 | # Code from: rhodecode/lib/utils.py:repo_name_slug() | |||
114 | pr_regex = re.compile( |
|
118 | pr_regex = re.compile( | |
115 | '(?P<base_name>(?:[\w-]+)(?:/[\w-]+)*)/' |
|
119 | '(?P<base_name>(?:[\w-]+)(?:/[\w-]+)*)/' # repo groups | |
116 | '(?P<repo_name>[\w-]+)' |
|
120 | '(?P<repo_name>[\w-]+)' # target repo name | |
117 | '/pull-request/(?P<pr_id>\d+)/repository') |
|
121 | '/pull-request/(?P<pr_id>\d+)/repository') # pr suffix | |
118 |
|
122 | |||
|
123 | # Get url repo name from environment. | |||
119 | self.url_repo_name = self._get_repository_name(environ) |
|
124 | self.url_repo_name = self._get_repository_name(environ) | |
120 | match = pr_regex.match(self.url_repo_name) |
|
|||
121 |
|
125 | |||
|
126 | # Check if this is a request to a shadow repository. In case of a | |||
|
127 | # shadow repo set vcs_repo_name to the file system path pointing to the | |||
|
128 | # shadow repo. And set acl_repo_name to the pull request target repo | |||
|
129 | # because we use the target repo for permission checks. Otherwise all | |||
|
130 | # names are equal. | |||
|
131 | match = pr_regex.match(self.url_repo_name) | |||
122 | if match: |
|
132 | if match: | |
|
133 | # Get pull request instance. | |||
123 | match_dict = match.groupdict() |
|
134 | match_dict = match.groupdict() | |
124 | self.acl_repo_name = '{base_name}/{repo_name}'.format(**match_dict) |
|
135 | pr_id = match_dict['pr_id'] | |
125 | self.vcs_repo_name = '{base_name}/.__shadow_{repo_name}_pr-{pr_id}'.format( |
|
136 | pull_request = PullRequest.get(pr_id) | |
126 | **match_dict) |
|
137 | ||
127 | self.pr_id = match_dict['pr_id'] |
|
138 | # Get file system path to shadow repository. | |
|
139 | workspace_id = PullRequestModel()._workspace_id(pull_request) | |||
|
140 | target_vcs = pull_request.target_repo.scm_instance() | |||
|
141 | vcs_repo_name = target_vcs._get_shadow_repository_path( | |||
|
142 | workspace_id) | |||
|
143 | ||||
|
144 | # Store names for later usage. | |||
|
145 | self.pr_id = pr_id | |||
|
146 | self.vcs_repo_name = vcs_repo_name | |||
|
147 | self.acl_repo_name = pull_request.target_repo.repo_name | |||
128 | else: |
|
148 | else: | |
|
149 | # All names are equal for normal (non shadow) repositories. | |||
129 | self.acl_repo_name = self.url_repo_name |
|
150 | self.acl_repo_name = self.url_repo_name | |
130 | self.vcs_repo_name = self.url_repo_name |
|
151 | self.vcs_repo_name = self.url_repo_name | |
131 | self.pr_id = None |
|
152 | self.pr_id = None |
General Comments 0
You need to be logged in to leave comments.
Login now