##// END OF EJS Templates
fix reset statistics call if there are no statistics yet
marcink -
r3314:059efaea beta
parent child Browse files
Show More
@@ -1,705 +1,705 b''
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) 2010-2012 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 from __future__ import with_statement
26 26 import os
27 27 import shutil
28 28 import logging
29 29 import traceback
30 30 from datetime import datetime
31 31
32 32 from rhodecode.lib.vcs.backends import get_backend
33 33 from rhodecode.lib.compat import json
34 34 from rhodecode.lib.utils2 import LazyProperty, safe_str, safe_unicode,\
35 35 remove_prefix
36 36 from rhodecode.lib.caching_query import FromCache
37 37 from rhodecode.lib.hooks import log_create_repository, log_delete_repository
38 38
39 39 from rhodecode.model import BaseModel
40 40 from rhodecode.model.db import Repository, UserRepoToPerm, User, Permission, \
41 41 Statistics, UsersGroup, UsersGroupRepoToPerm, RhodeCodeUi, RepoGroup,\
42 42 RhodeCodeSetting, RepositoryField
43 43 from rhodecode.lib import helpers as h
44 44 from rhodecode.lib.auth import HasRepoPermissionAny
45 45 from rhodecode.lib.vcs.backends.base import EmptyChangeset
46 46
47 47
48 48 log = logging.getLogger(__name__)
49 49
50 50
51 51 class RepoModel(BaseModel):
52 52
53 53 cls = Repository
54 54 URL_SEPARATOR = Repository.url_sep()
55 55
56 56 def __get_users_group(self, users_group):
57 57 return self._get_instance(UsersGroup, users_group,
58 58 callback=UsersGroup.get_by_group_name)
59 59
60 60 def _get_repos_group(self, repos_group):
61 61 return self._get_instance(RepoGroup, repos_group,
62 62 callback=RepoGroup.get_by_group_name)
63 63
64 64 @LazyProperty
65 65 def repos_path(self):
66 66 """
67 67 Get's the repositories root path from database
68 68 """
69 69
70 70 q = self.sa.query(RhodeCodeUi).filter(RhodeCodeUi.ui_key == '/').one()
71 71 return q.ui_value
72 72
73 73 def get(self, repo_id, cache=False):
74 74 repo = self.sa.query(Repository)\
75 75 .filter(Repository.repo_id == repo_id)
76 76
77 77 if cache:
78 78 repo = repo.options(FromCache("sql_cache_short",
79 79 "get_repo_%s" % repo_id))
80 80 return repo.scalar()
81 81
82 82 def get_repo(self, repository):
83 83 return self._get_repo(repository)
84 84
85 85 def get_by_repo_name(self, repo_name, cache=False):
86 86 repo = self.sa.query(Repository)\
87 87 .filter(Repository.repo_name == repo_name)
88 88
89 89 if cache:
90 90 repo = repo.options(FromCache("sql_cache_short",
91 91 "get_repo_%s" % repo_name))
92 92 return repo.scalar()
93 93
94 94 def get_all_user_repos(self, user):
95 95 """
96 96 Get's all repositories that user have at least read access
97 97
98 98 :param user:
99 99 :type user:
100 100 """
101 101 from rhodecode.lib.auth import AuthUser
102 102 user = self._get_user(user)
103 103 repos = AuthUser(user_id=user.user_id).permissions['repositories']
104 104 access_check = lambda r: r[1] in ['repository.read',
105 105 'repository.write',
106 106 'repository.admin']
107 107 repos = [x[0] for x in filter(access_check, repos.items())]
108 108 return Repository.query().filter(Repository.repo_name.in_(repos))
109 109
110 110 def get_users_js(self):
111 111 users = self.sa.query(User).filter(User.active == True).all()
112 112 return json.dumps([
113 113 {
114 114 'id': u.user_id,
115 115 'fname': u.name,
116 116 'lname': u.lastname,
117 117 'nname': u.username,
118 118 'gravatar_lnk': h.gravatar_url(u.email, 14)
119 119 } for u in users]
120 120 )
121 121
122 122 def get_users_groups_js(self):
123 123 users_groups = self.sa.query(UsersGroup)\
124 124 .filter(UsersGroup.users_group_active == True).all()
125 125
126 126 return json.dumps([
127 127 {
128 128 'id': gr.users_group_id,
129 129 'grname': gr.users_group_name,
130 130 'grmembers': len(gr.members),
131 131 } for gr in users_groups]
132 132 )
133 133
134 134 @classmethod
135 135 def _render_datatable(cls, tmpl, *args, **kwargs):
136 136 import rhodecode
137 137 from pylons import tmpl_context as c
138 138 from pylons.i18n.translation import _
139 139
140 140 _tmpl_lookup = rhodecode.CONFIG['pylons.app_globals'].mako_lookup
141 141 template = _tmpl_lookup.get_template('data_table/_dt_elements.html')
142 142
143 143 tmpl = template.get_def(tmpl)
144 144 kwargs.update(dict(_=_, h=h, c=c))
145 145 return tmpl.render(*args, **kwargs)
146 146
147 147 @classmethod
148 148 def update_repoinfo(cls, repositories=None):
149 149 if not repositories:
150 150 repositories = Repository.getAll()
151 151 for repo in repositories:
152 152 scm_repo = repo.scm_instance_no_cache
153 153 last_cs = EmptyChangeset()
154 154 if scm_repo:
155 155 last_cs = scm_repo.get_changeset()
156 156 repo.update_changeset_cache(last_cs)
157 157
158 158 def get_repos_as_dict(self, repos_list=None, admin=False, perm_check=True,
159 159 super_user_actions=False):
160 160 _render = self._render_datatable
161 161
162 162 def quick_menu(repo_name):
163 163 return _render('quick_menu', repo_name)
164 164
165 165 def repo_lnk(name, rtype, private, fork_of):
166 166 return _render('repo_name', name, rtype, private, fork_of,
167 167 short_name=not admin, admin=False)
168 168
169 169 def last_change(last_change):
170 170 return _render("last_change", last_change)
171 171
172 172 def rss_lnk(repo_name):
173 173 return _render("rss", repo_name)
174 174
175 175 def atom_lnk(repo_name):
176 176 return _render("atom", repo_name)
177 177
178 178 def last_rev(repo_name, cs_cache):
179 179 return _render('revision', repo_name, cs_cache.get('revision'),
180 180 cs_cache.get('raw_id'), cs_cache.get('author'),
181 181 cs_cache.get('message'))
182 182
183 183 def desc(desc):
184 184 from pylons import tmpl_context as c
185 185 if c.visual.stylify_metatags:
186 186 return h.urlify_text(h.desc_stylize(h.truncate(desc, 60)))
187 187 else:
188 188 return h.urlify_text(h.truncate(desc, 60))
189 189
190 190 def repo_actions(repo_name):
191 191 return _render('repo_actions', repo_name, super_user_actions)
192 192
193 193 def owner_actions(user_id, username):
194 194 return _render('user_name', user_id, username)
195 195
196 196 repos_data = []
197 197 for repo in repos_list:
198 198 if perm_check:
199 199 # check permission at this level
200 200 if not HasRepoPermissionAny(
201 201 'repository.read', 'repository.write', 'repository.admin'
202 202 )(repo.repo_name, 'get_repos_as_dict check'):
203 203 continue
204 204 cs_cache = repo.changeset_cache
205 205 row = {
206 206 "menu": quick_menu(repo.repo_name),
207 207 "raw_name": repo.repo_name.lower(),
208 208 "name": repo_lnk(repo.repo_name, repo.repo_type,
209 209 repo.private, repo.fork),
210 210 "last_change": last_change(repo.last_db_change),
211 211 "last_changeset": last_rev(repo.repo_name, cs_cache),
212 212 "raw_tip": cs_cache.get('revision'),
213 213 "desc": desc(repo.description),
214 214 "owner": h.person(repo.user.username),
215 215 "rss": rss_lnk(repo.repo_name),
216 216 "atom": atom_lnk(repo.repo_name),
217 217
218 218 }
219 219 if admin:
220 220 row.update({
221 221 "action": repo_actions(repo.repo_name),
222 222 "owner": owner_actions(repo.user.user_id,
223 223 h.person(repo.user.username))
224 224 })
225 225 repos_data.append(row)
226 226
227 227 return {
228 228 "totalRecords": len(repos_list),
229 229 "startIndex": 0,
230 230 "sort": "name",
231 231 "dir": "asc",
232 232 "records": repos_data
233 233 }
234 234
235 235 def _get_defaults(self, repo_name):
236 236 """
237 237 Get's information about repository, and returns a dict for
238 238 usage in forms
239 239
240 240 :param repo_name:
241 241 """
242 242
243 243 repo_info = Repository.get_by_repo_name(repo_name)
244 244
245 245 if repo_info is None:
246 246 return None
247 247
248 248 defaults = repo_info.get_dict()
249 249 group, repo_name = repo_info.groups_and_repo
250 250 defaults['repo_name'] = repo_name
251 251 defaults['repo_group'] = getattr(group[-1] if group else None,
252 252 'group_id', None)
253 253
254 254 for strip, k in [(0, 'repo_type'), (1, 'repo_enable_downloads'),
255 255 (1, 'repo_description'), (1, 'repo_enable_locking'),
256 256 (1, 'repo_landing_rev'), (0, 'clone_uri'),
257 257 (1, 'repo_private'), (1, 'repo_enable_statistics')]:
258 258 attr = k
259 259 if strip:
260 260 attr = remove_prefix(k, 'repo_')
261 261
262 262 defaults[k] = defaults[attr]
263 263
264 264 # fill owner
265 265 if repo_info.user:
266 266 defaults.update({'user': repo_info.user.username})
267 267 else:
268 268 replacement_user = User.query().filter(User.admin ==
269 269 True).first().username
270 270 defaults.update({'user': replacement_user})
271 271
272 272 # fill repository users
273 273 for p in repo_info.repo_to_perm:
274 274 defaults.update({'u_perm_%s' % p.user.username:
275 275 p.permission.permission_name})
276 276
277 277 # fill repository groups
278 278 for p in repo_info.users_group_to_perm:
279 279 defaults.update({'g_perm_%s' % p.users_group.users_group_name:
280 280 p.permission.permission_name})
281 281
282 282 return defaults
283 283
284 284 def update(self, org_repo_name, **kwargs):
285 285 try:
286 286 cur_repo = self.get_by_repo_name(org_repo_name, cache=False)
287 287
288 288 # update permissions
289 289 for member, perm, member_type in kwargs['perms_updates']:
290 290 if member_type == 'user':
291 291 # this updates existing one
292 292 RepoModel().grant_user_permission(
293 293 repo=cur_repo, user=member, perm=perm
294 294 )
295 295 else:
296 296 RepoModel().grant_users_group_permission(
297 297 repo=cur_repo, group_name=member, perm=perm
298 298 )
299 299 # set new permissions
300 300 for member, perm, member_type in kwargs['perms_new']:
301 301 if member_type == 'user':
302 302 RepoModel().grant_user_permission(
303 303 repo=cur_repo, user=member, perm=perm
304 304 )
305 305 else:
306 306 RepoModel().grant_users_group_permission(
307 307 repo=cur_repo, group_name=member, perm=perm
308 308 )
309 309
310 310 if 'user' in kwargs:
311 311 cur_repo.user = User.get_by_username(kwargs['user'])
312 312
313 313 if 'repo_group' in kwargs:
314 314 cur_repo.group = RepoGroup.get(kwargs['repo_group'])
315 315
316 316 for strip, k in [(0, 'repo_type'), (1, 'repo_enable_downloads'),
317 317 (1, 'repo_description'), (1, 'repo_enable_locking'),
318 318 (1, 'repo_landing_rev'), (0, 'clone_uri'),
319 319 (1, 'repo_private'), (1, 'repo_enable_statistics')]:
320 320 if k in kwargs:
321 321 val = kwargs[k]
322 322 if strip:
323 323 k = remove_prefix(k, 'repo_')
324 324 setattr(cur_repo, k, val)
325 325
326 326 new_name = cur_repo.get_new_name(kwargs['repo_name'])
327 327 cur_repo.repo_name = new_name
328 328
329 329 #handle extra fields
330 330 for field in filter(lambda k: k.startswith(RepositoryField.PREFIX), kwargs):
331 331 k = RepositoryField.un_prefix_key(field)
332 332 ex_field = RepositoryField.get_by_key_name(key=k, repo=cur_repo)
333 333 if ex_field:
334 334 ex_field.field_value = kwargs[field]
335 335 self.sa.add(ex_field)
336 336 self.sa.add(cur_repo)
337 337
338 338 if org_repo_name != new_name:
339 339 # rename repository
340 340 self.__rename_repo(old=org_repo_name, new=new_name)
341 341
342 342 return cur_repo
343 343 except:
344 344 log.error(traceback.format_exc())
345 345 raise
346 346
347 347 def create_repo(self, repo_name, repo_type, description, owner,
348 348 private=False, clone_uri=None, repos_group=None,
349 349 landing_rev='tip', just_db=False, fork_of=None,
350 350 copy_fork_permissions=False, enable_statistics=False,
351 351 enable_locking=False, enable_downloads=False):
352 352 """
353 353 Create repository
354 354
355 355 """
356 356 from rhodecode.model.scm import ScmModel
357 357
358 358 owner = self._get_user(owner)
359 359 fork_of = self._get_repo(fork_of)
360 360 repos_group = self._get_repos_group(repos_group)
361 361 try:
362 362
363 363 # repo name is just a name of repository
364 364 # while repo_name_full is a full qualified name that is combined
365 365 # with name and path of group
366 366 repo_name_full = repo_name
367 367 repo_name = repo_name.split(self.URL_SEPARATOR)[-1]
368 368
369 369 new_repo = Repository()
370 370 new_repo.enable_statistics = False
371 371 new_repo.repo_name = repo_name_full
372 372 new_repo.repo_type = repo_type
373 373 new_repo.user = owner
374 374 new_repo.group = repos_group
375 375 new_repo.description = description or repo_name
376 376 new_repo.private = private
377 377 new_repo.clone_uri = clone_uri
378 378 new_repo.landing_rev = landing_rev
379 379
380 380 new_repo.enable_statistics = enable_statistics
381 381 new_repo.enable_locking = enable_locking
382 382 new_repo.enable_downloads = enable_downloads
383 383
384 384 if repos_group:
385 385 new_repo.enable_locking = repos_group.enable_locking
386 386
387 387 if fork_of:
388 388 parent_repo = fork_of
389 389 new_repo.fork = parent_repo
390 390
391 391 self.sa.add(new_repo)
392 392
393 393 def _create_default_perms():
394 394 # create default permission
395 395 repo_to_perm = UserRepoToPerm()
396 396 default = 'repository.read'
397 397 for p in User.get_by_username('default').user_perms:
398 398 if p.permission.permission_name.startswith('repository.'):
399 399 default = p.permission.permission_name
400 400 break
401 401
402 402 default_perm = 'repository.none' if private else default
403 403
404 404 repo_to_perm.permission_id = self.sa.query(Permission)\
405 405 .filter(Permission.permission_name == default_perm)\
406 406 .one().permission_id
407 407
408 408 repo_to_perm.repository = new_repo
409 409 repo_to_perm.user_id = User.get_by_username('default').user_id
410 410
411 411 self.sa.add(repo_to_perm)
412 412
413 413 if fork_of:
414 414 if copy_fork_permissions:
415 415 repo = fork_of
416 416 user_perms = UserRepoToPerm.query()\
417 417 .filter(UserRepoToPerm.repository == repo).all()
418 418 group_perms = UsersGroupRepoToPerm.query()\
419 419 .filter(UsersGroupRepoToPerm.repository == repo).all()
420 420
421 421 for perm in user_perms:
422 422 UserRepoToPerm.create(perm.user, new_repo,
423 423 perm.permission)
424 424
425 425 for perm in group_perms:
426 426 UsersGroupRepoToPerm.create(perm.users_group, new_repo,
427 427 perm.permission)
428 428 else:
429 429 _create_default_perms()
430 430 else:
431 431 _create_default_perms()
432 432
433 433 if not just_db:
434 434 self.__create_repo(repo_name, repo_type,
435 435 repos_group,
436 436 clone_uri)
437 437 log_create_repository(new_repo.get_dict(),
438 438 created_by=owner.username)
439 439
440 440 # now automatically start following this repository as owner
441 441 ScmModel(self.sa).toggle_following_repo(new_repo.repo_id,
442 442 owner.user_id)
443 443 return new_repo
444 444 except:
445 445 log.error(traceback.format_exc())
446 446 raise
447 447
448 448 def create(self, form_data, cur_user, just_db=False, fork=None):
449 449 """
450 450 Backward compatibility function, just a wrapper on top of create_repo
451 451
452 452 :param form_data:
453 453 :param cur_user:
454 454 :param just_db:
455 455 :param fork:
456 456 """
457 457 owner = cur_user
458 458 repo_name = form_data['repo_name_full']
459 459 repo_type = form_data['repo_type']
460 460 description = form_data['repo_description']
461 461 private = form_data['repo_private']
462 462 clone_uri = form_data.get('clone_uri')
463 463 repos_group = form_data['repo_group']
464 464 landing_rev = form_data['repo_landing_rev']
465 465 copy_fork_permissions = form_data.get('copy_permissions')
466 466 fork_of = form_data.get('fork_parent_id')
467 467
468 468 ## repo creation defaults, private and repo_type are filled in form
469 469 defs = RhodeCodeSetting.get_default_repo_settings(strip_prefix=True)
470 470 enable_statistics = defs.get('repo_enable_statistics')
471 471 enable_locking = defs.get('repo_enable_locking')
472 472 enable_downloads = defs.get('repo_enable_downloads')
473 473
474 474 return self.create_repo(
475 475 repo_name, repo_type, description, owner, private, clone_uri,
476 476 repos_group, landing_rev, just_db, fork_of, copy_fork_permissions,
477 477 enable_statistics, enable_locking, enable_downloads
478 478 )
479 479
480 480 def create_fork(self, form_data, cur_user):
481 481 """
482 482 Simple wrapper into executing celery task for fork creation
483 483
484 484 :param form_data:
485 485 :param cur_user:
486 486 """
487 487 from rhodecode.lib.celerylib import tasks, run_task
488 488 run_task(tasks.create_repo_fork, form_data, cur_user)
489 489
490 490 def delete(self, repo):
491 491 repo = self._get_repo(repo)
492 492 if repo:
493 493 old_repo_dict = repo.get_dict()
494 494 owner = repo.user
495 495 try:
496 496 self.sa.delete(repo)
497 497 self.__delete_repo(repo)
498 498 log_delete_repository(old_repo_dict,
499 499 deleted_by=owner.username)
500 500 except:
501 501 log.error(traceback.format_exc())
502 502 raise
503 503
504 504 def grant_user_permission(self, repo, user, perm):
505 505 """
506 506 Grant permission for user on given repository, or update existing one
507 507 if found
508 508
509 509 :param repo: Instance of Repository, repository_id, or repository name
510 510 :param user: Instance of User, user_id or username
511 511 :param perm: Instance of Permission, or permission_name
512 512 """
513 513 user = self._get_user(user)
514 514 repo = self._get_repo(repo)
515 515 permission = self._get_perm(perm)
516 516
517 517 # check if we have that permission already
518 518 obj = self.sa.query(UserRepoToPerm)\
519 519 .filter(UserRepoToPerm.user == user)\
520 520 .filter(UserRepoToPerm.repository == repo)\
521 521 .scalar()
522 522 if obj is None:
523 523 # create new !
524 524 obj = UserRepoToPerm()
525 525 obj.repository = repo
526 526 obj.user = user
527 527 obj.permission = permission
528 528 self.sa.add(obj)
529 529 log.debug('Granted perm %s to %s on %s' % (perm, user, repo))
530 530
531 531 def revoke_user_permission(self, repo, user):
532 532 """
533 533 Revoke permission for user on given repository
534 534
535 535 :param repo: Instance of Repository, repository_id, or repository name
536 536 :param user: Instance of User, user_id or username
537 537 """
538 538
539 539 user = self._get_user(user)
540 540 repo = self._get_repo(repo)
541 541
542 542 obj = self.sa.query(UserRepoToPerm)\
543 543 .filter(UserRepoToPerm.repository == repo)\
544 544 .filter(UserRepoToPerm.user == user)\
545 545 .scalar()
546 546 if obj:
547 547 self.sa.delete(obj)
548 548 log.debug('Revoked perm on %s on %s' % (repo, user))
549 549
550 550 def grant_users_group_permission(self, repo, group_name, perm):
551 551 """
552 552 Grant permission for users group on given repository, or update
553 553 existing one if found
554 554
555 555 :param repo: Instance of Repository, repository_id, or repository name
556 556 :param group_name: Instance of UserGroup, users_group_id,
557 557 or users group name
558 558 :param perm: Instance of Permission, or permission_name
559 559 """
560 560 repo = self._get_repo(repo)
561 561 group_name = self.__get_users_group(group_name)
562 562 permission = self._get_perm(perm)
563 563
564 564 # check if we have that permission already
565 565 obj = self.sa.query(UsersGroupRepoToPerm)\
566 566 .filter(UsersGroupRepoToPerm.users_group == group_name)\
567 567 .filter(UsersGroupRepoToPerm.repository == repo)\
568 568 .scalar()
569 569
570 570 if obj is None:
571 571 # create new
572 572 obj = UsersGroupRepoToPerm()
573 573
574 574 obj.repository = repo
575 575 obj.users_group = group_name
576 576 obj.permission = permission
577 577 self.sa.add(obj)
578 578 log.debug('Granted perm %s to %s on %s' % (perm, group_name, repo))
579 579
580 580 def revoke_users_group_permission(self, repo, group_name):
581 581 """
582 582 Revoke permission for users group on given repository
583 583
584 584 :param repo: Instance of Repository, repository_id, or repository name
585 585 :param group_name: Instance of UserGroup, users_group_id,
586 586 or users group name
587 587 """
588 588 repo = self._get_repo(repo)
589 589 group_name = self.__get_users_group(group_name)
590 590
591 591 obj = self.sa.query(UsersGroupRepoToPerm)\
592 592 .filter(UsersGroupRepoToPerm.repository == repo)\
593 593 .filter(UsersGroupRepoToPerm.users_group == group_name)\
594 594 .scalar()
595 595 if obj:
596 596 self.sa.delete(obj)
597 597 log.debug('Revoked perm to %s on %s' % (repo, group_name))
598 598
599 599 def delete_stats(self, repo_name):
600 600 """
601 601 removes stats for given repo
602 602
603 603 :param repo_name:
604 604 """
605 repo = self._get_repo(repo_name)
605 606 try:
606 607 obj = self.sa.query(Statistics)\
607 .filter(Statistics.repository ==
608 self.get_by_repo_name(repo_name))\
609 .one()
610 self.sa.delete(obj)
608 .filter(Statistics.repository == repo).scalar()
609 if obj:
610 self.sa.delete(obj)
611 611 except:
612 612 log.error(traceback.format_exc())
613 613 raise
614 614
615 615 def __create_repo(self, repo_name, alias, parent, clone_uri=False):
616 616 """
617 617 makes repository on filesystem. It's group aware means it'll create
618 618 a repository within a group, and alter the paths accordingly of
619 619 group location
620 620
621 621 :param repo_name:
622 622 :param alias:
623 623 :param parent_id:
624 624 :param clone_uri:
625 625 """
626 626 from rhodecode.lib.utils import is_valid_repo, is_valid_repos_group
627 627 from rhodecode.model.scm import ScmModel
628 628
629 629 if parent:
630 630 new_parent_path = os.sep.join(parent.full_path_splitted)
631 631 else:
632 632 new_parent_path = ''
633 633
634 634 # we need to make it str for mercurial
635 635 repo_path = os.path.join(*map(lambda x: safe_str(x),
636 636 [self.repos_path, new_parent_path, repo_name]))
637 637
638 638 # check if this path is not a repository
639 639 if is_valid_repo(repo_path, self.repos_path):
640 640 raise Exception('This path %s is a valid repository' % repo_path)
641 641
642 642 # check if this path is a group
643 643 if is_valid_repos_group(repo_path, self.repos_path):
644 644 raise Exception('This path %s is a valid group' % repo_path)
645 645
646 646 log.info('creating repo %s in %s @ %s' % (
647 647 repo_name, safe_unicode(repo_path), clone_uri
648 648 )
649 649 )
650 650 backend = get_backend(alias)
651 651 if alias == 'hg':
652 652 backend(repo_path, create=True, src_url=clone_uri)
653 653 elif alias == 'git':
654 654 r = backend(repo_path, create=True, src_url=clone_uri, bare=True)
655 655 # add rhodecode hook into this repo
656 656 ScmModel().install_git_hook(repo=r)
657 657 else:
658 658 raise Exception('Undefined alias %s' % alias)
659 659
660 660 def __rename_repo(self, old, new):
661 661 """
662 662 renames repository on filesystem
663 663
664 664 :param old: old name
665 665 :param new: new name
666 666 """
667 667 log.info('renaming repo from %s to %s' % (old, new))
668 668
669 669 old_path = os.path.join(self.repos_path, old)
670 670 new_path = os.path.join(self.repos_path, new)
671 671 if os.path.isdir(new_path):
672 672 raise Exception(
673 673 'Was trying to rename to already existing dir %s' % new_path
674 674 )
675 675 shutil.move(old_path, new_path)
676 676
677 677 def __delete_repo(self, repo):
678 678 """
679 679 removes repo from filesystem, the removal is acctually made by
680 680 added rm__ prefix into dir, and rename internat .hg/.git dirs so this
681 681 repository is no longer valid for rhodecode, can be undeleted later on
682 682 by reverting the renames on this repository
683 683
684 684 :param repo: repo object
685 685 """
686 686 rm_path = os.path.join(self.repos_path, repo.repo_name)
687 687 log.info("Removing %s" % (rm_path))
688 688 # disable hg/git internal that it doesn't get detected as repo
689 689 alias = repo.repo_type
690 690
691 691 bare = getattr(repo.scm_instance, 'bare', False)
692 692
693 693 if not bare:
694 694 # skip this for bare git repos
695 695 shutil.move(os.path.join(rm_path, '.%s' % alias),
696 696 os.path.join(rm_path, 'rm__.%s' % alias))
697 697 # disable repo
698 698 _now = datetime.now()
699 699 _ms = str(_now.microsecond).rjust(6, '0')
700 700 _d = 'rm__%s__%s' % (_now.strftime('%Y%m%d_%H%M%S_' + _ms),
701 701 repo.just_name)
702 702 if repo.group:
703 703 args = repo.group.full_path_splitted + [_d]
704 704 _d = os.path.join(*args)
705 705 shutil.move(rm_path, os.path.join(self.repos_path, _d))
General Comments 0
You need to be logged in to leave comments. Login now