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