Show More
@@ -31,6 +31,7 b' log = logging.getLogger(__name__)' | |||||
31 |
|
31 | |||
32 |
|
32 | |||
33 | class VcsServer(object): |
|
33 | class VcsServer(object): | |
|
34 | repo_user_agent = None # set in child classes | |||
34 | _path = None # set executable path for hg/git/svn binary |
|
35 | _path = None # set executable path for hg/git/svn binary | |
35 | backend = None # set in child classes |
|
36 | backend = None # set in child classes | |
36 | tunnel = None # subprocess handling tunnel |
|
37 | tunnel = None # subprocess handling tunnel | |
@@ -106,7 +107,7 b' class VcsServer(object):' | |||||
106 | 'make_lock': None, |
|
107 | 'make_lock': None, | |
107 | 'locked_by': [None, None], |
|
108 | 'locked_by': [None, None], | |
108 | 'server_url': None, |
|
109 | 'server_url': None, | |
109 | 'user_agent': 'ssh-user-agent', |
|
110 | 'user_agent': '{}/ssh-user-agent'.format(self.repo_user_agent), | |
110 | 'hooks': ['push', 'pull'], |
|
111 | 'hooks': ['push', 'pull'], | |
111 | 'hooks_module': 'rhodecode.lib.hooks_daemon', |
|
112 | 'hooks_module': 'rhodecode.lib.hooks_daemon', | |
112 | 'is_shadow_repo': False, |
|
113 | 'is_shadow_repo': False, |
@@ -59,6 +59,7 b' class GitTunnelWrapper(object):' | |||||
59 |
|
59 | |||
60 | class GitServer(VcsServer): |
|
60 | class GitServer(VcsServer): | |
61 | backend = 'git' |
|
61 | backend = 'git' | |
|
62 | repo_user_agent = 'git' | |||
62 |
|
63 | |||
63 | def __init__(self, store, ini_path, repo_name, repo_mode, |
|
64 | def __init__(self, store, ini_path, repo_name, repo_mode, | |
64 | user, user_permissions, config, env): |
|
65 | user, user_permissions, config, env): |
@@ -97,6 +97,7 b' class MercurialTunnelWrapper(object):' | |||||
97 |
|
97 | |||
98 | class MercurialServer(VcsServer): |
|
98 | class MercurialServer(VcsServer): | |
99 | backend = 'hg' |
|
99 | backend = 'hg' | |
|
100 | repo_user_agent = 'mercurial' | |||
100 | cli_flags = ['phases', 'largefiles', 'extensions', 'experimental', 'hooks'] |
|
101 | cli_flags = ['phases', 'largefiles', 'extensions', 'experimental', 'hooks'] | |
101 |
|
102 | |||
102 | def __init__(self, store, ini_path, repo_name, user, user_permissions, config, env): |
|
103 | def __init__(self, store, ini_path, repo_name, user, user_permissions, config, env): |
@@ -222,6 +222,7 b' class SubversionTunnelWrapper(object):' | |||||
222 |
|
222 | |||
223 | class SubversionServer(VcsServer): |
|
223 | class SubversionServer(VcsServer): | |
224 | backend = 'svn' |
|
224 | backend = 'svn' | |
|
225 | repo_user_agent = 'svn' | |||
225 |
|
226 | |||
226 | def __init__(self, store, ini_path, repo_name, |
|
227 | def __init__(self, store, ini_path, repo_name, | |
227 | user, user_permissions, config, env): |
|
228 | user, user_permissions, config, env): |
@@ -148,7 +148,7 b' class TestGitServer(object):' | |||||
148 | 'hooks_module': 'rhodecode.lib.hooks_daemon', |
|
148 | 'hooks_module': 'rhodecode.lib.hooks_daemon', | |
149 | 'check_branch_perms': False, |
|
149 | 'check_branch_perms': False, | |
150 | 'detect_force_push': False, |
|
150 | 'detect_force_push': False, | |
151 | 'user_agent': u'ssh-user-agent', |
|
151 | 'user_agent': u'git/ssh-user-agent', | |
152 | 'SSH': True, |
|
152 | 'SSH': True, | |
153 | 'SSH_PERMISSIONS': 'repository.admin', |
|
153 | 'SSH_PERMISSIONS': 'repository.admin', | |
154 | } |
|
154 | } |
@@ -30,7 +30,7 b' import rhodecode' | |||||
30 | from rhodecode import events |
|
30 | from rhodecode import events | |
31 | from rhodecode.lib import helpers as h |
|
31 | from rhodecode.lib import helpers as h | |
32 | from rhodecode.lib import audit_logger |
|
32 | from rhodecode.lib import audit_logger | |
33 | from rhodecode.lib.utils2 import safe_str |
|
33 | from rhodecode.lib.utils2 import safe_str, user_agent_normalizer | |
34 | from rhodecode.lib.exceptions import ( |
|
34 | from rhodecode.lib.exceptions import ( | |
35 | HTTPLockedRC, HTTPBranchProtected, UserCreationError) |
|
35 | HTTPLockedRC, HTTPBranchProtected, UserCreationError) | |
36 | from rhodecode.model.db import Repository, User |
|
36 | from rhodecode.model.db import Repository, User | |
@@ -222,8 +222,9 b' def post_pull(extras):' | |||||
222 |
|
222 | |||
223 | statsd = StatsdClient.statsd |
|
223 | statsd = StatsdClient.statsd | |
224 | if statsd: |
|
224 | if statsd: | |
225 |
statsd.incr('rhodecode_pull_total' |
|
225 | statsd.incr('rhodecode_pull_total', tags=[ | |
226 |
|
226 | 'user-agent:{}'.format(user_agent_normalizer(extras.user_agent)), | ||
|
227 | ]) | |||
227 | output = '' |
|
228 | output = '' | |
228 | # make lock is a tri state False, True, None. We only make lock on True |
|
229 | # make lock is a tri state False, True, None. We only make lock on True | |
229 | if extras.make_lock is True and not is_shadow_repo(extras): |
|
230 | if extras.make_lock is True and not is_shadow_repo(extras): | |
@@ -271,7 +272,9 b' def post_push(extras):' | |||||
271 |
|
272 | |||
272 | statsd = StatsdClient.statsd |
|
273 | statsd = StatsdClient.statsd | |
273 | if statsd: |
|
274 | if statsd: | |
274 |
statsd.incr('rhodecode_push_total' |
|
275 | statsd.incr('rhodecode_push_total', tags=[ | |
|
276 | 'user-agent:{}'.format(user_agent_normalizer(extras.user_agent)), | |||
|
277 | ]) | |||
275 |
|
278 | |||
276 | # Propagate to external components. |
|
279 | # Propagate to external components. | |
277 | output = '' |
|
280 | output = '' |
@@ -1146,3 +1146,20 b' def retry(func=None, exception=Exception' | |||||
1146 | return func(*args, **kwargs) |
|
1146 | return func(*args, **kwargs) | |
1147 |
|
1147 | |||
1148 | return wrapper |
|
1148 | return wrapper | |
|
1149 | ||||
|
1150 | ||||
|
1151 | def user_agent_normalizer(user_agent_raw): | |||
|
1152 | log = logging.getLogger('rhodecode.user_agent_normalizer') | |||
|
1153 | ua = (user_agent_raw or '').strip().lower() | |||
|
1154 | ||||
|
1155 | try: | |||
|
1156 | if 'mercurial/proto-1.0' in ua: | |||
|
1157 | ua = ua.replace('mercurial/proto-1.0', '') | |||
|
1158 | ua = ua.replace('(', '').replace(')', '').strip() | |||
|
1159 | ua = ua.replace('mercurial ', 'mercurial/') | |||
|
1160 | elif ua.startswith('git'): | |||
|
1161 | pass | |||
|
1162 | except Exception: | |||
|
1163 | log.exception('Failed to parse scm user-agent') | |||
|
1164 | ||||
|
1165 | return ua |
@@ -939,8 +939,9 b' class PullRequestModel(BaseModel):' | |||||
939 | return commit_ids |
|
939 | return commit_ids | |
940 |
|
940 | |||
941 | def merge_repo(self, pull_request, user, extras): |
|
941 | def merge_repo(self, pull_request, user, extras): | |
|
942 | repo_type = pull_request.source_repo.repo_type | |||
942 | log.debug("Merging pull request %s", pull_request.pull_request_id) |
|
943 | log.debug("Merging pull request %s", pull_request.pull_request_id) | |
943 | extras['user_agent'] = 'internal-merge' |
|
944 | extras['user_agent'] = '{}/internal-merge'.format(repo_type) | |
944 | merge_state = self._merge_pull_request(pull_request, user, extras) |
|
945 | merge_state = self._merge_pull_request(pull_request, user, extras) | |
945 | if merge_state.executed: |
|
946 | if merge_state.executed: | |
946 | log.debug("Merge was successful, updating the pull request comments.") |
|
947 | log.debug("Merge was successful, updating the pull request comments.") |
General Comments 0
You need to be logged in to leave comments.
Login now