##// END OF EJS Templates
fixed exception message
marcink -
r1492:7592484e beta
parent child Browse files
Show More
@@ -1,358 +1,358
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 rhodecode.model.repo
4 4 ~~~~~~~~~~~~~~~~~~~~
5 5
6 6 Repository model for rhodecode
7 7
8 8 :created_on: Jun 5, 2010
9 9 :author: marcink
10 10 :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com>
11 11 :license: GPLv3, see COPYING for more details.
12 12 """
13 13 # This program is free software: you can redistribute it and/or modify
14 14 # it under the terms of the GNU General Public License as published by
15 15 # the Free Software Foundation, either version 3 of the License, or
16 16 # (at your option) any later version.
17 17 #
18 18 # This program is distributed in the hope that it will be useful,
19 19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 21 # GNU General Public License for more details.
22 22 #
23 23 # You should have received a copy of the GNU General Public License
24 24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
25 25 import os
26 26 import shutil
27 27 import logging
28 28 import traceback
29 29 from datetime import datetime
30 30
31 31 from sqlalchemy.orm import joinedload, make_transient
32 32
33 33 from vcs.utils.lazy import LazyProperty
34 34 from vcs.backends import get_backend
35 35
36 36 from rhodecode.lib import safe_str
37 37
38 38 from rhodecode.model import BaseModel
39 39 from rhodecode.model.caching_query import FromCache
40 40 from rhodecode.model.db import Repository, RepoToPerm, User, Permission, \
41 41 Statistics, UsersGroup, UsersGroupRepoToPerm, RhodeCodeUi, Group
42 42 from rhodecode.model.user import UserModel
43 43
44 44 log = logging.getLogger(__name__)
45 45
46 46
47 47 class RepoModel(BaseModel):
48 48
49 49 @LazyProperty
50 50 def repos_path(self):
51 51 """Get's the repositories root path from database
52 52 """
53 53
54 54 q = self.sa.query(RhodeCodeUi).filter(RhodeCodeUi.ui_key == '/').one()
55 55 return q.ui_value
56 56
57 57 def get(self, repo_id, cache=False):
58 58 repo = self.sa.query(Repository)\
59 59 .filter(Repository.repo_id == repo_id)
60 60
61 61 if cache:
62 62 repo = repo.options(FromCache("sql_cache_short",
63 63 "get_repo_%s" % repo_id))
64 64 return repo.scalar()
65 65
66 66 def get_by_repo_name(self, repo_name, cache=False):
67 67 repo = self.sa.query(Repository)\
68 68 .filter(Repository.repo_name == repo_name)
69 69
70 70 if cache:
71 71 repo = repo.options(FromCache("sql_cache_short",
72 72 "get_repo_%s" % repo_name))
73 73 return repo.scalar()
74 74
75 75
76 76 def get_users_js(self):
77 77
78 78 users = self.sa.query(User).filter(User.active == True).all()
79 79 u_tmpl = '''{id:%s, fname:"%s", lname:"%s", nname:"%s"},'''
80 80 users_array = '[%s]' % '\n'.join([u_tmpl % (u.user_id, u.name,
81 81 u.lastname, u.username)
82 82 for u in users])
83 83 return users_array
84 84
85 85 def get_users_groups_js(self):
86 86 users_groups = self.sa.query(UsersGroup)\
87 87 .filter(UsersGroup.users_group_active == True).all()
88 88
89 89 g_tmpl = '''{id:%s, grname:"%s",grmembers:"%s"},'''
90 90
91 91 users_groups_array = '[%s]' % '\n'.join([g_tmpl % \
92 92 (gr.users_group_id, gr.users_group_name,
93 93 len(gr.members))
94 94 for gr in users_groups])
95 95 return users_groups_array
96 96
97 97 def update(self, repo_name, form_data):
98 98 try:
99 99 cur_repo = self.get_by_repo_name(repo_name, cache=False)
100 100
101 101 #update permissions
102 102 for member, perm, member_type in form_data['perms_updates']:
103 103 if member_type == 'user':
104 104 r2p = self.sa.query(RepoToPerm)\
105 105 .filter(RepoToPerm.user == User.by_username(member))\
106 106 .filter(RepoToPerm.repository == cur_repo)\
107 107 .one()
108 108
109 109 r2p.permission = self.sa.query(Permission)\
110 110 .filter(Permission.permission_name ==
111 111 perm).scalar()
112 112 self.sa.add(r2p)
113 113 else:
114 114 g2p = self.sa.query(UsersGroupRepoToPerm)\
115 115 .filter(UsersGroupRepoToPerm.users_group ==
116 116 UsersGroup.get_by_group_name(member))\
117 117 .filter(UsersGroupRepoToPerm.repository ==
118 118 cur_repo).one()
119 119
120 120 g2p.permission = self.sa.query(Permission)\
121 121 .filter(Permission.permission_name ==
122 122 perm).scalar()
123 123 self.sa.add(g2p)
124 124
125 125 #set new permissions
126 126 for member, perm, member_type in form_data['perms_new']:
127 127 if member_type == 'user':
128 128 r2p = RepoToPerm()
129 129 r2p.repository = cur_repo
130 130 r2p.user = User.by_username(member)
131 131
132 132 r2p.permission = self.sa.query(Permission)\
133 133 .filter(Permission.
134 134 permission_name == perm)\
135 135 .scalar()
136 136 self.sa.add(r2p)
137 137 else:
138 138 g2p = UsersGroupRepoToPerm()
139 139 g2p.repository = cur_repo
140 140 g2p.users_group = UsersGroup.get_by_group_name(member)
141 141 g2p.permission = self.sa.query(Permission)\
142 142 .filter(Permission.
143 143 permission_name == perm)\
144 144 .scalar()
145 145 self.sa.add(g2p)
146 146
147 147 #update current repo
148 148 for k, v in form_data.items():
149 149 if k == 'user':
150 150 cur_repo.user = User.by_username(v)
151 151 elif k == 'repo_name':
152 152 cur_repo.repo_name = form_data['repo_name_full']
153 153 elif k == 'repo_group':
154 154 cur_repo.group_id = v
155 155
156 156 else:
157 157 setattr(cur_repo, k, v)
158 158
159 159 self.sa.add(cur_repo)
160 160
161 161 if repo_name != form_data['repo_name_full']:
162 162 # rename repository
163 163 self.__rename_repo(old=repo_name,
164 164 new=form_data['repo_name_full'])
165 165
166 166 self.sa.commit()
167 167 except:
168 168 log.error(traceback.format_exc())
169 169 self.sa.rollback()
170 170 raise
171 171
172 172 def create(self, form_data, cur_user, just_db=False, fork=False):
173 173
174 174 try:
175 175 if fork:
176 176 repo_name = form_data['fork_name']
177 177 org_name = form_data['repo_name']
178 178 org_full_name = org_name
179 179
180 180 else:
181 181 org_name = repo_name = form_data['repo_name']
182 182 repo_name_full = form_data['repo_name_full']
183 183
184 184 new_repo = Repository()
185 185 new_repo.enable_statistics = False
186 186 for k, v in form_data.items():
187 187 if k == 'repo_name':
188 188 if fork:
189 189 v = repo_name
190 190 else:
191 191 v = repo_name_full
192 192 if k == 'repo_group':
193 193 k = 'group_id'
194 194
195 195 setattr(new_repo, k, v)
196 196
197 197 if fork:
198 198 parent_repo = self.sa.query(Repository)\
199 199 .filter(Repository.repo_name == org_full_name).one()
200 200 new_repo.fork = parent_repo
201 201
202 202 new_repo.user_id = cur_user.user_id
203 203 self.sa.add(new_repo)
204 204
205 205 #create default permission
206 206 repo_to_perm = RepoToPerm()
207 207 default = 'repository.read'
208 208 for p in UserModel(self.sa).get_by_username('default',
209 209 cache=False).user_perms:
210 210 if p.permission.permission_name.startswith('repository.'):
211 211 default = p.permission.permission_name
212 212 break
213 213
214 214 default_perm = 'repository.none' if form_data['private'] else default
215 215
216 216 repo_to_perm.permission_id = self.sa.query(Permission)\
217 217 .filter(Permission.permission_name == default_perm)\
218 218 .one().permission_id
219 219
220 220 repo_to_perm.repository = new_repo
221 221 repo_to_perm.user_id = UserModel(self.sa)\
222 222 .get_by_username('default', cache=False).user_id
223 223
224 224 self.sa.add(repo_to_perm)
225 225
226 226 if not just_db:
227 227 self.__create_repo(repo_name, form_data['repo_type'],
228 228 form_data['repo_group'],
229 229 form_data['clone_uri'])
230 230
231 231 self.sa.commit()
232 232
233 233 #now automatically start following this repository as owner
234 234 from rhodecode.model.scm import ScmModel
235 235 ScmModel(self.sa).toggle_following_repo(new_repo.repo_id,
236 236 cur_user.user_id)
237 237
238 238 except:
239 239 log.error(traceback.format_exc())
240 240 self.sa.rollback()
241 241 raise
242 242
243 243 def create_fork(self, form_data, cur_user):
244 244 from rhodecode.lib.celerylib import tasks, run_task
245 245 run_task(tasks.create_repo_fork, form_data, cur_user)
246 246
247 247 def delete(self, repo):
248 248 try:
249 249 self.sa.delete(repo)
250 250 self.__delete_repo(repo)
251 251 self.sa.commit()
252 252 except:
253 253 log.error(traceback.format_exc())
254 254 self.sa.rollback()
255 255 raise
256 256
257 257 def delete_perm_user(self, form_data, repo_name):
258 258 try:
259 259 self.sa.query(RepoToPerm)\
260 260 .filter(RepoToPerm.repository \
261 261 == self.get_by_repo_name(repo_name))\
262 262 .filter(RepoToPerm.user_id == form_data['user_id']).delete()
263 263 self.sa.commit()
264 264 except:
265 265 log.error(traceback.format_exc())
266 266 self.sa.rollback()
267 267 raise
268 268
269 269 def delete_perm_users_group(self, form_data, repo_name):
270 270 try:
271 271 self.sa.query(UsersGroupRepoToPerm)\
272 272 .filter(UsersGroupRepoToPerm.repository \
273 273 == self.get_by_repo_name(repo_name))\
274 274 .filter(UsersGroupRepoToPerm.users_group_id \
275 275 == form_data['users_group_id']).delete()
276 276 self.sa.commit()
277 277 except:
278 278 log.error(traceback.format_exc())
279 279 self.sa.rollback()
280 280 raise
281 281
282 282 def delete_stats(self, repo_name):
283 283 try:
284 284 self.sa.query(Statistics)\
285 285 .filter(Statistics.repository == \
286 286 self.get_by_repo_name(repo_name)).delete()
287 287 self.sa.commit()
288 288 except:
289 289 log.error(traceback.format_exc())
290 290 self.sa.rollback()
291 291 raise
292 292
293 293 def __create_repo(self, repo_name, alias, new_parent_id, clone_uri=False):
294 294 """
295 295 makes repository on filesystem. It's group aware means it'll create
296 296 a repository within a group, and alter the paths accordingly of
297 297 group location
298 298
299 299 :param repo_name:
300 300 :param alias:
301 301 :param parent_id:
302 302 :param clone_uri:
303 303 """
304 304 from rhodecode.lib.utils import check_repo
305 305
306 306 if new_parent_id:
307 307 paths = Group.get(new_parent_id).full_path.split(Group.url_sep())
308 308 new_parent_path = os.sep.join(paths)
309 309 else:
310 310 new_parent_path = ''
311 311
312 312 repo_path = os.path.join(*map(lambda x:safe_str(x),
313 313 [self.repos_path, new_parent_path, repo_name]))
314 314
315 315 if check_repo(repo_path, self.repos_path):
316 316 log.info('creating repo %s in %s @ %s', repo_name, repo_path,
317 317 clone_uri)
318 318 backend = get_backend(alias)
319 319
320 320 backend(repo_path, create=True, src_url=clone_uri)
321 321
322 322
323 323 def __rename_repo(self, old, new):
324 324 """
325 325 renames repository on filesystem
326 326
327 327 :param old: old name
328 328 :param new: new name
329 329 """
330 330 log.info('renaming repo from %s to %s', old, new)
331 331
332 332 old_path = os.path.join(self.repos_path, old)
333 333 new_path = os.path.join(self.repos_path, new)
334 334 if os.path.isdir(new_path):
335 raise Exception('Was trying to rename to already existing dir %s',
336 new_path)
335 raise Exception('Was trying to rename to already existing dir %s' \
336 % new_path)
337 337 shutil.move(old_path, new_path)
338 338
339 339 def __delete_repo(self, repo):
340 340 """
341 341 removes repo from filesystem, the removal is acctually made by
342 342 added rm__ prefix into dir, and rename internat .hg/.git dirs so this
343 343 repository is no longer valid for rhodecode, can be undeleted later on
344 344 by reverting the renames on this repository
345 345
346 346 :param repo: repo object
347 347 """
348 348 rm_path = os.path.join(self.repos_path, repo.repo_name)
349 349 log.info("Removing %s", rm_path)
350 350 #disable hg/git
351 351 alias = repo.repo_type
352 352 shutil.move(os.path.join(rm_path, '.%s' % alias),
353 353 os.path.join(rm_path, 'rm__.%s' % alias))
354 354 #disable repo
355 355 shutil.move(rm_path, os.path.join(self.repos_path, 'rm__%s__%s' \
356 356 % (datetime.today()\
357 357 .strftime('%Y%m%d_%H%M%S_%f'),
358 358 repo.repo_name)))
General Comments 0
You need to be logged in to leave comments. Login now