annotate rhodecode/model/scm.py @ 3878:7d29355db6f4 beta

fixes #834 hooks error on remote pulling
author Marcin Kuzminski <marcin@python-works.com>
date Mon, 20 May 2013 02:34:03 +0200
parents 1aefa8d864e4
children a228a33d868e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
757
c52e88b57bf4 rolled back to make transient since got some exceptions on expunge
Marcin Kuzminski <marcin@python-works.com>
parents: 753
diff changeset
1 # -*- coding: utf-8 -*-
c52e88b57bf4 rolled back to make transient since got some exceptions on expunge
Marcin Kuzminski <marcin@python-works.com>
parents: 753
diff changeset
2 """
811
bb35ad076e2f docs updates
Marcin Kuzminski <marcin@python-works.com>
parents: 792
diff changeset
3 rhodecode.model.scm
bb35ad076e2f docs updates
Marcin Kuzminski <marcin@python-works.com>
parents: 792
diff changeset
4 ~~~~~~~~~~~~~~~~~~~
757
c52e88b57bf4 rolled back to make transient since got some exceptions on expunge
Marcin Kuzminski <marcin@python-works.com>
parents: 753
diff changeset
5
811
bb35ad076e2f docs updates
Marcin Kuzminski <marcin@python-works.com>
parents: 792
diff changeset
6 Scm model for RhodeCode
bb35ad076e2f docs updates
Marcin Kuzminski <marcin@python-works.com>
parents: 792
diff changeset
7
757
c52e88b57bf4 rolled back to make transient since got some exceptions on expunge
Marcin Kuzminski <marcin@python-works.com>
parents: 753
diff changeset
8 :created_on: Apr 9, 2010
c52e88b57bf4 rolled back to make transient since got some exceptions on expunge
Marcin Kuzminski <marcin@python-works.com>
parents: 753
diff changeset
9 :author: marcink
1824
89efedac4e6c 2012 copyrights
Marcin Kuzminski <marcin@python-works.com>
parents: 1810
diff changeset
10 :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
757
c52e88b57bf4 rolled back to make transient since got some exceptions on expunge
Marcin Kuzminski <marcin@python-works.com>
parents: 753
diff changeset
11 :license: GPLv3, see COPYING for more details.
c52e88b57bf4 rolled back to make transient since got some exceptions on expunge
Marcin Kuzminski <marcin@python-works.com>
parents: 753
diff changeset
12 """
1206
a671db5bdd58 fixed license issue #149
Marcin Kuzminski <marcin@python-works.com>
parents: 1203
diff changeset
13 # This program is free software: you can redistribute it and/or modify
a671db5bdd58 fixed license issue #149
Marcin Kuzminski <marcin@python-works.com>
parents: 1203
diff changeset
14 # it under the terms of the GNU General Public License as published by
a671db5bdd58 fixed license issue #149
Marcin Kuzminski <marcin@python-works.com>
parents: 1203
diff changeset
15 # the Free Software Foundation, either version 3 of the License, or
a671db5bdd58 fixed license issue #149
Marcin Kuzminski <marcin@python-works.com>
parents: 1203
diff changeset
16 # (at your option) any later version.
1203
6832ef664673 source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents: 1193
diff changeset
17 #
252
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 248
diff changeset
18 # This program is distributed in the hope that it will be useful,
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 248
diff changeset
19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 248
diff changeset
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 248
diff changeset
21 # GNU General Public License for more details.
1203
6832ef664673 source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents: 1193
diff changeset
22 #
252
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 248
diff changeset
23 # You should have received a copy of the GNU General Public License
1206
a671db5bdd58 fixed license issue #149
Marcin Kuzminski <marcin@python-works.com>
parents: 1203
diff changeset
24 # along with this program. If not, see <http://www.gnu.org/licenses/>.
2620
cd207411cf22 fixed python2.5 compat and repo mapper issue
Marcin Kuzminski <marcin@python-works.com>
parents: 2618
diff changeset
25 from __future__ import with_statement
1554
e7c6341ad3cb fixes #245 Rescan of the repositories on Windows
Marcin Kuzminski <marcin@python-works.com>
parents: 1530
diff changeset
26 import os
2618
e1370dcb9908 Created install_git_hook more verbose version of previos code.
Marcin Kuzminski <marcin@python-works.com>
parents: 2604
diff changeset
27 import re
757
c52e88b57bf4 rolled back to make transient since got some exceptions on expunge
Marcin Kuzminski <marcin@python-works.com>
parents: 753
diff changeset
28 import time
c52e88b57bf4 rolled back to make transient since got some exceptions on expunge
Marcin Kuzminski <marcin@python-works.com>
parents: 753
diff changeset
29 import traceback
c52e88b57bf4 rolled back to make transient since got some exceptions on expunge
Marcin Kuzminski <marcin@python-works.com>
parents: 753
diff changeset
30 import logging
1801
b6d23aa3754c fixed problem with uploading files into rhodecode that wasn't detected as streams
Marcin Kuzminski <marcin@python-works.com>
parents: 1755
diff changeset
31 import cStringIO
2618
e1370dcb9908 Created install_git_hook more verbose version of previos code.
Marcin Kuzminski <marcin@python-works.com>
parents: 2604
diff changeset
32 import pkg_resources
e1370dcb9908 Created install_git_hook more verbose version of previos code.
Marcin Kuzminski <marcin@python-works.com>
parents: 2604
diff changeset
33 from os.path import dirname as dn, join as jn
757
c52e88b57bf4 rolled back to make transient since got some exceptions on expunge
Marcin Kuzminski <marcin@python-works.com>
parents: 753
diff changeset
34
2354
f3417f0d54b5 fixed default sorting on main page with sorting using wrapped lower() call on database level
Marcin Kuzminski <marcin@python-works.com>
parents: 2352
diff changeset
35 from sqlalchemy import func
2459
9492ab68331f Initial version of landing revisions ref #483
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
36 from pylons.i18n.translation import _
2354
f3417f0d54b5 fixed default sorting on main page with sorting using wrapped lower() call on database level
Marcin Kuzminski <marcin@python-works.com>
parents: 2352
diff changeset
37
2618
e1370dcb9908 Created install_git_hook more verbose version of previos code.
Marcin Kuzminski <marcin@python-works.com>
parents: 2604
diff changeset
38 import rhodecode
2007
324ac367a4da Added VCS into rhodecode core for faster and easier deployments of new versions
Marcin Kuzminski <marcin@python-works.com>
parents: 1982
diff changeset
39 from rhodecode.lib.vcs import get_backend
324ac367a4da Added VCS into rhodecode core for faster and easier deployments of new versions
Marcin Kuzminski <marcin@python-works.com>
parents: 1982
diff changeset
40 from rhodecode.lib.vcs.exceptions import RepositoryError
324ac367a4da Added VCS into rhodecode core for faster and easier deployments of new versions
Marcin Kuzminski <marcin@python-works.com>
parents: 1982
diff changeset
41 from rhodecode.lib.vcs.utils.lazy import LazyProperty
324ac367a4da Added VCS into rhodecode core for faster and easier deployments of new versions
Marcin Kuzminski <marcin@python-works.com>
parents: 1982
diff changeset
42 from rhodecode.lib.vcs.nodes import FileNode
2684
2b6939a77052 Bumped mercurial version to 2.3
Marcin Kuzminski <marcin@python-works.com>
parents: 2672
diff changeset
43 from rhodecode.lib.vcs.backends.base import EmptyChangeset
757
c52e88b57bf4 rolled back to make transient since got some exceptions on expunge
Marcin Kuzminski <marcin@python-works.com>
parents: 753
diff changeset
44
710
e2f3c8e6939d Disable git support due to large problems with dulwich.
Marcin Kuzminski <marcin@python-works.com>
parents: 693
diff changeset
45 from rhodecode import BACKENDS
547
1e757ac98988 renamed project to rhodecode
Marcin Kuzminski <marcin@python-works.com>
parents: 535
diff changeset
46 from rhodecode.lib import helpers as h
3577
238486bb71ab Switched handling of RhodeCode extra params in consistent way
Marcin Kuzminski <marcin@python-works.com>
parents: 3481
diff changeset
47 from rhodecode.lib.utils2 import safe_str, safe_unicode, get_server_url,\
238486bb71ab Switched handling of RhodeCode extra params in consistent way
Marcin Kuzminski <marcin@python-works.com>
parents: 3481
diff changeset
48 _set_extras
3714
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
49 from rhodecode.lib.auth import HasRepoPermissionAny, HasReposGroupPermissionAny,\
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
50 HasUserGroupPermissionAnyDecorator, HasUserGroupPermissionAny
3228
ba2e2514a01a reposcann should skip directories with starting with '.'
Marcin Kuzminski <marcin@python-works.com>
parents: 3222
diff changeset
51 from rhodecode.lib.utils import get_filesystem_repos, make_ui, \
2684
2b6939a77052 Bumped mercurial version to 2.3
Marcin Kuzminski <marcin@python-works.com>
parents: 2672
diff changeset
52 action_logger, REMOVED_REPO_PAT
752
89b9037d68b7 fixed Example celery config to ampq,
Marcin Kuzminski <marcin@python-works.com>
parents: 747
diff changeset
53 from rhodecode.model import BaseModel
758
6a31e64acabd code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 757
diff changeset
54 from rhodecode.model.db import Repository, RhodeCodeUi, CacheInvalidation, \
2440
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
55 UserFollowing, UserLog, User, RepoGroup, PullRequest
3478
796738bb697c webinterface file commiting executes push hooks ref #594
Marcin Kuzminski <marcin@python-works.com>
parents: 3418
diff changeset
56 from rhodecode.lib.hooks import log_push_action
3840
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
57 from rhodecode.lib.exceptions import NonRelativePathError
757
c52e88b57bf4 rolled back to make transient since got some exceptions on expunge
Marcin Kuzminski <marcin@python-works.com>
parents: 753
diff changeset
58
245
a83a1799480c Reimplemented way of caching repos list, hg model now get's repos objects right from cached dict, this way we skipp creating instances of MercurialRepository and gain performance. Some import cleanup
Marcin Kuzminski <marcin@python-works.com>
parents: 222
diff changeset
59 log = logging.getLogger(__name__)
a83a1799480c Reimplemented way of caching repos list, hg model now get's repos objects right from cached dict, this way we skipp creating instances of MercurialRepository and gain performance. Some import cleanup
Marcin Kuzminski <marcin@python-works.com>
parents: 222
diff changeset
60
757
c52e88b57bf4 rolled back to make transient since got some exceptions on expunge
Marcin Kuzminski <marcin@python-works.com>
parents: 753
diff changeset
61
735
dbec976d9975 added action loggers to following repositories,
Marcin Kuzminski <marcin@python-works.com>
parents: 734
diff changeset
62 class UserTemp(object):
dbec976d9975 added action loggers to following repositories,
Marcin Kuzminski <marcin@python-works.com>
parents: 734
diff changeset
63 def __init__(self, user_id):
dbec976d9975 added action loggers to following repositories,
Marcin Kuzminski <marcin@python-works.com>
parents: 734
diff changeset
64 self.user_id = user_id
901
765c2125e4d9 Fixed repo of Temp user and repo for better logging
Marcin Kuzminski <marcin@python-works.com>
parents: 878
diff changeset
65
765c2125e4d9 Fixed repo of Temp user and repo for better logging
Marcin Kuzminski <marcin@python-works.com>
parents: 878
diff changeset
66 def __repr__(self):
765c2125e4d9 Fixed repo of Temp user and repo for better logging
Marcin Kuzminski <marcin@python-works.com>
parents: 878
diff changeset
67 return "<%s('id:%s')>" % (self.__class__.__name__, self.user_id)
765c2125e4d9 Fixed repo of Temp user and repo for better logging
Marcin Kuzminski <marcin@python-works.com>
parents: 878
diff changeset
68
1213
68e34f5cf122 #150 fixes for errors on repositories mapped in db but corrupted in filesystem
Marcin Kuzminski <marcin@python-works.com>
parents: 1206
diff changeset
69
735
dbec976d9975 added action loggers to following repositories,
Marcin Kuzminski <marcin@python-works.com>
parents: 734
diff changeset
70 class RepoTemp(object):
dbec976d9975 added action loggers to following repositories,
Marcin Kuzminski <marcin@python-works.com>
parents: 734
diff changeset
71 def __init__(self, repo_id):
dbec976d9975 added action loggers to following repositories,
Marcin Kuzminski <marcin@python-works.com>
parents: 734
diff changeset
72 self.repo_id = repo_id
747
2f89beda06a1 Added icons with numbers of followers and number of forks
Marcin Kuzminski <marcin@python-works.com>
parents: 735
diff changeset
73
901
765c2125e4d9 Fixed repo of Temp user and repo for better logging
Marcin Kuzminski <marcin@python-works.com>
parents: 878
diff changeset
74 def __repr__(self):
765c2125e4d9 Fixed repo of Temp user and repo for better logging
Marcin Kuzminski <marcin@python-works.com>
parents: 878
diff changeset
75 return "<%s('id:%s')>" % (self.__class__.__name__, self.repo_id)
765c2125e4d9 Fixed repo of Temp user and repo for better logging
Marcin Kuzminski <marcin@python-works.com>
parents: 878
diff changeset
76
1801
b6d23aa3754c fixed problem with uploading files into rhodecode that wasn't detected as streams
Marcin Kuzminski <marcin@python-works.com>
parents: 1755
diff changeset
77
1366
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
78 class CachedRepoList(object):
2604
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
79 """
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
80 Cached repo list, uses in-memory cache after initialization, that is
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
81 super fast
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
82 """
1366
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
83
3222
b4daef4cc26d Group management delegation:
Marcin Kuzminski <marcin@python-works.com>
parents: 3152
diff changeset
84 def __init__(self, db_repo_list, repos_path, order_by=None, perm_set=None):
1366
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
85 self.db_repo_list = db_repo_list
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
86 self.repos_path = repos_path
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
87 self.order_by = order_by
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
88 self.reversed = (order_by or '').startswith('-')
3222
b4daef4cc26d Group management delegation:
Marcin Kuzminski <marcin@python-works.com>
parents: 3152
diff changeset
89 if not perm_set:
b4daef4cc26d Group management delegation:
Marcin Kuzminski <marcin@python-works.com>
parents: 3152
diff changeset
90 perm_set = ['repository.read', 'repository.write',
b4daef4cc26d Group management delegation:
Marcin Kuzminski <marcin@python-works.com>
parents: 3152
diff changeset
91 'repository.admin']
b4daef4cc26d Group management delegation:
Marcin Kuzminski <marcin@python-works.com>
parents: 3152
diff changeset
92 self.perm_set = perm_set
1366
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
93
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
94 def __len__(self):
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
95 return len(self.db_repo_list)
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
96
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
97 def __repr__(self):
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
98 return '<%s (%s)>' % (self.__class__.__name__, self.__len__())
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
99
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
100 def __iter__(self):
3772
910ad1ffee99 invalidation: merge .invalidate and .set_valid as .test_and_set_valid
Mads Kiilerich <madski@unity3d.com>
parents: 3759
diff changeset
101 # pre-propagated valid_cache_keys to save executing select statements
2352
90e06f53af8c Implemented cache-map on main page to save executing select
Marcin Kuzminski <marcin@python-works.com>
parents: 2209
diff changeset
102 # for each repo
3772
910ad1ffee99 invalidation: merge .invalidate and .set_valid as .test_and_set_valid
Mads Kiilerich <madski@unity3d.com>
parents: 3759
diff changeset
103 valid_cache_keys = CacheInvalidation.get_valid_cache_keys()
2352
90e06f53af8c Implemented cache-map on main page to save executing select
Marcin Kuzminski <marcin@python-works.com>
parents: 2209
diff changeset
104
1428
e5467730682b fixed some issues with cache invalidation, and simplified invalidation codes
Marcin Kuzminski <marcin@python-works.com>
parents: 1401
diff changeset
105 for dbr in self.db_repo_list:
3772
910ad1ffee99 invalidation: merge .invalidate and .set_valid as .test_and_set_valid
Mads Kiilerich <madski@unity3d.com>
parents: 3759
diff changeset
106 scmr = dbr.scm_instance_cached(valid_cache_keys)
1437
7a46d67c263c added welcome message if no repositories are present in current view
Marcin Kuzminski <marcin@python-works.com>
parents: 1428
diff changeset
107 # check permission at this level
1982
87f0800abc7b #227 Initial version of repository groups permissions system
Marcin Kuzminski <marcin@python-works.com>
parents: 1925
diff changeset
108 if not HasRepoPermissionAny(
3717
6ff98871247a Minor changes
Mads Kiilerich <madski@unity3d.com>
parents: 3714
diff changeset
109 *self.perm_set)(dbr.repo_name, 'get repo check'):
1366
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
110 continue
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
111
3360
85f69bf84d95 non-lightweight dashboard mode is now more error proof when it stumbles across bad or damaged repositories
Marcin Kuzminski <marcin@python-works.com>
parents: 3234
diff changeset
112 try:
85f69bf84d95 non-lightweight dashboard mode is now more error proof when it stumbles across bad or damaged repositories
Marcin Kuzminski <marcin@python-works.com>
parents: 3234
diff changeset
113 last_change = scmr.last_change
85f69bf84d95 non-lightweight dashboard mode is now more error proof when it stumbles across bad or damaged repositories
Marcin Kuzminski <marcin@python-works.com>
parents: 3234
diff changeset
114 tip = h.get_changeset_safe(scmr, 'tip')
85f69bf84d95 non-lightweight dashboard mode is now more error proof when it stumbles across bad or damaged repositories
Marcin Kuzminski <marcin@python-works.com>
parents: 3234
diff changeset
115 except Exception:
1982
87f0800abc7b #227 Initial version of repository groups permissions system
Marcin Kuzminski <marcin@python-works.com>
parents: 1925
diff changeset
116 log.error(
87f0800abc7b #227 Initial version of repository groups permissions system
Marcin Kuzminski <marcin@python-works.com>
parents: 1925
diff changeset
117 '%s this repository is present in database but it '
3360
85f69bf84d95 non-lightweight dashboard mode is now more error proof when it stumbles across bad or damaged repositories
Marcin Kuzminski <marcin@python-works.com>
parents: 3234
diff changeset
118 'cannot be created as an scm instance, org_exc:%s'
85f69bf84d95 non-lightweight dashboard mode is now more error proof when it stumbles across bad or damaged repositories
Marcin Kuzminski <marcin@python-works.com>
parents: 3234
diff changeset
119 % (dbr.repo_name, traceback.format_exc())
1982
87f0800abc7b #227 Initial version of repository groups permissions system
Marcin Kuzminski <marcin@python-works.com>
parents: 1925
diff changeset
120 )
1373
66f03a87141c Fixes issue #201
Marcin Kuzminski <marcin@python-works.com>
parents: 1370
diff changeset
121 continue
1366
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
122
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
123 tmp_d = {}
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
124 tmp_d['name'] = dbr.repo_name
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
125 tmp_d['name_sort'] = tmp_d['name'].lower()
2936
62e493c7f436 Added lightweight dashboard option. ref #500
Marcin Kuzminski <marcin@python-works.com>
parents: 2726
diff changeset
126 tmp_d['raw_name'] = tmp_d['name'].lower()
1366
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
127 tmp_d['description'] = dbr.description
2604
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
128 tmp_d['description_sort'] = tmp_d['description'].lower()
1366
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
129 tmp_d['last_change'] = last_change
1728
07e56179633e - fixes celery sqlalchemy session issues for async forking
Marcin Kuzminski <marcin@python-works.com>
parents: 1722
diff changeset
130 tmp_d['last_change_sort'] = time.mktime(last_change.timetuple())
1366
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
131 tmp_d['tip'] = tip.raw_id
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
132 tmp_d['tip_sort'] = tip.revision
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
133 tmp_d['rev'] = tip.revision
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
134 tmp_d['contact'] = dbr.user.full_contact
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
135 tmp_d['contact_sort'] = tmp_d['contact']
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
136 tmp_d['owner_sort'] = tmp_d['contact']
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
137 tmp_d['repo_archives'] = list(scmr._get_archives())
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
138 tmp_d['last_msg'] = tip.message
1459
6691d4097344 added author to main page tooltip
Marcin Kuzminski <marcin@python-works.com>
parents: 1437
diff changeset
139 tmp_d['author'] = tip.author
1366
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
140 tmp_d['dbrepo'] = dbr.get_dict()
1728
07e56179633e - fixes celery sqlalchemy session issues for async forking
Marcin Kuzminski <marcin@python-works.com>
parents: 1722
diff changeset
141 tmp_d['dbrepo_fork'] = dbr.fork.get_dict() if dbr.fork else {}
1366
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
142 yield tmp_d
1213
68e34f5cf122 #150 fixes for errors on repositories mapped in db but corrupted in filesystem
Marcin Kuzminski <marcin@python-works.com>
parents: 1206
diff changeset
143
1801
b6d23aa3754c fixed problem with uploading files into rhodecode that wasn't detected as streams
Marcin Kuzminski <marcin@python-works.com>
parents: 1755
diff changeset
144
2604
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
145 class SimpleCachedRepoList(CachedRepoList):
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
146 """
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
147 Lighter version of CachedRepoList without the scm initialisation
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
148 """
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
149
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
150 def __iter__(self):
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
151 for dbr in self.db_repo_list:
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
152 # check permission at this level
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
153 if not HasRepoPermissionAny(
3717
6ff98871247a Minor changes
Mads Kiilerich <madski@unity3d.com>
parents: 3714
diff changeset
154 *self.perm_set)(dbr.repo_name, 'get repo check'):
2604
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
155 continue
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
156
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
157 tmp_d = {}
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
158 tmp_d['name'] = dbr.repo_name
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
159 tmp_d['name_sort'] = tmp_d['name'].lower()
2936
62e493c7f436 Added lightweight dashboard option. ref #500
Marcin Kuzminski <marcin@python-works.com>
parents: 2726
diff changeset
160 tmp_d['raw_name'] = tmp_d['name'].lower()
2604
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
161 tmp_d['description'] = dbr.description
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
162 tmp_d['description_sort'] = tmp_d['description'].lower()
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
163 tmp_d['dbrepo'] = dbr.get_dict()
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
164 tmp_d['dbrepo_fork'] = dbr.fork.get_dict() if dbr.fork else {}
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
165 yield tmp_d
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
166
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
167
3714
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
168 class _PermCheckIterator(object):
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
169 def __init__(self, obj_list, obj_attr, perm_set, perm_checker):
3222
b4daef4cc26d Group management delegation:
Marcin Kuzminski <marcin@python-works.com>
parents: 3152
diff changeset
170 """
3714
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
171 Creates iterator from given list of objects, additionally
3222
b4daef4cc26d Group management delegation:
Marcin Kuzminski <marcin@python-works.com>
parents: 3152
diff changeset
172 checking permission for them from perm_set var
b4daef4cc26d Group management delegation:
Marcin Kuzminski <marcin@python-works.com>
parents: 3152
diff changeset
173
3714
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
174 :param obj_list: list of db objects
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
175 :param obj_attr: attribute of object to pass into perm_checker
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
176 :param perm_set: list of permissions to check
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
177 :param perm_checker: callable to check permissions against
3222
b4daef4cc26d Group management delegation:
Marcin Kuzminski <marcin@python-works.com>
parents: 3152
diff changeset
178 """
3714
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
179 self.obj_list = obj_list
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
180 self.obj_attr = obj_attr
3222
b4daef4cc26d Group management delegation:
Marcin Kuzminski <marcin@python-works.com>
parents: 3152
diff changeset
181 self.perm_set = perm_set
3714
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
182 self.perm_checker = perm_checker
1982
87f0800abc7b #227 Initial version of repository groups permissions system
Marcin Kuzminski <marcin@python-works.com>
parents: 1925
diff changeset
183
87f0800abc7b #227 Initial version of repository groups permissions system
Marcin Kuzminski <marcin@python-works.com>
parents: 1925
diff changeset
184 def __len__(self):
3714
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
185 return len(self.obj_list)
1982
87f0800abc7b #227 Initial version of repository groups permissions system
Marcin Kuzminski <marcin@python-works.com>
parents: 1925
diff changeset
186
87f0800abc7b #227 Initial version of repository groups permissions system
Marcin Kuzminski <marcin@python-works.com>
parents: 1925
diff changeset
187 def __repr__(self):
87f0800abc7b #227 Initial version of repository groups permissions system
Marcin Kuzminski <marcin@python-works.com>
parents: 1925
diff changeset
188 return '<%s (%s)>' % (self.__class__.__name__, self.__len__())
87f0800abc7b #227 Initial version of repository groups permissions system
Marcin Kuzminski <marcin@python-works.com>
parents: 1925
diff changeset
189
87f0800abc7b #227 Initial version of repository groups permissions system
Marcin Kuzminski <marcin@python-works.com>
parents: 1925
diff changeset
190 def __iter__(self):
3714
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
191 for db_obj in self.obj_list:
1982
87f0800abc7b #227 Initial version of repository groups permissions system
Marcin Kuzminski <marcin@python-works.com>
parents: 1925
diff changeset
192 # check permission at this level
3714
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
193 name = getattr(db_obj, self.obj_attr, None)
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
194 if not self.perm_checker(*self.perm_set)(name, self.__class__.__name__):
1982
87f0800abc7b #227 Initial version of repository groups permissions system
Marcin Kuzminski <marcin@python-works.com>
parents: 1925
diff changeset
195 continue
87f0800abc7b #227 Initial version of repository groups permissions system
Marcin Kuzminski <marcin@python-works.com>
parents: 1925
diff changeset
196
3714
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
197 yield db_obj
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
198
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
199
3864
1aefa8d864e4 Do read only checks on attach as fork of repo list.
Marcin Kuzminski <marcin@python-works.com>
parents: 3840
diff changeset
200 class RepoList(_PermCheckIterator):
1aefa8d864e4 Do read only checks on attach as fork of repo list.
Marcin Kuzminski <marcin@python-works.com>
parents: 3840
diff changeset
201
1aefa8d864e4 Do read only checks on attach as fork of repo list.
Marcin Kuzminski <marcin@python-works.com>
parents: 3840
diff changeset
202 def __init__(self, db_repo_list, perm_set=None):
1aefa8d864e4 Do read only checks on attach as fork of repo list.
Marcin Kuzminski <marcin@python-works.com>
parents: 3840
diff changeset
203 if not perm_set:
1aefa8d864e4 Do read only checks on attach as fork of repo list.
Marcin Kuzminski <marcin@python-works.com>
parents: 3840
diff changeset
204 perm_set = ['repository.read', 'repository.write', 'repository.admin']
1aefa8d864e4 Do read only checks on attach as fork of repo list.
Marcin Kuzminski <marcin@python-works.com>
parents: 3840
diff changeset
205
1aefa8d864e4 Do read only checks on attach as fork of repo list.
Marcin Kuzminski <marcin@python-works.com>
parents: 3840
diff changeset
206 super(RepoList, self).__init__(obj_list=db_repo_list,
1aefa8d864e4 Do read only checks on attach as fork of repo list.
Marcin Kuzminski <marcin@python-works.com>
parents: 3840
diff changeset
207 obj_attr='repo_name', perm_set=perm_set,
1aefa8d864e4 Do read only checks on attach as fork of repo list.
Marcin Kuzminski <marcin@python-works.com>
parents: 3840
diff changeset
208 perm_checker=HasRepoPermissionAny)
1aefa8d864e4 Do read only checks on attach as fork of repo list.
Marcin Kuzminski <marcin@python-works.com>
parents: 3840
diff changeset
209
1aefa8d864e4 Do read only checks on attach as fork of repo list.
Marcin Kuzminski <marcin@python-works.com>
parents: 3840
diff changeset
210
3714
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
211 class RepoGroupList(_PermCheckIterator):
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
212
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
213 def __init__(self, db_repo_group_list, perm_set=None):
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
214 if not perm_set:
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
215 perm_set = ['group.read', 'group.write', 'group.admin']
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
216
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
217 super(RepoGroupList, self).__init__(obj_list=db_repo_group_list,
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
218 obj_attr='group_name', perm_set=perm_set,
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
219 perm_checker=HasReposGroupPermissionAny)
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
220
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
221
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
222 class UserGroupList(_PermCheckIterator):
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
223
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
224 def __init__(self, db_user_group_list, perm_set=None):
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
225 if not perm_set:
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
226 perm_set = ['usergroup.read', 'usergroup.write', 'usergroup.admin']
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
227
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
228 super(UserGroupList, self).__init__(obj_list=db_user_group_list,
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
229 obj_attr='users_group_name', perm_set=perm_set,
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
230 perm_checker=HasUserGroupPermissionAny)
1982
87f0800abc7b #227 Initial version of repository groups permissions system
Marcin Kuzminski <marcin@python-works.com>
parents: 1925
diff changeset
231
87f0800abc7b #227 Initial version of repository groups permissions system
Marcin Kuzminski <marcin@python-works.com>
parents: 1925
diff changeset
232
752
89b9037d68b7 fixed Example celery config to ampq,
Marcin Kuzminski <marcin@python-works.com>
parents: 747
diff changeset
233 class ScmModel(BaseModel):
1716
7d1fc253549e notification to commit author + gardening
Marcin Kuzminski <marcin@python-works.com>
parents: 1607
diff changeset
234 """
7d1fc253549e notification to commit author + gardening
Marcin Kuzminski <marcin@python-works.com>
parents: 1607
diff changeset
235 Generic Scm Model
58
8fb1abd4178a Added hg model,implemented removal of repos, added HgModel for fetching repos(with generator)
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
236 """
8fb1abd4178a Added hg model,implemented removal of repos, added HgModel for fetching repos(with generator)
Marcin Kuzminski <marcin@python-blog.com>
parents:
diff changeset
237
1755
1088ded6e602 implements #239 manual marking of repos as forks for admins
Marcin Kuzminski <marcin@python-works.com>
parents: 1753
diff changeset
238 def __get_repo(self, instance):
1088ded6e602 implements #239 manual marking of repos as forks for admins
Marcin Kuzminski <marcin@python-works.com>
parents: 1753
diff changeset
239 cls = Repository
1088ded6e602 implements #239 manual marking of repos as forks for admins
Marcin Kuzminski <marcin@python-works.com>
parents: 1753
diff changeset
240 if isinstance(instance, cls):
1088ded6e602 implements #239 manual marking of repos as forks for admins
Marcin Kuzminski <marcin@python-works.com>
parents: 1753
diff changeset
241 return instance
2672
169807710db2 fixed possible unicode errors on repo get function
Marcin Kuzminski <marcin@python-works.com>
parents: 2655
diff changeset
242 elif isinstance(instance, int) or safe_str(instance).isdigit():
1755
1088ded6e602 implements #239 manual marking of repos as forks for admins
Marcin Kuzminski <marcin@python-works.com>
parents: 1753
diff changeset
243 return cls.get(instance)
1088ded6e602 implements #239 manual marking of repos as forks for admins
Marcin Kuzminski <marcin@python-works.com>
parents: 1753
diff changeset
244 elif isinstance(instance, basestring):
1088ded6e602 implements #239 manual marking of repos as forks for admins
Marcin Kuzminski <marcin@python-works.com>
parents: 1753
diff changeset
245 return cls.get_by_repo_name(instance)
1088ded6e602 implements #239 manual marking of repos as forks for admins
Marcin Kuzminski <marcin@python-works.com>
parents: 1753
diff changeset
246 elif instance:
1088ded6e602 implements #239 manual marking of repos as forks for admins
Marcin Kuzminski <marcin@python-works.com>
parents: 1753
diff changeset
247 raise Exception('given object must be int, basestr or Instance'
1088ded6e602 implements #239 manual marking of repos as forks for admins
Marcin Kuzminski <marcin@python-works.com>
parents: 1753
diff changeset
248 ' of %s got %s' % (type(cls), type(instance)))
1088ded6e602 implements #239 manual marking of repos as forks for admins
Marcin Kuzminski <marcin@python-works.com>
parents: 1753
diff changeset
249
665
070f32743632 Moved out reposcan into hg Model.
Marcin Kuzminski <marcin@python-works.com>
parents: 636
diff changeset
250 @LazyProperty
070f32743632 Moved out reposcan into hg Model.
Marcin Kuzminski <marcin@python-works.com>
parents: 636
diff changeset
251 def repos_path(self):
1716
7d1fc253549e notification to commit author + gardening
Marcin Kuzminski <marcin@python-works.com>
parents: 1607
diff changeset
252 """
7d1fc253549e notification to commit author + gardening
Marcin Kuzminski <marcin@python-works.com>
parents: 1607
diff changeset
253 Get's the repositories root path from database
665
070f32743632 Moved out reposcan into hg Model.
Marcin Kuzminski <marcin@python-works.com>
parents: 636
diff changeset
254 """
811
bb35ad076e2f docs updates
Marcin Kuzminski <marcin@python-works.com>
parents: 792
diff changeset
255
665
070f32743632 Moved out reposcan into hg Model.
Marcin Kuzminski <marcin@python-works.com>
parents: 636
diff changeset
256 q = self.sa.query(RhodeCodeUi).filter(RhodeCodeUi.ui_key == '/').one()
070f32743632 Moved out reposcan into hg Model.
Marcin Kuzminski <marcin@python-works.com>
parents: 636
diff changeset
257
070f32743632 Moved out reposcan into hg Model.
Marcin Kuzminski <marcin@python-works.com>
parents: 636
diff changeset
258 return q.ui_value
070f32743632 Moved out reposcan into hg Model.
Marcin Kuzminski <marcin@python-works.com>
parents: 636
diff changeset
259
1038
5554aa9c2480 another major code rafactor, reimplemented (almost from scratch)
Marcin Kuzminski <marcin@python-works.com>
parents: 1033
diff changeset
260 def repo_scan(self, repos_path=None):
1716
7d1fc253549e notification to commit author + gardening
Marcin Kuzminski <marcin@python-works.com>
parents: 1607
diff changeset
261 """
7d1fc253549e notification to commit author + gardening
Marcin Kuzminski <marcin@python-works.com>
parents: 1607
diff changeset
262 Listing of repositories in given path. This path should not be a
245
a83a1799480c Reimplemented way of caching repos list, hg model now get's repos objects right from cached dict, this way we skipp creating instances of MercurialRepository and gain performance. Some import cleanup
Marcin Kuzminski <marcin@python-works.com>
parents: 222
diff changeset
263 repository itself. Return a dictionary of repository objects
1203
6832ef664673 source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents: 1193
diff changeset
264
631
05528ad948c4 Hacking for git support,and new faster repo scan
Marcin Kuzminski <marcin@python-works.com>
parents: 629
diff changeset
265 :param repos_path: path to directory containing repositories
245
a83a1799480c Reimplemented way of caching repos list, hg model now get's repos objects right from cached dict, this way we skipp creating instances of MercurialRepository and gain performance. Some import cleanup
Marcin Kuzminski <marcin@python-works.com>
parents: 222
diff changeset
266 """
811
bb35ad076e2f docs updates
Marcin Kuzminski <marcin@python-works.com>
parents: 792
diff changeset
267
1038
5554aa9c2480 another major code rafactor, reimplemented (almost from scratch)
Marcin Kuzminski <marcin@python-works.com>
parents: 1033
diff changeset
268 if repos_path is None:
5554aa9c2480 another major code rafactor, reimplemented (almost from scratch)
Marcin Kuzminski <marcin@python-works.com>
parents: 1033
diff changeset
269 repos_path = self.repos_path
5554aa9c2480 another major code rafactor, reimplemented (almost from scratch)
Marcin Kuzminski <marcin@python-works.com>
parents: 1033
diff changeset
270
1925
9d400b585c24 fixes issue #341, logger outputed invalid path name
Marcin Kuzminski <marcin@python-works.com>
parents: 1824
diff changeset
271 log.info('scanning for repositories in %s' % repos_path)
9d400b585c24 fixes issue #341, logger outputed invalid path name
Marcin Kuzminski <marcin@python-works.com>
parents: 1824
diff changeset
272
1038
5554aa9c2480 another major code rafactor, reimplemented (almost from scratch)
Marcin Kuzminski <marcin@python-works.com>
parents: 1033
diff changeset
273 baseui = make_ui('db')
1751
47c2a006d43b Summary page downloads limited to zip.
Marcin Kuzminski <marcin@python-works.com>
parents: 1728
diff changeset
274 repos = {}
690
4685f3eafd35 Fixed sumamry page description bug
Marcin Kuzminski <marcin@python-works.com>
parents: 665
diff changeset
275
877
bc9a73adc216 Added recursive scanning for repositories in directory
Marcin Kuzminski <marcin@python-works.com>
parents: 851
diff changeset
276 for name, path in get_filesystem_repos(repos_path, recursive=True):
1554
e7c6341ad3cb fixes #245 Rescan of the repositories on Windows
Marcin Kuzminski <marcin@python-works.com>
parents: 1530
diff changeset
277 # name need to be decomposed and put back together using the /
e7c6341ad3cb fixes #245 Rescan of the repositories on Windows
Marcin Kuzminski <marcin@python-works.com>
parents: 1530
diff changeset
278 # since this is internal storage separator for rhodecode
3152
46234d2d388f fixed issues with getting repos by path on windows
Marcin Kuzminski <marcin@python-works.com>
parents: 3150
diff changeset
279 name = Repository.normalize_repo_name(name)
1716
7d1fc253549e notification to commit author + gardening
Marcin Kuzminski <marcin@python-works.com>
parents: 1607
diff changeset
280
245
a83a1799480c Reimplemented way of caching repos list, hg model now get's repos objects right from cached dict, this way we skipp creating instances of MercurialRepository and gain performance. Some import cleanup
Marcin Kuzminski <marcin@python-works.com>
parents: 222
diff changeset
281 try:
1751
47c2a006d43b Summary page downloads limited to zip.
Marcin Kuzminski <marcin@python-works.com>
parents: 1728
diff changeset
282 if name in repos:
665
070f32743632 Moved out reposcan into hg Model.
Marcin Kuzminski <marcin@python-works.com>
parents: 636
diff changeset
283 raise RepositoryError('Duplicate repository name %s '
1554
e7c6341ad3cb fixes #245 Rescan of the repositories on Windows
Marcin Kuzminski <marcin@python-works.com>
parents: 1530
diff changeset
284 'found in %s' % (name, path))
248
fb7f066126cc Added support for repository located in subdirectories.
Marcin Kuzminski <marcin@python-works.com>
parents: 245
diff changeset
285 else:
665
070f32743632 Moved out reposcan into hg Model.
Marcin Kuzminski <marcin@python-works.com>
parents: 636
diff changeset
286
070f32743632 Moved out reposcan into hg Model.
Marcin Kuzminski <marcin@python-works.com>
parents: 636
diff changeset
287 klass = get_backend(path[0])
070f32743632 Moved out reposcan into hg Model.
Marcin Kuzminski <marcin@python-works.com>
parents: 636
diff changeset
288
710
e2f3c8e6939d Disable git support due to large problems with dulwich.
Marcin Kuzminski <marcin@python-works.com>
parents: 693
diff changeset
289 if path[0] == 'hg' and path[0] in BACKENDS.keys():
1753
1d1ccb873d00 moved soon-to-be-deleted code from vcs to rhodecode
Marcin Kuzminski <marcin@python-works.com>
parents: 1751
diff changeset
290 repos[name] = klass(safe_str(path[1]), baseui=baseui)
629
7e536d1af60d Code refactoring,models renames
Marcin Kuzminski <marcin@python-works.com>
parents: 569
diff changeset
291
710
e2f3c8e6939d Disable git support due to large problems with dulwich.
Marcin Kuzminski <marcin@python-works.com>
parents: 693
diff changeset
292 if path[0] == 'git' and path[0] in BACKENDS.keys():
1751
47c2a006d43b Summary page downloads limited to zip.
Marcin Kuzminski <marcin@python-works.com>
parents: 1728
diff changeset
293 repos[name] = klass(path[1])
245
a83a1799480c Reimplemented way of caching repos list, hg model now get's repos objects right from cached dict, this way we skipp creating instances of MercurialRepository and gain performance. Some import cleanup
Marcin Kuzminski <marcin@python-works.com>
parents: 222
diff changeset
294 except OSError:
a83a1799480c Reimplemented way of caching repos list, hg model now get's repos objects right from cached dict, this way we skipp creating instances of MercurialRepository and gain performance. Some import cleanup
Marcin Kuzminski <marcin@python-works.com>
parents: 222
diff changeset
295 continue
3228
ba2e2514a01a reposcann should skip directories with starting with '.'
Marcin Kuzminski <marcin@python-works.com>
parents: 3222
diff changeset
296 log.debug('found %s paths with repositories' % (len(repos)))
1751
47c2a006d43b Summary page downloads limited to zip.
Marcin Kuzminski <marcin@python-works.com>
parents: 1728
diff changeset
297 return repos
629
7e536d1af60d Code refactoring,models renames
Marcin Kuzminski <marcin@python-works.com>
parents: 569
diff changeset
298
2604
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
299 def get_repos(self, all_repos=None, sort_key=None, simple=False):
1343
a04fe5986109 #47 implemented basic gui for browsing repo groups
Marcin Kuzminski <marcin@python-works.com>
parents: 1312
diff changeset
300 """
a04fe5986109 #47 implemented basic gui for browsing repo groups
Marcin Kuzminski <marcin@python-works.com>
parents: 1312
diff changeset
301 Get all repos from db and for each repo create it's
1213
68e34f5cf122 #150 fixes for errors on repositories mapped in db but corrupted in filesystem
Marcin Kuzminski <marcin@python-works.com>
parents: 1206
diff changeset
302 backend instance and fill that backed with information from database
1203
6832ef664673 source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents: 1193
diff changeset
303
1343
a04fe5986109 #47 implemented basic gui for browsing repo groups
Marcin Kuzminski <marcin@python-works.com>
parents: 1312
diff changeset
304 :param all_repos: list of repository names as strings
a04fe5986109 #47 implemented basic gui for browsing repo groups
Marcin Kuzminski <marcin@python-works.com>
parents: 1312
diff changeset
305 give specific repositories list, good for filtering
2604
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
306
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
307 :param sort_key: initial sorting of repos
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
308 :param simple: use SimpleCachedList - one without the SCM info
665
070f32743632 Moved out reposcan into hg Model.
Marcin Kuzminski <marcin@python-works.com>
parents: 636
diff changeset
309 """
767
632b0761e617 bugfix, when user had no repos he would see all repos in my account, (correct commit)
Marcin Kuzminski <marcin@python-works.com>
parents: 758
diff changeset
310 if all_repos is None:
1366
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
311 all_repos = self.sa.query(Repository)\
1343
a04fe5986109 #47 implemented basic gui for browsing repo groups
Marcin Kuzminski <marcin@python-works.com>
parents: 1312
diff changeset
312 .filter(Repository.group_id == None)\
2354
f3417f0d54b5 fixed default sorting on main page with sorting using wrapped lower() call on database level
Marcin Kuzminski <marcin@python-works.com>
parents: 2352
diff changeset
313 .order_by(func.lower(Repository.repo_name)).all()
2604
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
314 if simple:
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
315 repo_iter = SimpleCachedRepoList(all_repos,
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
316 repos_path=self.repos_path,
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
317 order_by=sort_key)
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
318 else:
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
319 repo_iter = CachedRepoList(all_repos,
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
320 repos_path=self.repos_path,
dfa5180cf02f Use simplified cached repos list for quick repo switcher, in some cases it can have 2-3x speed-up since it doesn't need to init the scms
Marcin Kuzminski <marcin@python-works.com>
parents: 2520
diff changeset
321 order_by=sort_key)
665
070f32743632 Moved out reposcan into hg Model.
Marcin Kuzminski <marcin@python-works.com>
parents: 636
diff changeset
322
1366
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1343
diff changeset
323 return repo_iter
629
7e536d1af60d Code refactoring,models renames
Marcin Kuzminski <marcin@python-works.com>
parents: 569
diff changeset
324
1982
87f0800abc7b #227 Initial version of repository groups permissions system
Marcin Kuzminski <marcin@python-works.com>
parents: 1925
diff changeset
325 def get_repos_groups(self, all_groups=None):
87f0800abc7b #227 Initial version of repository groups permissions system
Marcin Kuzminski <marcin@python-works.com>
parents: 1925
diff changeset
326 if all_groups is None:
87f0800abc7b #227 Initial version of repository groups permissions system
Marcin Kuzminski <marcin@python-works.com>
parents: 1925
diff changeset
327 all_groups = RepoGroup.query()\
87f0800abc7b #227 Initial version of repository groups permissions system
Marcin Kuzminski <marcin@python-works.com>
parents: 1925
diff changeset
328 .filter(RepoGroup.group_parent_id == None).all()
3714
7e3d89d9d3a2 - Manage User’s Groups: create, delete, rename, add/remove users inside.
Marcin Kuzminski <marcin@python-works.com>
parents: 3685
diff changeset
329 return [x for x in RepoGroupList(all_groups)]
1982
87f0800abc7b #227 Initial version of repository groups permissions system
Marcin Kuzminski <marcin@python-works.com>
parents: 1925
diff changeset
330
692
cb0d9ce6ac5c #50 on point cache invalidation changes.
Marcin Kuzminski <marcin@python-works.com>
parents: 691
diff changeset
331 def mark_for_invalidation(self, repo_name):
2147
d25bd432bc3e - #347 when running multiple RhodeCode instances, properly invalidates cache
Marcin Kuzminski <marcin@python-works.com>
parents: 2109
diff changeset
332 """
3682
cf65b2c1b69d invalidation: some documentation and refactoring, second round
Mads Kiilerich <madski@unity3d.com>
parents: 3631
diff changeset
333 Mark caches of this repo invalid in the database.
1203
6832ef664673 source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents: 1193
diff changeset
334
3682
cf65b2c1b69d invalidation: some documentation and refactoring, second round
Mads Kiilerich <madski@unity3d.com>
parents: 3631
diff changeset
335 :param repo_name: the repo for which caches should be marked invalid
692
cb0d9ce6ac5c #50 on point cache invalidation changes.
Marcin Kuzminski <marcin@python-works.com>
parents: 691
diff changeset
336 """
3759
12ca667b69b6 api: don't report invalidated cache_keys after invalidating a repo
Mads Kiilerich <madski@unity3d.com>
parents: 3717
diff changeset
337 CacheInvalidation.set_invalidate(repo_name)
3150
80abc924a38c always update changeset cache after invalidation signal
Marcin Kuzminski <marcin@python-works.com>
parents: 3090
diff changeset
338 repo = Repository.get_by_repo_name(repo_name)
80abc924a38c always update changeset cache after invalidation signal
Marcin Kuzminski <marcin@python-works.com>
parents: 3090
diff changeset
339 if repo:
80abc924a38c always update changeset cache after invalidation signal
Marcin Kuzminski <marcin@python-works.com>
parents: 3090
diff changeset
340 repo.update_changeset_cache()
692
cb0d9ce6ac5c #50 on point cache invalidation changes.
Marcin Kuzminski <marcin@python-works.com>
parents: 691
diff changeset
341
734
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
342 def toggle_following_repo(self, follow_repo_id, user_id):
692
cb0d9ce6ac5c #50 on point cache invalidation changes.
Marcin Kuzminski <marcin@python-works.com>
parents: 691
diff changeset
343
734
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
344 f = self.sa.query(UserFollowing)\
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
345 .filter(UserFollowing.follows_repo_id == follow_repo_id)\
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
346 .filter(UserFollowing.user_id == user_id).scalar()
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
347
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
348 if f is not None:
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
349 try:
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
350 self.sa.delete(f)
735
dbec976d9975 added action loggers to following repositories,
Marcin Kuzminski <marcin@python-works.com>
parents: 734
diff changeset
351 action_logger(UserTemp(user_id),
dbec976d9975 added action loggers to following repositories,
Marcin Kuzminski <marcin@python-works.com>
parents: 734
diff changeset
352 'stopped_following_repo',
747
2f89beda06a1 Added icons with numbers of followers and number of forks
Marcin Kuzminski <marcin@python-works.com>
parents: 735
diff changeset
353 RepoTemp(follow_repo_id))
734
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
354 return
3631
10b4e34841a4 Don't catch all exceptions
Marcin Kuzminski <marcin@python-works.com>
parents: 3589
diff changeset
355 except Exception:
734
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
356 log.error(traceback.format_exc())
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
357 raise
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
358
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
359 try:
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
360 f = UserFollowing()
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
361 f.user_id = user_id
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
362 f.follows_repo_id = follow_repo_id
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
363 self.sa.add(f)
1722
e7eef7a1db6a #235 forking page repo group selection
Marcin Kuzminski <marcin@python-works.com>
parents: 1716
diff changeset
364
735
dbec976d9975 added action loggers to following repositories,
Marcin Kuzminski <marcin@python-works.com>
parents: 734
diff changeset
365 action_logger(UserTemp(user_id),
dbec976d9975 added action loggers to following repositories,
Marcin Kuzminski <marcin@python-works.com>
parents: 734
diff changeset
366 'started_following_repo',
747
2f89beda06a1 Added icons with numbers of followers and number of forks
Marcin Kuzminski <marcin@python-works.com>
parents: 735
diff changeset
367 RepoTemp(follow_repo_id))
3631
10b4e34841a4 Don't catch all exceptions
Marcin Kuzminski <marcin@python-works.com>
parents: 3589
diff changeset
368 except Exception:
734
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
369 log.error(traceback.format_exc())
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
370 raise
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
371
1213
68e34f5cf122 #150 fixes for errors on repositories mapped in db but corrupted in filesystem
Marcin Kuzminski <marcin@python-works.com>
parents: 1206
diff changeset
372 def toggle_following_user(self, follow_user_id, user_id):
734
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
373 f = self.sa.query(UserFollowing)\
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
374 .filter(UserFollowing.follows_user_id == follow_user_id)\
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
375 .filter(UserFollowing.user_id == user_id).scalar()
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
376
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
377 if f is not None:
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
378 try:
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
379 self.sa.delete(f)
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
380 return
3631
10b4e34841a4 Don't catch all exceptions
Marcin Kuzminski <marcin@python-works.com>
parents: 3589
diff changeset
381 except Exception:
734
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
382 log.error(traceback.format_exc())
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
383 raise
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
384
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
385 try:
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
386 f = UserFollowing()
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
387 f.user_id = user_id
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
388 f.follows_user_id = follow_user_id
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
389 self.sa.add(f)
3631
10b4e34841a4 Don't catch all exceptions
Marcin Kuzminski <marcin@python-works.com>
parents: 3589
diff changeset
390 except Exception:
734
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
391 log.error(traceback.format_exc())
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
392 raise
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
393
999
1951c35483ab fixed following js snipet. It' can be called multiple times now next to each repository
Marcin Kuzminski <marcin@python-works.com>
parents: 902
diff changeset
394 def is_following_repo(self, repo_name, user_id, cache=False):
734
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
395 r = self.sa.query(Repository)\
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
396 .filter(Repository.repo_name == repo_name).scalar()
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
397
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
398 f = self.sa.query(UserFollowing)\
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
399 .filter(UserFollowing.follows_repository == r)\
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
400 .filter(UserFollowing.user_id == user_id).scalar()
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
401
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
402 return f is not None
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
403
999
1951c35483ab fixed following js snipet. It' can be called multiple times now next to each repository
Marcin Kuzminski <marcin@python-works.com>
parents: 902
diff changeset
404 def is_following_user(self, username, user_id, cache=False):
1530
04027bdb876c Refactoring of model get functions
Marcin Kuzminski <marcin@python-works.com>
parents: 1508
diff changeset
405 u = User.get_by_username(username)
734
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
406
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
407 f = self.sa.query(UserFollowing)\
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
408 .filter(UserFollowing.follows_user == u)\
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
409 .filter(UserFollowing.user_id == user_id).scalar()
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
410
49eb69d78988 implemented user dashboards, and following system.
Marcin Kuzminski <marcin@python-works.com>
parents: 726
diff changeset
411 return f is not None
692
cb0d9ce6ac5c #50 on point cache invalidation changes.
Marcin Kuzminski <marcin@python-works.com>
parents: 691
diff changeset
412
2440
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
413 def get_followers(self, repo):
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
414 repo = self._get_repo(repo)
1282
faaadfc3c359 fixed condition evaluated for gitrepo that returned null, simplified scm functions
Marcin Kuzminski <marcin@python-works.com>
parents: 1265
diff changeset
415
faaadfc3c359 fixed condition evaluated for gitrepo that returned null, simplified scm functions
Marcin Kuzminski <marcin@python-works.com>
parents: 1265
diff changeset
416 return self.sa.query(UserFollowing)\
2440
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
417 .filter(UserFollowing.follows_repository == repo).count()
747
2f89beda06a1 Added icons with numbers of followers and number of forks
Marcin Kuzminski <marcin@python-works.com>
parents: 735
diff changeset
418
2440
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
419 def get_forks(self, repo):
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
420 repo = self._get_repo(repo)
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
421 return self.sa.query(Repository)\
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
422 .filter(Repository.fork == repo).count()
1282
faaadfc3c359 fixed condition evaluated for gitrepo that returned null, simplified scm functions
Marcin Kuzminski <marcin@python-works.com>
parents: 1265
diff changeset
423
2440
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
424 def get_pull_requests(self, repo):
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
425 repo = self._get_repo(repo)
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
426 return self.sa.query(PullRequest)\
3580
7b9d4f6bb04e show only open pull requests in the counter, and use repo context bar in pull requests view
Marcin Kuzminski <marcin@python-works.com>
parents: 3577
diff changeset
427 .filter(PullRequest.other_repo == repo)\
7b9d4f6bb04e show only open pull requests in the counter, and use repo context bar in pull requests view
Marcin Kuzminski <marcin@python-works.com>
parents: 3577
diff changeset
428 .filter(PullRequest.status != PullRequest.STATUS_CLOSED).count()
692
cb0d9ce6ac5c #50 on point cache invalidation changes.
Marcin Kuzminski <marcin@python-works.com>
parents: 691
diff changeset
429
1755
1088ded6e602 implements #239 manual marking of repos as forks for admins
Marcin Kuzminski <marcin@python-works.com>
parents: 1753
diff changeset
430 def mark_as_fork(self, repo, fork, user):
1088ded6e602 implements #239 manual marking of repos as forks for admins
Marcin Kuzminski <marcin@python-works.com>
parents: 1753
diff changeset
431 repo = self.__get_repo(repo)
1088ded6e602 implements #239 manual marking of repos as forks for admins
Marcin Kuzminski <marcin@python-works.com>
parents: 1753
diff changeset
432 fork = self.__get_repo(fork)
2629
d2901d906ef3 Fixed issue #501 error on setting set_as_fork to same repo
Marcin Kuzminski <marcin@python-works.com>
parents: 2620
diff changeset
433 if fork and repo.repo_id == fork.repo_id:
d2901d906ef3 Fixed issue #501 error on setting set_as_fork to same repo
Marcin Kuzminski <marcin@python-works.com>
parents: 2620
diff changeset
434 raise Exception("Cannot set repository as fork of itself")
1755
1088ded6e602 implements #239 manual marking of repos as forks for admins
Marcin Kuzminski <marcin@python-works.com>
parents: 1753
diff changeset
435 repo.fork = fork
1088ded6e602 implements #239 manual marking of repos as forks for admins
Marcin Kuzminski <marcin@python-works.com>
parents: 1753
diff changeset
436 self.sa.add(repo)
1088ded6e602 implements #239 manual marking of repos as forks for admins
Marcin Kuzminski <marcin@python-works.com>
parents: 1753
diff changeset
437 return repo
1088ded6e602 implements #239 manual marking of repos as forks for admins
Marcin Kuzminski <marcin@python-works.com>
parents: 1753
diff changeset
438
3878
7d29355db6f4 fixes #834 hooks error on remote pulling
Marcin Kuzminski <marcin@python-works.com>
parents: 3864
diff changeset
439 def _handle_rc_scm_extras(self, username, repo_name, repo_alias,
7d29355db6f4 fixes #834 hooks error on remote pulling
Marcin Kuzminski <marcin@python-works.com>
parents: 3864
diff changeset
440 action=None):
3826
00e2c162d8bc move out setting rc_extras for in-memory-push handlers to separate function
Marcin Kuzminski <marcin@python-works.com>
parents: 3772
diff changeset
441 from rhodecode import CONFIG
00e2c162d8bc move out setting rc_extras for in-memory-push handlers to separate function
Marcin Kuzminski <marcin@python-works.com>
parents: 3772
diff changeset
442 from rhodecode.lib.base import _get_ip_addr
00e2c162d8bc move out setting rc_extras for in-memory-push handlers to separate function
Marcin Kuzminski <marcin@python-works.com>
parents: 3772
diff changeset
443 try:
00e2c162d8bc move out setting rc_extras for in-memory-push handlers to separate function
Marcin Kuzminski <marcin@python-works.com>
parents: 3772
diff changeset
444 from pylons import request
00e2c162d8bc move out setting rc_extras for in-memory-push handlers to separate function
Marcin Kuzminski <marcin@python-works.com>
parents: 3772
diff changeset
445 environ = request.environ
00e2c162d8bc move out setting rc_extras for in-memory-push handlers to separate function
Marcin Kuzminski <marcin@python-works.com>
parents: 3772
diff changeset
446 except TypeError:
00e2c162d8bc move out setting rc_extras for in-memory-push handlers to separate function
Marcin Kuzminski <marcin@python-works.com>
parents: 3772
diff changeset
447 # we might use this outside of request context, let's fake the
00e2c162d8bc move out setting rc_extras for in-memory-push handlers to separate function
Marcin Kuzminski <marcin@python-works.com>
parents: 3772
diff changeset
448 # environ data
00e2c162d8bc move out setting rc_extras for in-memory-push handlers to separate function
Marcin Kuzminski <marcin@python-works.com>
parents: 3772
diff changeset
449 from webob import Request
00e2c162d8bc move out setting rc_extras for in-memory-push handlers to separate function
Marcin Kuzminski <marcin@python-works.com>
parents: 3772
diff changeset
450 environ = Request.blank('').environ
00e2c162d8bc move out setting rc_extras for in-memory-push handlers to separate function
Marcin Kuzminski <marcin@python-works.com>
parents: 3772
diff changeset
451 extras = {
00e2c162d8bc move out setting rc_extras for in-memory-push handlers to separate function
Marcin Kuzminski <marcin@python-works.com>
parents: 3772
diff changeset
452 'ip': _get_ip_addr(environ),
00e2c162d8bc move out setting rc_extras for in-memory-push handlers to separate function
Marcin Kuzminski <marcin@python-works.com>
parents: 3772
diff changeset
453 'username': username,
3878
7d29355db6f4 fixes #834 hooks error on remote pulling
Marcin Kuzminski <marcin@python-works.com>
parents: 3864
diff changeset
454 'action': action or 'push_local',
3826
00e2c162d8bc move out setting rc_extras for in-memory-push handlers to separate function
Marcin Kuzminski <marcin@python-works.com>
parents: 3772
diff changeset
455 'repository': repo_name,
00e2c162d8bc move out setting rc_extras for in-memory-push handlers to separate function
Marcin Kuzminski <marcin@python-works.com>
parents: 3772
diff changeset
456 'scm': repo_alias,
00e2c162d8bc move out setting rc_extras for in-memory-push handlers to separate function
Marcin Kuzminski <marcin@python-works.com>
parents: 3772
diff changeset
457 'config': CONFIG['__file__'],
00e2c162d8bc move out setting rc_extras for in-memory-push handlers to separate function
Marcin Kuzminski <marcin@python-works.com>
parents: 3772
diff changeset
458 'server_url': get_server_url(environ),
00e2c162d8bc move out setting rc_extras for in-memory-push handlers to separate function
Marcin Kuzminski <marcin@python-works.com>
parents: 3772
diff changeset
459 'make_lock': None,
00e2c162d8bc move out setting rc_extras for in-memory-push handlers to separate function
Marcin Kuzminski <marcin@python-works.com>
parents: 3772
diff changeset
460 'locked_by': [None, None]
00e2c162d8bc move out setting rc_extras for in-memory-push handlers to separate function
Marcin Kuzminski <marcin@python-works.com>
parents: 3772
diff changeset
461 }
00e2c162d8bc move out setting rc_extras for in-memory-push handlers to separate function
Marcin Kuzminski <marcin@python-works.com>
parents: 3772
diff changeset
462 _set_extras(extras)
00e2c162d8bc move out setting rc_extras for in-memory-push handlers to separate function
Marcin Kuzminski <marcin@python-works.com>
parents: 3772
diff changeset
463
3481
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
464 def _handle_push(self, repo, username, action, repo_name, revisions):
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
465 """
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
466 Triggers push action hooks
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
467
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
468 :param repo: SCM repo
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
469 :param username: username who pushes
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
470 :param action: push/push_loca/push_remote
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
471 :param repo_name: name of repo
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
472 :param revisions: list of revisions that we pushed
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
473 """
3826
00e2c162d8bc move out setting rc_extras for in-memory-push handlers to separate function
Marcin Kuzminski <marcin@python-works.com>
parents: 3772
diff changeset
474 self._handle_rc_scm_extras(username, repo_name, repo_alias=repo.alias)
3478
796738bb697c webinterface file commiting executes push hooks ref #594
Marcin Kuzminski <marcin@python-works.com>
parents: 3418
diff changeset
475 _scm_repo = repo._repo
3826
00e2c162d8bc move out setting rc_extras for in-memory-push handlers to separate function
Marcin Kuzminski <marcin@python-works.com>
parents: 3772
diff changeset
476 # trigger push hook
3481
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
477 if repo.alias == 'hg':
3478
796738bb697c webinterface file commiting executes push hooks ref #594
Marcin Kuzminski <marcin@python-works.com>
parents: 3418
diff changeset
478 log_push_action(_scm_repo.ui, _scm_repo, node=revisions[0])
3481
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
479 elif repo.alias == 'git':
3589
35454cd8233b kill depracated .ui objects on git repos
Marcin Kuzminski <marcin@python-works.com>
parents: 3580
diff changeset
480 log_push_action(None, _scm_repo, _git_revs=revisions)
3478
796738bb697c webinterface file commiting executes push hooks ref #594
Marcin Kuzminski <marcin@python-works.com>
parents: 3418
diff changeset
481
3481
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
482 def _get_IMC_module(self, scm_type):
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
483 """
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
484 Returns InMemoryCommit class based on scm_type
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
485
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
486 :param scm_type:
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
487 """
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
488 if scm_type == 'hg':
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
489 from rhodecode.lib.vcs.backends.hg import \
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
490 MercurialInMemoryChangeset as IMC
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
491 elif scm_type == 'git':
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
492 from rhodecode.lib.vcs.backends.git import \
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
493 GitInMemoryChangeset as IMC
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
494 return IMC
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
495
2514
9b734e9530c2 fixed pull method repo lookup
Marcin Kuzminski <marcin@python-works.com>
parents: 2462
diff changeset
496 def pull_changes(self, repo, username):
9b734e9530c2 fixed pull method repo lookup
Marcin Kuzminski <marcin@python-works.com>
parents: 2462
diff changeset
497 dbrepo = self.__get_repo(repo)
1508
4aba7be311e8 API added checks for a valid repository on pull command
Marcin Kuzminski <marcin@python-works.com>
parents: 1485
diff changeset
498 clone_uri = dbrepo.clone_uri
4aba7be311e8 API added checks for a valid repository on pull command
Marcin Kuzminski <marcin@python-works.com>
parents: 1485
diff changeset
499 if not clone_uri:
4aba7be311e8 API added checks for a valid repository on pull command
Marcin Kuzminski <marcin@python-works.com>
parents: 1485
diff changeset
500 raise Exception("This repository doesn't have a clone uri")
1530
04027bdb876c Refactoring of model get functions
Marcin Kuzminski <marcin@python-works.com>
parents: 1508
diff changeset
501
1370
ef9a30e22ea6 Fixed remote pull command from todays code refactoring
Marcin Kuzminski <marcin@python-works.com>
parents: 1366
diff changeset
502 repo = dbrepo.scm_instance
3478
796738bb697c webinterface file commiting executes push hooks ref #594
Marcin Kuzminski <marcin@python-works.com>
parents: 3418
diff changeset
503 repo_name = dbrepo.repo_name
1114
4de3fa6290a7 #109, added manual pull of changes for repositories that have remote location filled in.
Marcin Kuzminski <marcin@python-works.com>
parents: 1045
diff changeset
504 try:
2383
e576410f911d Don't do git pull on remote repos since they are bare now, we need to use git fetch on them
Marcin Kuzminski <marcin@python-works.com>
parents: 2354
diff changeset
505 if repo.alias == 'git':
e576410f911d Don't do git pull on remote repos since they are bare now, we need to use git fetch on them
Marcin Kuzminski <marcin@python-works.com>
parents: 2354
diff changeset
506 repo.fetch(clone_uri)
e576410f911d Don't do git pull on remote repos since they are bare now, we need to use git fetch on them
Marcin Kuzminski <marcin@python-works.com>
parents: 2354
diff changeset
507 else:
3878
7d29355db6f4 fixes #834 hooks error on remote pulling
Marcin Kuzminski <marcin@python-works.com>
parents: 3864
diff changeset
508 self._handle_rc_scm_extras(username, dbrepo.repo_name,
7d29355db6f4 fixes #834 hooks error on remote pulling
Marcin Kuzminski <marcin@python-works.com>
parents: 3864
diff changeset
509 repo.alias, action='push_remote')
2383
e576410f911d Don't do git pull on remote repos since they are bare now, we need to use git fetch on them
Marcin Kuzminski <marcin@python-works.com>
parents: 2354
diff changeset
510 repo.pull(clone_uri)
3878
7d29355db6f4 fixes #834 hooks error on remote pulling
Marcin Kuzminski <marcin@python-works.com>
parents: 3864
diff changeset
511
3478
796738bb697c webinterface file commiting executes push hooks ref #594
Marcin Kuzminski <marcin@python-works.com>
parents: 3418
diff changeset
512 self.mark_for_invalidation(repo_name)
3631
10b4e34841a4 Don't catch all exceptions
Marcin Kuzminski <marcin@python-works.com>
parents: 3589
diff changeset
513 except Exception:
1114
4de3fa6290a7 #109, added manual pull of changes for repositories that have remote location filled in.
Marcin Kuzminski <marcin@python-works.com>
parents: 1045
diff changeset
514 log.error(traceback.format_exc())
4de3fa6290a7 #109, added manual pull of changes for repositories that have remote location filled in.
Marcin Kuzminski <marcin@python-works.com>
parents: 1045
diff changeset
515 raise
4de3fa6290a7 #109, added manual pull of changes for repositories that have remote location filled in.
Marcin Kuzminski <marcin@python-works.com>
parents: 1045
diff changeset
516
1722
e7eef7a1db6a #235 forking page repo group selection
Marcin Kuzminski <marcin@python-works.com>
parents: 1716
diff changeset
517 def commit_change(self, repo, repo_name, cs, user, author, message,
e7eef7a1db6a #235 forking page repo group selection
Marcin Kuzminski <marcin@python-works.com>
parents: 1716
diff changeset
518 content, f_path):
2684
2b6939a77052 Bumped mercurial version to 2.3
Marcin Kuzminski <marcin@python-works.com>
parents: 2672
diff changeset
519 """
2b6939a77052 Bumped mercurial version to 2.3
Marcin Kuzminski <marcin@python-works.com>
parents: 2672
diff changeset
520 Commits changes
2b6939a77052 Bumped mercurial version to 2.3
Marcin Kuzminski <marcin@python-works.com>
parents: 2672
diff changeset
521
2b6939a77052 Bumped mercurial version to 2.3
Marcin Kuzminski <marcin@python-works.com>
parents: 2672
diff changeset
522 :param repo: SCM instance
2b6939a77052 Bumped mercurial version to 2.3
Marcin Kuzminski <marcin@python-works.com>
parents: 2672
diff changeset
523
2b6939a77052 Bumped mercurial version to 2.3
Marcin Kuzminski <marcin@python-works.com>
parents: 2672
diff changeset
524 """
3481
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
525 user = self._get_user(user)
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
526 IMC = self._get_IMC_module(repo.alias)
1311
6705eeebc41b moved out commit into scm model, and added cache invalidation after commit.
Marcin Kuzminski <marcin@python-works.com>
parents: 1282
diff changeset
527
6705eeebc41b moved out commit into scm model, and added cache invalidation after commit.
Marcin Kuzminski <marcin@python-works.com>
parents: 1282
diff changeset
528 # decoding here will force that we have proper encoded values
6705eeebc41b moved out commit into scm model, and added cache invalidation after commit.
Marcin Kuzminski <marcin@python-works.com>
parents: 1282
diff changeset
529 # in any other case this will throw exceptions and deny commit
1401
b7563ad4e7ee Unicode fixes, added safe_str method for global str() operations +better test sandboxing
Marcin Kuzminski <marcin@python-works.com>
parents: 1380
diff changeset
530 content = safe_str(content)
b7563ad4e7ee Unicode fixes, added safe_str method for global str() operations +better test sandboxing
Marcin Kuzminski <marcin@python-works.com>
parents: 1380
diff changeset
531 path = safe_str(f_path)
2199
31ebf7010566 various fixes for git and mercurial with InMemoryCommit backend and non-ascii files
Marcin Kuzminski <marcin@python-works.com>
parents: 2147
diff changeset
532 # message and author needs to be unicode
31ebf7010566 various fixes for git and mercurial with InMemoryCommit backend and non-ascii files
Marcin Kuzminski <marcin@python-works.com>
parents: 2147
diff changeset
533 # proper backend should then translate that into required type
31ebf7010566 various fixes for git and mercurial with InMemoryCommit backend and non-ascii files
Marcin Kuzminski <marcin@python-works.com>
parents: 2147
diff changeset
534 message = safe_unicode(message)
31ebf7010566 various fixes for git and mercurial with InMemoryCommit backend and non-ascii files
Marcin Kuzminski <marcin@python-works.com>
parents: 2147
diff changeset
535 author = safe_unicode(author)
3836
14a6e9ffd9c8 fixed issue with web-editor that didn't preserve executable bit
Marcin Kuzminski <marcin@python-works.com>
parents: 3826
diff changeset
536 imc = IMC(repo)
14a6e9ffd9c8 fixed issue with web-editor that didn't preserve executable bit
Marcin Kuzminski <marcin@python-works.com>
parents: 3826
diff changeset
537 imc.change(FileNode(path, content, mode=cs.get_file_mode(f_path)))
14a6e9ffd9c8 fixed issue with web-editor that didn't preserve executable bit
Marcin Kuzminski <marcin@python-works.com>
parents: 3826
diff changeset
538 tip = imc.commit(message=message,
2199
31ebf7010566 various fixes for git and mercurial with InMemoryCommit backend and non-ascii files
Marcin Kuzminski <marcin@python-works.com>
parents: 2147
diff changeset
539 author=author,
31ebf7010566 various fixes for git and mercurial with InMemoryCommit backend and non-ascii files
Marcin Kuzminski <marcin@python-works.com>
parents: 2147
diff changeset
540 parents=[cs], branch=cs.branch)
1311
6705eeebc41b moved out commit into scm model, and added cache invalidation after commit.
Marcin Kuzminski <marcin@python-works.com>
parents: 1282
diff changeset
541
6705eeebc41b moved out commit into scm model, and added cache invalidation after commit.
Marcin Kuzminski <marcin@python-works.com>
parents: 1282
diff changeset
542 self.mark_for_invalidation(repo_name)
3478
796738bb697c webinterface file commiting executes push hooks ref #594
Marcin Kuzminski <marcin@python-works.com>
parents: 3418
diff changeset
543 self._handle_push(repo,
796738bb697c webinterface file commiting executes push hooks ref #594
Marcin Kuzminski <marcin@python-works.com>
parents: 3418
diff changeset
544 username=user.username,
796738bb697c webinterface file commiting executes push hooks ref #594
Marcin Kuzminski <marcin@python-works.com>
parents: 3418
diff changeset
545 action='push_local',
796738bb697c webinterface file commiting executes push hooks ref #594
Marcin Kuzminski <marcin@python-works.com>
parents: 3418
diff changeset
546 repo_name=repo_name,
796738bb697c webinterface file commiting executes push hooks ref #594
Marcin Kuzminski <marcin@python-works.com>
parents: 3418
diff changeset
547 revisions=[tip.raw_id])
2684
2b6939a77052 Bumped mercurial version to 2.3
Marcin Kuzminski <marcin@python-works.com>
parents: 2672
diff changeset
548 return tip
1311
6705eeebc41b moved out commit into scm model, and added cache invalidation after commit.
Marcin Kuzminski <marcin@python-works.com>
parents: 1282
diff changeset
549
3840
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
550 def create_nodes(self, user, repo, message, nodes, parent_cs=None,
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
551 author=None, trigger_push_hook=True):
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
552 """
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
553 Commits given multiple nodes into repo
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
554
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
555 :param user: RhodeCode User object or user_id, the commiter
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
556 :param repo: RhodeCode Repository object
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
557 :param message: commit message
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
558 :param nodes: mapping {filename:{'content':content},...}
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
559 :param parent_cs: parent changeset, can be empty than it's initial commit
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
560 :param author: author of commit, cna be different that commiter only for git
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
561 :param trigger_push_hook: trigger push hooks
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
562
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
563 :returns: new commited changeset
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
564 """
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
565
3481
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
566 user = self._get_user(user)
3840
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
567 scm_instance = repo.scm_instance_no_cache()
3481
c9214877d43e If commit operation is used out of pylons request scope use blank request instead
Marcin Kuzminski <marcin@python-works.com>
parents: 3478
diff changeset
568
3840
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
569 processed_nodes = []
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
570 for f_path in nodes:
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
571 if f_path.startswith('/') or f_path.startswith('.') or '../' in f_path:
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
572 raise NonRelativePathError('%s is not an relative path' % f_path)
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
573 if f_path:
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
574 f_path = os.path.normpath(f_path)
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
575 f_path = safe_str(f_path)
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
576 content = nodes[f_path]['content']
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
577 # decoding here will force that we have proper encoded values
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
578 # in any other case this will throw exceptions and deny commit
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
579 if isinstance(content, (basestring,)):
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
580 content = safe_str(content)
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
581 elif isinstance(content, (file, cStringIO.OutputType,)):
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
582 content = content.read()
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
583 else:
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
584 raise Exception('Content is of unrecognized type %s' % (
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
585 type(content)
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
586 ))
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
587 processed_nodes.append((f_path, content))
1530
04027bdb876c Refactoring of model get functions
Marcin Kuzminski <marcin@python-works.com>
parents: 1508
diff changeset
588
2199
31ebf7010566 various fixes for git and mercurial with InMemoryCommit backend and non-ascii files
Marcin Kuzminski <marcin@python-works.com>
parents: 2147
diff changeset
589 message = safe_unicode(message)
3840
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
590 commiter = user.full_contact
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
591 author = safe_unicode(author) if author else commiter
1483
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1459
diff changeset
592
3840
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
593 IMC = self._get_IMC_module(scm_instance.alias)
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
594 imc = IMC(scm_instance)
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
595
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
596 if not parent_cs:
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
597 parent_cs = EmptyChangeset(alias=scm_instance.alias)
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
598
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
599 if isinstance(parent_cs, EmptyChangeset):
2199
31ebf7010566 various fixes for git and mercurial with InMemoryCommit backend and non-ascii files
Marcin Kuzminski <marcin@python-works.com>
parents: 2147
diff changeset
600 # EmptyChangeset means we we're editing empty repository
1483
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1459
diff changeset
601 parents = None
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1459
diff changeset
602 else:
3840
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
603 parents = [parent_cs]
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
604 # add multiple nodes
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
605 for path, content in processed_nodes:
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
606 imc.add(FileNode(path, content=content))
1483
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1459
diff changeset
607
3840
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
608 tip = imc.commit(message=message,
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
609 author=author,
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
610 parents=parents,
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
611 branch=parent_cs.branch)
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
612
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
613 self.mark_for_invalidation(repo.repo_name)
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
614 if trigger_push_hook:
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
615 self._handle_push(scm_instance,
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
616 username=user.username,
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
617 action='push_local',
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
618 repo_name=repo.repo_name,
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3836
diff changeset
619 revisions=[tip.raw_id])
2684
2b6939a77052 Bumped mercurial version to 2.3
Marcin Kuzminski <marcin@python-works.com>
parents: 2672
diff changeset
620 return tip
1483
7b67b0dcad6d Added initial support for creating new nodes in repos
Marcin Kuzminski <marcin@python-works.com>
parents: 1459
diff changeset
621
1810
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
622 def get_nodes(self, repo_name, revision, root_path='/', flat=True):
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
623 """
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
624 recursive walk in root dir and return a set of all path in that dir
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
625 based on repository walk function
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
626
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
627 :param repo_name: name of repository
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
628 :param revision: revision for which to list nodes
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
629 :param root_path: root path to list
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
630 :param flat: return as a list, if False returns a dict with decription
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
631
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
632 """
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
633 _files = list()
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
634 _dirs = list()
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
635 try:
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
636 _repo = self.__get_repo(repo_name)
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
637 changeset = _repo.scm_instance.get_changeset(revision)
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
638 root_path = root_path.lstrip('/')
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
639 for topnode, dirs, files in changeset.walk(root_path):
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
640 for f in files:
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
641 _files.append(f.path if flat else {"name": f.path,
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
642 "type": "file"})
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
643 for d in dirs:
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
644 _dirs.append(d.path if flat else {"name": d.path,
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
645 "type": "dir"})
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
646 except RepositoryError:
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
647 log.debug(traceback.format_exc())
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
648 raise
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
649
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
650 return _dirs, _files
203af05539e0 implements #330 api method for listing nodes at particular revision
Marcin Kuzminski <marcin@python-works.com>
parents: 1801
diff changeset
651
784
30d3161c6683 Implemented fancier top menu for logged and anonymous users
Marcin Kuzminski <marcin@python-works.com>
parents: 767
diff changeset
652 def get_unread_journal(self):
30d3161c6683 Implemented fancier top menu for logged and anonymous users
Marcin Kuzminski <marcin@python-works.com>
parents: 767
diff changeset
653 return self.sa.query(UserLog).count()
2459
9492ab68331f Initial version of landing revisions ref #483
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
654
9492ab68331f Initial version of landing revisions ref #483
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
655 def get_repo_landing_revs(self, repo=None):
9492ab68331f Initial version of landing revisions ref #483
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
656 """
9492ab68331f Initial version of landing revisions ref #483
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
657 Generates select option with tags branches and bookmarks (for hg only)
9492ab68331f Initial version of landing revisions ref #483
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
658 grouped by type
9492ab68331f Initial version of landing revisions ref #483
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
659
9492ab68331f Initial version of landing revisions ref #483
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
660 :param repo:
9492ab68331f Initial version of landing revisions ref #483
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
661 """
2460
12fa0c19c42f validating choices for landing_rev
Marcin Kuzminski <marcin@python-works.com>
parents: 2459
diff changeset
662
2459
9492ab68331f Initial version of landing revisions ref #483
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
663 hist_l = []
2460
12fa0c19c42f validating choices for landing_rev
Marcin Kuzminski <marcin@python-works.com>
parents: 2459
diff changeset
664 choices = []
2459
9492ab68331f Initial version of landing revisions ref #483
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
665 repo = self.__get_repo(repo)
9492ab68331f Initial version of landing revisions ref #483
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
666 hist_l.append(['tip', _('latest tip')])
2460
12fa0c19c42f validating choices for landing_rev
Marcin Kuzminski <marcin@python-works.com>
parents: 2459
diff changeset
667 choices.append('tip')
2459
9492ab68331f Initial version of landing revisions ref #483
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
668 if not repo:
2460
12fa0c19c42f validating choices for landing_rev
Marcin Kuzminski <marcin@python-works.com>
parents: 2459
diff changeset
669 return choices, hist_l
2459
9492ab68331f Initial version of landing revisions ref #483
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
670
9492ab68331f Initial version of landing revisions ref #483
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
671 repo = repo.scm_instance
2460
12fa0c19c42f validating choices for landing_rev
Marcin Kuzminski <marcin@python-works.com>
parents: 2459
diff changeset
672
2459
9492ab68331f Initial version of landing revisions ref #483
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
673 branches_group = ([(k, k) for k, v in
9492ab68331f Initial version of landing revisions ref #483
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
674 repo.branches.iteritems()], _("Branches"))
9492ab68331f Initial version of landing revisions ref #483
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
675 hist_l.append(branches_group)
2460
12fa0c19c42f validating choices for landing_rev
Marcin Kuzminski <marcin@python-works.com>
parents: 2459
diff changeset
676 choices.extend([x[0] for x in branches_group[0]])
2459
9492ab68331f Initial version of landing revisions ref #483
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
677
9492ab68331f Initial version of landing revisions ref #483
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
678 if repo.alias == 'hg':
9492ab68331f Initial version of landing revisions ref #483
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
679 bookmarks_group = ([(k, k) for k, v in
9492ab68331f Initial version of landing revisions ref #483
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
680 repo.bookmarks.iteritems()], _("Bookmarks"))
9492ab68331f Initial version of landing revisions ref #483
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
681 hist_l.append(bookmarks_group)
2460
12fa0c19c42f validating choices for landing_rev
Marcin Kuzminski <marcin@python-works.com>
parents: 2459
diff changeset
682 choices.extend([x[0] for x in bookmarks_group[0]])
2459
9492ab68331f Initial version of landing revisions ref #483
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
683
9492ab68331f Initial version of landing revisions ref #483
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
684 tags_group = ([(k, k) for k, v in
9492ab68331f Initial version of landing revisions ref #483
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
685 repo.tags.iteritems()], _("Tags"))
9492ab68331f Initial version of landing revisions ref #483
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
686 hist_l.append(tags_group)
2460
12fa0c19c42f validating choices for landing_rev
Marcin Kuzminski <marcin@python-works.com>
parents: 2459
diff changeset
687 choices.extend([x[0] for x in tags_group[0]])
2459
9492ab68331f Initial version of landing revisions ref #483
Marcin Kuzminski <marcin@python-works.com>
parents: 2383
diff changeset
688
2460
12fa0c19c42f validating choices for landing_rev
Marcin Kuzminski <marcin@python-works.com>
parents: 2459
diff changeset
689 return choices, hist_l
2618
e1370dcb9908 Created install_git_hook more verbose version of previos code.
Marcin Kuzminski <marcin@python-works.com>
parents: 2604
diff changeset
690
e1370dcb9908 Created install_git_hook more verbose version of previos code.
Marcin Kuzminski <marcin@python-works.com>
parents: 2604
diff changeset
691 def install_git_hook(self, repo, force_create=False):
e1370dcb9908 Created install_git_hook more verbose version of previos code.
Marcin Kuzminski <marcin@python-works.com>
parents: 2604
diff changeset
692 """
e1370dcb9908 Created install_git_hook more verbose version of previos code.
Marcin Kuzminski <marcin@python-works.com>
parents: 2604
diff changeset
693 Creates a rhodecode hook inside a git repository
e1370dcb9908 Created install_git_hook more verbose version of previos code.
Marcin Kuzminski <marcin@python-works.com>
parents: 2604
diff changeset
694
e1370dcb9908 Created install_git_hook more verbose version of previos code.
Marcin Kuzminski <marcin@python-works.com>
parents: 2604
diff changeset
695 :param repo: Instance of VCS repo
e1370dcb9908 Created install_git_hook more verbose version of previos code.
Marcin Kuzminski <marcin@python-works.com>
parents: 2604
diff changeset
696 :param force_create: Create even if same name hook exists
e1370dcb9908 Created install_git_hook more verbose version of previos code.
Marcin Kuzminski <marcin@python-works.com>
parents: 2604
diff changeset
697 """
e1370dcb9908 Created install_git_hook more verbose version of previos code.
Marcin Kuzminski <marcin@python-works.com>
parents: 2604
diff changeset
698
e1370dcb9908 Created install_git_hook more verbose version of previos code.
Marcin Kuzminski <marcin@python-works.com>
parents: 2604
diff changeset
699 loc = jn(repo.path, 'hooks')
e1370dcb9908 Created install_git_hook more verbose version of previos code.
Marcin Kuzminski <marcin@python-works.com>
parents: 2604
diff changeset
700 if not repo.bare:
e1370dcb9908 Created install_git_hook more verbose version of previos code.
Marcin Kuzminski <marcin@python-works.com>
parents: 2604
diff changeset
701 loc = jn(repo.path, '.git', 'hooks')
e1370dcb9908 Created install_git_hook more verbose version of previos code.
Marcin Kuzminski <marcin@python-works.com>
parents: 2604
diff changeset
702 if not os.path.isdir(loc):
e1370dcb9908 Created install_git_hook more verbose version of previos code.
Marcin Kuzminski <marcin@python-works.com>
parents: 2604
diff changeset
703 os.makedirs(loc)
e1370dcb9908 Created install_git_hook more verbose version of previos code.
Marcin Kuzminski <marcin@python-works.com>
parents: 2604
diff changeset
704
2726
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
705 tmpl_post = pkg_resources.resource_string(
2618
e1370dcb9908 Created install_git_hook more verbose version of previos code.
Marcin Kuzminski <marcin@python-works.com>
parents: 2604
diff changeset
706 'rhodecode', jn('config', 'post_receive_tmpl.py')
e1370dcb9908 Created install_git_hook more verbose version of previos code.
Marcin Kuzminski <marcin@python-works.com>
parents: 2604
diff changeset
707 )
2726
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
708 tmpl_pre = pkg_resources.resource_string(
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
709 'rhodecode', jn('config', 'pre_receive_tmpl.py')
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
710 )
2618
e1370dcb9908 Created install_git_hook more verbose version of previos code.
Marcin Kuzminski <marcin@python-works.com>
parents: 2604
diff changeset
711
2726
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
712 for h_type, tmpl in [('pre', tmpl_pre), ('post', tmpl_post)]:
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
713 _hook_file = jn(loc, '%s-receive' % h_type)
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
714 _rhodecode_hook = False
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
715 log.debug('Installing git hook in repo %s' % repo)
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
716 if os.path.exists(_hook_file):
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
717 # let's take a look at this hook, maybe it's rhodecode ?
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
718 log.debug('hook exists, checking if it is from rhodecode')
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
719 _HOOK_VER_PAT = re.compile(r'^RC_HOOK_VER')
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
720 with open(_hook_file, 'rb') as f:
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
721 data = f.read()
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
722 matches = re.compile(r'(?:%s)\s*=\s*(.*)'
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
723 % 'RC_HOOK_VER').search(data)
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
724 if matches:
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
725 try:
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
726 ver = matches.groups()[0]
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
727 log.debug('got %s it is rhodecode' % (ver))
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
728 _rhodecode_hook = True
3631
10b4e34841a4 Don't catch all exceptions
Marcin Kuzminski <marcin@python-works.com>
parents: 3589
diff changeset
729 except Exception:
2726
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
730 log.error(traceback.format_exc())
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
731 else:
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
732 # there is no hook in this dir, so we want to create one
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
733 _rhodecode_hook = True
2618
e1370dcb9908 Created install_git_hook more verbose version of previos code.
Marcin Kuzminski <marcin@python-works.com>
parents: 2604
diff changeset
734
2726
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
735 if _rhodecode_hook or force_create:
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
736 log.debug('writing %s hook file !' % h_type)
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
737 with open(_hook_file, 'wb') as f:
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
738 tmpl = tmpl.replace('_TMPL_', rhodecode.__version__)
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
739 f.write(tmpl)
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
740 os.chmod(_hook_file, 0755)
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
741 else:
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2684
diff changeset
742 log.debug('skipping writing hook file')