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