Show More
The requested changes are too big and content was truncated. Show full diff
@@ -0,0 +1,28 b'' | |||||
|
1 | .. _repo-admin-set: | |||
|
2 | .. _permissions-info-add-group-ref: | |||
|
3 | ||||
|
4 | Repository Administration | |||
|
5 | ========================= | |||
|
6 | ||||
|
7 | Repository permissions in |RCE| can be managed in a number of different ways. | |||
|
8 | This overview should give you an insight into how you could adopt particular | |||
|
9 | settings for your needs: | |||
|
10 | ||||
|
11 | * Global |repo| permissions: This allows you to set the default permissions | |||
|
12 | for each new |repo| created within |RCE|, see :ref:`repo-default-ref`. All | |||
|
13 | |repos| created will inherit these permissions unless explicitly configured. | |||
|
14 | * Individual |repo| permissions: To set individual |repo| permissions, | |||
|
15 | see :ref:`set-repo-perms`. | |||
|
16 | * Repository Group permissions: This allows you to define the permissions for | |||
|
17 | a group, and all |repos| created within that group will inherit the same | |||
|
18 | permissions. | |||
|
19 | ||||
|
20 | .. toctree:: | |||
|
21 | ||||
|
22 | repo_admin/repo-perm-steps | |||
|
23 | repo_admin/repo-extra-fields | |||
|
24 | repo_admin/repo-hooks | |||
|
25 | repo_admin/repo-issue-tracker | |||
|
26 | repo_admin/repo-vcs | |||
|
27 | repo_admin/restore-deleted-repositories | |||
|
28 | repo_admin/repo-admin-tasks No newline at end of file |
@@ -0,0 +1,24 b'' | |||||
|
1 | .. _repo-admin-tasks: | |||
|
2 | ||||
|
3 | Common Admin Tasks for Repositories | |||
|
4 | ----------------------------------- | |||
|
5 | ||||
|
6 | ||||
|
7 | Manually Force Delete Repository | |||
|
8 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |||
|
9 | ||||
|
10 | In case of attached forks or pull-requests repositories should be archived. | |||
|
11 | Here is how to force delete a repository and remove all dependent objects | |||
|
12 | ||||
|
13 | ||||
|
14 | .. code-block:: bash | |||
|
15 | ||||
|
16 | # starts the ishell interactive prompt | |||
|
17 | $ rccontrol ishell enterprise-1 | |||
|
18 | ||||
|
19 | .. code-block:: python | |||
|
20 | ||||
|
21 | In [4]: from rhodecode.model.repo import RepoModel | |||
|
22 | In [3]: repo = Repository.get_by_repo_name('test_repos/repo_with_prs') | |||
|
23 | In [5]: RepoModel().delete(repo, forks='detach', pull_requests='delete') | |||
|
24 | In [6]: Session().commit() |
@@ -0,0 +1,35 b'' | |||||
|
1 | .. _search-methods-ref: | |||
|
2 | ||||
|
3 | search methods | |||
|
4 | ============== | |||
|
5 | ||||
|
6 | search | |||
|
7 | ------ | |||
|
8 | ||||
|
9 | .. py:function:: search(apiuser, search_query, search_type, page_limit=<Optional:10>, page=<Optional:1>, search_sort=<Optional:'newfirst'>, repo_name=<Optional:None>, repo_group_name=<Optional:None>) | |||
|
10 | ||||
|
11 | Fetch Full Text Search results using API. | |||
|
12 | ||||
|
13 | :param apiuser: This is filled automatically from the |authtoken|. | |||
|
14 | :type apiuser: AuthUser | |||
|
15 | :param search_query: Search query. | |||
|
16 | :type search_query: str | |||
|
17 | :param search_type: Search type. The following are valid options: | |||
|
18 | * commit | |||
|
19 | * content | |||
|
20 | * path | |||
|
21 | :type search_type: str | |||
|
22 | :param page_limit: Page item limit, from 1 to 500. Default 10 items. | |||
|
23 | :type page_limit: Optional(int) | |||
|
24 | :param page: Page number. Default first page. | |||
|
25 | :type page: Optional(int) | |||
|
26 | :param search_sort: Search sort order. Default newfirst. The following are valid options: | |||
|
27 | * newfirst | |||
|
28 | * oldfirst | |||
|
29 | :type search_sort: Optional(str) | |||
|
30 | :param repo_name: Filter by one repo. Default is all. | |||
|
31 | :type repo_name: Optional(str) | |||
|
32 | :param repo_group_name: Filter by one repo group. Default is all. | |||
|
33 | :type repo_group_name: Optional(str) | |||
|
34 | ||||
|
35 |
@@ -0,0 +1,48 b'' | |||||
|
1 | # -*- coding: utf-8 -*- | |||
|
2 | ||||
|
3 | # Copyright (C) 2011-2019 RhodeCode GmbH | |||
|
4 | # | |||
|
5 | # This program is free software: you can redistribute it and/or modify | |||
|
6 | # it under the terms of the GNU Affero General Public License, version 3 | |||
|
7 | # (only), as published by the Free Software Foundation. | |||
|
8 | # | |||
|
9 | # This program is distributed in the hope that it will be useful, | |||
|
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
|
12 | # GNU General Public License for more details. | |||
|
13 | # | |||
|
14 | # You should have received a copy of the GNU Affero General Public License | |||
|
15 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
|
16 | # | |||
|
17 | # This program is dual-licensed. If you wish to learn more about the | |||
|
18 | # RhodeCode Enterprise Edition, including its added features, Support services, | |||
|
19 | # and proprietary license terms, please see https://rhodecode.com/licenses/ | |||
|
20 | ||||
|
21 | import logging | |||
|
22 | ||||
|
23 | from pyramid.view import view_config | |||
|
24 | ||||
|
25 | from rhodecode.apps._base import RepoAppView | |||
|
26 | from rhodecode.lib.auth import ( | |||
|
27 | LoginRequired, HasRepoPermissionAnyDecorator) | |||
|
28 | ||||
|
29 | log = logging.getLogger(__name__) | |||
|
30 | ||||
|
31 | ||||
|
32 | class RepoArtifactsView(RepoAppView): | |||
|
33 | ||||
|
34 | def load_default_context(self): | |||
|
35 | c = self._get_local_tmpl_context(include_app_defaults=True) | |||
|
36 | c.rhodecode_repo = self.rhodecode_vcs_repo | |||
|
37 | return c | |||
|
38 | ||||
|
39 | @LoginRequired() | |||
|
40 | @HasRepoPermissionAnyDecorator( | |||
|
41 | 'repository.read', 'repository.write', 'repository.admin') | |||
|
42 | @view_config( | |||
|
43 | route_name='repo_artifacts_list', request_method='GET', | |||
|
44 | renderer='rhodecode:templates/artifacts/artifact_list.mako') | |||
|
45 | def repo_artifacts(self): | |||
|
46 | c = self.load_default_context() | |||
|
47 | c.active = 'artifacts' | |||
|
48 | return self._get_template_context(c) |
@@ -0,0 +1,37 b'' | |||||
|
1 | # -*- coding: utf-8 -*- | |||
|
2 | ||||
|
3 | import logging | |||
|
4 | ||||
|
5 | from alembic.migration import MigrationContext | |||
|
6 | from alembic.operations import Operations | |||
|
7 | from sqlalchemy import Column, LargeBinary | |||
|
8 | ||||
|
9 | from rhodecode.lib.dbmigrate.versions import _reset_base | |||
|
10 | from rhodecode.model import init_model_encryption | |||
|
11 | ||||
|
12 | ||||
|
13 | log = logging.getLogger(__name__) | |||
|
14 | ||||
|
15 | ||||
|
16 | def upgrade(migrate_engine): | |||
|
17 | """ | |||
|
18 | Upgrade operations go here. | |||
|
19 | Don't create your own engine; bind migrate_engine to your metadata | |||
|
20 | """ | |||
|
21 | _reset_base(migrate_engine) | |||
|
22 | from rhodecode.lib.dbmigrate.schema import db_4_16_0_2 | |||
|
23 | ||||
|
24 | init_model_encryption(db_4_16_0_2) | |||
|
25 | ||||
|
26 | context = MigrationContext.configure(migrate_engine.connect()) | |||
|
27 | op = Operations(context) | |||
|
28 | ||||
|
29 | repo_group = db_4_16_0_2.RepoGroup.__table__ | |||
|
30 | ||||
|
31 | with op.batch_alter_table(repo_group.name) as batch_op: | |||
|
32 | batch_op.add_column( | |||
|
33 | Column("changeset_cache", LargeBinary(1024), nullable=True)) | |||
|
34 | ||||
|
35 | ||||
|
36 | def downgrade(migrate_engine): | |||
|
37 | pass |
@@ -0,0 +1,200 b'' | |||||
|
1 | # Copyright (c) 2010 Agendaless Consulting and Contributors. | |||
|
2 | # (http://www.agendaless.com), All Rights Reserved | |||
|
3 | # License: BSD-derived (http://www.repoze.org/LICENSE.txt) | |||
|
4 | # With Patches from RhodeCode GmBH | |||
|
5 | ||||
|
6 | ||||
|
7 | import os | |||
|
8 | ||||
|
9 | from beaker import cache | |||
|
10 | from beaker.session import SessionObject | |||
|
11 | from beaker.util import coerce_cache_params | |||
|
12 | from beaker.util import coerce_session_params | |||
|
13 | ||||
|
14 | from pyramid.interfaces import ISession | |||
|
15 | from pyramid.settings import asbool | |||
|
16 | from zope.interface import implementer | |||
|
17 | ||||
|
18 | from binascii import hexlify | |||
|
19 | ||||
|
20 | ||||
|
21 | def BeakerSessionFactoryConfig(**options): | |||
|
22 | """ Return a Pyramid session factory using Beaker session settings | |||
|
23 | supplied directly as ``**options``""" | |||
|
24 | ||||
|
25 | class PyramidBeakerSessionObject(SessionObject): | |||
|
26 | _options = options | |||
|
27 | _cookie_on_exception = _options.pop('cookie_on_exception', True) | |||
|
28 | _constant_csrf_token = _options.pop('constant_csrf_token', False) | |||
|
29 | ||||
|
30 | def __init__(self, request): | |||
|
31 | SessionObject.__init__(self, request.environ, **self._options) | |||
|
32 | ||||
|
33 | def session_callback(request, response): | |||
|
34 | exception = getattr(request, 'exception', None) | |||
|
35 | if (exception is None or self._cookie_on_exception) and self.accessed(): | |||
|
36 | self.persist() | |||
|
37 | headers = self.__dict__['_headers'] | |||
|
38 | if headers['set_cookie'] and headers['cookie_out']: | |||
|
39 | response.headerlist.append(('Set-Cookie', headers['cookie_out'])) | |||
|
40 | request.add_response_callback(session_callback) | |||
|
41 | ||||
|
42 | # ISession API | |||
|
43 | ||||
|
44 | @property | |||
|
45 | def id(self): | |||
|
46 | # this is as inspected in SessionObject.__init__ | |||
|
47 | if self.__dict__['_params'].get('type') != 'cookie': | |||
|
48 | return self._session().id | |||
|
49 | return None | |||
|
50 | ||||
|
51 | @property | |||
|
52 | def new(self): | |||
|
53 | return self.last_accessed is None | |||
|
54 | ||||
|
55 | changed = SessionObject.save | |||
|
56 | ||||
|
57 | # modifying dictionary methods | |||
|
58 | ||||
|
59 | @call_save | |||
|
60 | def clear(self): | |||
|
61 | return self._session().clear() | |||
|
62 | ||||
|
63 | @call_save | |||
|
64 | def update(self, d, **kw): | |||
|
65 | return self._session().update(d, **kw) | |||
|
66 | ||||
|
67 | @call_save | |||
|
68 | def setdefault(self, k, d=None): | |||
|
69 | return self._session().setdefault(k, d) | |||
|
70 | ||||
|
71 | @call_save | |||
|
72 | def pop(self, k, d=None): | |||
|
73 | return self._session().pop(k, d) | |||
|
74 | ||||
|
75 | @call_save | |||
|
76 | def popitem(self): | |||
|
77 | return self._session().popitem() | |||
|
78 | ||||
|
79 | __setitem__ = call_save(SessionObject.__setitem__) | |||
|
80 | __delitem__ = call_save(SessionObject.__delitem__) | |||
|
81 | ||||
|
82 | # Flash API methods | |||
|
83 | def flash(self, msg, queue='', allow_duplicate=True): | |||
|
84 | storage = self.setdefault('_f_' + queue, []) | |||
|
85 | if allow_duplicate or (msg not in storage): | |||
|
86 | storage.append(msg) | |||
|
87 | ||||
|
88 | def pop_flash(self, queue=''): | |||
|
89 | storage = self.pop('_f_' + queue, []) | |||
|
90 | return storage | |||
|
91 | ||||
|
92 | def peek_flash(self, queue=''): | |||
|
93 | storage = self.get('_f_' + queue, []) | |||
|
94 | return storage | |||
|
95 | ||||
|
96 | # CSRF API methods | |||
|
97 | def new_csrf_token(self): | |||
|
98 | token = (self._constant_csrf_token | |||
|
99 | or hexlify(os.urandom(20)).decode('ascii')) | |||
|
100 | self['_csrft_'] = token | |||
|
101 | return token | |||
|
102 | ||||
|
103 | def get_csrf_token(self): | |||
|
104 | token = self.get('_csrft_', None) | |||
|
105 | if token is None: | |||
|
106 | token = self.new_csrf_token() | |||
|
107 | return token | |||
|
108 | ||||
|
109 | return implementer(ISession)(PyramidBeakerSessionObject) | |||
|
110 | ||||
|
111 | ||||
|
112 | def call_save(wrapped): | |||
|
113 | """ By default, in non-auto-mode beaker badly wants people to | |||
|
114 | call save even though it should know something has changed when | |||
|
115 | a mutating method is called. This hack should be removed if | |||
|
116 | Beaker ever starts to do this by default. """ | |||
|
117 | def save(session, *arg, **kw): | |||
|
118 | value = wrapped(session, *arg, **kw) | |||
|
119 | session.save() | |||
|
120 | return value | |||
|
121 | save.__doc__ = wrapped.__doc__ | |||
|
122 | return save | |||
|
123 | ||||
|
124 | ||||
|
125 | def session_factory_from_settings(settings): | |||
|
126 | """ Return a Pyramid session factory using Beaker session settings | |||
|
127 | supplied from a Paste configuration file""" | |||
|
128 | prefixes = ('session.', 'beaker.session.') | |||
|
129 | options = {} | |||
|
130 | ||||
|
131 | # Pull out any config args meant for beaker session. if there are any | |||
|
132 | for k, v in settings.items(): | |||
|
133 | for prefix in prefixes: | |||
|
134 | if k.startswith(prefix): | |||
|
135 | option_name = k[len(prefix):] | |||
|
136 | if option_name == 'cookie_on_exception': | |||
|
137 | v = asbool(v) | |||
|
138 | options[option_name] = v | |||
|
139 | ||||
|
140 | options = coerce_session_params(options) | |||
|
141 | return BeakerSessionFactoryConfig(**options) | |||
|
142 | ||||
|
143 | ||||
|
144 | def set_cache_regions_from_settings(settings): | |||
|
145 | """ Add cache support to the Pylons application. | |||
|
146 | ||||
|
147 | The ``settings`` passed to the configurator are used to setup | |||
|
148 | the cache options. Cache options in the settings should start | |||
|
149 | with either 'beaker.cache.' or 'cache.'. | |||
|
150 | ||||
|
151 | """ | |||
|
152 | cache_settings = {'regions': []} | |||
|
153 | for key in settings.keys(): | |||
|
154 | for prefix in ['beaker.cache.', 'cache.']: | |||
|
155 | if key.startswith(prefix): | |||
|
156 | name = key.split(prefix)[1].strip() | |||
|
157 | cache_settings[name] = settings[key].strip() | |||
|
158 | ||||
|
159 | if ('expire' in cache_settings | |||
|
160 | and isinstance(cache_settings['expire'], basestring) | |||
|
161 | and cache_settings['expire'].lower() in ['none', 'no']): | |||
|
162 | cache_settings['expire'] = None | |||
|
163 | ||||
|
164 | coerce_cache_params(cache_settings) | |||
|
165 | ||||
|
166 | if 'enabled' not in cache_settings: | |||
|
167 | cache_settings['enabled'] = True | |||
|
168 | ||||
|
169 | regions = cache_settings['regions'] | |||
|
170 | if regions: | |||
|
171 | for region in regions: | |||
|
172 | if not region: | |||
|
173 | continue | |||
|
174 | ||||
|
175 | region_settings = { | |||
|
176 | 'data_dir': cache_settings.get('data_dir'), | |||
|
177 | 'lock_dir': cache_settings.get('lock_dir'), | |||
|
178 | 'expire': cache_settings.get('expire', 60), | |||
|
179 | 'enabled': cache_settings['enabled'], | |||
|
180 | 'key_length': cache_settings.get('key_length', 250), | |||
|
181 | 'type': cache_settings.get('type'), | |||
|
182 | 'url': cache_settings.get('url'), | |||
|
183 | } | |||
|
184 | region_prefix = '%s.' % region | |||
|
185 | region_len = len(region_prefix) | |||
|
186 | for key in list(cache_settings.keys()): | |||
|
187 | if key.startswith(region_prefix): | |||
|
188 | region_settings[key[region_len:]] = cache_settings.pop(key) | |||
|
189 | ||||
|
190 | if (isinstance(region_settings['expire'], basestring) | |||
|
191 | and region_settings['expire'].lower() in ['none', 'no']): | |||
|
192 | region_settings['expire'] = None | |||
|
193 | coerce_cache_params(region_settings) | |||
|
194 | cache.cache_regions[region] = region_settings | |||
|
195 | ||||
|
196 | ||||
|
197 | def includeme(config): | |||
|
198 | session_factory = session_factory_from_settings(config.registry.settings) | |||
|
199 | config.set_session_factory(session_factory) | |||
|
200 | set_cache_regions_from_settings(config.registry.settings) |
This diff has been collapsed as it changes many lines, (623 lines changed) Show them Hide them | |||||
@@ -0,0 +1,623 b'' | |||||
|
1 | { | |||
|
2 | "name": "rcicons", | |||
|
3 | "css_prefix_text": "icon-", | |||
|
4 | "css_use_suffix": false, | |||
|
5 | "hinting": true, | |||
|
6 | "units_per_em": 1000, | |||
|
7 | "ascent": 850, | |||
|
8 | "copyright": "RhodeCode GmbH", | |||
|
9 | "glyphs": [ | |||
|
10 | { | |||
|
11 | "uid": "a5f9b6d4d795603e6e29a5b8007cc139", | |||
|
12 | "css": "bookmark", | |||
|
13 | "code": 59395, | |||
|
14 | "src": "custom_icons", | |||
|
15 | "selected": true, | |||
|
16 | "svg": { | |||
|
17 | "path": "M780 990L520 700C510 690 495 690 485 700L225 995C205 1015 180 1000 180 965V35C175 15 190 0 205 0H795C810 0 825 15 825 35V960C825 995 795 1010 780 990Z", | |||
|
18 | "width": 1000 | |||
|
19 | }, | |||
|
20 | "search": [ | |||
|
21 | "bookmark" | |||
|
22 | ] | |||
|
23 | }, | |||
|
24 | { | |||
|
25 | "uid": "fbc028d3a6a0df72f8f508ff5dfbab72", | |||
|
26 | "css": "tag", | |||
|
27 | "code": 59397, | |||
|
28 | "src": "custom_icons", | |||
|
29 | "selected": true, | |||
|
30 | "svg": { | |||
|
31 | "path": "M459.8 62.5L93.8 53.6C75.9 53.6 62.5 67 62.5 84.8L75.9 450.9C75.9 459.8 80.4 464.3 84.8 473.2L549.1 937.5C562.5 950.9 580.4 950.9 593.8 937.5L946.4 584.8C959.8 571.4 959.8 553.6 946.4 540.2L477.7 71.4C473.2 67 464.3 62.5 459.8 62.5ZM357.1 285.7C357.1 321.4 325.9 352.7 290.2 352.7 254.5 352.7 223.2 321.4 223.2 285.7 223.2 250 254.5 218.8 290.2 218.8S357.1 245.5 357.1 285.7Z", | |||
|
32 | "width": 1000 | |||
|
33 | }, | |||
|
34 | "search": [ | |||
|
35 | "tag" | |||
|
36 | ] | |||
|
37 | }, | |||
|
38 | { | |||
|
39 | "uid": "1c67c02366438b324c184ff9e356dca1", | |||
|
40 | "css": "branch", | |||
|
41 | "code": 59396, | |||
|
42 | "src": "custom_icons", | |||
|
43 | "selected": true, | |||
|
44 | "svg": { | |||
|
45 | "path": "M875 250C875 174.1 817 116.1 741.1 116.1S607.1 174.1 607.1 250C607.1 299.1 633.9 339.3 669.6 361.6 651.8 504.5 531.3 544.6 459.8 558V245.5C504.5 223.2 531.3 183 531.3 133.9 531.3 58 473.2 0 397.3 0S263.4 58 263.4 133.9C263.4 183 290.2 227.7 330.4 250V750C290.2 772.3 263.4 817 263.4 866.1 263.4 942 321.4 1000 397.3 1000S531.3 942 531.3 866.1C531.3 817 504.5 772.3 464.3 750V692C526.8 683 629.5 660.7 709.8 580.4 767.9 522.3 799.1 450.9 808 366.1 848.2 343.8 875 299.1 875 250ZM397.3 89.3C424.1 89.3 442 107.1 442 133.9S424.1 178.6 397.3 178.6 352.7 160.7 352.7 133.9 370.5 89.3 397.3 89.3ZM397.3 910.7C370.5 910.7 352.7 892.9 352.7 866.1S370.5 821.4 397.3 821.4 442 839.3 442 866.1 419.6 910.7 397.3 910.7ZM741.1 205.4C767.9 205.4 785.7 223.2 785.7 250S767.9 294.6 741.1 294.6 696.4 276.8 696.4 250 718.8 205.4 741.1 205.4Z", | |||
|
46 | "width": 1000 | |||
|
47 | }, | |||
|
48 | "search": [ | |||
|
49 | "branch" | |||
|
50 | ] | |||
|
51 | }, | |||
|
52 | { | |||
|
53 | "uid": "b75f7b47706aebd803ef370082e8e334", | |||
|
54 | "css": "group", | |||
|
55 | "code": 59407, | |||
|
56 | "src": "custom_icons", | |||
|
57 | "selected": true, | |||
|
58 | "svg": { | |||
|
59 | "path": "M961.5 630.8V646.2C961.5 650 957.7 657.7 950 657.7H788.5 784.6C769.2 638.5 746.2 619.2 707.7 615.4 673.1 607.7 653.8 600 638.5 592.3 646.2 584.6 657.7 580.8 669.2 576.9 715.4 569.2 726.9 553.8 734.6 542.3 742.3 530.8 742.3 519.2 734.6 503.8 726.9 488.5 703.8 461.5 703.8 423.1 703.8 384.6 703.8 319.2 776.9 319.2H784.6 792.3C865.4 323.1 869.2 384.6 865.4 423.1 865.4 461.5 842.3 492.3 834.6 503.8 826.9 519.2 826.9 530.8 834.6 542.3 842.3 553.8 857.7 569.2 900 576.9 953.8 580.8 961.5 623.1 961.5 630.8 961.5 630.8 961.5 630.8 961.5 630.8ZM253.8 646.2C269.2 630.8 292.3 615.4 323.1 611.5 361.5 603.8 384.6 596.2 396.2 584.6 388.5 576.9 376.9 569.2 361.5 565.4 315.4 557.7 303.8 542.3 296.2 530.8 288.5 519.2 288.5 507.7 296.2 492.3 303.8 476.9 326.9 450 326.9 411.5 326.9 373.1 326.9 307.7 253.8 307.7H246.2 234.6C161.5 311.5 157.7 373.1 161.5 411.5 161.5 450 184.6 480.8 192.3 492.3 200 507.7 200 519.2 192.3 530.8 184.6 542.3 169.2 557.7 126.9 565.4 80.8 573.1 73.1 615.4 73.1 619.2 73.1 619.2 73.1 619.2 73.1 619.2V634.6C73.1 638.5 76.9 646.2 84.6 646.2H246.2 253.8ZM707.7 634.6C634.6 623.1 611.5 600 600 580.8 588.5 561.5 588.5 542.3 600 519.2 611.5 496.2 650 450 653.8 388.5 657.7 326.9 653.8 223.1 534.6 219.2H519.2 503.8C384.6 223.1 380.8 323.1 384.6 384.6 388.5 446.2 423.1 492.3 438.5 515.4 450 538.5 450 557.7 438.5 576.9 426.9 596.2 403.8 619.2 330.8 630.8 257.7 642.3 246.2 711.5 246.2 719.2 246.2 719.2 246.2 719.2 246.2 719.2V742.3C246.2 750 253.8 757.7 261.5 757.7H519.2 776.9C784.6 757.7 792.3 750 792.3 742.3V719.2C792.3 719.2 792.3 719.2 792.3 719.2 788.5 715.4 780.8 646.2 707.7 634.6Z", | |||
|
60 | "width": 1000 | |||
|
61 | }, | |||
|
62 | "search": [ | |||
|
63 | "group" | |||
|
64 | ] | |||
|
65 | }, | |||
|
66 | { | |||
|
67 | "uid": "7ae0ef039bb0217d9581e44b09448905", | |||
|
68 | "css": "fork", | |||
|
69 | "code": 59409, | |||
|
70 | "src": "custom_icons", | |||
|
71 | "selected": true, | |||
|
72 | "svg": { | |||
|
73 | "path": "M792.3 196.2C792.3 138.5 746.2 96.2 692.3 96.2 634.6 96.2 592.3 142.3 592.3 196.2 592.3 230.8 611.5 261.5 638.5 280.8 626.9 365.4 569.2 403.8 511.5 423.1 453.8 407.7 396.2 369.2 384.6 280.8 411.5 261.5 430.8 230.8 430.8 196.2 430.8 138.5 384.6 96.2 330.8 96.2S223.1 138.5 223.1 196.2C223.1 234.6 246.2 269.2 276.9 284.6 288.5 392.3 353.8 473.1 457.7 511.5V673.1C426.9 692.3 407.7 723.1 407.7 761.5 407.7 819.2 453.8 861.5 507.7 861.5S607.7 815.4 607.7 761.5C607.7 723.1 588.5 692.3 557.7 673.1V511.5C661.5 473.1 726.9 392.3 738.5 284.6 769.2 265.4 792.3 234.6 792.3 196.2ZM326.9 161.5C346.2 161.5 361.5 176.9 361.5 196.2S346.2 226.9 326.9 226.9 292.3 215.4 292.3 196.2 307.7 161.5 326.9 161.5ZM507.7 796.2C488.5 796.2 473.1 780.8 473.1 761.5S488.5 726.9 507.7 726.9C526.9 726.9 542.3 742.3 542.3 761.5S526.9 796.2 507.7 796.2ZM692.3 161.5C711.5 161.5 726.9 176.9 726.9 196.2S711.5 226.9 692.3 226.9 657.7 211.5 657.7 192.3 673.1 161.5 692.3 161.5Z", | |||
|
74 | "width": 1000 | |||
|
75 | }, | |||
|
76 | "search": [ | |||
|
77 | "fork" | |||
|
78 | ] | |||
|
79 | }, | |||
|
80 | { | |||
|
81 | "uid": "65e66c3e7d74e2c345fb78fadd400d3f", | |||
|
82 | "css": "rhodecode", | |||
|
83 | "code": 59441, | |||
|
84 | "src": "custom_icons", | |||
|
85 | "selected": true, | |||
|
86 | "svg": { | |||
|
87 | "path": "M174.6 216.8C173.4 220.9 172.2 225 171 229.1 168.1 239.1 165.2 249.1 162.3 259.1 158.7 271.6 155 284.2 151.4 296.7 148 308.4 144.6 320.1 141.2 331.8 139 339.3 136.8 346.8 134.7 354.3 134.4 355.4 134.1 356.5 133.7 357.6 133.7 357.7 133.9 358.2 134 358.3 134.3 359 134.5 359.7 134.8 360.5 137.2 367.3 139.7 374.1 142.1 381 146 392 149.9 403 153.9 414.1 158.3 426.5 162.8 439 167.2 451.4 171.1 462.5 175.1 473.6 179 484.7 181.5 491.7 184 498.6 186.4 505.6 186.8 506.7 187.2 507.7 187.5 508.8 187.8 509.6 188.6 510.4 189 511.1 192.8 516.9 196.5 522.6 200.3 528.4 206.5 537.9 212.7 547.4 219 556.9 226.2 567.9 233.4 578.9 240.6 590 247.3 600.3 254.1 610.6 260.8 620.9 265.6 628.2 270.4 635.6 275.2 642.9 276.4 644.8 277.6 646.6 278.9 648.5 279.2 649 279.5 649.5 279.8 649.8 282.7 652.6 285.5 655.4 288.4 658.2 294.6 664.3 300.9 670.5 307.1 676.6 315.5 684.9 323.9 693.2 332.4 701.4 341.8 710.6 351.2 719.9 360.6 729.1 369.8 738.1 378.9 747.1 388.1 756.1 395.8 763.7 403.6 771.3 411.3 778.9 416.4 783.9 421.5 788.9 426.6 793.9 428.2 795.5 429.8 797.3 431.6 798.6 438.9 803.9 446.1 809.2 453.4 814.5 463.7 822 473.9 829.5 484.2 837 487.6 839.5 491.1 842 494.5 844.5 495.3 845.1 496.1 845.7 496.9 846.3 497.2 846.5 497.2 846.6 497.6 846.4 504.7 842.7 511.8 839.1 518.9 835.4 530.3 829.5 541.7 823.6 553.1 817.7 559.2 814.5 565.4 811.4 571.5 808.2 571.9 808 572.3 807.1 572.6 806.8 573.7 805.4 574.8 804 576 802.5 580.2 797.2 584.3 791.9 588.5 786.7 594.7 778.9 600.8 771.1 607 763.3 614.5 753.8 622 744.3 629.5 734.8 637.7 724.5 645.8 714.1 654 703.8 662.1 693.5 670.3 683.2 678.4 672.9 685.9 663.5 693.3 654 700.8 644.6 706.9 636.9 713 629.2 719.1 621.5 723.2 616.4 727.2 611.2 731.3 606.1 732.7 604.4 734 602.6 735.4 600.9 735.2 600.8 734.8 600.8 734.6 600.7 733.8 600.5 733 600.4 732.2 600.2 729.1 599.6 726 598.9 722.9 598.2 718 597.1 713 596 708.1 594.8 701.5 593.2 694.9 591.5 688.3 589.7 680.2 587.5 672.2 585.2 664.1 582.9 654.7 580.1 645.4 577.2 636.1 574.1 625.6 570.6 615.2 567 604.8 563.3 593.4 559.1 582 554.8 570.8 550.2 558.6 545.3 546.6 540.1 534.6 534.8 521.9 529.1 509.3 523.1 496.8 516.8 483.7 510.2 470.7 503.4 457.9 496.2 444.6 488.7 431.4 480.9 418.5 472.8 405.1 464.4 392 455.6 379.1 446.4 365.9 437 352.9 427.1 340.3 416.9 327.4 406.4 314.8 395.5 302.7 384.2 290.3 372.6 278.3 360.6 266.8 348.1 255.1 335.3 243.8 322.1 233.2 308.4 222.3 294.4 212 279.9 202.4 265 192.5 249.7 183.4 233.9 175 217.8 175 217.4 174.8 217.1 174.6 216.8ZM172.1 214.2C170.7 218.7 169.3 223.3 167.8 227.8 164.5 238.5 161.1 249.2 157.8 259.9 153.9 272.4 150 285 146.1 297.5 143 307.5 139.9 317.4 136.7 327.4 135.9 330.1 135 332.7 134.2 335.4 134 336.1 133.6 336.7 133.8 337.4 135.4 342.2 137 347.1 138.6 351.9 141.9 361.9 145.2 371.8 148.6 381.8 152.7 394.1 156.8 406.5 160.9 418.8 164.9 430.8 168.9 442.8 172.9 454.8 175.9 463.7 178.8 472.6 181.8 481.4 182.6 483.8 183.4 486.2 184.2 488.7 184.4 489.4 184.6 490.1 184.9 490.8 187.2 495 189.5 499.2 191.8 503.4 196.8 512.6 201.9 521.8 206.9 531 213.2 542.4 219.4 553.9 225.7 565.3 231.7 576.2 237.6 587.1 243.6 598 247.8 605.6 251.9 613.2 256.1 620.8 257.3 623 258.2 625.4 259.9 627.2 264.1 631.7 268.3 636.2 272.5 640.7 280.2 648.9 287.9 657.2 295.5 665.4 304.5 675 313.5 684.7 322.4 694.3 330.5 703 338.6 711.7 346.7 720.4 351.8 725.8 356.8 731.3 361.9 736.7 363.5 738.4 365 740 366.6 741.6 372.3 747.3 378 753 383.7 758.7 392.5 767.5 401.2 776.2 410 785 419.1 794.1 428.3 803.3 437.4 812.4 444.2 819.2 451.1 826.1 457.9 832.9 459.6 834.6 461.3 836.3 463 838 463.3 838.3 463.6 838.6 463.8 838.8 463.9 838.9 465.1 838.7 465.3 838.6 475.9 837.2 486.5 835.8 497 834.5 505.6 833.4 514.1 832.3 522.7 831.2 523 831.2 523.7 830.1 523.9 829.9 525.1 828.6 526.3 827.2 527.6 825.9 532.1 820.9 536.7 815.9 541.2 810.9 547.9 803.5 554.6 796.1 561.4 788.7 569.6 779.7 577.7 770.7 585.9 761.8 594.8 752 603.6 742.3 612.5 732.5 621.3 722.8 630.1 713.1 639 703.4 647 694.5 655.1 685.7 663.1 676.8 669.6 669.6 676.2 662.4 682.7 655.2 687 650.5 691.3 645.8 695.6 641 696.6 639.9 697.7 638.7 698.7 637.6 698.9 637.4 699.6 636.9 699.6 636.6 699.6 636.5 696.6 635.7 696.5 635.7 693.5 634.8 690.4 633.9 687.4 633 682.6 631.5 677.8 630 673 628.4 666.6 626.3 660.1 624.1 653.8 621.8 645.9 619 638.1 616.1 630.3 613.1 621.2 609.6 612.1 606 603.1 602.2 592.9 598 582.8 593.6 572.8 589 561.8 584 550.8 578.8 540 573.4 528.3 567.6 516.7 561.6 505.2 555.3 493 548.7 480.9 541.8 469 534.6 456.5 527.1 444.1 519.3 431.9 511.2 419.2 502.8 406.7 494 394.5 484.9 381.8 475.5 369.5 465.8 357.4 455.7 345 445.3 332.8 434.6 321.1 423.4 309.1 412 297.4 400.2 286.2 388 274.7 375.5 263.7 362.6 253.2 349.3 242.5 335.7 232.3 321.7 222.8 307.2 213 292.4 203.9 277.2 195.5 261.7 186.8 246.5 179 230.5 172.1 214.2ZM169.5 204C168.8 207.8 168.1 211.6 167.3 215.4 165.5 224.9 163.7 234.5 161.9 244 159.5 256.5 157.1 269 154.7 281.5 152.3 294.2 149.8 307 147.4 319.7 145.5 329.9 143.5 340.1 141.6 350.3 140.7 355.2 139.7 360.1 138.8 365 138.7 365.7 139.1 366.4 139.3 367 140.2 369.6 141.1 372.2 142 374.8 145.4 384.5 148.7 394.3 152.1 404 156.4 416.4 160.7 428.7 165 441.1 168.8 452.1 172.6 463 176.4 474 178.3 479.5 180.2 485 182.1 490.5 182.3 491.2 182.7 491.8 183 492.4 184.2 494.8 185.4 497.1 186.5 499.5 190.9 508.4 195.4 517.2 199.8 526.1 205.6 537.7 211.4 549.3 217.2 560.9 222.7 571.9 228.2 583 233.8 594 237.4 601.2 241 608.3 244.6 615.5 245.2 616.6 245.7 617.7 246.3 618.8 246.7 619.6 247.6 620.4 248.2 621.1 252.8 626.6 257.4 632.1 262 637.7 269.5 646.7 276.9 655.6 284.4 664.6 292.8 674.7 301.3 684.9 309.7 695 317.2 704 324.8 713.1 332.3 722.1 337 727.8 341.8 733.5 346.5 739.1 347.2 740 347.9 740.8 348.7 741.7 348.9 741.9 349.2 742 349.4 742.2 350.2 742.7 350.9 743.2 351.7 743.7 358.7 748.5 365.8 753.3 372.8 758.1 383.3 765.3 393.9 772.5 404.4 779.7 414.6 786.6 424.7 793.6 434.9 800.5 440.8 804.5 446.7 808.6 452.7 812.6 456.3 815.1 459.5 818.1 462.9 820.8 472.5 828.7 482.1 836.7 491.7 844.6 498.5 850.2 505.4 855.9 512.2 861.5 512.8 862 512.7 861.9 513.3 861.3 514.2 860.3 515.2 859.2 516.1 858.2 520 853.9 524 849.6 527.9 845.3 534 838.6 540.2 831.9 546.3 825.2 554 816.8 561.7 808.3 569.4 799.9 578.1 790.4 586.7 781 595.4 771.5 604.4 761.7 613.3 751.9 622.3 742.1 630.9 732.6 639.6 723.2 648.2 713.7 655.9 705.3 663.6 696.9 671.3 688.5 677.4 681.8 683.5 675.1 689.6 668.4 693.5 664.1 697.4 659.9 701.3 655.6 702.4 654.4 703.5 653.2 704.6 652 704.6 652 704.6 652 704.6 652 704.6 652 704.6 652 704.6 652 704.6 652.1 701.6 651.3 701.5 651.3 698.5 650.5 695.5 649.5 692.6 648.6 687.9 647.1 683.1 645.5 678.4 643.8 672.1 641.6 665.8 639.2 659.5 636.9 651.8 634 644.1 630.9 636.4 627.8 627.5 624.1 618.6 620.3 609.7 616.4 599.7 612 589.8 607.4 580 602.7 569.2 597.5 558.4 592.1 547.7 586.6 536.2 580.6 524.8 574.4 513.4 568 501.4 561.2 489.5 554.2 477.7 546.9 465.3 539.3 453.1 531.4 441.1 523.3 428.6 514.8 416.3 506.1 404.2 497 391.7 487.7 379.5 478 367.5 468 355.2 457.8 343.2 447.2 331.5 436.3 319.6 425.2 308 413.6 296.8 401.7 285.4 389.6 274.5 377.1 264 364.3 253.3 351.2 243.2 337.8 233.6 323.9 223.8 309.8 214.6 295.4 206.1 280.5 197.4 265.4 189.4 249.9 182.1 234 177.7 224.2 173.5 214.2 169.5 204ZM866 183.5C863.9 179.4 861.1 176.2 857.1 174 851.9 171.1 846.2 168.9 840.7 166.5 829.5 161.7 818.2 157.4 806.7 153.4 783.6 145.4 760 138.9 736.3 132.9 711.7 126.7 687.1 120.9 662.3 115.7 637.1 110.4 611.7 105.6 586.3 101.4 561.2 97.2 536 93.1 510.5 91.1 497.8 90.1 485 89.9 472.4 91.3 465.9 92 459.4 93.2 453 94.2 446.6 95.2 440.1 96.2 433.7 97.3 408.2 101.5 382.8 106 357.4 111 332.2 115.9 307.1 121.2 282.1 126.9 257.2 132.5 232.6 139.2 208.4 147.3 196.3 151.4 184.2 155.8 172.3 160.5 166.4 162.8 160.5 165.2 154.6 167.7 151.7 168.9 148.8 170.2 145.8 171.4 143.2 172.5 140.6 173.5 138.1 174.7 134 176.7 130.6 179.7 128.3 183.6 127 185.8 126.2 188.2 125.3 190.6 124.2 193.6 123.1 196.6 122.1 199.6 118.1 211.5 114.9 223.7 112.5 236 107.7 260.4 106 285.4 106.8 310.2 107.2 322.7 108.2 335.3 109.7 347.7 111.2 360.2 112.7 372.8 115.1 385.2 119.8 410.4 126.7 435.1 134.8 459.3 138.9 471.4 143.3 483.5 147.9 495.4 152.2 506.5 157.5 517.3 162.7 528 173 549.2 184.4 569.8 196.6 589.9 208.8 609.9 221.9 629.3 235.7 648.1 249.5 666.8 264.1 685 279.3 702.6 295.3 721.1 311.7 739.2 328.6 756.9 345.6 774.8 363 792.2 381 809 398.9 825.9 417.4 842.2 436.4 857.8 445.6 865.4 454.9 872.8 464.2 880.2 473.6 887.7 483.1 895.1 492 903.2 494.3 905.2 496.5 907.3 498.7 909.5 498.9 909.7 499.7 910.8 500 910.8 500.2 910.8 500.5 910.8 500.7 910.8 501.2 910.8 502 911 502.5 910.8 507.3 907.1 512 903.3 516.8 899.6 526.2 892.1 535.6 884.6 544.9 876.9 563.3 861.7 581.4 846.2 599.2 830.3 616.9 814.5 634.1 798.2 651 781.5 667.9 764.7 684.4 747.5 700.3 729.7 716.3 711.8 731.8 693.4 746.5 674.4 761 655.7 774.8 636.5 787.8 616.8 800.7 597.2 812.8 577 823.8 556.2 835 535.1 845.2 513.5 854.3 491.4 863.4 469.1 871.2 446.3 877.3 423 883.4 399.9 887.8 376.4 890.3 352.7 892.9 328.6 893.4 304.3 892 280 891.8 276.9 891 273.8 890.3 270.7 889.7 267.7 889 264.6 888.4 261.6 887.2 255.7 886 249.9 884.7 244 882.3 233 879.7 222 876.5 211.1 873.4 201.8 870.1 192.5 866 183.5 863.5 178.4 878.8 211.7 866 183.5ZM814.8 393.5C808.1 418.2 799.5 442.5 789.4 466 780 487.9 770 509.6 758.5 530.5 747.4 550.7 735.1 570.3 722 589.3 708.8 608.4 694.7 626.8 680 644.8 664.8 663.4 649 681.5 632.7 699.1 615.9 717.3 598.5 734.9 580.5 752 562.5 769.1 544.1 785.7 525.1 801.6 515.7 809.5 506.1 817.3 496.5 824.9 496.1 825.2 495.2 826.3 494.7 826.3 494 826.3 493.3 826.3 492.6 826.3 492 826.3 491.4 825.5 491 825.1 490.5 824.6 490 824.1 489.5 823.6 488.4 822.6 487.2 821.5 486.1 820.5 481.6 816.6 476.9 813.1 472.2 809.4 469.9 807.6 467.6 805.7 465.3 803.8 463.1 801.9 461 799.8 458.8 797.8 454.2 793.7 449.7 789.6 445.2 785.5 435.9 777 426.6 768.5 417.5 759.8 408.4 751.1 399.5 742.3 390.9 733.2 386.7 728.8 382.7 724.3 378.4 720 374.2 715.8 370 711.5 365.8 707.2 349.1 690 332.9 672.5 317.4 654.3 301.8 636 286.9 617 273.1 597.3 259.2 577.5 246.4 556.9 234.5 535.8 222.8 515 212.1 493.7 202.6 471.8 193.1 449.9 184.8 427.4 177.9 404.6 176.1 398.6 174.4 392.6 173.1 386.5 171.7 380.1 170.6 373.6 169.6 367.1 167.6 354.2 166.3 341.2 165.5 328.2 164.7 315.3 164.3 302.3 164.5 289.3 164.7 276.7 165.9 264.2 167.5 251.7 167.9 248.5 168.3 245.4 168.7 242.2 168.9 240.6 169.1 239.1 169.3 237.5 169.5 235.9 169.6 234.3 169.8 232.7 170.1 230.3 171.1 228.1 171.7 225.7 172 224.5 172.2 223.2 172.2 221.9 172.2 220.8 172.8 220.1 173.6 219.5 174.6 218.8 175.6 218.3 176.5 217.5 177.1 217 177.6 216.6 178.4 216.3 179.2 216 180.1 215.7 180.9 215.3 183.9 214.2 186.8 213 189.8 211.9 195.7 209.7 201.6 207.5 207.6 205.3 231.3 196.7 255.3 189 279.7 182.4 292 179.1 304.3 176.1 316.7 173.5 322.9 172.2 329.1 170.6 335.4 169.3 341.7 167.9 348 166.6 354.3 165.4 379.8 160.4 405.4 156.3 431.1 152.5 444 150.6 457 148.8 470 147 473.2 146.6 476.5 146.1 479.7 145.7 481.3 145.5 482.8 145.3 484.4 145.1 485.7 144.9 487.1 145 488.4 145.1 493.9 145.1 499.5 145.3 504.9 146.3 506.2 146.5 507.4 146.8 508.6 147.1 510.1 147.5 511.5 147.8 513 148 516.1 148.4 519.2 148.9 522.3 149.3 528.6 150.2 534.8 151.1 541.1 152 553.7 153.8 566.4 155.7 579 157.7 604.4 161.7 629.7 166 654.8 171.4 680 176.8 705 183.2 729.7 190.3 742.1 193.9 754.4 197.7 766.6 201.7 772.7 203.7 778.7 205.8 784.7 207.9 787.7 209 790.7 210 793.7 211.1 795.1 211.6 796.6 212.1 798 212.7 798.7 213 799.4 213.2 800.1 213.5 800.8 213.8 801.9 214 802.4 214.5 803.6 215.7 805.3 216.5 806.3 217.9 806.8 218.7 807.1 219.5 807.2 220.5 807.3 221.2 807.2 221.8 807.4 222.5 807.7 223.4 807.9 224.3 808.1 225.2 809.8 231.5 811.2 237.9 812.3 244.4 813.4 250.8 814.1 257.2 814.5 263.6 814.7 266.8 814.8 270 814.9 273.2 814.9 274 814.9 274.7 814.9 275.5 814.9 276.3 815.2 277.1 815.3 277.8 815.7 279.5 816 281.1 816.4 282.8 821.3 306.5 822.7 330.7 820.7 354.8 819.6 367.7 817.6 380.7 814.8 393.5 807.1 421.7 822.5 357.6 814.8 393.5ZM617.6 393.5C616.1 389 614.6 384.5 613.1 379.9 612.9 379.3 612.7 378.7 612.5 378.1 612.4 377.7 612.5 377.1 612.4 376.7 612.3 376.1 612.2 375.5 612.1 374.9 611.8 373.8 611.4 372.8 610.8 371.9 609.7 370.1 608.1 368.5 606.5 367 604.7 365.2 602.4 362.7 599.6 362.7 601.6 360.7 604.3 360 606.5 358.3 607.6 357.4 608.5 356.5 609.7 355.7 610.5 355.2 611.6 354.7 612.1 353.8 612.3 353.4 612.4 352.9 612.4 352.5 612.9 352 613.3 351.5 613.7 350.9 614.4 349.8 614.7 348.6 614.9 347.3 615.1 345.1 615 342.9 615 340.7 615 338.4 615 336.1 615 333.8 615 331.4 615 329 614.4 326.6 613.1 321.5 610 316.8 606.4 313.1 604.7 311.4 603 309.9 601 308.6 598.3 306.9 595.5 305.5 592.7 304.1 589.9 302.7 586.9 301.8 583.8 301.4 581.4 301.1 579 301.1 576.6 301.1 573.9 301.1 571.2 301.1 568.5 301.1 556.2 301.1 543.8 301.1 531.5 301.1 526.9 301.1 522.3 301.1 517.7 301.1 516.9 301.1 516.1 301.1 515.2 301.1 515.1 301.1 515.2 305.3 515.2 305.6 515.2 308.8 515.2 311.9 515.2 315.1 515.2 316.2 515.2 317.3 515.2 318.4 515.2 318.9 515 319.1 515.5 319.1 516.7 319.1 528 319 528 319.2 528 327.2 528 335.2 528 343.2 528 355.8 528 368.3 528 380.9 528 384.6 528 388.3 528 392 528 392.2 528.1 393.4 527.9 393.4 525.4 393.4 522.8 393.4 520.3 393.4 518.9 393.4 517.6 393.4 516.2 393.4 515.9 393.4 515.2 393.2 515.2 393.6 515.2 395.7 515.2 397.8 515.2 400 515.2 401 515.2 414 515.2 414 524.7 414 534.3 414 543.8 414 549.3 414 554.8 414 560.2 414 561.4 414 562.5 414 563.7 414 564 414 563.8 411.1 563.8 410.7 563.8 405.1 563.8 399.6 563.8 394 563.8 393.4 563.9 393.5 563.3 393.5 562 393.5 560.7 393.5 559.3 393.5 557.8 393.5 556.3 393.5 554.8 393.5 554.6 393.5 553.5 393.7 553.5 393.4 553.5 388.4 553.5 383.4 553.5 378.4 553.5 375.6 553.5 372.9 553.5 370.1 553.5 369.4 553.5 368.8 553.5 368.1 553.5 367.7 554.2 367.9 554.5 367.9 557.4 367.9 560.2 367.9 563.1 367.9 565 367.9 566.9 367.9 568.8 367.9 570.1 367.9 571.6 367.7 572.8 368.1 573.9 368.4 574.8 369 575.7 369.7 576.8 370.6 578.3 371.8 578.9 373.1 579.2 373.8 579.2 374.5 579.2 375.3 579.2 376.6 579.6 377.7 580.2 378.9 580.7 380 581.3 381 581.6 382.2 581.7 382.6 581.7 383 581.8 383.4 581.9 384 582 384.6 582.1 385.1 583.1 390.9 584.2 396.6 585.2 402.4 585.6 404.9 586.1 407.3 586.5 409.8 586.6 410.3 586.7 410.8 586.8 411.3 586.8 411.4 587.2 411.4 587.4 411.4 597.8 411.4 608.3 411.4 618.7 411.4 619.2 411.4 619.6 411.4 620.1 411.4 620.2 411.4 620.2 410.7 620.2 410.6 620.2 408.2 620.2 405.7 620.2 403.3 620.2 398.3 620.2 393.3 620.2 388.4 620.2 388.4 620.2 388.4 620.2 388.4 619.3 390.1 618.5 391.8 617.6 393.5ZM592 339.7C592 342 589.2 342.8 587.7 344.1 587.4 344.3 587.1 344.6 586.9 344.8 586.7 344.8 586.4 344.8 586.2 344.9 585.8 345 585.4 345.2 585.1 345.4 584.4 345.9 583.9 346.6 583.2 347 582.1 347.5 580.7 347.3 579.6 347.3 577.9 347.3 576.3 347.3 574.6 347.3 573.9 347.3 573.2 347.3 572.5 347.3 569.5 347.3 566.4 347.3 563.4 347.3 563 347.3 558.8 347.4 558.8 347.2 558.8 337.9 558.8 328.5 558.8 319.2 558.8 319.1 571.7 319.2 573 319.2 577 319.2 581 319.1 584.9 320.1 586.4 320.5 587.8 321 589.2 321.6 590.1 322.1 591 323.2 591.6 324 593.1 325.7 594.1 327.8 594.5 330 594.6 330.7 594.6 331.3 594.6 332 594.3 332.6 594 333.2 593.7 333.9 593.3 334.7 592.9 335.5 592.6 336.3 592.1 337.4 592 338.5 592 339.7ZM722.6 393.5C722.6 384.2 722.6 374.9 722.6 365.6 722.6 357.1 720.9 348 714.6 341.9 707.5 335.1 696.4 333.9 687 334.7 685.1 334.9 683.2 335.3 681.4 336.1 680.4 336.5 679.5 336.9 678.6 337.6 678 338.1 677.3 338.5 676.7 338.8 673.6 340.4 670.5 341.6 668.8 344.9 668.8 335.9 668.8 326.8 668.8 317.8 668.8 311.9 668.8 306 668.8 300.1 668.8 298.4 668.8 296.6 668.8 294.9 668.8 294.4 669.1 293.7 668.5 293.7 657.9 293.7 647.3 293.7 636.7 293.7 635.5 293.7 634.2 293.7 633 293.7 633 293.7 633 297.8 633 298.1 633 303.4 633 308.7 633 314 633 314.3 633.8 314.2 634 314.2 635.4 314.2 636.7 314.2 638.1 314.2 640.6 314.2 643.2 314.2 645.7 314.2 645.9 314.2 645.8 319.4 645.8 319.8 645.8 331.2 645.8 342.6 645.8 353.9 645.8 364.9 645.8 375.8 645.8 386.8 645.8 388 645.8 389.2 645.8 390.3 645.8 391.2 645.7 391 644.6 391 641.6 391 638.7 391 635.7 391 634.8 391 633.9 391 633 391 632.9 391 632.9 391.9 632.9 392 632.9 397.7 632.9 403.4 632.9 409 632.9 409.8 632.9 410.5 632.9 411.3 632.9 411.5 633 411.5 633.2 411.5 634.5 411.5 635.9 411.5 637.2 411.5 649.1 411.5 661 411.5 672.9 411.5 673.4 411.5 681.5 411.5 681.5 411.5 681.5 406.5 681.5 401.5 681.5 396.5 681.5 394.7 681.5 392.9 681.5 391.1 681.5 391.1 675.6 391.1 675.2 391.1 674.8 391.1 668.7 391.1 668.7 391.1 668.7 389.8 668.7 388.5 668.7 387.3 668.7 381.2 668.7 375 668.7 368.9 668.7 366.5 668.7 364.2 668.7 361.8 668.7 361.3 668.7 360.9 668.7 360.4 668.7 360 670.3 358.8 670.6 358.5 671.7 357.5 672.8 356.5 674.2 355.8 674.7 355.5 675.3 355.3 675.8 355.3 676.5 355.2 676.8 354.8 677.4 354.3 678.5 353.5 679.7 353 681 352.8 683.6 352.4 685.8 352.7 687.9 354.2 689.1 355.1 690.1 356.1 691.2 357.2 692 358 692.7 358.8 693.3 359.8 694.2 361.6 694.3 363.7 694.3 365.7 694.4 369.3 694.3 372.9 694.3 376.6 694.3 387.8 694.3 399 694.3 410.3 694.3 410.9 694 411.6 694.7 411.6 696.4 411.6 698.1 411.6 699.8 411.6 706 411.6 712.3 411.6 718.5 411.6 722.4 411.6 726.3 411.6 730.2 411.6 730.2 411.6 730.2 398.5 730.2 397.5 730.2 395.4 730.2 393.3 730.2 391.2 727.8 391.8 725.2 392.6 722.6 393.5ZM730.3 270.6C727.9 270.6 725.4 270.6 723 270.6 722 270.6 721.1 270.6 720.1 270.6 720 270.6 719.6 271.3 719.6 271.4 716.5 276 713.4 280.6 710.4 285.3 708.9 287.5 707.4 289.7 706 292 705.6 292.5 705.3 293.1 704.9 293.6 704.6 294.1 704.8 294.9 704.8 295.4 704.8 295.6 704.8 298.8 704.8 298.8 705.4 298.8 706 298.8 706.5 298.8 709.5 298.8 712.4 298.8 715.4 298.8 717.8 298.8 720.1 298.8 722.5 298.8 723 298.8 722.7 299.6 722.7 299.9 722.7 301.4 722.7 302.9 722.7 304.4 722.7 305.8 722.7 307.1 722.7 308.5 722.7 309.3 723 309.1 723.8 309.1 725.3 309.1 726.9 309.1 728.4 309.1 728.7 309.1 730.3 309.3 730.3 308.9 730.3 306.2 730.3 303.4 730.3 300.7 730.3 300.4 730.1 298.8 730.5 298.8 731.9 298.8 733.3 298.8 734.6 298.8 734.7 298.8 735.4 298.8 735.4 298.8 735.4 298.2 735.4 297.7 735.4 297.1 735.4 296.9 735.4 293.7 735.4 293.7 734.1 293.7 732.9 293.7 731.6 293.7 731.1 293.7 730.3 294 730.3 293.4 730.3 285.7 730.3 278.1 730.3 270.6ZM722.6 285.9C722.6 287.2 722.6 288.5 722.6 289.7 722.6 290.6 722.6 291.4 722.6 292.3 722.6 292.5 722.7 293.4 722.6 293.6 722.5 293.7 721.6 293.6 721.5 293.6 720.6 293.6 719.7 293.6 718.8 293.6 717.5 293.6 716.2 293.6 715 293.6 716.3 291.6 717.7 289.6 719 287.6 719.6 286.7 720.2 285.9 720.8 285.1 722.4 283.1 722.6 280.7 722.6 278.2 722.6 280.8 722.6 283.4 722.6 285.9ZM763.6 288.5C760.9 285.8 756.2 285.9 752.6 285.9 752 285.9 751.4 285.9 750.8 285.9 750.8 285.9 750.8 284.8 750.8 284.7 750.8 283.4 750.8 282.1 750.8 280.8 750.8 280.7 763.9 280.8 765.2 280.8 765.7 280.8 766.2 281 766.2 280.5 766.2 279.1 766.2 277.7 766.2 276.4 766.2 275.3 766.2 274.2 766.2 273.2 766.2 273.2 764.9 273.2 764.9 273.2 759.2 273.2 753.5 273.2 747.8 273.2 747.2 273.2 746.5 273.2 745.9 273.2 745.7 273.2 745.7 273.6 745.7 273.8 745.4 276 745.1 278.2 744.9 280.4 744.3 284.8 743.8 289.3 743.2 293.7 747 293.7 751.5 293.1 755.1 294.8 757.9 296.2 759 299.4 758.5 302.4 758 305.8 754.4 306.5 751.5 306.5 749.6 306.5 743.2 307 743.2 303.9 742.3 306.5 741.5 309 740.6 311.6 742.3 311.6 744 312.6 745.6 313.2 748 314.1 750.5 314.3 753 314.1 756.9 313.8 761 312.5 763.6 309.4 766.3 306.1 766.2 301.9 766.2 297.8 766.2 295.6 766.2 293.3 765.7 291.1 765.5 290.1 765 288.6 763.7 288.5 763.7 288.5 763.6 288.5 763.6 288.5 761 285.9 766.2 288.5 763.6 288.5Z", | |||
|
88 | "width": 1000 | |||
|
89 | }, | |||
|
90 | "search": [ | |||
|
91 | "rhodecode" | |||
|
92 | ] | |||
|
93 | }, | |||
|
94 | { | |||
|
95 | "uid": "e5ad8728e6d6290aff4b6ffcfcaa9167", | |||
|
96 | "css": "up", | |||
|
97 | "code": 59442, | |||
|
98 | "src": "custom_icons", | |||
|
99 | "selected": true, | |||
|
100 | "svg": { | |||
|
101 | "path": "M686.5 595.8L513.6 379.1C506.3 369.9 492.4 369.9 485.1 379.1L312.2 595.8C302.7 607.8 311.2 625.4 326.5 625.4H672.2C687.5 625.4 696 607.8 686.5 595.8Z", | |||
|
102 | "width": 1000 | |||
|
103 | }, | |||
|
104 | "search": [ | |||
|
105 | "up" | |||
|
106 | ] | |||
|
107 | }, | |||
|
108 | { | |||
|
109 | "uid": "6e459e39444c93a2c017f258186765d6", | |||
|
110 | "css": "unlock", | |||
|
111 | "code": 59399, | |||
|
112 | "src": "custom_icons", | |||
|
113 | "selected": true, | |||
|
114 | "svg": { | |||
|
115 | "path": "M780.8 434.6H396.2V342.3C396.2 284.6 438.5 238.5 492.3 226.9 492.3 226.9 492.3 226.9 496.2 226.9 503.8 226.9 507.7 226.9 515.4 226.9 515.4 226.9 519.2 226.9 519.2 226.9 519.2 226.9 519.2 226.9 523.1 226.9 530.8 226.9 538.5 226.9 546.2 230.8 546.2 230.8 546.2 230.8 546.2 230.8 553.8 230.8 557.7 234.6 565.4 238.5 565.4 238.5 569.2 238.5 569.2 242.3 573.1 246.2 580.8 246.2 584.6 250 584.6 250 584.6 250 584.6 250 588.5 253.8 596.2 257.7 600 261.5 600 261.5 603.8 265.4 603.8 265.4 607.7 269.2 611.5 273.1 615.4 276.9 615.4 276.9 615.4 276.9 619.2 280.8 623.1 284.6 626.9 292.3 630.8 300 630.8 300 630.8 303.8 630.8 303.8 634.6 307.7 634.6 315.4 634.6 319.2 634.6 319.2 634.6 323.1 634.6 323.1 634.6 323.1 634.6 323.1 634.6 326.9 638.5 338.5 646.2 346.2 657.7 346.2H715.4C730.8 346.2 742.3 334.6 738.5 319.2 738.5 319.2 738.5 319.2 738.5 319.2 738.5 319.2 738.5 315.4 738.5 315.4 738.5 307.7 734.6 303.8 734.6 296.2 734.6 292.3 734.6 292.3 730.8 288.5 730.8 273.1 730.8 269.2 726.9 261.5 726.9 261.5 726.9 257.7 723.1 257.7 719.2 250 715.4 242.3 711.5 234.6 711.5 234.6 707.7 230.8 707.7 230.8 703.8 223.1 700 219.2 696.2 215.4 696.2 211.5 692.3 211.5 692.3 207.7 688.5 203.8 684.6 196.2 680.8 192.3 680.8 192.3 676.9 188.5 676.9 188.5 669.2 180.8 665.4 176.9 657.7 169.2 657.7 169.2 653.8 169.2 653.8 165.4 650 161.5 642.3 157.7 634.6 153.8 630.8 153.8 630.8 150 626.9 150 623.1 146.2 615.4 142.3 611.5 142.3 607.7 142.3 607.7 138.5 603.8 138.5 596.2 134.6 588.5 130.8 580.8 130.8 580.8 130.8 580.8 130.8 580.8 130.8 573.1 126.9 565.4 126.9 553.8 123.1 550 123.1 550 123.1 546.2 123.1 538.5 123.1 534.6 123.1 526.9 119.2 523.1 119.2 519.2 119.2 519.2 119.2 511.5 119.2 503.8 119.2 496.2 119.2 496.2 119.2 492.3 119.2 492.3 119.2 484.6 119.2 476.9 123.1 465.4 123.1 461.5 123.1 453.8 126.9 450 126.9 450 126.9 446.2 126.9 446.2 126.9 353.8 153.8 288.5 242.3 288.5 342.3V434.6H246.2C230.8 434.6 223.1 446.2 223.1 457.7V857.7C223.1 873.1 234.6 880.8 246.2 880.8H780.8C796.2 880.8 803.8 869.2 803.8 857.7V457.7C807.7 446.2 796.2 434.6 780.8 434.6Z", | |||
|
116 | "width": 1000 | |||
|
117 | }, | |||
|
118 | "search": [ | |||
|
119 | "unlock" | |||
|
120 | ] | |||
|
121 | }, | |||
|
122 | { | |||
|
123 | "uid": "b077586592b9b69166b981325446c836", | |||
|
124 | "css": "delete", | |||
|
125 | "code": 59392, | |||
|
126 | "src": "custom_icons", | |||
|
127 | "selected": true, | |||
|
128 | "svg": { | |||
|
129 | "path": "M515.4 92.3C303.8 92.3 130.8 265.4 130.8 476.9 130.8 688.5 303.8 861.5 515.4 861.5S900 688.5 900 476.9C900 265.4 726.9 92.3 515.4 92.3ZM742.3 507.7C742.3 523.1 730.8 534.6 711.5 534.6H315.4C300 534.6 284.6 523.1 284.6 507.7V446.2C284.6 430.8 296.2 419.2 315.4 419.2H711.5C726.9 419.2 742.3 430.8 742.3 446.2V507.7Z", | |||
|
130 | "width": 1000 | |||
|
131 | }, | |||
|
132 | "search": [ | |||
|
133 | "delete" | |||
|
134 | ] | |||
|
135 | }, | |||
|
136 | { | |||
|
137 | "uid": "dca63ad885c0d6f1780a8d1d55bc2380", | |||
|
138 | "css": "ok", | |||
|
139 | "code": 59393, | |||
|
140 | "src": "custom_icons", | |||
|
141 | "selected": true, | |||
|
142 | "svg": { | |||
|
143 | "path": "M515.4 115.4C303.8 115.4 130.8 288.5 130.8 500 130.8 711.5 303.8 884.6 515.4 884.6S900 711.5 900 500C900 288.5 726.9 115.4 515.4 115.4ZM753.8 411.5L450 715.4C438.5 726.9 423.1 726.9 411.5 715.4L273.1 576.9C261.5 565.4 261.5 550 273.1 538.5L315.4 496.2C326.9 484.6 342.3 484.6 353.8 496.2L411.5 553.8C423.1 565.4 438.5 565.4 450 553.8L669.2 334.6C680.8 323.1 696.2 323.1 707.7 334.6L750 376.9C765.4 384.6 765.4 400 753.8 411.5Z", | |||
|
144 | "width": 1000 | |||
|
145 | }, | |||
|
146 | "search": [ | |||
|
147 | "ok" | |||
|
148 | ] | |||
|
149 | }, | |||
|
150 | { | |||
|
151 | "uid": "c158b3a004c055c6ad1471cd98932268", | |||
|
152 | "css": "down", | |||
|
153 | "code": 59403, | |||
|
154 | "src": "custom_icons", | |||
|
155 | "selected": true, | |||
|
156 | "svg": { | |||
|
157 | "path": "M703.8 396.2L530.8 615.4C523.1 623.1 507.7 623.1 503.8 615.4L330.8 396.2C323.1 384.6 330.8 365.4 346.2 365.4H692.3C703.8 365.4 711.5 384.6 703.8 396.2Z", | |||
|
158 | "width": 1000 | |||
|
159 | }, | |||
|
160 | "search": [ | |||
|
161 | "arrow_down" | |||
|
162 | ] | |||
|
163 | }, | |||
|
164 | { | |||
|
165 | "uid": "02f59f392ad28056845cfc04cb121f13", | |||
|
166 | "css": "comment", | |||
|
167 | "code": 59394, | |||
|
168 | "src": "custom_icons", | |||
|
169 | "selected": true, | |||
|
170 | "svg": { | |||
|
171 | "path": "M130.8 784.6V280.8C130.8 207.7 188.5 150 261.5 150H769.2C842.3 150 900 207.7 900 280.8V569.2C900 642.3 842.3 700 769.2 700H273.1C269.2 700 261.5 703.8 257.7 707.7L165.4 800C153.8 815.4 130.8 803.8 130.8 784.6ZM261.5 211.5C223.1 211.5 188.5 242.3 188.5 284.6V696.2L234.6 650C238.5 646.2 242.3 642.3 250 642.3H769.2C807.7 642.3 842.3 611.5 842.3 569.2V280.8C842.3 242.3 811.5 207.7 769.2 207.7H261.5Z", | |||
|
172 | "width": 1000 | |||
|
173 | }, | |||
|
174 | "search": [ | |||
|
175 | "comment" | |||
|
176 | ] | |||
|
177 | }, | |||
|
178 | { | |||
|
179 | "uid": "9a44b838872ca62b8aba7bbbbf67cc59", | |||
|
180 | "css": "feed", | |||
|
181 | "code": 59400, | |||
|
182 | "src": "custom_icons", | |||
|
183 | "selected": true, | |||
|
184 | "svg": { | |||
|
185 | "path": "M842.3 111.5H188.5C153.8 111.5 130.8 138.5 130.8 169.2V826.9C130.8 857.7 157.7 884.6 188.5 884.6H846.2C876.9 884.6 903.8 857.7 903.8 826.9V169.2C900 138.5 873.1 111.5 842.3 111.5ZM307.7 776.9C269.2 776.9 234.6 746.2 234.6 703.8S265.4 630.8 307.7 630.8C346.2 630.8 380.8 661.5 380.8 703.8S346.2 776.9 307.7 776.9ZM553.8 788.5C519.2 788.5 496.2 761.5 496.2 730.8 496.2 619.2 407.7 530.8 296.2 530.8 265.4 530.8 230.8 503.8 230.8 473.1 230.8 438.5 253.8 411.5 284.6 411.5L296.2 411.5C473.1 411.5 615.4 553.8 615.4 730.8 611.5 761.5 584.6 788.5 553.8 788.5ZM750 788.5C715.4 788.5 692.3 761.5 692.3 730.8 692.3 511.5 511.5 330.8 292.3 330.8 261.5 330.8 226.9 303.8 226.9 269.2 226.9 234.6 250 207.7 280.8 207.7L292.3 207.7C576.9 207.7 811.5 438.5 811.5 726.9 811.5 761.5 784.6 788.5 750 788.5Z", | |||
|
186 | "width": 1000 | |||
|
187 | }, | |||
|
188 | "search": [ | |||
|
189 | "feed" | |||
|
190 | ] | |||
|
191 | }, | |||
|
192 | { | |||
|
193 | "uid": "e0118d6f20b76d77317977ae8dc849d7", | |||
|
194 | "css": "left", | |||
|
195 | "code": 59401, | |||
|
196 | "src": "custom_icons", | |||
|
197 | "selected": true, | |||
|
198 | "svg": { | |||
|
199 | "path": "M692.3 76.9L761.5 146.2C773.1 157.7 773.1 173.1 761.5 184.6L473.1 473.1C461.5 484.6 461.5 500 473.1 511.5L769.2 807.7C780.8 819.2 780.8 834.6 769.2 846.2L700 915.4C688.5 926.9 673.1 926.9 661.5 915.4L257.7 511.5C246.2 500 246.2 484.6 257.7 473.1L653.8 76.9C665.4 65.4 680.8 65.4 692.3 76.9Z", | |||
|
200 | "width": 1000 | |||
|
201 | }, | |||
|
202 | "search": [ | |||
|
203 | "left" | |||
|
204 | ] | |||
|
205 | }, | |||
|
206 | { | |||
|
207 | "uid": "3cea97f90c8f2b0a90833855434f58de", | |||
|
208 | "css": "right", | |||
|
209 | "code": 59402, | |||
|
210 | "src": "custom_icons", | |||
|
211 | "selected": true, | |||
|
212 | "svg": { | |||
|
213 | "path": "M338.5 915.4L265.4 846.2C253.8 834.6 253.8 819.2 265.4 807.7L553.8 519.2C565.4 507.7 565.4 492.3 553.8 480.8L257.7 184.6C246.2 173.1 246.2 157.7 257.7 146.2L326.9 76.9C338.5 65.4 353.8 65.4 365.4 76.9L769.2 480.8C780.8 492.3 780.8 507.7 769.2 519.2L376.9 915.4C365.4 926.9 346.2 926.9 338.5 915.4Z", | |||
|
214 | "width": 1000 | |||
|
215 | }, | |||
|
216 | "search": [ | |||
|
217 | "right" | |||
|
218 | ] | |||
|
219 | }, | |||
|
220 | { | |||
|
221 | "uid": "820a44cb2e7fc1d0e28b1d2a8cd44cb9", | |||
|
222 | "css": "git", | |||
|
223 | "code": 59434, | |||
|
224 | "src": "custom_icons", | |||
|
225 | "selected": true, | |||
|
226 | "svg": { | |||
|
227 | "path": "M928.8 6.3H71.3C35 6.3 6.3 36.3 6.3 71.3V927.5C6.3 963.8 36.3 992.5 71.3 992.5H927.5C963.8 992.5 992.5 962.5 992.5 927.5V71.3C993.8 36.3 963.7 6.3 928.8 6.3ZM200 555C203.8 566.3 208.8 575 213.8 582.5 220 590 227.5 596.3 236.3 600 245 603.8 255 606.3 265 606.3 273.8 606.3 281.3 605 288.8 603.8 296.3 602.5 302.5 600 308.8 597.5L315 546.3H287.5C283.8 546.3 280 545 277.5 542.5 276.3 541.3 275 537.5 275 535L280 496.2H385L368.7 627.5C361.2 633.8 352.5 638.7 343.7 642.5 335 646.3 326.3 650 316.2 652.5 306.2 655 297.5 657.5 286.3 658.8 276.3 660 265 661.3 252.5 661.3 232.5 661.3 215 657.5 198.7 650 182.5 642.5 168.7 632.5 157.5 620 146.2 607.5 137.5 592.5 131.2 575 125 557.5 121.2 538.8 121.2 518.8 121.2 501.3 123.7 485 127.5 468.8 131.2 452.5 137.5 438.8 145 425 152.5 411.3 161.2 400 171.2 388.8 181.2 377.5 192.5 368.8 205 361.3 217.5 353.8 231.3 347.5 246.3 343.8 261.3 340 276.3 337.5 292.5 337.5 306.3 337.5 317.5 338.8 328.7 341.3 340 343.8 350 347.5 357.5 351.3 366.2 355 373.8 360 380 365 386.3 370 392.5 376.3 397.5 381.3L377.5 412.5C373.8 417.5 368.8 420 363.8 421.3 358.8 422.5 353.7 421.3 347.5 417.5 342.5 413.8 337.5 411.3 333.7 408.8 328.7 406.3 325 403.8 320 402.5 315 401.3 310 400 305 398.8 300 397.5 293.7 397.5 287.5 397.5 273.7 397.5 261.2 400 250 406.3 238.7 412.5 228.7 420 221.2 431.3 212.5 441.2 206.2 455 202.5 468.8 197.5 483.8 196.2 500 196.2 517.5 195 531.3 197.5 543.8 200 555ZM536.3 657.5H465L503.7 342.5H575L536.3 657.5ZM878.8 398.8H798.8L766.3 657.5H696.3L727.5 398.7H647.5L655 342.5H886.3L878.8 398.8Z", | |||
|
228 | "width": 1000 | |||
|
229 | }, | |||
|
230 | "search": [ | |||
|
231 | "git" | |||
|
232 | ] | |||
|
233 | }, | |||
|
234 | { | |||
|
235 | "uid": "ea152b092f5ad7d610de2c388553e188", | |||
|
236 | "css": "hg", | |||
|
237 | "code": 59437, | |||
|
238 | "src": "custom_icons", | |||
|
239 | "selected": true, | |||
|
240 | "svg": { | |||
|
241 | "path": "M926.6 9.2H73.9C37.9 9.2 8.7 38.5 8.7 74.4V927.1C8.7 963.1 38 992.3 73.9 992.3H926.6C962.6 992.3 991.8 963 991.8 927.1V74.4C991.8 38.4 962.6 9.2 926.6 9.2ZM444 657.4H373.5L389.8 524.1H276.7L260.4 657.4H189.9L228.6 344.2H299.1L282.8 476.4H395.9L412.2 344.2H482.7L444 657.4ZM621 555.8C624.3 566.8 629.1 576 635.3 583.5 641.5 591 648.8 596.8 657.5 600.8 666.1 604.8 675.6 606.8 686.1 606.8 694.7 606.8 702.4 606 709.3 604.5 716.2 603 722.8 600.8 729.1 598.1L735.1 546.9H708.4C704.1 546.9 700.8 545.8 698.6 543.6 696.4 541.4 695.5 538.5 695.9 534.9L700.6 496.2H805.1L788.8 627.1C780.8 633 772.5 638.1 763.9 642.3 755.3 646.6 746.3 650 736.9 652.7 727.5 655.5 717.6 657.5 707.2 658.7 696.8 660 685.7 660.6 674 660.6 654.6 660.6 637 657 621 650 605 642.9 591.3 633.1 579.9 620.7 568.5 608.2 559.7 593.5 553.5 576.4 547.2 559.3 544.1 540.9 544.1 520.9 544.1 503.6 546.1 487.1 550 471.3 554 455.6 559.6 441.1 566.9 427.8 574.2 414.5 583 402.4 593.2 391.7 603.4 381 614.9 371.8 627.4 364.2 639.9 356.6 653.5 350.7 667.9 346.6 682.4 342.6 697.6 340.5 713.5 340.5 726.8 340.5 738.9 341.7 749.7 344.2 760.5 346.6 770.2 349.9 778.8 353.9 787.4 358 795.1 362.8 801.8 368.1 808.6 373.5 814.5 379 819.7 384.8L797 413.2C793.3 418.2 788.8 421.3 783.7 422.3 778.6 423.4 773.2 422.2 767.8 418.8 762.8 415.4 758.1 412.4 753.6 409.9 749.2 407.4 744.7 405.3 740.1 403.7 735.5 402 730.7 400.8 725.6 400 720.5 399.2 714.8 398.8 708.5 398.8 694.9 398.8 682.4 401.7 671.1 407.5 659.8 413.3 650 421.5 641.9 432 633.7 442.5 627.4 455.2 622.9 469.9 618.4 484.7 616.1 501 616.1 518.7 615.9 532.5 617.6 544.8 621 555.8Z", | |||
|
242 | "width": 1000 | |||
|
243 | }, | |||
|
244 | "search": [ | |||
|
245 | "hg" | |||
|
246 | ] | |||
|
247 | }, | |||
|
248 | { | |||
|
249 | "uid": "4a842c0afb4c35dacd21da71f9fed3f1", | |||
|
250 | "css": "comment-add", | |||
|
251 | "code": 59439, | |||
|
252 | "src": "custom_icons", | |||
|
253 | "selected": true, | |||
|
254 | "svg": { | |||
|
255 | "path": "M952.4 591.9V274.9C952.4 268.4 952.3 261.9 951.8 255.4 950.7 242.9 948.2 230.6 944.1 218.8 936.5 196.6 923.8 176.2 907.3 159.6 890.8 143.1 870.6 130.4 848.5 122.7 836.6 118.6 824.2 115.9 811.6 114.8 805.3 114.2 798.9 114.2 792.6 114.2H216.9C204 114.2 191.3 114.1 178.5 116 166.3 117.9 154.4 121.2 143 125.9 121.4 134.8 101.9 148.7 86.4 166.2 70.8 183.8 59.3 205 53.1 227.7 49.7 240.1 47.9 252.8 47.6 265.6 47.3 278.7 47.6 291.8 47.6 304.9V861.8C47.6 870.7 52.5 878.6 60.5 882.5 67.3 885.9 75.6 886.2 82.4 882.7 84.8 881.5 86.9 879.7 88.8 877.8 91.1 875.5 93.4 873.2 95.6 871 100.3 866.3 105 861.6 109.7 856.9L137.9 828.6C147.3 819.2 156.6 809.9 166 800.5 175.2 791.3 184.6 782.1 193.7 772.7 197.7 768.5 201.9 764.4 207.6 762.7 210.4 761.9 213.2 761.8 216 761.8H782.7C795.5 761.8 808.3 762 821 760.1 844.8 756.5 867.7 747.3 887.3 733.3 906.2 719.9 922.1 702.1 933.2 681.8 945.1 660.2 951.5 636 952.2 611.4 952.5 604.9 952.4 598.4 952.4 591.9ZM883.4 285.1V602.5C883.4 608.8 883.4 615.1 882.5 621.4 881.7 627.5 880.2 633.6 878.1 639.4 874.4 649.4 868.8 658.7 861.7 666.7 846.6 683.6 825.1 693.8 802.5 695.1 796.3 695.4 790 695.2 783.8 695.2H207.8C201.2 695.2 194.7 695.2 188.1 695.2 185 695.2 181.8 695.2 178.8 696.1 176.2 696.9 173.9 698.2 171.8 699.9 169.6 701.7 167.6 703.7 165.6 705.7 163.3 708 161 710.3 158.7 712.6 154 717.3 149.4 721.9 144.7 726.6 135.3 736 126 745.3 116.6 754.7V270C116.6 257.8 118.8 245.7 123.7 234.6 128 224.9 134 215.9 141.5 208.4 157.5 192.4 179.6 183.3 202.2 183.3H791.5C797.6 183.3 803.7 183.3 809.7 184.2 832 187.4 852.4 199.4 866 217.4 872.8 226.4 877.7 236.7 880.5 247.6 882 253.5 882.9 259.6 883.1 265.8 883.6 272.2 883.4 278.7 883.4 285.1ZM668.8 402H538.2C534.4 402 526.7 394.3 526.7 390.5V263.7C526.7 256 519 248.3 515.2 248.3H465.3C457.6 248.3 449.9 256 449.9 259.8V390.4C449.9 394.2 442.2 401.9 438.4 401.9H311.7C304 401.9 296.3 409.6 296.3 413.4V463.3C296.3 471 304 478.7 307.8 478.7H434.5C442.2 478.7 449.9 486.4 449.9 490.2V617C449.9 624.7 457.6 632.4 461.4 632.4H511.3C519 632.4 526.7 624.7 526.7 620.9V494.1C526.7 486.4 534.4 478.7 538.2 478.7H665C672.7 478.7 680.4 471 680.4 467.2V417.3C680.3 409.6 672.6 402 668.8 402Z", | |||
|
256 | "width": 1000 | |||
|
257 | }, | |||
|
258 | "search": [ | |||
|
259 | "comment-add" | |||
|
260 | ] | |||
|
261 | }, | |||
|
262 | { | |||
|
263 | "uid": "2427f6b8d4379b9a0b41cf31780807cf", | |||
|
264 | "css": "comment-toggle", | |||
|
265 | "code": 59440, | |||
|
266 | "src": "custom_icons", | |||
|
267 | "selected": true, | |||
|
268 | "svg": { | |||
|
269 | "path": "M797.6 114.2H202.4C116.6 114.2 47.6 183.3 47.6 269V861.9C47.6 881.4 69.5 891.1 84.1 881.8 86.4 880.7 88.6 879.1 90.6 877.1L199.8 768C202.1 765.7 204.7 764 207.7 762.8 209.7 762.2 211.9 761.9 214.3 761.9H797.6C883.4 761.9 952.4 692.8 952.4 607.1V269C952.4 183.2 883.3 114.2 797.6 114.2ZM118.3 752.6V269.5C118.3 222.5 156.4 184.3 203.5 184.3H680.1C593.7 267.9 175.5 695.4 171.4 699.5L118.3 752.6Z", | |||
|
270 | "width": 1000 | |||
|
271 | }, | |||
|
272 | "search": [ | |||
|
273 | "comment-toggle" | |||
|
274 | ] | |||
|
275 | }, | |||
|
276 | { | |||
|
277 | "uid": "6533bdc16ab201eb3f3b27ce989cab33", | |||
|
278 | "css": "folder-open-empty", | |||
|
279 | "code": 61717, | |||
|
280 | "src": "fontawesome" | |||
|
281 | }, | |||
|
282 | { | |||
|
283 | "uid": "d64b34fac1d9923b7d29d1550b628ecd", | |||
|
284 | "css": "lock", | |||
|
285 | "code": 59398, | |||
|
286 | "src": "custom_icons", | |||
|
287 | "selected": true, | |||
|
288 | "svg": { | |||
|
289 | "path": "M812.5 424.1H758.9V317C758.9 308 758.9 303.6 758.9 299.1 758.9 294.6 758.9 290.2 758.9 285.7 758.9 281.3 758.9 281.3 758.9 276.8 758.9 267.9 758.9 263.4 754.5 254.5 754.5 250 754.5 250 750 245.5 750 236.6 745.5 232.1 741.1 223.2 741.1 223.2 741.1 218.8 736.6 218.8 732.1 209.8 727.7 200.9 723.2 192 723.2 192 718.8 187.5 718.8 187.5 723.2 178.6 718.8 169.6 714.3 165.2 714.3 160.7 709.8 160.7 709.8 156.3 705.4 151.8 700.9 142.9 696.4 138.4 696.4 138.4 692 133.9 692 133.9 683 125 678.6 120.5 669.6 111.6 669.6 111.6 665.2 111.6 665.2 107.1 660.7 102.7 651.8 98.2 642.9 93.8 638.4 93.8 638.4 89.3 633.9 89.3 629.5 84.8 620.5 80.4 616.1 80.4 611.6 80.4 611.6 75.9 607.1 75.9 598.2 71.4 589.3 67 580.4 67 580.4 67 580.4 67 580.4 67 571.4 62.5 562.5 62.5 549.1 58 544.6 58 544.6 58 540.2 58 535.7 58 535.7 58 531.3 58 531.3 58 526.8 58 526.8 58 526.8 58 522.3 58 522.3 58 522.3 58 522.3 58 522.3 58 522.3 58 522.3 58 522.3 58 517.9 58 513.4 58 513.4 58 513.4 58 508.9 58 508.9 58 504.5 58 504.5 58 500 58 500 58 500 58 500 58 495.5 58 491.1 58 491.1 58 491.1 58 491.1 58 491.1 58 491.1 58 491.1 58 491.1 58 491.1 58 486.6 58 486.6 58 486.6 58 482.1 58 482.1 58 477.7 58 477.7 58 473.2 58 468.8 58 468.8 58 464.3 58 455.4 58 442 62.5 433 67 433 67 433 67 433 67 410.7 67 397.3 71.4 388.4 75.9 383.9 75.9 383.9 80.4 379.5 80.4 375 84.8 370.5 84.8 361.6 89.3 361.6 93.8 357.1 93.8 357.1 93.8 348.2 98.2 339.3 102.7 334.8 111.6 334.8 111.6 330.4 111.6 330.4 116.1 321.4 120.5 317 125 308 133.9 308 133.9 303.6 138.4 303.6 138.4 299.1 142.9 294.6 151.8 290.2 156.3 290.2 160.7 285.7 160.7 285.7 165.2 276.8 169.6 272.3 178.6 272.3 183 267.9 183 267.9 187.5 267.9 187.5 263.4 196.4 258.9 205.4 254.5 214.3 254.5 214.3 254.5 218.8 250 218.8 250 232.1 245.5 236.6 245.5 245.5 245.5 250 245.5 250 241.1 254.5 241.1 263.4 236.6 267.9 236.6 276.8 236.6 281.3 236.6 281.3 236.6 285.7 236.6 290.2 236.6 294.6 236.6 299.1 236.6 303.6 236.6 312.5 236.6 317V424.1H187.5C169.6 424.1 160.7 437.5 160.7 450.9V915.2C160.7 933 174.1 942 187.5 942H808C825.9 942 834.8 928.6 834.8 915.2V450.9C839.3 433 825.9 424.1 812.5 424.1ZM361.6 317C361.6 250 410.7 196.4 473.2 183 473.2 183 473.2 183 477.7 183 486.6 183 491.1 183 500 183 500 183 504.5 183 504.5 183 504.5 183 504.5 183 504.5 183 513.4 183 517.9 183 526.8 183 526.8 183 526.8 183 531.3 183 593.8 196.4 642.9 250 642.9 317V424.1H361.6V317Z", | |||
|
290 | "width": 1000 | |||
|
291 | }, | |||
|
292 | "search": [ | |||
|
293 | "lock" | |||
|
294 | ] | |||
|
295 | }, | |||
|
296 | { | |||
|
297 | "uid": "d95fde5e3bfeb3302efc47c90538a1c5", | |||
|
298 | "css": "more", | |||
|
299 | "code": 59410, | |||
|
300 | "src": "custom_icons", | |||
|
301 | "selected": true, | |||
|
302 | "svg": { | |||
|
303 | "path": "M546.2 415.4H446.2C430.8 415.4 419.2 426.9 419.2 442.3V542.3C419.2 557.7 430.8 569.2 446.2 569.2H546.2C561.5 569.2 573.1 557.7 573.1 542.3V442.3C573.1 426.9 561.5 415.4 546.2 415.4ZM546.2 107.7H446.2C430.8 107.7 419.2 119.2 419.2 134.6V234.6C419.2 250 430.8 261.5 446.2 261.5H546.2C561.5 261.5 573.1 250 573.1 234.6V134.6C573.1 119.2 561.5 107.7 546.2 107.7ZM546.2 723.1H446.2C430.8 723.1 419.2 734.6 419.2 750V850C419.2 865.4 430.8 876.9 446.2 876.9H546.2C561.5 876.9 573.1 865.4 573.1 850V750C573.1 734.6 561.5 723.1 546.2 723.1Z", | |||
|
304 | "width": 1000 | |||
|
305 | }, | |||
|
306 | "search": [ | |||
|
307 | "more" | |||
|
308 | ] | |||
|
309 | }, | |||
|
310 | { | |||
|
311 | "uid": "34e7772638ae3ca1bfb0a4eca2c39221", | |||
|
312 | "css": "merge", | |||
|
313 | "code": 59443, | |||
|
314 | "src": "custom_icons", | |||
|
315 | "selected": true, | |||
|
316 | "svg": { | |||
|
317 | "path": "M199.8 740.5C199.8 812.2 258.1 870.5 329.8 870.5S459.8 812.2 459.8 740.5C459.8 694.6 435.8 654.5 399.8 631.3 418.4 491.7 533.4 451.9 602.4 440.6V742.4C563.7 765 537.4 806.4 537.4 854.4 537.4 926.1 595.7 984.4 667.4 984.4S797.4 926.1 797.4 854.4C797.4 806.5 771.1 765 732.4 742.4V254.9C771.1 232.3 797.4 190.9 797.4 142.9 797.4 71.2 739.1 12.9 667.4 12.9S537.4 71.2 537.4 142.9C537.4 190.8 563.7 232.3 602.4 254.9V309.9C542.2 317.8 440.4 342.3 364.2 417.8 309.5 472.1 277.9 542.1 269.6 625.9 228.4 647.7 199.8 690.6 199.8 740.5ZM667.6 897.8C643.7 897.8 624.3 878.3 624.3 854.5S643.8 811.2 667.6 811.2C691.5 811.2 710.9 830.7 710.9 854.5S691.5 897.8 667.6 897.8ZM667.6 99.6C691.5 99.6 710.9 119 710.9 142.9S691.4 186.2 667.6 186.2C643.7 186.2 624.3 166.8 624.3 142.9S643.7 99.6 667.6 99.6ZM329.9 783.9C306 783.9 286.6 764.4 286.6 740.6S306.1 697.3 329.9 697.3C353.8 697.3 373.2 716.7 373.2 740.6S353.8 783.9 329.9 783.9Z", | |||
|
318 | "width": 1000 | |||
|
319 | }, | |||
|
320 | "search": [ | |||
|
321 | "merge" | |||
|
322 | ] | |||
|
323 | }, | |||
|
324 | { | |||
|
325 | "uid": "c95735c17a10af81448c7fed98a04546", | |||
|
326 | "css": "folder-open", | |||
|
327 | "code": 59405, | |||
|
328 | "src": "fontawesome" | |||
|
329 | }, | |||
|
330 | { | |||
|
331 | "uid": "865ac833a8efcfc24a6f573705ce56b1", | |||
|
332 | "css": "svn", | |||
|
333 | "code": 59438, | |||
|
334 | "src": "custom_icons", | |||
|
335 | "selected": true, | |||
|
336 | "svg": { | |||
|
337 | "path": "M933.4 9.2H80.7C44.7 9.2 15.5 38.5 15.5 74.4V927.1C15.5 963.1 44.8 992.3 80.7 992.3H933.4C969.4 992.3 998.6 963 998.6 927.1V74.4C998.7 38.4 969.4 9.2 933.4 9.2ZM167.9 447.1C171.1 451 175.4 454.4 180.8 457.3 186.2 460.2 192.2 463 199 465.4 205.7 467.8 212.7 470.5 219.8 473.3 226.9 476.2 233.9 479.5 240.7 483.2 247.5 486.9 253.6 491.6 259 497.2 264.4 502.8 268.7 509.6 271.9 517.4 275.1 525.3 276.8 534.8 276.8 545.8 276.8 561.6 274.1 576.4 268.6 590.3 263.1 604.3 255.3 616.4 245.1 626.8 234.9 637.2 222.5 645.4 208 651.5 193.4 657.6 177 660.7 158.8 660.7 149.7 660.7 140.7 659.7 131.5 657.7S113.6 652.8 105.2 649.2C96.8 645.5 89 641.2 81.8 636.2 74.6 631.2 68.5 625.6 63.5 619.5L88.5 586.7C90.5 584.3 93 582.3 95.9 580.7 98.8 579.1 101.8 578.3 104.8 578.3 108.8 578.3 112.7 579.7 116.5 582.5 120.3 585.3 124.5 588.4 129.1 591.8 133.7 595.2 139 598.2 145.1 601.1 151.2 603.9 158.7 605.3 167.6 605.3 180.7 605.3 190.7 601.7 197.8 594.7 204.9 587.6 208.4 577.1 208.4 563.2 208.4 556.8 206.8 551.4 203.5 547.3 200.3 543.1 196 539.7 190.8 536.8 185.6 533.9 179.6 531.4 172.8 529.1 166 526.9 159.2 524.5 152.1 521.9 145.1 519.3 138.2 516.2 131.4 512.8 124.6 509.3 118.6 504.7 113.4 499 108.2 493.3 103.9 486.4 100.7 478.2 97.5 469.9 95.9 459.8 95.9 447.7 95.9 433.8 98.5 420.4 103.7 407.6 108.9 394.8 116.4 383.4 126.2 373.5 136 363.6 147.8 355.7 161.7 349.8 175.6 343.9 191.3 341 208.6 341 217.5 341 226.1 341.9 234.5 343.8S250.8 348.2 258.1 351.6C265.4 354.9 272.1 358.8 278.1 363.3 284.1 367.8 289.2 372.8 293.4 378.1L272.3 407C269.7 410.3 267.2 412.8 264.8 414.4 262.4 416 259.4 416.8 256 416.8 252.7 416.8 249.4 415.8 246.1 413.6 242.8 411.4 239.1 409.1 235 406.5 230.9 403.9 226.2 401.6 220.9 399.4 215.6 397.2 209.3 396.2 202.2 396.2 195.6 396.2 189.8 397.1 184.9 399 179.9 400.9 175.8 403.4 172.5 406.8 169.2 410.1 166.7 414 165.1 418.4 163.5 422.9 162.6 427.8 162.6 433 163.1 438.4 164.7 443.2 167.9 447.1ZM480 657.4H416.3L339.2 343.7H395.6C401.6 343.7 406.4 345.1 410 348 413.6 350.8 415.8 354.5 416.7 359L449.4 531.8C451.3 538.7 453 546.3 454.6 554.8 456.2 563.2 457.5 571.9 458.7 581 461.7 572 464.9 563.2 468.4 554.8 471.8 546.4 475.4 538.8 479.2 531.8L552.3 359C553.2 357.1 554.4 355.2 556.1 353.4 557.7 351.5 559.6 349.8 561.8 348.4 564 347 566.4 345.8 569 345 571.6 344.2 574.4 343.7 577.3 343.7H634.1L480 657.4ZM902.6 657.4H866C860.5 657.4 856.1 656.5 852.8 654.7 849.4 652.9 846.2 649.9 843.2 645.8L733.6 452.2C733.3 456.2 733 460.1 732.7 463.8 732.3 467.6 732 471.1 731.7 474.4L710.2 657.4H648.2L686.9 343.7H723.9C726.9 343.7 729.5 343.8 731.6 344 733.7 344.2 735.5 344.7 737.1 345.5 738.7 346.3 740.1 347.4 741.4 348.8S744.1 352.1 745.5 354.4L855.5 548.1C855.8 543.1 856.2 538.3 856.7 533.7 857.2 529.2 857.8 524.8 858.3 520.8L879.4 343.6H941.4L902.6 657.4Z", | |||
|
338 | "width": 1000 | |||
|
339 | }, | |||
|
340 | "search": [ | |||
|
341 | "svn" | |||
|
342 | ] | |||
|
343 | }, | |||
|
344 | { | |||
|
345 | "uid": "bbfb51903f40597f0b70fd75bc7b5cac", | |||
|
346 | "css": "trash", | |||
|
347 | "code": 61944, | |||
|
348 | "src": "fontawesome" | |||
|
349 | }, | |||
|
350 | { | |||
|
351 | "uid": "f48ae54adfb27d8ada53d0fd9e34ee10", | |||
|
352 | "css": "trash-empty", | |||
|
353 | "code": 59406, | |||
|
354 | "src": "fontawesome" | |||
|
355 | }, | |||
|
356 | { | |||
|
357 | "uid": "f8aa663c489bcbd6e68ec8147dca841e", | |||
|
358 | "css": "folder", | |||
|
359 | "code": 59404, | |||
|
360 | "src": "fontawesome" | |||
|
361 | }, | |||
|
362 | { | |||
|
363 | "uid": "c8585e1e5b0467f28b70bce765d5840c", | |||
|
364 | "css": "docs", | |||
|
365 | "code": 61637, | |||
|
366 | "src": "fontawesome" | |||
|
367 | }, | |||
|
368 | { | |||
|
369 | "uid": "1b5a5d7b7e3c71437f5a26befdd045ed", | |||
|
370 | "css": "doc", | |||
|
371 | "code": 59414, | |||
|
372 | "src": "fontawesome" | |||
|
373 | }, | |||
|
374 | { | |||
|
375 | "uid": "5408be43f7c42bccee419c6be53fdef5", | |||
|
376 | "css": "doc-text", | |||
|
377 | "code": 61686, | |||
|
378 | "src": "fontawesome" | |||
|
379 | }, | |||
|
380 | { | |||
|
381 | "uid": "b091a8bd0fdade174951f17d936f51e4", | |||
|
382 | "css": "folder-empty", | |||
|
383 | "code": 61716, | |||
|
384 | "src": "fontawesome" | |||
|
385 | }, | |||
|
386 | { | |||
|
387 | "uid": "c08a1cde48d96cba21d8c05fa7d7feb1", | |||
|
388 | "css": "doc-text-inv", | |||
|
389 | "code": 61788, | |||
|
390 | "src": "fontawesome" | |||
|
391 | }, | |||
|
392 | { | |||
|
393 | "uid": "178053298e3e5b03551d754d4b9acd8b", | |||
|
394 | "css": "doc-inv", | |||
|
395 | "code": 61787, | |||
|
396 | "src": "fontawesome" | |||
|
397 | }, | |||
|
398 | { | |||
|
399 | "uid": "e99461abfef3923546da8d745372c995", | |||
|
400 | "css": "cog", | |||
|
401 | "code": 59415, | |||
|
402 | "src": "fontawesome" | |||
|
403 | }, | |||
|
404 | { | |||
|
405 | "uid": "98687378abd1faf8f6af97c254eb6cd6", | |||
|
406 | "css": "cog-alt", | |||
|
407 | "code": 59416, | |||
|
408 | "src": "fontawesome" | |||
|
409 | }, | |||
|
410 | { | |||
|
411 | "uid": "21b42d3c3e6be44c3cc3d73042faa216", | |||
|
412 | "css": "sliders", | |||
|
413 | "code": 61918, | |||
|
414 | "src": "fontawesome" | |||
|
415 | }, | |||
|
416 | { | |||
|
417 | "uid": "559647a6f430b3aeadbecd67194451dd", | |||
|
418 | "css": "menu", | |||
|
419 | "code": 61641, | |||
|
420 | "src": "fontawesome" | |||
|
421 | }, | |||
|
422 | { | |||
|
423 | "uid": "c5fd349cbd3d23e4ade333789c29c729", | |||
|
424 | "css": "eye", | |||
|
425 | "code": 59417, | |||
|
426 | "src": "fontawesome" | |||
|
427 | }, | |||
|
428 | { | |||
|
429 | "uid": "7fd683b2c518ceb9e5fa6757f2276faa", | |||
|
430 | "css": "eye-off", | |||
|
431 | "code": 59418, | |||
|
432 | "src": "fontawesome" | |||
|
433 | }, | |||
|
434 | { | |||
|
435 | "uid": "2e2dba0307a502a8507c1729084c7ab5", | |||
|
436 | "css": "cancel-circled2", | |||
|
437 | "code": 59419, | |||
|
438 | "src": "fontawesome" | |||
|
439 | }, | |||
|
440 | { | |||
|
441 | "uid": "0f4cae16f34ae243a6144c18a003f2d8", | |||
|
442 | "css": "cancel-circled", | |||
|
443 | "code": 59420, | |||
|
444 | "src": "fontawesome" | |||
|
445 | }, | |||
|
446 | { | |||
|
447 | "uid": "26613a2e6bc41593c54bead46f8c8ee3", | |||
|
448 | "css": "file-code", | |||
|
449 | "code": 61897, | |||
|
450 | "src": "fontawesome" | |||
|
451 | }, | |||
|
452 | { | |||
|
453 | "uid": "5211af474d3a9848f67f945e2ccaf143", | |||
|
454 | "css": "remove", | |||
|
455 | "code": 59408, | |||
|
456 | "src": "fontawesome" | |||
|
457 | }, | |||
|
458 | { | |||
|
459 | "uid": "44e04715aecbca7f266a17d5a7863c68", | |||
|
460 | "css": "plus", | |||
|
461 | "code": 59421, | |||
|
462 | "src": "fontawesome" | |||
|
463 | }, | |||
|
464 | { | |||
|
465 | "uid": "4ba33d2607902cf690dd45df09774cb0", | |||
|
466 | "css": "plus-circled", | |||
|
467 | "code": 59422, | |||
|
468 | "src": "fontawesome" | |||
|
469 | }, | |||
|
470 | { | |||
|
471 | "uid": "1a5cfa186647e8c929c2b17b9fc4dac1", | |||
|
472 | "css": "plus-squared", | |||
|
473 | "code": 61694, | |||
|
474 | "src": "fontawesome" | |||
|
475 | }, | |||
|
476 | { | |||
|
477 | "uid": "2d3be3e856fc1e4ac067590d2ded1b07", | |||
|
478 | "css": "plus-squared-alt", | |||
|
479 | "code": 61846, | |||
|
480 | "src": "fontawesome" | |||
|
481 | }, | |||
|
482 | { | |||
|
483 | "uid": "eeadb020bb75d089b25d8424aabe19e0", | |||
|
484 | "css": "minus-circled", | |||
|
485 | "code": 59423, | |||
|
486 | "src": "fontawesome" | |||
|
487 | }, | |||
|
488 | { | |||
|
489 | "uid": "f755a58fb985eeb70bd47d9b31892a34", | |||
|
490 | "css": "minus-squared", | |||
|
491 | "code": 61766, | |||
|
492 | "src": "fontawesome" | |||
|
493 | }, | |||
|
494 | { | |||
|
495 | "uid": "18ef25350258541e8e54148ed79845c0", | |||
|
496 | "css": "minus-squared-alt", | |||
|
497 | "code": 61767, | |||
|
498 | "src": "fontawesome" | |||
|
499 | }, | |||
|
500 | { | |||
|
501 | "uid": "861ab06e455e2de3232ebef67d60d708", | |||
|
502 | "css": "minus", | |||
|
503 | "code": 59424, | |||
|
504 | "src": "fontawesome" | |||
|
505 | }, | |||
|
506 | { | |||
|
507 | "uid": "e82cedfa1d5f15b00c5a81c9bd731ea2", | |||
|
508 | "css": "info-circled", | |||
|
509 | "code": 59425, | |||
|
510 | "src": "fontawesome" | |||
|
511 | }, | |||
|
512 | { | |||
|
513 | "uid": "9dd9e835aebe1060ba7190ad2b2ed951", | |||
|
514 | "css": "search", | |||
|
515 | "code": 59411, | |||
|
516 | "src": "fontawesome" | |||
|
517 | }, | |||
|
518 | { | |||
|
519 | "uid": "b429436ec5a518c78479d44ef18dbd60", | |||
|
520 | "css": "paste", | |||
|
521 | "code": 61674, | |||
|
522 | "src": "fontawesome" | |||
|
523 | }, | |||
|
524 | { | |||
|
525 | "uid": "8772331a9fec983cdb5d72902a6f9e0e", | |||
|
526 | "css": "scissors", | |||
|
527 | "code": 59412, | |||
|
528 | "src": "fontawesome" | |||
|
529 | }, | |||
|
530 | { | |||
|
531 | "uid": "9a76bc135eac17d2c8b8ad4a5774fc87", | |||
|
532 | "css": "download", | |||
|
533 | "code": 59413, | |||
|
534 | "src": "fontawesome" | |||
|
535 | }, | |||
|
536 | { | |||
|
537 | "uid": "eeec3208c90b7b48e804919d0d2d4a41", | |||
|
538 | "css": "upload", | |||
|
539 | "code": 59426, | |||
|
540 | "src": "fontawesome" | |||
|
541 | }, | |||
|
542 | { | |||
|
543 | "uid": "5d2d07f112b8de19f2c0dbfec3e42c05", | |||
|
544 | "css": "spin", | |||
|
545 | "code": 59448, | |||
|
546 | "src": "fontelico" | |||
|
547 | }, | |||
|
548 | { | |||
|
549 | "uid": "9bd60140934a1eb9236fd7a8ab1ff6ba", | |||
|
550 | "css": "spin-alt", | |||
|
551 | "code": 59444, | |||
|
552 | "src": "fontelico" | |||
|
553 | }, | |||
|
554 | { | |||
|
555 | "uid": "513ac180ff85bd275f2b736720cbbf5e", | |||
|
556 | "css": "home", | |||
|
557 | "code": 59427, | |||
|
558 | "src": "entypo" | |||
|
559 | }, | |||
|
560 | { | |||
|
561 | "uid": "d4816c0845aa43767213d45574b3b145", | |||
|
562 | "css": "history", | |||
|
563 | "code": 61914, | |||
|
564 | "src": "fontawesome" | |||
|
565 | }, | |||
|
566 | { | |||
|
567 | "uid": "c43db6645e7515889fc2193294f50767", | |||
|
568 | "css": "plus", | |||
|
569 | "code": 59411, | |||
|
570 | "src": "custom_icons", | |||
|
571 | "selected": false, | |||
|
572 | "svg": { | |||
|
573 | "path": "M873.1 446.2H619.2C603.8 446.2 592.3 434.6 592.3 419.2V165.4C592.3 150 580.8 138.5 565.4 138.5H465.4C450 138.5 438.5 150 438.5 165.4V419.2C438.5 434.6 426.9 446.2 411.5 446.2H157.7C142.3 446.2 130.8 457.7 130.8 473.1V573.1C130.8 588.5 142.3 600 157.7 600H411.5C426.9 600 438.5 611.5 438.5 626.9V880.8C438.5 896.2 450 907.7 465.4 907.7H565.4C580.8 907.7 592.3 896.2 592.3 880.8V626.9C592.3 611.5 603.8 600 619.2 600H873.1C888.5 600 900 588.5 900 573.1V473.1C900 457.7 888.5 446.2 873.1 446.2Z", | |||
|
574 | "width": 1000 | |||
|
575 | }, | |||
|
576 | "search": [ | |||
|
577 | "plus" | |||
|
578 | ] | |||
|
579 | }, | |||
|
580 | { | |||
|
581 | "uid": "7d7f338d90203f20c0d8d5c26091cc69", | |||
|
582 | "css": "minus", | |||
|
583 | "code": 59412, | |||
|
584 | "src": "custom_icons", | |||
|
585 | "selected": false, | |||
|
586 | "svg": { | |||
|
587 | "path": "M980 560H20C10 560 0 550 0 540V380C0 370 10 360 20 360H985C995 360 1005 370 1005 380V545C1000 550 990 560 980 560Z", | |||
|
588 | "width": 1000 | |||
|
589 | }, | |||
|
590 | "search": [ | |||
|
591 | "minus" | |||
|
592 | ] | |||
|
593 | }, | |||
|
594 | { | |||
|
595 | "uid": "4ccc61480001600f2e7e3c7dd0546c6e", | |||
|
596 | "css": "remove", | |||
|
597 | "code": 59413, | |||
|
598 | "src": "custom_icons", | |||
|
599 | "selected": false, | |||
|
600 | "svg": { | |||
|
601 | "path": "M975 140L860 25C845 10 825 10 810 25L525 310C510 325 490 325 475 310L190 25C175 10 155 10 140 25L25 140C10 155 10 175 25 190L310 475C325 490 325 510 310 525L25 810C10 825 10 845 25 860L140 975C155 990 175 990 190 975L475 690C490 675 510 675 525 690L810 975C825 990 845 990 860 975L975 860C990 845 990 825 975 810L690 525C675 510 675 490 690 475L975 190C990 180 990 155 975 140Z", | |||
|
602 | "width": 1000 | |||
|
603 | }, | |||
|
604 | "search": [ | |||
|
605 | "remove" | |||
|
606 | ] | |||
|
607 | }, | |||
|
608 | { | |||
|
609 | "uid": "b1afcccc053ecb95fbcacf06e5c0d554", | |||
|
610 | "css": "history", | |||
|
611 | "code": 59418, | |||
|
612 | "src": "custom_icons", | |||
|
613 | "selected": false, | |||
|
614 | "svg": { | |||
|
615 | "path": "", | |||
|
616 | "width": 1143 | |||
|
617 | }, | |||
|
618 | "search": [ | |||
|
619 | "history" | |||
|
620 | ] | |||
|
621 | } | |||
|
622 | ] | |||
|
623 | } No newline at end of file |
@@ -0,0 +1,78 b'' | |||||
|
1 | ||||
|
2 | How To Build A New Icon Font | |||
|
3 | ============================ | |||
|
4 | ||||
|
5 | Welcome. Contained in this repo is everything you need to build a new custom | |||
|
6 | RhodeCode icon font for RhodeCode Community and Enterprise Editions. While the | |||
|
7 | files are here, this document references what needs to be done in the actual | |||
|
8 | Community Edition repository. | |||
|
9 | ||||
|
10 | Creating New Icons | |||
|
11 | ------------------ | |||
|
12 | ||||
|
13 | Presumably, you're reading this because you'd like to update the icon font with | |||
|
14 | new icons. To create new icons, you'll want to use Illustrator. Start with an | |||
|
15 | empty 1000px x 1000px artboard, or use an existing .svg file if you'd like to | |||
|
16 | use an existing icon as a guide. | |||
|
17 | ||||
|
18 | You'll need to make sure that your outlines are paths. This can be done using | |||
|
19 | the Shape Modes in the Pathfinder tool; see Window > Pathfinder in Illustrator | |||
|
20 | to build a compound image. It may happen that your image is rasterized, in which | |||
|
21 | case it will need to be converted to vector; check the results carefully. | |||
|
22 | ||||
|
23 | .. note:: | |||
|
24 | When adding to the existing icon collection, please maintain our | |||
|
25 | existing icon style. | |||
|
26 | ||||
|
27 | ||||
|
28 | Creating The Font | |||
|
29 | ----------------- | |||
|
30 | ||||
|
31 | *Fontello* | |||
|
32 | ||||
|
33 | We use fontello.com to generate the font files. On the main page, there is a | |||
|
34 | section for clicking and dragging icons to add to a font. If you would like to | |||
|
35 | use the existing font icons, here you will need to drag the .json file from the | |||
|
36 | current fontello folder. Once it has preloaded all of the existing fonts, drag | |||
|
37 | any new .svg icons into this same section to add them. | |||
|
38 | ||||
|
39 | Any icons which appear blank or incorrect will need to be rebuilt in Illustrator. | |||
|
40 | This likely means that the paths have not been generated correctly; check the | |||
|
41 | settings in the Pathfinder tool. | |||
|
42 | ||||
|
43 | After all of the icons are loaded into fontello, resist the temptation to click | |||
|
44 | the big red button; there's another task to do. Each icon has a pencil button; | |||
|
45 | click *every* icon - including the pre-existing ones - and check the settings. | |||
|
46 | Each current icon should have the same hex code as that which is listed in | |||
|
47 | rcicons.less. The "default css name" should be its simplified name; this is what | |||
|
48 | will be prepended with "icon-" for the CSS classes. Also remove any unnecessary | |||
|
49 | information from the keywords. | |||
|
50 | ||||
|
51 | Once you have checked the icons, click the button in fontello which downloads a | |||
|
52 | zip file of the new font. | |||
|
53 | ||||
|
54 | ||||
|
55 | Preparing The LESS Files | |||
|
56 | ------------------------ | |||
|
57 | ||||
|
58 | .. note:: | |||
|
59 | It's a good idea to have `grunt watch` running in the background for this. | |||
|
60 | ||||
|
61 | First, obviously the font files located in the unzipped folder under "font" | |||
|
62 | should replace the existing files in rhodecode/public/fonts/RCIcons/. While | |||
|
63 | doing this, check the permissions of the files that they have not changed; they | |||
|
64 | should be set to `chmod 644` but fontello's files may be different. | |||
|
65 | ||||
|
66 | Next, you'll need to open the rcicons.css file which comes in the fontello .zip | |||
|
67 | and match the @font-face declaration to the one at the top of | |||
|
68 | rhodecode/public/css/rcicons.less, making sure to adjust the paths to | |||
|
69 | /fonts/RCIcons/. | |||
|
70 | ||||
|
71 | In the same file, you will see the CSS for each icon. Take a quick look to make | |||
|
72 | sure that the existing icons haven't changed; if they have, you'll need to | |||
|
73 | adjust the content. Add any new icons to rcicons.less (note that similar ones | |||
|
74 | have been grouped together). | |||
|
75 | ||||
|
76 | If you haven't yet, you'll need to run grunt to compile the LESS files; see the | |||
|
77 | developer documentation for instructions. | |||
|
78 |
1 | NO CONTENT: new file 100644 |
|
NO CONTENT: new file 100644 | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: new file 100644 |
|
NO CONTENT: new file 100644 | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: new file 100644 |
|
NO CONTENT: new file 100644 | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: new file 100644 |
|
NO CONTENT: new file 100644 | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: new file 100644 |
|
NO CONTENT: new file 100644 | ||
The requested commit or file is too big and content was truncated. Show full diff |
@@ -29,7 +29,7 b' 1. Go to :menuselection:`Admin --> Repos' | |||||
29 | beside the |repo| to which you wish to add extra fields. |
|
29 | beside the |repo| to which you wish to add extra fields. | |
30 | 2. On the |repo| settings page, select the :guilabel:`Extra fields` tab. |
|
30 | 2. On the |repo| settings page, select the :guilabel:`Extra fields` tab. | |
31 |
|
31 | |||
32 | .. image:: ../images/extra-repo-fields.png |
|
32 | .. image:: ../../images/extra-repo-fields.png | |
33 |
|
33 | |||
34 | The most important is the `New field key` variable which under the value will |
|
34 | The most important is the `New field key` variable which under the value will | |
35 | be stored. It needs to be unique for each repository. The label and description |
|
35 | be stored. It needs to be unique for each repository. The label and description |
1 | NO CONTENT: file renamed from docs/admin/repo-hooks.rst to docs/admin/repo_admin/repo-hooks.rst |
|
NO CONTENT: file renamed from docs/admin/repo-hooks.rst to docs/admin/repo_admin/repo-hooks.rst |
1 | NO CONTENT: file renamed from docs/admin/repo-issue-tracker.rst to docs/admin/repo_admin/repo-issue-tracker.rst |
|
NO CONTENT: file renamed from docs/admin/repo-issue-tracker.rst to docs/admin/repo_admin/repo-issue-tracker.rst |
1 | NO CONTENT: file renamed from docs/admin/repo-perm-steps.rst to docs/admin/repo_admin/repo-perm-steps.rst |
|
NO CONTENT: file renamed from docs/admin/repo-perm-steps.rst to docs/admin/repo_admin/repo-perm-steps.rst |
1 | NO CONTENT: file renamed from docs/admin/repo-vcs.rst to docs/admin/repo_admin/repo-vcs.rst |
|
NO CONTENT: file renamed from docs/admin/repo-vcs.rst to docs/admin/repo_admin/repo-vcs.rst |
1 | NO CONTENT: file renamed from docs/admin/restore-deleted-repositories.rst to docs/admin/repo_admin/restore-deleted-repositories.rst |
|
NO CONTENT: file renamed from docs/admin/restore-deleted-repositories.rst to docs/admin/repo_admin/restore-deleted-repositories.rst |
@@ -16,19 +16,17 b' The following are the most common system' | |||||
16 |
|
16 | |||
17 | .. toctree:: |
|
17 | .. toctree:: | |
18 |
|
18 | |||
19 | config-files-overview |
|
19 | system_admin/config-files-overview | |
20 | vcs-server |
|
20 | system_admin/vcs-server | |
21 | svn-http |
|
21 | system_admin/svn-http | |
22 | svn-path-permissions |
|
22 | system_admin/svn-path-permissions | |
23 | gunicorn-ssl-support |
|
23 | system_admin/gunicorn-ssl-support | |
24 | apache-config |
|
24 | system_admin/apache-config | |
25 | nginx-config |
|
25 | system_admin/nginx-config | |
26 | backup-restore |
|
26 | system_admin/backup-restore | |
27 | tuning-rhodecode |
|
27 | system_admin/tuning-rhodecode | |
28 | indexing |
|
28 | system_admin/indexing | |
29 | reset-information |
|
29 | system_admin/reset-information | |
30 | enable-debug |
|
30 | system_admin/enable-debug | |
31 | admin-tricks |
|
31 | system_admin/admin-tricks | |
32 | cleanup-cmds |
|
32 | system_admin/cleanup-cmds | |
33 | restore-deleted-repositories |
|
|||
34 |
|
@@ -57,7 +57,7 b' 2. To add a message that will be display' | |||||
57 | 3. Select :guilabel:`Save`, and you will see the message once your page |
|
57 | 3. Select :guilabel:`Save`, and you will see the message once your page | |
58 | refreshes. |
|
58 | refreshes. | |
59 |
|
59 | |||
60 | .. image:: ../images/server-wide-announcement.png |
|
60 | .. image:: ../../images/server-wide-announcement.png | |
61 | :alt: Server Wide Announcement |
|
61 | :alt: Server Wide Announcement | |
62 |
|
62 | |||
63 | .. _md-rst: |
|
63 | .. _md-rst: | |
@@ -207,7 +207,7 b' 2. Restart the |RCE| instance and check ' | |||||
207 | Instance "enterprise-2" successfully stopped. |
|
207 | Instance "enterprise-2" successfully stopped. | |
208 | Instance "enterprise-2" successfully started. |
|
208 | Instance "enterprise-2" successfully started. | |
209 |
|
209 | |||
210 | .. image:: ../images/language.png |
|
210 | .. image:: ../../images/language.png | |
211 |
|
211 | |||
212 | .. _set-repo-pub: |
|
212 | .. _set-repo-pub: | |
213 |
|
213 |
@@ -8,7 +8,7 b' the information in the following section' | |||||
8 |
|
8 | |||
9 | .. toctree:: |
|
9 | .. toctree:: | |
10 |
|
10 | |||
11 | apache-conf-example |
|
11 | apache/apache-conf-example | |
12 | apache-diffie-hellman |
|
12 | apache/apache-diffie-hellman | |
13 | apache-subdirectory |
|
13 | apache/apache-subdirectory | |
14 | apache-wsgi-coding |
|
14 | apache/apache-wsgi-coding |
1 | NO CONTENT: file renamed from docs/admin/apache-conf-example.rst to docs/admin/system_admin/apache/apache-conf-example.rst |
|
NO CONTENT: file renamed from docs/admin/apache-conf-example.rst to docs/admin/system_admin/apache/apache-conf-example.rst |
1 | NO CONTENT: file renamed from docs/admin/apache-diffie-hellman.rst to docs/admin/system_admin/apache/apache-diffie-hellman.rst |
|
NO CONTENT: file renamed from docs/admin/apache-diffie-hellman.rst to docs/admin/system_admin/apache/apache-diffie-hellman.rst |
1 | NO CONTENT: file renamed from docs/admin/apache-subdirectory.rst to docs/admin/system_admin/apache/apache-subdirectory.rst |
|
NO CONTENT: file renamed from docs/admin/apache-subdirectory.rst to docs/admin/system_admin/apache/apache-subdirectory.rst |
1 | NO CONTENT: file renamed from docs/admin/apache-wsgi-coding.rst to docs/admin/system_admin/apache/apache-wsgi-coding.rst |
|
NO CONTENT: file renamed from docs/admin/apache-wsgi-coding.rst to docs/admin/system_admin/apache/apache-wsgi-coding.rst |
1 | NO CONTENT: file renamed from docs/admin/backup-restore.rst to docs/admin/system_admin/backup-restore.rst |
|
NO CONTENT: file renamed from docs/admin/backup-restore.rst to docs/admin/system_admin/backup-restore.rst |
1 | NO CONTENT: file renamed from docs/admin/cleanup-cmds.rst to docs/admin/system_admin/cleanup-cmds.rst |
|
NO CONTENT: file renamed from docs/admin/cleanup-cmds.rst to docs/admin/system_admin/cleanup-cmds.rst |
1 | NO CONTENT: file renamed from docs/admin/config-files-overview.rst to docs/admin/system_admin/config-files-overview.rst |
|
NO CONTENT: file renamed from docs/admin/config-files-overview.rst to docs/admin/system_admin/config-files-overview.rst |
1 | NO CONTENT: file renamed from docs/admin/enable-debug.rst to docs/admin/system_admin/enable-debug.rst |
|
NO CONTENT: file renamed from docs/admin/enable-debug.rst to docs/admin/system_admin/enable-debug.rst |
1 | NO CONTENT: file renamed from docs/admin/gunicorn-ssl-support.rst to docs/admin/system_admin/gunicorn-ssl-support.rst |
|
NO CONTENT: file renamed from docs/admin/gunicorn-ssl-support.rst to docs/admin/system_admin/gunicorn-ssl-support.rst |
1 | NO CONTENT: file renamed from docs/admin/indexing.rst to docs/admin/system_admin/indexing.rst |
|
NO CONTENT: file renamed from docs/admin/indexing.rst to docs/admin/system_admin/indexing.rst |
@@ -8,7 +8,7 b' the information in the following section' | |||||
8 |
|
8 | |||
9 | .. toctree:: |
|
9 | .. toctree:: | |
10 |
|
10 | |||
11 | nginx-config-example |
|
11 | nginx/nginx-config-example | |
12 | nginx-diffie-hellman |
|
12 | nginx/nginx-diffie-hellman | |
13 | nginx-proxy-conf |
|
13 | nginx/nginx-proxy-conf | |
14 | nginx-url-prefix |
|
14 | nginx/nginx-url-prefix |
1 | NO CONTENT: file renamed from docs/admin/nginx-config-example.rst to docs/admin/system_admin/nginx/nginx-config-example.rst |
|
NO CONTENT: file renamed from docs/admin/nginx-config-example.rst to docs/admin/system_admin/nginx/nginx-config-example.rst |
1 | NO CONTENT: file renamed from docs/admin/nginx-diffie-hellman.rst to docs/admin/system_admin/nginx/nginx-diffie-hellman.rst |
|
NO CONTENT: file renamed from docs/admin/nginx-diffie-hellman.rst to docs/admin/system_admin/nginx/nginx-diffie-hellman.rst |
1 | NO CONTENT: file renamed from docs/admin/nginx-proxy-conf.rst to docs/admin/system_admin/nginx/nginx-proxy-conf.rst |
|
NO CONTENT: file renamed from docs/admin/nginx-proxy-conf.rst to docs/admin/system_admin/nginx/nginx-proxy-conf.rst |
1 | NO CONTENT: file renamed from docs/admin/nginx-url-prefix.rst to docs/admin/system_admin/nginx/nginx-url-prefix.rst |
|
NO CONTENT: file renamed from docs/admin/nginx-url-prefix.rst to docs/admin/system_admin/nginx/nginx-url-prefix.rst |
1 | NO CONTENT: file renamed from docs/admin/reset-information.rst to docs/admin/system_admin/reset-information.rst |
|
NO CONTENT: file renamed from docs/admin/reset-information.rst to docs/admin/system_admin/reset-information.rst |
1 | NO CONTENT: file renamed from docs/admin/svn-http.rst to docs/admin/system_admin/svn-http.rst |
|
NO CONTENT: file renamed from docs/admin/svn-http.rst to docs/admin/system_admin/svn-http.rst |
1 | NO CONTENT: file renamed from docs/admin/svn-path-permissions.rst to docs/admin/system_admin/svn-path-permissions.rst |
|
NO CONTENT: file renamed from docs/admin/svn-path-permissions.rst to docs/admin/system_admin/svn-path-permissions.rst |
@@ -8,14 +8,14 b' may find some of the following methods u' | |||||
8 |
|
8 | |||
9 | .. toctree:: |
|
9 | .. toctree:: | |
10 |
|
10 | |||
11 | tuning-gunicorn |
|
11 | tuning/tuning-gunicorn | |
12 | tuning-vcs-memory-cache |
|
12 | tuning/tuning-vcs-memory-cache | |
13 | tuning-user-sessions-performance |
|
13 | tuning/tuning-user-sessions-performance | |
14 | tuning-increase-db-performance |
|
14 | tuning/tuning-increase-db-performance | |
15 | tuning-scale-horizontally-cluster |
|
15 | tuning/tuning-scale-horizontally-cluster | |
16 | tuning-mount-cache-memory |
|
16 | tuning/tuning-mount-cache-memory | |
17 | tuning-change-encoding |
|
17 | tuning/tuning-change-encoding | |
18 | tuning-change-large-file-dir |
|
18 | tuning/tuning-change-large-file-dir | |
19 | tuning-change-lfs-dir |
|
19 | tuning/tuning-change-lfs-dir | |
20 | tuning-hg-auth-loop |
|
20 | tuning/tuning-hg-auth-loop | |
21 |
|
21 |
1 | NO CONTENT: file renamed from docs/admin/tuning-change-encoding.rst to docs/admin/system_admin/tuning/tuning-change-encoding.rst |
|
NO CONTENT: file renamed from docs/admin/tuning-change-encoding.rst to docs/admin/system_admin/tuning/tuning-change-encoding.rst |
1 | NO CONTENT: file renamed from docs/admin/tuning-change-large-file-dir.rst to docs/admin/system_admin/tuning/tuning-change-large-file-dir.rst |
|
NO CONTENT: file renamed from docs/admin/tuning-change-large-file-dir.rst to docs/admin/system_admin/tuning/tuning-change-large-file-dir.rst |
1 | NO CONTENT: file renamed from docs/admin/tuning-change-lfs-dir.rst to docs/admin/system_admin/tuning/tuning-change-lfs-dir.rst |
|
NO CONTENT: file renamed from docs/admin/tuning-change-lfs-dir.rst to docs/admin/system_admin/tuning/tuning-change-lfs-dir.rst |
@@ -42,7 +42,7 b' 2. In the ``[server:main]`` section, cha' | |||||
42 | ## restarted, could prevent memory leaks |
|
42 | ## restarted, could prevent memory leaks | |
43 | max_requests = 1000 |
|
43 | max_requests = 1000 | |
44 | max_requests_jitter = 30 |
|
44 | max_requests_jitter = 30 | |
45 | ## amount of time a worker can spend with handling a request before it |
|
45 | ## amount of time a worker can spend with handling a request tuning-change-lfs-dir.before it | |
46 | ## gets killed and restarted. Set to 6hrs |
|
46 | ## gets killed and restarted. Set to 6hrs | |
47 | timeout = 21600 |
|
47 | timeout = 21600 | |
48 |
|
48 |
1 | NO CONTENT: file renamed from docs/admin/tuning-hg-auth-loop.rst to docs/admin/system_admin/tuning/tuning-hg-auth-loop.rst |
|
NO CONTENT: file renamed from docs/admin/tuning-hg-auth-loop.rst to docs/admin/system_admin/tuning/tuning-hg-auth-loop.rst |
1 | NO CONTENT: file renamed from docs/admin/tuning-increase-db-performance.rst to docs/admin/system_admin/tuning/tuning-increase-db-performance.rst |
|
NO CONTENT: file renamed from docs/admin/tuning-increase-db-performance.rst to docs/admin/system_admin/tuning/tuning-increase-db-performance.rst |
1 | NO CONTENT: file renamed from docs/admin/tuning-mount-cache-memory.rst to docs/admin/system_admin/tuning/tuning-mount-cache-memory.rst |
|
NO CONTENT: file renamed from docs/admin/tuning-mount-cache-memory.rst to docs/admin/system_admin/tuning/tuning-mount-cache-memory.rst |
1 | NO CONTENT: file renamed from docs/admin/tuning-scale-horizontally-cluster.rst to docs/admin/system_admin/tuning/tuning-scale-horizontally-cluster.rst |
|
NO CONTENT: file renamed from docs/admin/tuning-scale-horizontally-cluster.rst to docs/admin/system_admin/tuning/tuning-scale-horizontally-cluster.rst |
1 | NO CONTENT: file renamed from docs/admin/tuning-user-sessions-performance.rst to docs/admin/system_admin/tuning/tuning-user-sessions-performance.rst |
|
NO CONTENT: file renamed from docs/admin/tuning-user-sessions-performance.rst to docs/admin/system_admin/tuning/tuning-user-sessions-performance.rst |
1 | NO CONTENT: file renamed from docs/admin/tuning-vcs-memory-cache.rst to docs/admin/system_admin/tuning/tuning-vcs-memory-cache.rst |
|
NO CONTENT: file renamed from docs/admin/tuning-vcs-memory-cache.rst to docs/admin/system_admin/tuning/tuning-vcs-memory-cache.rst |
1 | NO CONTENT: file renamed from docs/admin/vcs-server.rst to docs/admin/system_admin/vcs-server.rst |
|
NO CONTENT: file renamed from docs/admin/vcs-server.rst to docs/admin/system_admin/vcs-server.rst |
@@ -204,6 +204,7 b' are not required in args.' | |||||
204 | methods/pull-request-methods |
|
204 | methods/pull-request-methods | |
205 | methods/repo-methods |
|
205 | methods/repo-methods | |
206 | methods/repo-group-methods |
|
206 | methods/repo-group-methods | |
|
207 | methods/search-methods | |||
207 | methods/server-methods |
|
208 | methods/server-methods | |
208 | methods/user-methods |
|
209 | methods/user-methods | |
209 | methods/user-group-methods |
|
210 | methods/user-group-methods |
@@ -462,6 +462,7 b' get_repo_file' | |||||
462 | :param cache: Use internal caches for fetching files. If disabled fetching |
|
462 | :param cache: Use internal caches for fetching files. If disabled fetching | |
463 | files is slower but more memory efficient |
|
463 | files is slower but more memory efficient | |
464 | :type cache: Optional(bool) |
|
464 | :type cache: Optional(bool) | |
|
465 | ||||
465 | Example output: |
|
466 | Example output: | |
466 |
|
467 | |||
467 | .. code-block:: bash |
|
468 | .. code-block:: bash | |
@@ -499,53 +500,51 b' get_repo_nodes' | |||||
499 | .. py:function:: get_repo_nodes(apiuser, repoid, revision, root_path, ret_type=<Optional:'all'>, details=<Optional:'basic'>, max_file_bytes=<Optional:None>) |
|
500 | .. py:function:: get_repo_nodes(apiuser, repoid, revision, root_path, ret_type=<Optional:'all'>, details=<Optional:'basic'>, max_file_bytes=<Optional:None>) | |
500 |
|
501 | |||
501 | Returns a list of nodes and children in a flat list for a given |
|
502 | Returns a list of nodes and children in a flat list for a given | |
502 |
|
|
503 | path at given revision. | |
503 |
|
504 | |||
504 |
|
|
505 | It's possible to specify ret_type to show only `files` or `dirs`. | |
505 |
|
506 | |||
506 |
|
|
507 | This command can only be run using an |authtoken| with admin rights, | |
507 |
|
|
508 | or users with at least read rights to |repos|. | |
508 |
|
509 | |||
509 |
|
|
510 | :param apiuser: This is filled automatically from the |authtoken|. | |
510 |
|
|
511 | :type apiuser: AuthUser | |
511 |
|
|
512 | :param repoid: The repository name or repository ID. | |
512 |
|
|
513 | :type repoid: str or int | |
513 |
|
|
514 | :param revision: The revision for which listing should be done. | |
514 |
|
|
515 | :type revision: str | |
515 |
|
|
516 | :param root_path: The path from which to start displaying. | |
516 |
|
|
517 | :type root_path: str | |
517 |
|
|
518 | :param ret_type: Set the return type. Valid options are | |
518 |
|
|
519 | ``all`` (default), ``files`` and ``dirs``. | |
519 |
|
|
520 | :type ret_type: Optional(str) | |
520 |
|
|
521 | :param details: Returns extended information about nodes, such as | |
521 |
|
|
522 | md5, binary, and or content. | |
522 |
|
|
523 | The valid options are ``basic`` and ``full``. | |
523 |
|
|
524 | :type details: Optional(str) | |
524 |
|
|
525 | :param max_file_bytes: Only return file content under this file size bytes | |
525 |
|
|
526 | :type details: Optional(int) | |
526 |
|
||||
527 | Example output: |
|
|||
528 |
|
527 | |||
529 | .. code-block:: bash |
|
528 | Example output: | |
|
529 | ||||
|
530 | .. code-block:: bash | |||
530 |
|
531 | |||
531 |
|
|
532 | id : <id_given_in_input> | |
532 |
|
|
533 | result: [ | |
533 |
|
|
534 | { | |
534 |
|
|
535 | "binary": false, | |
535 |
|
|
536 | "content": "File line", | |
536 | Line2 |
|
537 | "extension": "md", | |
537 | ", |
|
538 | "lines": 2, | |
538 | "extension": "md", |
|
539 | "md5": "059fa5d29b19c0657e384749480f6422", | |
539 |
|
|
540 | "mimetype": "text/x-minidsrc", | |
540 | "md5": "059fa5d29b19c0657e384749480f6422", |
|
541 | "name": "file.md", | |
541 |
|
|
542 | "size": 580, | |
542 |
|
|
543 | "type": "file" | |
543 |
|
|
544 | }, | |
544 | "type": "file" |
|
545 | ... | |
545 |
|
|
546 | ] | |
546 | ... |
|
547 | error: null | |
547 | ] |
|
|||
548 | error: null |
|
|||
549 |
|
548 | |||
550 |
|
549 | |||
551 | get_repo_refs |
|
550 | get_repo_refs |
@@ -46,7 +46,7 b' and commit files and |repos| while manag' | |||||
46 | nix/default-env |
|
46 | nix/default-env | |
47 | admin/system-admin |
|
47 | admin/system-admin | |
48 | admin/user-admin |
|
48 | admin/user-admin | |
49 |
admin/ |
|
49 | admin/repo-admin | |
50 | admin/security-tips |
|
50 | admin/security-tips | |
51 | auth/auth |
|
51 | auth/auth | |
52 | issue-trackers/issue-trackers |
|
52 | issue-trackers/issue-trackers |
@@ -35,6 +35,7 b'' | |||||
35 | "<%= dirs.js.node_modules %>/moment/min/moment.min.js", |
|
35 | "<%= dirs.js.node_modules %>/moment/min/moment.min.js", | |
36 | "<%= dirs.js.node_modules %>/clipboard/dist/clipboard.min.js", |
|
36 | "<%= dirs.js.node_modules %>/clipboard/dist/clipboard.min.js", | |
37 | "<%= dirs.js.node_modules %>/favico.js/favico-0.3.10.min.js", |
|
37 | "<%= dirs.js.node_modules %>/favico.js/favico-0.3.10.min.js", | |
|
38 | "<%= dirs.js.node_modules %>/dropzone/dist/dropzone.js", | |||
38 | "<%= dirs.js.node_modules %>/sticky-sidebar/dist/sticky-sidebar.min.js", |
|
39 | "<%= dirs.js.node_modules %>/sticky-sidebar/dist/sticky-sidebar.min.js", | |
39 | "<%= dirs.js.node_modules %>/sticky-sidebar/dist/jquery.sticky-sidebar.min.js", |
|
40 | "<%= dirs.js.node_modules %>/sticky-sidebar/dist/jquery.sticky-sidebar.min.js", | |
40 | "<%= dirs.js.node_modules %>/waypoints/lib/noframework.waypoints.min.js", |
|
41 | "<%= dirs.js.node_modules %>/waypoints/lib/noframework.waypoints.min.js", |
@@ -13,6 +13,7 b'' | |||||
13 | "clipboard": "^2.0.1", |
|
13 | "clipboard": "^2.0.1", | |
14 | "exports-loader": "^0.6.4", |
|
14 | "exports-loader": "^0.6.4", | |
15 | "favico.js": "^0.3.10", |
|
15 | "favico.js": "^0.3.10", | |
|
16 | "dropzone": "^5.5.0", | |||
16 | "grunt": "^0.4.5", |
|
17 | "grunt": "^0.4.5", | |
17 | "grunt-cli": "^1.3.1", |
|
18 | "grunt-cli": "^1.3.1", | |
18 | "grunt-contrib-concat": "^0.5.1", |
|
19 | "grunt-contrib-concat": "^0.5.1", |
This diff has been collapsed as it changes many lines, (617 lines changed) Show them Hide them | |||||
@@ -211,13 +211,13 b' let' | |||||
211 | sha512 = "yiUk09opTEnE1lK+tb501ENb+yQBi4p++Ep0eGJAHesVYKVMPNgPphVKkIizkDaU+n0SE+zXfTsRbYyOMDYXSg=="; |
|
211 | sha512 = "yiUk09opTEnE1lK+tb501ENb+yQBi4p++Ep0eGJAHesVYKVMPNgPphVKkIizkDaU+n0SE+zXfTsRbYyOMDYXSg=="; | |
212 | }; |
|
212 | }; | |
213 | }; |
|
213 | }; | |
214 |
"@polymer/polymer-3. |
|
214 | "@polymer/polymer-3.2.0" = { | |
215 | name = "_at_polymer_slash_polymer"; |
|
215 | name = "_at_polymer_slash_polymer"; | |
216 | packageName = "@polymer/polymer"; |
|
216 | packageName = "@polymer/polymer"; | |
217 |
version = "3. |
|
217 | version = "3.2.0"; | |
218 | src = fetchurl { |
|
218 | src = fetchurl { | |
219 |
url = "https://registry.npmjs.org/@polymer/polymer/-/polymer-3. |
|
219 | url = "https://registry.npmjs.org/@polymer/polymer/-/polymer-3.2.0.tgz"; | |
220 | sha512 = "hwN8IMERsFATz/9dSMxYHL+84J9uBkPuuarxJWlTsppZ4CAYTZKnepBfNrKoyNsafBmA3yXBiiKPPf+fJtza7A=="; |
|
220 | sha512 = "L6uV1oM6T6xbwbVx6t3biG5T2VSSB03LxnIrUd9M2pr6RkHVPFHJ37pC5MUwBAEhkGFJif7eks7fdMMSGZTeEQ=="; | |
221 | }; |
|
221 | }; | |
222 | }; |
|
222 | }; | |
223 | "@types/clone-0.1.30" = { |
|
223 | "@types/clone-0.1.30" = { | |
@@ -229,13 +229,13 b' let' | |||||
229 | sha1 = "e7365648c1b42136a59c7d5040637b3b5c83b614"; |
|
229 | sha1 = "e7365648c1b42136a59c7d5040637b3b5c83b614"; | |
230 | }; |
|
230 | }; | |
231 | }; |
|
231 | }; | |
232 |
"@types/node-6.14. |
|
232 | "@types/node-6.14.6" = { | |
233 | name = "_at_types_slash_node"; |
|
233 | name = "_at_types_slash_node"; | |
234 | packageName = "@types/node"; |
|
234 | packageName = "@types/node"; | |
235 |
version = "6.14. |
|
235 | version = "6.14.6"; | |
236 | src = fetchurl { |
|
236 | src = fetchurl { | |
237 |
url = "https://registry.npmjs.org/@types/node/-/node-6.14. |
|
237 | url = "https://registry.npmjs.org/@types/node/-/node-6.14.6.tgz"; | |
238 | sha512 = "V2VrQBCKo4U0rni6tW4AASRDqIO5ZTLDN/Xzrm4mNBr9SGQYZ+7zZJn+hMs89Q8ZCIHzp4aWQPyCpK+rux1YGA=="; |
|
238 | sha512 = "rFs9zCFtSHuseiNXxYxFlun8ibu+jtZPgRM+2ILCmeLiGeGLiIGxuOzD+cNyHegI1GD+da3R/cIbs9+xCLp13w=="; | |
239 | }; |
|
239 | }; | |
240 | }; |
|
240 | }; | |
241 | "@types/parse5-2.2.34" = { |
|
241 | "@types/parse5-2.2.34" = { | |
@@ -409,22 +409,22 b' let' | |||||
409 | sha512 = "mJ3QKWtCchL1vhU/kZlJnLPuQZnlDOdZsyP0bbLWPGdYsQDnSBvyTLhzwBA3QAMlzEL9V4JHygEmK6/OTEyytA=="; |
|
409 | sha512 = "mJ3QKWtCchL1vhU/kZlJnLPuQZnlDOdZsyP0bbLWPGdYsQDnSBvyTLhzwBA3QAMlzEL9V4JHygEmK6/OTEyytA=="; | |
410 | }; |
|
410 | }; | |
411 | }; |
|
411 | }; | |
412 |
"@webcomponents/shadycss-1.9. |
|
412 | "@webcomponents/shadycss-1.9.1" = { | |
413 | name = "_at_webcomponents_slash_shadycss"; |
|
413 | name = "_at_webcomponents_slash_shadycss"; | |
414 | packageName = "@webcomponents/shadycss"; |
|
414 | packageName = "@webcomponents/shadycss"; | |
415 |
version = "1.9. |
|
415 | version = "1.9.1"; | |
416 | src = fetchurl { |
|
416 | src = fetchurl { | |
417 |
url = "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.9. |
|
417 | url = "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.9.1.tgz"; | |
418 | sha512 = "g8Xa+6RSEME4g/wLJW4YII0eq15rvXp76RxPAuv7hx+Bdoi7GzZJ/EoZOUfyIbqAsQbII1TcWD4/+Xhs5NcM1w=="; |
|
418 | sha512 = "IaZOnWOKXHghqk/WfPNDRIgDBi3RsVPY2IFAw6tYiL9UBGvQRy5R6uC+Fk7qTZsReTJ0xh5MTT8yAcb3MUR4mQ=="; | |
419 | }; |
|
419 | }; | |
420 | }; |
|
420 | }; | |
421 |
"@webcomponents/webcomponentsjs-2.2. |
|
421 | "@webcomponents/webcomponentsjs-2.2.10" = { | |
422 | name = "_at_webcomponents_slash_webcomponentsjs"; |
|
422 | name = "_at_webcomponents_slash_webcomponentsjs"; | |
423 | packageName = "@webcomponents/webcomponentsjs"; |
|
423 | packageName = "@webcomponents/webcomponentsjs"; | |
424 |
version = "2.2. |
|
424 | version = "2.2.10"; | |
425 | src = fetchurl { |
|
425 | src = fetchurl { | |
426 |
url = "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.2. |
|
426 | url = "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.2.10.tgz"; | |
427 | sha512 = "kPPjzV+5kpoWpTniyvBSPcXS33f3j/C6HvNOJ3YecF3pvz3XwVeU4ammbxtVy/osF3z7hr1DYNptIf4oPEvXZA=="; |
|
427 | sha512 = "5dzhUhP+h0qMiK0IWb7VNb0OGBoXO3AuI6Qi8t9PoKT50s5L1jv0xnwnLq+cFgPuTB8FLTNP8xIDmyoOsKBy9Q=="; | |
428 | }; |
|
428 | }; | |
429 | }; |
|
429 | }; | |
430 | "@xtuc/ieee754-1.2.0" = { |
|
430 | "@xtuc/ieee754-1.2.0" = { | |
@@ -499,13 +499,13 b' let' | |||||
499 | sha1 = "82ffb02b29e662ae53bdc20af15947706739c536"; |
|
499 | sha1 = "82ffb02b29e662ae53bdc20af15947706739c536"; | |
500 | }; |
|
500 | }; | |
501 | }; |
|
501 | }; | |
502 |
"ajv-6. |
|
502 | "ajv-6.10.0" = { | |
503 | name = "ajv"; |
|
503 | name = "ajv"; | |
504 | packageName = "ajv"; |
|
504 | packageName = "ajv"; | |
505 |
version = "6. |
|
505 | version = "6.10.0"; | |
506 | src = fetchurl { |
|
506 | src = fetchurl { | |
507 |
url = "https://registry.npmjs.org/ajv/-/ajv-6. |
|
507 | url = "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz"; | |
508 | sha512 = "4UFy0/LgDo7Oa/+wOAlj44tp9K78u38E5/359eSrqEp1Z5PdVfimCcs7SluXMP755RUQu6d2b4AvF0R1C9RZjg=="; |
|
508 | sha512 = "nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg=="; | |
509 | }; |
|
509 | }; | |
510 | }; |
|
510 | }; | |
511 | "ajv-keywords-3.4.0" = { |
|
511 | "ajv-keywords-3.4.0" = { | |
@@ -743,13 +743,13 b' let' | |||||
743 | sha512 = "p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw=="; |
|
743 | sha512 = "p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw=="; | |
744 | }; |
|
744 | }; | |
745 | }; |
|
745 | }; | |
746 |
"assert-1. |
|
746 | "assert-1.5.0" = { | |
747 | name = "assert"; |
|
747 | name = "assert"; | |
748 | packageName = "assert"; |
|
748 | packageName = "assert"; | |
749 |
version = "1. |
|
749 | version = "1.5.0"; | |
750 | src = fetchurl { |
|
750 | src = fetchurl { | |
751 |
url = "https://registry.npmjs.org/assert/-/assert-1. |
|
751 | url = "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz"; | |
752 | sha1 = "99912d591836b5a6f5b345c0f07eefc08fc65d91"; |
|
752 | sha512 = "EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA=="; | |
753 | }; |
|
753 | }; | |
754 | }; |
|
754 | }; | |
755 | "assert-plus-0.2.0" = { |
|
755 | "assert-plus-0.2.0" = { | |
@@ -815,13 +815,13 b' let' | |||||
815 | sha512 = "H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg=="; |
|
815 | sha512 = "H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg=="; | |
816 | }; |
|
816 | }; | |
817 | }; |
|
817 | }; | |
818 |
"async-each-1.0. |
|
818 | "async-each-1.0.3" = { | |
819 | name = "async-each"; |
|
819 | name = "async-each"; | |
820 | packageName = "async-each"; |
|
820 | packageName = "async-each"; | |
821 |
version = "1.0. |
|
821 | version = "1.0.3"; | |
822 | src = fetchurl { |
|
822 | src = fetchurl { | |
823 |
url = "https://registry.npmjs.org/async-each/-/async-each-1.0. |
|
823 | url = "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz"; | |
824 | sha1 = "19d386a1d9edc6e7c1c85d388aedbcc56d33602d"; |
|
824 | sha512 = "z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ=="; | |
825 | }; |
|
825 | }; | |
826 | }; |
|
826 | }; | |
827 | "asynckit-0.4.0" = { |
|
827 | "asynckit-0.4.0" = { | |
@@ -1436,22 +1436,22 b' let' | |||||
1436 | sha512 = "vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="; |
|
1436 | sha512 = "vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="; | |
1437 | }; |
|
1437 | }; | |
1438 | }; |
|
1438 | }; | |
1439 |
"binary-extensions-1.13. |
|
1439 | "binary-extensions-1.13.1" = { | |
1440 | name = "binary-extensions"; |
|
1440 | name = "binary-extensions"; | |
1441 | packageName = "binary-extensions"; |
|
1441 | packageName = "binary-extensions"; | |
1442 |
version = "1.13. |
|
1442 | version = "1.13.1"; | |
1443 | src = fetchurl { |
|
1443 | src = fetchurl { | |
1444 |
url = "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13. |
|
1444 | url = "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz"; | |
1445 | sha512 = "EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw=="; |
|
1445 | sha512 = "Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw=="; | |
1446 | }; |
|
1446 | }; | |
1447 | }; |
|
1447 | }; | |
1448 |
"bluebird-3.5. |
|
1448 | "bluebird-3.5.4" = { | |
1449 | name = "bluebird"; |
|
1449 | name = "bluebird"; | |
1450 | packageName = "bluebird"; |
|
1450 | packageName = "bluebird"; | |
1451 |
version = "3.5. |
|
1451 | version = "3.5.4"; | |
1452 | src = fetchurl { |
|
1452 | src = fetchurl { | |
1453 |
url = "https://registry.npmjs.org/bluebird/-/bluebird-3.5. |
|
1453 | url = "https://registry.npmjs.org/bluebird/-/bluebird-3.5.4.tgz"; | |
1454 | sha512 = "/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw=="; |
|
1454 | sha512 = "FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw=="; | |
1455 | }; |
|
1455 | }; | |
1456 | }; |
|
1456 | }; | |
1457 | "bn.js-4.11.8" = { |
|
1457 | "bn.js-4.11.8" = { | |
@@ -1652,13 +1652,13 b' let' | |||||
1652 | sha1 = "9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"; |
|
1652 | sha1 = "9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"; | |
1653 | }; |
|
1653 | }; | |
1654 | }; |
|
1654 | }; | |
1655 |
"camelcase-5. |
|
1655 | "camelcase-5.3.1" = { | |
1656 | name = "camelcase"; |
|
1656 | name = "camelcase"; | |
1657 | packageName = "camelcase"; |
|
1657 | packageName = "camelcase"; | |
1658 |
version = "5. |
|
1658 | version = "5.3.1"; | |
1659 | src = fetchurl { |
|
1659 | src = fetchurl { | |
1660 |
url = "https://registry.npmjs.org/camelcase/-/camelcase-5. |
|
1660 | url = "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz"; | |
1661 | sha512 = "faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA=="; |
|
1661 | sha512 = "L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="; | |
1662 | }; |
|
1662 | }; | |
1663 | }; |
|
1663 | }; | |
1664 | "caniuse-api-1.6.1" = { |
|
1664 | "caniuse-api-1.6.1" = { | |
@@ -1670,22 +1670,22 b' let' | |||||
1670 | sha1 = "b534e7c734c4f81ec5fbe8aca2ad24354b962c6c"; |
|
1670 | sha1 = "b534e7c734c4f81ec5fbe8aca2ad24354b962c6c"; | |
1671 | }; |
|
1671 | }; | |
1672 | }; |
|
1672 | }; | |
1673 |
"caniuse-db-1.0.300009 |
|
1673 | "caniuse-db-1.0.30000967" = { | |
1674 | name = "caniuse-db"; |
|
1674 | name = "caniuse-db"; | |
1675 | packageName = "caniuse-db"; |
|
1675 | packageName = "caniuse-db"; | |
1676 |
version = "1.0.300009 |
|
1676 | version = "1.0.30000967"; | |
1677 | src = fetchurl { |
|
1677 | src = fetchurl { | |
1678 |
url = "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.300009 |
|
1678 | url = "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000967.tgz"; | |
1679 | sha512 = "nB5tLf3hOs+biXl1lhKjHRgNC0J1I7H52h/t1FP7qxARKKwpB0z+P/JewJLYAlxCBP/q7rxJzQzHHrQMl0viKg=="; |
|
1679 | sha512 = "70gk6cLSD5rItxnZ7WUxyCpM9LAjEb1tVzlENQfXQXZS/IiGnfAC6u32G5cZFlDBKjNPBIta/QSx5CZLZepxRA=="; | |
1680 | }; |
|
1680 | }; | |
1681 | }; |
|
1681 | }; | |
1682 |
"caniuse-lite-1.0.300009 |
|
1682 | "caniuse-lite-1.0.30000967" = { | |
1683 | name = "caniuse-lite"; |
|
1683 | name = "caniuse-lite"; | |
1684 | packageName = "caniuse-lite"; |
|
1684 | packageName = "caniuse-lite"; | |
1685 |
version = "1.0.300009 |
|
1685 | version = "1.0.30000967"; | |
1686 | src = fetchurl { |
|
1686 | src = fetchurl { | |
1687 |
url = "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.300009 |
|
1687 | url = "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000967.tgz"; | |
1688 | sha512 = "oXB23ImDJOgQpGjRv1tCtzAvJr4/OvrHi5SO2vUgB0g0xpdZZoA/BxfImiWfdwoYdUTtQrPsXsvYU/dmCSM8gg=="; |
|
1688 | sha512 = "rUBIbap+VJfxTzrM4akJ00lkvVb5/n5v3EGXfWzSH5zT8aJmGzjA8HWhJ4U6kCpzxozUSnB+yvAYDRPY6mRpgQ=="; | |
1689 | }; |
|
1689 | }; | |
1690 | }; |
|
1690 | }; | |
1691 | "caseless-0.12.0" = { |
|
1691 | "caseless-0.12.0" = { | |
@@ -1733,13 +1733,13 b' let' | |||||
1733 | sha512 = "Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="; |
|
1733 | sha512 = "Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="; | |
1734 | }; |
|
1734 | }; | |
1735 | }; |
|
1735 | }; | |
1736 |
"chokidar-2.1. |
|
1736 | "chokidar-2.1.5" = { | |
1737 | name = "chokidar"; |
|
1737 | name = "chokidar"; | |
1738 | packageName = "chokidar"; |
|
1738 | packageName = "chokidar"; | |
1739 |
version = "2.1. |
|
1739 | version = "2.1.5"; | |
1740 | src = fetchurl { |
|
1740 | src = fetchurl { | |
1741 |
url = "https://registry.npmjs.org/chokidar/-/chokidar-2.1. |
|
1741 | url = "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz"; | |
1742 | sha512 = "IwXUx0FXc5ibYmPC2XeEj5mpXoV66sR+t3jqu2NS2GYwCktt3KF1/Qqjws/NkegajBA4RbZ5+DDwlOiJsxDHEg=="; |
|
1742 | sha512 = "i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A=="; | |
1743 | }; |
|
1743 | }; | |
1744 | }; |
|
1744 | }; | |
1745 | "chownr-1.1.1" = { |
|
1745 | "chownr-1.1.1" = { | |
@@ -1967,13 +1967,13 b' let' | |||||
1967 | sha512 = "mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg=="; |
|
1967 | sha512 = "mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg=="; | |
1968 | }; |
|
1968 | }; | |
1969 | }; |
|
1969 | }; | |
1970 |
"combined-stream-1.0. |
|
1970 | "combined-stream-1.0.8" = { | |
1971 | name = "combined-stream"; |
|
1971 | name = "combined-stream"; | |
1972 | packageName = "combined-stream"; |
|
1972 | packageName = "combined-stream"; | |
1973 |
version = "1.0. |
|
1973 | version = "1.0.8"; | |
1974 | src = fetchurl { |
|
1974 | src = fetchurl { | |
1975 |
url = "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0. |
|
1975 | url = "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz"; | |
1976 | sha512 = "brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w=="; |
|
1976 | sha512 = "FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="; | |
1977 | }; |
|
1977 | }; | |
1978 | }; |
|
1978 | }; | |
1979 | "commander-2.14.1" = { |
|
1979 | "commander-2.14.1" = { | |
@@ -1994,6 +1994,15 b' let' | |||||
1994 | sha512 = "wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg=="; |
|
1994 | sha512 = "wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg=="; | |
1995 | }; |
|
1995 | }; | |
1996 | }; |
|
1996 | }; | |
|
1997 | "commander-2.19.0" = { | |||
|
1998 | name = "commander"; | |||
|
1999 | packageName = "commander"; | |||
|
2000 | version = "2.19.0"; | |||
|
2001 | src = fetchurl { | |||
|
2002 | url = "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz"; | |||
|
2003 | sha512 = "6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg=="; | |||
|
2004 | }; | |||
|
2005 | }; | |||
1997 | "commondir-1.0.1" = { |
|
2006 | "commondir-1.0.1" = { | |
1998 | name = "commondir"; |
|
2007 | name = "commondir"; | |
1999 | packageName = "commondir"; |
|
2008 | packageName = "commondir"; | |
@@ -2003,13 +2012,13 b' let' | |||||
2003 | sha1 = "ddd800da0c66127393cca5950ea968a3aaf1253b"; |
|
2012 | sha1 = "ddd800da0c66127393cca5950ea968a3aaf1253b"; | |
2004 | }; |
|
2013 | }; | |
2005 | }; |
|
2014 | }; | |
2006 |
"component-emitter-1. |
|
2015 | "component-emitter-1.3.0" = { | |
2007 | name = "component-emitter"; |
|
2016 | name = "component-emitter"; | |
2008 | packageName = "component-emitter"; |
|
2017 | packageName = "component-emitter"; | |
2009 |
version = "1. |
|
2018 | version = "1.3.0"; | |
2010 | src = fetchurl { |
|
2019 | src = fetchurl { | |
2011 |
url = "https://registry.npmjs.org/component-emitter/-/component-emitter-1. |
|
2020 | url = "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz"; | |
2012 | sha1 = "137918d6d78283f7df7a6b7c5a63e140e69425e6"; |
|
2021 | sha512 = "Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="; | |
2013 | }; |
|
2022 | }; | |
2014 | }; |
|
2023 | }; | |
2015 | "concat-map-0.0.1" = { |
|
2024 | "concat-map-0.0.1" = { | |
@@ -2480,6 +2489,15 b' let' | |||||
2480 | sha1 = "dcd8488a26f563d61079e48c9f7b7e32373682cf"; |
|
2489 | sha1 = "dcd8488a26f563d61079e48c9f7b7e32373682cf"; | |
2481 | }; |
|
2490 | }; | |
2482 | }; |
|
2491 | }; | |
|
2492 | "dropzone-5.5.1" = { | |||
|
2493 | name = "dropzone"; | |||
|
2494 | packageName = "dropzone"; | |||
|
2495 | version = "5.5.1"; | |||
|
2496 | src = fetchurl { | |||
|
2497 | url = "https://registry.npmjs.org/dropzone/-/dropzone-5.5.1.tgz"; | |||
|
2498 | sha512 = "3VduRWLxx9hbVr42QieQN25mx/I61/mRdUSuxAmDGdDqZIN8qtP7tcKMa3KfpJjuGjOJGYYUzzeq6eGDnkzesA=="; | |||
|
2499 | }; | |||
|
2500 | }; | |||
2483 | "duplexify-3.7.1" = { |
|
2501 | "duplexify-3.7.1" = { | |
2484 | name = "duplexify"; |
|
2502 | name = "duplexify"; | |
2485 | packageName = "duplexify"; |
|
2503 | packageName = "duplexify"; | |
@@ -2498,13 +2516,13 b' let' | |||||
2498 | sha1 = "3a83a904e54353287874c564b7549386849a98c9"; |
|
2516 | sha1 = "3a83a904e54353287874c564b7549386849a98c9"; | |
2499 | }; |
|
2517 | }; | |
2500 | }; |
|
2518 | }; | |
2501 |
"electron-to-chromium-1.3.1 |
|
2519 | "electron-to-chromium-1.3.133" = { | |
2502 | name = "electron-to-chromium"; |
|
2520 | name = "electron-to-chromium"; | |
2503 | packageName = "electron-to-chromium"; |
|
2521 | packageName = "electron-to-chromium"; | |
2504 |
version = "1.3.1 |
|
2522 | version = "1.3.133"; | |
2505 | src = fetchurl { |
|
2523 | src = fetchurl { | |
2506 |
url = "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.1 |
|
2524 | url = "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.133.tgz"; | |
2507 | sha512 = "De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g=="; |
|
2525 | sha512 = "lyoC8aoqbbDqsprb6aPdt9n3DpOZZzdz/T4IZKsR0/dkZIxnJVUjjcpOSwA66jPRIOyDAamCTAUqweU05kKNSg=="; | |
2508 | }; |
|
2526 | }; | |
2509 | }; |
|
2527 | }; | |
2510 | "elliptic-6.4.1" = { |
|
2528 | "elliptic-6.4.1" = { | |
@@ -2615,13 +2633,13 b' let' | |||||
2615 | sha1 = "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"; |
|
2633 | sha1 = "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"; | |
2616 | }; |
|
2634 | }; | |
2617 | }; |
|
2635 | }; | |
2618 |
"eslint-scope-4.0. |
|
2636 | "eslint-scope-4.0.3" = { | |
2619 | name = "eslint-scope"; |
|
2637 | name = "eslint-scope"; | |
2620 | packageName = "eslint-scope"; |
|
2638 | packageName = "eslint-scope"; | |
2621 |
version = "4.0. |
|
2639 | version = "4.0.3"; | |
2622 | src = fetchurl { |
|
2640 | src = fetchurl { | |
2623 |
url = "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0. |
|
2641 | url = "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz"; | |
2624 | sha512 = "1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA=="; |
|
2642 | sha512 = "p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg=="; | |
2625 | }; |
|
2643 | }; | |
2626 | }; |
|
2644 | }; | |
2627 | "espree-3.5.4" = { |
|
2645 | "espree-3.5.4" = { | |
@@ -2912,13 +2930,13 b' let' | |||||
2912 | sha1 = "9326b1488c22d1a6088650a86901b2d9a90a2cbc"; |
|
2930 | sha1 = "9326b1488c22d1a6088650a86901b2d9a90a2cbc"; | |
2913 | }; |
|
2931 | }; | |
2914 | }; |
|
2932 | }; | |
2915 |
"fined-1. |
|
2933 | "fined-1.2.0" = { | |
2916 | name = "fined"; |
|
2934 | name = "fined"; | |
2917 | packageName = "fined"; |
|
2935 | packageName = "fined"; | |
2918 |
version = "1. |
|
2936 | version = "1.2.0"; | |
2919 | src = fetchurl { |
|
2937 | src = fetchurl { | |
2920 |
url = "https://registry.npmjs.org/fined/-/fined-1. |
|
2938 | url = "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz"; | |
2921 | sha512 = "jQp949ZmEbiYHk3gkbdtpJ0G1+kgtLQBNdP5edFP7Fh+WAYceLQz6yO1SBj72Xkg8GVyTB3bBzAYrHJVh5Xd5g=="; |
|
2939 | sha512 = "ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng=="; | |
2922 | }; |
|
2940 | }; | |
2923 | }; |
|
2941 | }; | |
2924 | "flagged-respawn-1.0.1" = { |
|
2942 | "flagged-respawn-1.0.1" = { | |
@@ -3020,13 +3038,13 b' let' | |||||
3020 | sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f"; |
|
3038 | sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f"; | |
3021 | }; |
|
3039 | }; | |
3022 | }; |
|
3040 | }; | |
3023 |
"fsevents-1.2. |
|
3041 | "fsevents-1.2.9" = { | |
3024 | name = "fsevents"; |
|
3042 | name = "fsevents"; | |
3025 | packageName = "fsevents"; |
|
3043 | packageName = "fsevents"; | |
3026 |
version = "1.2. |
|
3044 | version = "1.2.9"; | |
3027 | src = fetchurl { |
|
3045 | src = fetchurl { | |
3028 |
url = "https://registry.npmjs.org/fsevents/-/fsevents-1.2. |
|
3046 | url = "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz"; | |
3029 | sha512 = "Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw=="; |
|
3047 | sha512 = "oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw=="; | |
3030 | }; |
|
3048 | }; | |
3031 | }; |
|
3049 | }; | |
3032 | "function-bind-1.1.1" = { |
|
3050 | "function-bind-1.1.1" = { | |
@@ -3110,13 +3128,13 b' let' | |||||
3110 | sha1 = "4a973f635b9190f715d10987d5c00fd2815ebe3d"; |
|
3128 | sha1 = "4a973f635b9190f715d10987d5c00fd2815ebe3d"; | |
3111 | }; |
|
3129 | }; | |
3112 | }; |
|
3130 | }; | |
3113 |
"glob-7.1. |
|
3131 | "glob-7.1.4" = { | |
3114 | name = "glob"; |
|
3132 | name = "glob"; | |
3115 | packageName = "glob"; |
|
3133 | packageName = "glob"; | |
3116 |
version = "7.1. |
|
3134 | version = "7.1.4"; | |
3117 | src = fetchurl { |
|
3135 | src = fetchurl { | |
3118 |
url = "https://registry.npmjs.org/glob/-/glob-7.1. |
|
3136 | url = "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz"; | |
3119 | sha512 = "vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ=="; |
|
3137 | sha512 = "hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A=="; | |
3120 | }; |
|
3138 | }; | |
3121 | }; |
|
3139 | }; | |
3122 | "glob-parent-3.1.0" = { |
|
3140 | "glob-parent-3.1.0" = { | |
@@ -3605,13 +3623,13 b' let' | |||||
3605 | sha1 = "83f0a0ec378bf3246178b6c2ad9136f135b1c962"; |
|
3623 | sha1 = "83f0a0ec378bf3246178b6c2ad9136f135b1c962"; | |
3606 | }; |
|
3624 | }; | |
3607 | }; |
|
3625 | }; | |
3608 |
"ieee754-1.1.1 |
|
3626 | "ieee754-1.1.13" = { | |
3609 | name = "ieee754"; |
|
3627 | name = "ieee754"; | |
3610 | packageName = "ieee754"; |
|
3628 | packageName = "ieee754"; | |
3611 |
version = "1.1.1 |
|
3629 | version = "1.1.13"; | |
3612 | src = fetchurl { |
|
3630 | src = fetchurl { | |
3613 |
url = "https://registry.npmjs.org/ieee754/-/ieee754-1.1.1 |
|
3631 | url = "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz"; | |
3614 | sha512 = "GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA=="; |
|
3632 | sha512 = "4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="; | |
3615 | }; |
|
3633 | }; | |
3616 | }; |
|
3634 | }; | |
3617 | "iferr-0.1.5" = { |
|
3635 | "iferr-0.1.5" = { | |
@@ -3929,13 +3947,13 b' let' | |||||
3929 | sha1 = "7ba5ae24217804ac70707b96922567486cc3e84a"; |
|
3947 | sha1 = "7ba5ae24217804ac70707b96922567486cc3e84a"; | |
3930 | }; |
|
3948 | }; | |
3931 | }; |
|
3949 | }; | |
3932 |
"is-glob-4.0. |
|
3950 | "is-glob-4.0.1" = { | |
3933 | name = "is-glob"; |
|
3951 | name = "is-glob"; | |
3934 | packageName = "is-glob"; |
|
3952 | packageName = "is-glob"; | |
3935 |
version = "4.0. |
|
3953 | version = "4.0.1"; | |
3936 | src = fetchurl { |
|
3954 | src = fetchurl { | |
3937 |
url = "https://registry.npmjs.org/is-glob/-/is-glob-4.0. |
|
3955 | url = "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz"; | |
3938 | sha1 = "9521c76845cc2610a85203ddf080a958c2ffabc0"; |
|
3956 | sha512 = "5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg=="; | |
3939 | }; |
|
3957 | }; | |
3940 | }; |
|
3958 | }; | |
3941 | "is-number-3.0.0" = { |
|
3959 | "is-number-3.0.0" = { | |
@@ -4163,13 +4181,13 b' let' | |||||
4163 | sha1 = "46c3fec8c1892b12b0833db9bc7622176dbab34b"; |
|
4181 | sha1 = "46c3fec8c1892b12b0833db9bc7622176dbab34b"; | |
4164 | }; |
|
4182 | }; | |
4165 | }; |
|
4183 | }; | |
4166 |
"jshint-2.10. |
|
4184 | "jshint-2.10.2" = { | |
4167 | name = "jshint"; |
|
4185 | name = "jshint"; | |
4168 | packageName = "jshint"; |
|
4186 | packageName = "jshint"; | |
4169 |
version = "2.10. |
|
4187 | version = "2.10.2"; | |
4170 | src = fetchurl { |
|
4188 | src = fetchurl { | |
4171 |
url = "https://registry.npmjs.org/jshint/-/jshint-2.10. |
|
4189 | url = "https://registry.npmjs.org/jshint/-/jshint-2.10.2.tgz"; | |
4172 | sha512 = "9GpPfKeffYBl7oBDX2lHPG16j0AM7D2bn3aLy9DaWTr6CWa0i/7UGhX8WLZ7V14QQnnr4hXbjauTLYg06F+HYw=="; |
|
4190 | sha512 = "e7KZgCSXMJxznE/4WULzybCMNXNAd/bf5TSrvVEq78Q/K8ZwFpmBqQeDtNiHc3l49nV4E/+YeHU/JZjSUIrLAA=="; | |
4173 | }; |
|
4191 | }; | |
4174 | }; |
|
4192 | }; | |
4175 | "jshint-2.9.7" = { |
|
4193 | "jshint-2.9.7" = { | |
@@ -4568,13 +4586,13 b' let' | |||||
4568 | sha512 = "xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg=="; |
|
4586 | sha512 = "xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg=="; | |
4569 | }; |
|
4587 | }; | |
4570 | }; |
|
4588 | }; | |
4571 |
"mem-4. |
|
4589 | "mem-4.3.0" = { | |
4572 | name = "mem"; |
|
4590 | name = "mem"; | |
4573 | packageName = "mem"; |
|
4591 | packageName = "mem"; | |
4574 |
version = "4. |
|
4592 | version = "4.3.0"; | |
4575 | src = fetchurl { |
|
4593 | src = fetchurl { | |
4576 |
url = "https://registry.npmjs.org/mem/-/mem-4. |
|
4594 | url = "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz"; | |
4577 | sha512 = "I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg=="; |
|
4595 | sha512 = "qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w=="; | |
4578 | }; |
|
4596 | }; | |
4579 | }; |
|
4597 | }; | |
4580 | "memory-fs-0.4.1" = { |
|
4598 | "memory-fs-0.4.1" = { | |
@@ -4613,31 +4631,31 b' let' | |||||
4613 | sha512 = "x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="; |
|
4631 | sha512 = "x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="; | |
4614 | }; |
|
4632 | }; | |
4615 | }; |
|
4633 | }; | |
4616 |
"mime-db-1. |
|
4634 | "mime-db-1.40.0" = { | |
4617 | name = "mime-db"; |
|
4635 | name = "mime-db"; | |
4618 | packageName = "mime-db"; |
|
4636 | packageName = "mime-db"; | |
4619 |
version = "1. |
|
4637 | version = "1.40.0"; | |
4620 | src = fetchurl { |
|
4638 | src = fetchurl { | |
4621 |
url = "https://registry.npmjs.org/mime-db/-/mime-db-1. |
|
4639 | url = "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz"; | |
4622 | sha512 = "bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg=="; |
|
4640 | sha512 = "jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA=="; | |
4623 | }; |
|
4641 | }; | |
4624 | }; |
|
4642 | }; | |
4625 |
"mime-types-2.1.2 |
|
4643 | "mime-types-2.1.24" = { | |
4626 | name = "mime-types"; |
|
4644 | name = "mime-types"; | |
4627 | packageName = "mime-types"; |
|
4645 | packageName = "mime-types"; | |
4628 |
version = "2.1.2 |
|
4646 | version = "2.1.24"; | |
4629 | src = fetchurl { |
|
4647 | src = fetchurl { | |
4630 |
url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.2 |
|
4648 | url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz"; | |
4631 | sha512 = "aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog=="; |
|
4649 | sha512 = "WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ=="; | |
4632 | }; |
|
4650 | }; | |
4633 | }; |
|
4651 | }; | |
4634 |
"mimic-fn-1 |
|
4652 | "mimic-fn-2.1.0" = { | |
4635 | name = "mimic-fn"; |
|
4653 | name = "mimic-fn"; | |
4636 | packageName = "mimic-fn"; |
|
4654 | packageName = "mimic-fn"; | |
4637 |
version = "1 |
|
4655 | version = "2.1.0"; | |
4638 | src = fetchurl { |
|
4656 | src = fetchurl { | |
4639 |
url = "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1 |
|
4657 | url = "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz"; | |
4640 | sha512 = "jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="; |
|
4658 | sha512 = "OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="; | |
4641 | }; |
|
4659 | }; | |
4642 | }; |
|
4660 | }; | |
4643 | "minimalistic-assert-1.0.1" = { |
|
4661 | "minimalistic-assert-1.0.1" = { | |
@@ -4739,13 +4757,13 b' let' | |||||
4739 | sha512 = "bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="; |
|
4757 | sha512 = "bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="; | |
4740 | }; |
|
4758 | }; | |
4741 | }; |
|
4759 | }; | |
4742 |
"mousetrap-1.6. |
|
4760 | "mousetrap-1.6.3" = { | |
4743 | name = "mousetrap"; |
|
4761 | name = "mousetrap"; | |
4744 | packageName = "mousetrap"; |
|
4762 | packageName = "mousetrap"; | |
4745 |
version = "1.6. |
|
4763 | version = "1.6.3"; | |
4746 | src = fetchurl { |
|
4764 | src = fetchurl { | |
4747 |
url = "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6. |
|
4765 | url = "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.3.tgz"; | |
4748 | sha512 = "jDjhi7wlHwdO6q6DS7YRmSHcuI+RVxadBkLt3KHrhd3C2b+w5pKefg3oj5beTcHZyVFA9Aksf+yEE1y5jxUjVA=="; |
|
4766 | sha512 = "bd+nzwhhs9ifsUrC2tWaSgm24/oo2c83zaRyZQF06hYA6sANfsXHtnZ19AbbbDXCDzeH5nZBSQ4NvCjgD62tJA=="; | |
4749 | }; |
|
4767 | }; | |
4750 | }; |
|
4768 | }; | |
4751 | "move-concurrently-1.0.1" = { |
|
4769 | "move-concurrently-1.0.1" = { | |
@@ -4766,13 +4784,13 b' let' | |||||
4766 | sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8"; |
|
4784 | sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8"; | |
4767 | }; |
|
4785 | }; | |
4768 | }; |
|
4786 | }; | |
4769 |
"nan-2.12 |
|
4787 | "nan-2.13.2" = { | |
4770 | name = "nan"; |
|
4788 | name = "nan"; | |
4771 | packageName = "nan"; |
|
4789 | packageName = "nan"; | |
4772 |
version = "2.12 |
|
4790 | version = "2.13.2"; | |
4773 | src = fetchurl { |
|
4791 | src = fetchurl { | |
4774 |
url = "https://registry.npmjs.org/nan/-/nan-2.12 |
|
4792 | url = "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz"; | |
4775 | sha512 = "JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw=="; |
|
4793 | sha512 = "TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw=="; | |
4776 | }; |
|
4794 | }; | |
4777 | }; |
|
4795 | }; | |
4778 | "nanomatch-1.2.13" = { |
|
4796 | "nanomatch-1.2.13" = { | |
@@ -4784,13 +4802,13 b' let' | |||||
4784 | sha512 = "fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA=="; |
|
4802 | sha512 = "fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA=="; | |
4785 | }; |
|
4803 | }; | |
4786 | }; |
|
4804 | }; | |
4787 |
"neo-async-2.6. |
|
4805 | "neo-async-2.6.1" = { | |
4788 | name = "neo-async"; |
|
4806 | name = "neo-async"; | |
4789 | packageName = "neo-async"; |
|
4807 | packageName = "neo-async"; | |
4790 |
version = "2.6. |
|
4808 | version = "2.6.1"; | |
4791 | src = fetchurl { |
|
4809 | src = fetchurl { | |
4792 |
url = "https://registry.npmjs.org/neo-async/-/neo-async-2.6. |
|
4810 | url = "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz"; | |
4793 | sha512 = "MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA=="; |
|
4811 | sha512 = "iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw=="; | |
4794 | }; |
|
4812 | }; | |
4795 | }; |
|
4813 | }; | |
4796 | "nice-try-1.0.5" = { |
|
4814 | "nice-try-1.0.5" = { | |
@@ -4955,13 +4973,13 b' let' | |||||
4955 | sha1 = "7e7d858b781bd7c991a41ba975ed3812754e998c"; |
|
4973 | sha1 = "7e7d858b781bd7c991a41ba975ed3812754e998c"; | |
4956 | }; |
|
4974 | }; | |
4957 | }; |
|
4975 | }; | |
4958 |
"object-keys-1.1. |
|
4976 | "object-keys-1.1.1" = { | |
4959 | name = "object-keys"; |
|
4977 | name = "object-keys"; | |
4960 | packageName = "object-keys"; |
|
4978 | packageName = "object-keys"; | |
4961 |
version = "1.1. |
|
4979 | version = "1.1.1"; | |
4962 | src = fetchurl { |
|
4980 | src = fetchurl { | |
4963 |
url = "https://registry.npmjs.org/object-keys/-/object-keys-1.1. |
|
4981 | url = "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz"; | |
4964 | sha512 = "6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg=="; |
|
4982 | sha512 = "NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="; | |
4965 | }; |
|
4983 | }; | |
4966 | }; |
|
4984 | }; | |
4967 | "object-visit-1.0.1" = { |
|
4985 | "object-visit-1.0.1" = { | |
@@ -5081,13 +5099,13 b' let' | |||||
5081 | sha1 = "3fbcfb15b899a44123b34b6dcc18b724336a2cae"; |
|
5099 | sha1 = "3fbcfb15b899a44123b34b6dcc18b724336a2cae"; | |
5082 | }; |
|
5100 | }; | |
5083 | }; |
|
5101 | }; | |
5084 |
"p-is-promise-2. |
|
5102 | "p-is-promise-2.1.0" = { | |
5085 | name = "p-is-promise"; |
|
5103 | name = "p-is-promise"; | |
5086 | packageName = "p-is-promise"; |
|
5104 | packageName = "p-is-promise"; | |
5087 |
version = "2. |
|
5105 | version = "2.1.0"; | |
5088 | src = fetchurl { |
|
5106 | src = fetchurl { | |
5089 |
url = "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2. |
|
5107 | url = "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz"; | |
5090 | sha512 = "pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg=="; |
|
5108 | sha512 = "Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg=="; | |
5091 | }; |
|
5109 | }; | |
5092 | }; |
|
5110 | }; | |
5093 | "p-limit-1.3.0" = { |
|
5111 | "p-limit-1.3.0" = { | |
@@ -5099,13 +5117,13 b' let' | |||||
5099 | sha512 = "vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q=="; |
|
5117 | sha512 = "vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q=="; | |
5100 | }; |
|
5118 | }; | |
5101 | }; |
|
5119 | }; | |
5102 |
"p-limit-2. |
|
5120 | "p-limit-2.2.0" = { | |
5103 | name = "p-limit"; |
|
5121 | name = "p-limit"; | |
5104 | packageName = "p-limit"; |
|
5122 | packageName = "p-limit"; | |
5105 |
version = "2. |
|
5123 | version = "2.2.0"; | |
5106 | src = fetchurl { |
|
5124 | src = fetchurl { | |
5107 |
url = "https://registry.npmjs.org/p-limit/-/p-limit-2. |
|
5125 | url = "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz"; | |
5108 | sha512 = "NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g=="; |
|
5126 | sha512 = "pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ=="; | |
5109 | }; |
|
5127 | }; | |
5110 | }; |
|
5128 | }; | |
5111 | "p-locate-2.0.0" = { |
|
5129 | "p-locate-2.0.0" = { | |
@@ -5135,22 +5153,22 b' let' | |||||
5135 | sha1 = "cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"; |
|
5153 | sha1 = "cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"; | |
5136 | }; |
|
5154 | }; | |
5137 | }; |
|
5155 | }; | |
5138 |
"p-try-2. |
|
5156 | "p-try-2.2.0" = { | |
5139 | name = "p-try"; |
|
5157 | name = "p-try"; | |
5140 | packageName = "p-try"; |
|
5158 | packageName = "p-try"; | |
5141 |
version = "2. |
|
5159 | version = "2.2.0"; | |
5142 | src = fetchurl { |
|
5160 | src = fetchurl { | |
5143 |
url = "https://registry.npmjs.org/p-try/-/p-try-2. |
|
5161 | url = "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz"; | |
5144 | sha512 = "hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ=="; |
|
5162 | sha512 = "R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="; | |
5145 | }; |
|
5163 | }; | |
5146 | }; |
|
5164 | }; | |
5147 |
"pako-1.0. |
|
5165 | "pako-1.0.10" = { | |
5148 | name = "pako"; |
|
5166 | name = "pako"; | |
5149 | packageName = "pako"; |
|
5167 | packageName = "pako"; | |
5150 |
version = "1.0. |
|
5168 | version = "1.0.10"; | |
5151 | src = fetchurl { |
|
5169 | src = fetchurl { | |
5152 |
url = "https://registry.npmjs.org/pako/-/pako-1.0. |
|
5170 | url = "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz"; | |
5153 | sha512 = "6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA=="; |
|
5171 | sha512 = "0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw=="; | |
5154 | }; |
|
5172 | }; | |
5155 | }; |
|
5173 | }; | |
5156 | "parallel-transform-1.1.0" = { |
|
5174 | "parallel-transform-1.1.0" = { | |
@@ -6134,13 +6152,13 b' let' | |||||
6134 | sha1 = "97f717b69d48784f5f526a6c5aa8ffdda055a4d1"; |
|
6152 | sha1 = "97f717b69d48784f5f526a6c5aa8ffdda055a4d1"; | |
6135 | }; |
|
6153 | }; | |
6136 | }; |
|
6154 | }; | |
6137 |
"resolve-1.10. |
|
6155 | "resolve-1.10.1" = { | |
6138 | name = "resolve"; |
|
6156 | name = "resolve"; | |
6139 | packageName = "resolve"; |
|
6157 | packageName = "resolve"; | |
6140 |
version = "1.10. |
|
6158 | version = "1.10.1"; | |
6141 | src = fetchurl { |
|
6159 | src = fetchurl { | |
6142 |
url = "https://registry.npmjs.org/resolve/-/resolve-1.10. |
|
6160 | url = "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz"; | |
6143 | sha512 = "3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg=="; |
|
6161 | sha512 = "KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA=="; | |
6144 | }; |
|
6162 | }; | |
6145 | }; |
|
6163 | }; | |
6146 | "resolve-cwd-2.0.0" = { |
|
6164 | "resolve-cwd-2.0.0" = { | |
@@ -6287,22 +6305,22 b' let' | |||||
6287 | sha1 = "0e7350acdec80b1108528786ec1d4418d11b396d"; |
|
6305 | sha1 = "0e7350acdec80b1108528786ec1d4418d11b396d"; | |
6288 | }; |
|
6306 | }; | |
6289 | }; |
|
6307 | }; | |
6290 |
"semver-5. |
|
6308 | "semver-5.7.0" = { | |
6291 | name = "semver"; |
|
6309 | name = "semver"; | |
6292 | packageName = "semver"; |
|
6310 | packageName = "semver"; | |
6293 |
version = "5. |
|
6311 | version = "5.7.0"; | |
6294 | src = fetchurl { |
|
6312 | src = fetchurl { | |
6295 |
url = "https://registry.npmjs.org/semver/-/semver-5. |
|
6313 | url = "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz"; | |
6296 | sha512 = "RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg=="; |
|
6314 | sha512 = "Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA=="; | |
6297 | }; |
|
6315 | }; | |
6298 | }; |
|
6316 | }; | |
6299 |
"serialize-javascript-1. |
|
6317 | "serialize-javascript-1.7.0" = { | |
6300 | name = "serialize-javascript"; |
|
6318 | name = "serialize-javascript"; | |
6301 | packageName = "serialize-javascript"; |
|
6319 | packageName = "serialize-javascript"; | |
6302 |
version = "1. |
|
6320 | version = "1.7.0"; | |
6303 | src = fetchurl { |
|
6321 | src = fetchurl { | |
6304 |
url = "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1. |
|
6322 | url = "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz"; | |
6305 | sha512 = "A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw=="; |
|
6323 | sha512 = "ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA=="; | |
6306 | }; |
|
6324 | }; | |
6307 | }; |
|
6325 | }; | |
6308 | "set-blocking-2.0.0" = { |
|
6326 | "set-blocking-2.0.0" = { | |
@@ -6791,13 +6809,13 b' let' | |||||
6791 | sha512 = "2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A=="; |
|
6809 | sha512 = "2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A=="; | |
6792 | }; |
|
6810 | }; | |
6793 | }; |
|
6811 | }; | |
6794 |
"tapable-1.1. |
|
6812 | "tapable-1.1.3" = { | |
6795 | name = "tapable"; |
|
6813 | name = "tapable"; | |
6796 | packageName = "tapable"; |
|
6814 | packageName = "tapable"; | |
6797 |
version = "1.1. |
|
6815 | version = "1.1.3"; | |
6798 | src = fetchurl { |
|
6816 | src = fetchurl { | |
6799 |
url = "https://registry.npmjs.org/tapable/-/tapable-1.1. |
|
6817 | url = "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz"; | |
6800 | sha512 = "9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA=="; |
|
6818 | sha512 = "4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA=="; | |
6801 | }; |
|
6819 | }; | |
6802 | }; |
|
6820 | }; | |
6803 | "through-2.3.8" = { |
|
6821 | "through-2.3.8" = { | |
@@ -6989,13 +7007,13 b' let' | |||||
6989 | sha1 = "29c5733148057bb4e1f75df35b7a9cb72e6a59dd"; |
|
7007 | sha1 = "29c5733148057bb4e1f75df35b7a9cb72e6a59dd"; | |
6990 | }; |
|
7008 | }; | |
6991 | }; |
|
7009 | }; | |
6992 |
"uglify-js-3.4. |
|
7010 | "uglify-js-3.4.10" = { | |
6993 | name = "uglify-js"; |
|
7011 | name = "uglify-js"; | |
6994 | packageName = "uglify-js"; |
|
7012 | packageName = "uglify-js"; | |
6995 |
version = "3.4. |
|
7013 | version = "3.4.10"; | |
6996 | src = fetchurl { |
|
7014 | src = fetchurl { | |
6997 |
url = "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4. |
|
7015 | url = "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz"; | |
6998 | sha512 = "8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q=="; |
|
7016 | sha512 = "Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw=="; | |
6999 | }; |
|
7017 | }; | |
7000 | }; |
|
7018 | }; | |
7001 | "uglify-to-browserify-1.0.2" = { |
|
7019 | "uglify-to-browserify-1.0.2" = { | |
@@ -7115,13 +7133,13 b' let' | |||||
7115 | sha1 = "8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"; |
|
7133 | sha1 = "8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"; | |
7116 | }; |
|
7134 | }; | |
7117 | }; |
|
7135 | }; | |
7118 |
"upath-1.1. |
|
7136 | "upath-1.1.2" = { | |
7119 | name = "upath"; |
|
7137 | name = "upath"; | |
7120 | packageName = "upath"; |
|
7138 | packageName = "upath"; | |
7121 |
version = "1.1. |
|
7139 | version = "1.1.2"; | |
7122 | src = fetchurl { |
|
7140 | src = fetchurl { | |
7123 |
url = "https://registry.npmjs.org/upath/-/upath-1.1. |
|
7141 | url = "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz"; | |
7124 | sha512 = "bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw=="; |
|
7142 | sha512 = "kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q=="; | |
7125 | }; |
|
7143 | }; | |
7126 | }; |
|
7144 | }; | |
7127 | "upper-case-1.1.3" = { |
|
7145 | "upper-case-1.1.3" = { | |
@@ -7223,31 +7241,31 b' let' | |||||
7223 | sha512 = "yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="; |
|
7241 | sha512 = "yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="; | |
7224 | }; |
|
7242 | }; | |
7225 | }; |
|
7243 | }; | |
7226 |
"v8-compile-cache-2.0. |
|
7244 | "v8-compile-cache-2.0.3" = { | |
7227 | name = "v8-compile-cache"; |
|
7245 | name = "v8-compile-cache"; | |
7228 | packageName = "v8-compile-cache"; |
|
7246 | packageName = "v8-compile-cache"; | |
7229 |
version = "2.0. |
|
7247 | version = "2.0.3"; | |
7230 | src = fetchurl { |
|
7248 | src = fetchurl { | |
7231 |
url = "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0. |
|
7249 | url = "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz"; | |
7232 | sha512 = "1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw=="; |
|
7250 | sha512 = "CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w=="; | |
7233 | }; |
|
7251 | }; | |
7234 | }; |
|
7252 | }; | |
7235 |
"v8flags-3.1. |
|
7253 | "v8flags-3.1.3" = { | |
7236 | name = "v8flags"; |
|
7254 | name = "v8flags"; | |
7237 | packageName = "v8flags"; |
|
7255 | packageName = "v8flags"; | |
7238 |
version = "3.1. |
|
7256 | version = "3.1.3"; | |
7239 | src = fetchurl { |
|
7257 | src = fetchurl { | |
7240 |
url = "https://registry.npmjs.org/v8flags/-/v8flags-3.1. |
|
7258 | url = "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz"; | |
7241 | sha512 = "MtivA7GF24yMPte9Rp/BWGCYQNaUj86zeYxV/x2RRJMKagImbbv3u8iJC57lNhWLPcGLJmHcHmFWkNsplbbLWw=="; |
|
7259 | sha512 = "amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w=="; | |
7242 | }; |
|
7260 | }; | |
7243 | }; |
|
7261 | }; | |
7244 |
"vendors-1.0. |
|
7262 | "vendors-1.0.3" = { | |
7245 | name = "vendors"; |
|
7263 | name = "vendors"; | |
7246 | packageName = "vendors"; |
|
7264 | packageName = "vendors"; | |
7247 |
version = "1.0. |
|
7265 | version = "1.0.3"; | |
7248 | src = fetchurl { |
|
7266 | src = fetchurl { | |
7249 |
url = "https://registry.npmjs.org/vendors/-/vendors-1.0. |
|
7267 | url = "https://registry.npmjs.org/vendors/-/vendors-1.0.3.tgz"; | |
7250 | sha512 = "w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ=="; |
|
7268 | sha512 = "fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw=="; | |
7251 | }; |
|
7269 | }; | |
7252 | }; |
|
7270 | }; | |
7253 | "verror-1.10.0" = { |
|
7271 | "verror-1.10.0" = { | |
@@ -7385,13 +7403,13 b' let' | |||||
7385 | sha1 = "b79669bb42ecb409f83d583cad52ca17eaa1643f"; |
|
7403 | sha1 = "b79669bb42ecb409f83d583cad52ca17eaa1643f"; | |
7386 | }; |
|
7404 | }; | |
7387 | }; |
|
7405 | }; | |
7388 |
"worker-farm-1. |
|
7406 | "worker-farm-1.7.0" = { | |
7389 | name = "worker-farm"; |
|
7407 | name = "worker-farm"; | |
7390 | packageName = "worker-farm"; |
|
7408 | packageName = "worker-farm"; | |
7391 |
version = "1. |
|
7409 | version = "1.7.0"; | |
7392 | src = fetchurl { |
|
7410 | src = fetchurl { | |
7393 |
url = "https://registry.npmjs.org/worker-farm/-/worker-farm-1. |
|
7411 | url = "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz"; | |
7394 | sha512 = "6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ=="; |
|
7412 | sha512 = "rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw=="; | |
7395 | }; |
|
7413 | }; | |
7396 | }; |
|
7414 | }; | |
7397 | "wrap-ansi-2.1.0" = { |
|
7415 | "wrap-ansi-2.1.0" = { | |
@@ -7496,9 +7514,9 b' let' | |||||
7496 | sources."@polymer/paper-toast-3.0.1" |
|
7514 | sources."@polymer/paper-toast-3.0.1" | |
7497 | sources."@polymer/paper-toggle-button-3.0.1" |
|
7515 | sources."@polymer/paper-toggle-button-3.0.1" | |
7498 | sources."@polymer/paper-tooltip-3.0.1" |
|
7516 | sources."@polymer/paper-tooltip-3.0.1" | |
7499 |
sources."@polymer/polymer-3. |
|
7517 | sources."@polymer/polymer-3.2.0" | |
7500 | sources."@types/clone-0.1.30" |
|
7518 | sources."@types/clone-0.1.30" | |
7501 |
sources."@types/node-6.14. |
|
7519 | sources."@types/node-6.14.6" | |
7502 | sources."@types/parse5-2.2.34" |
|
7520 | sources."@types/parse5-2.2.34" | |
7503 | sources."@webassemblyjs/ast-1.7.10" |
|
7521 | sources."@webassemblyjs/ast-1.7.10" | |
7504 | sources."@webassemblyjs/floating-point-hex-parser-1.7.10" |
|
7522 | sources."@webassemblyjs/floating-point-hex-parser-1.7.10" | |
@@ -7518,8 +7536,8 b' let' | |||||
7518 | sources."@webassemblyjs/wasm-parser-1.7.10" |
|
7536 | sources."@webassemblyjs/wasm-parser-1.7.10" | |
7519 | sources."@webassemblyjs/wast-parser-1.7.10" |
|
7537 | sources."@webassemblyjs/wast-parser-1.7.10" | |
7520 | sources."@webassemblyjs/wast-printer-1.7.10" |
|
7538 | sources."@webassemblyjs/wast-printer-1.7.10" | |
7521 |
sources."@webcomponents/shadycss-1.9. |
|
7539 | sources."@webcomponents/shadycss-1.9.1" | |
7522 |
sources."@webcomponents/webcomponentsjs-2.2. |
|
7540 | sources."@webcomponents/webcomponentsjs-2.2.10" | |
7523 | sources."@xtuc/ieee754-1.2.0" |
|
7541 | sources."@xtuc/ieee754-1.2.0" | |
7524 | sources."@xtuc/long-4.2.1" |
|
7542 | sources."@xtuc/long-4.2.1" | |
7525 | sources."abbrev-1.1.1" |
|
7543 | sources."abbrev-1.1.1" | |
@@ -7564,7 +7582,7 b' let' | |||||
7564 | sources."asap-2.0.6" |
|
7582 | sources."asap-2.0.6" | |
7565 | sources."asn1-0.2.4" |
|
7583 | sources."asn1-0.2.4" | |
7566 | sources."asn1.js-4.10.1" |
|
7584 | sources."asn1.js-4.10.1" | |
7567 |
(sources."assert-1. |
|
7585 | (sources."assert-1.5.0" // { | |
7568 | dependencies = [ |
|
7586 | dependencies = [ | |
7569 | sources."inherits-2.0.1" |
|
7587 | sources."inherits-2.0.1" | |
7570 | sources."util-0.10.3" |
|
7588 | sources."util-0.10.3" | |
@@ -7574,7 +7592,7 b' let' | |||||
7574 | sources."assign-symbols-1.0.0" |
|
7592 | sources."assign-symbols-1.0.0" | |
7575 | sources."ast-types-0.9.6" |
|
7593 | sources."ast-types-0.9.6" | |
7576 | sources."async-0.1.22" |
|
7594 | sources."async-0.1.22" | |
7577 |
sources."async-each-1.0. |
|
7595 | sources."async-each-1.0.3" | |
7578 | sources."asynckit-0.4.0" |
|
7596 | sources."asynckit-0.4.0" | |
7579 | sources."atob-2.1.2" |
|
7597 | sources."atob-2.1.2" | |
7580 | (sources."autoprefixer-6.7.7" // { |
|
7598 | (sources."autoprefixer-6.7.7" // { | |
@@ -7696,8 +7714,8 b' let' | |||||
7696 | sources."base64-js-1.3.0" |
|
7714 | sources."base64-js-1.3.0" | |
7697 | sources."bcrypt-pbkdf-1.0.2" |
|
7715 | sources."bcrypt-pbkdf-1.0.2" | |
7698 | sources."big.js-5.2.2" |
|
7716 | sources."big.js-5.2.2" | |
7699 |
sources."binary-extensions-1.13. |
|
7717 | sources."binary-extensions-1.13.1" | |
7700 |
sources."bluebird-3.5. |
|
7718 | sources."bluebird-3.5.4" | |
7701 | sources."bn.js-4.11.8" |
|
7719 | sources."bn.js-4.11.8" | |
7702 | sources."boolbase-1.0.0" |
|
7720 | sources."boolbase-1.0.0" | |
7703 | sources."boom-2.10.1" |
|
7721 | sources."boom-2.10.1" | |
@@ -7721,7 +7739,7 b' let' | |||||
7721 | sources."builtin-status-codes-3.0.0" |
|
7739 | sources."builtin-status-codes-3.0.0" | |
7722 | (sources."cacache-10.0.4" // { |
|
7740 | (sources."cacache-10.0.4" // { | |
7723 | dependencies = [ |
|
7741 | dependencies = [ | |
7724 |
sources."glob-7.1. |
|
7742 | sources."glob-7.1.4" | |
7725 | sources."graceful-fs-4.1.15" |
|
7743 | sources."graceful-fs-4.1.15" | |
7726 | sources."lru-cache-4.1.5" |
|
7744 | sources."lru-cache-4.1.5" | |
7727 | sources."minimatch-3.0.4" |
|
7745 | sources."minimatch-3.0.4" | |
@@ -7730,20 +7748,20 b' let' | |||||
7730 | }) |
|
7748 | }) | |
7731 | sources."cache-base-1.0.1" |
|
7749 | sources."cache-base-1.0.1" | |
7732 | sources."camel-case-3.0.0" |
|
7750 | sources."camel-case-3.0.0" | |
7733 |
sources."camelcase-5. |
|
7751 | sources."camelcase-5.3.1" | |
7734 | (sources."caniuse-api-1.6.1" // { |
|
7752 | (sources."caniuse-api-1.6.1" // { | |
7735 | dependencies = [ |
|
7753 | dependencies = [ | |
7736 | sources."browserslist-1.7.7" |
|
7754 | sources."browserslist-1.7.7" | |
7737 | ]; |
|
7755 | ]; | |
7738 | }) |
|
7756 | }) | |
7739 |
sources."caniuse-db-1.0.300009 |
|
7757 | sources."caniuse-db-1.0.30000967" | |
7740 |
sources."caniuse-lite-1.0.300009 |
|
7758 | sources."caniuse-lite-1.0.30000967" | |
7741 | sources."caseless-0.12.0" |
|
7759 | sources."caseless-0.12.0" | |
7742 | sources."center-align-0.1.3" |
|
7760 | sources."center-align-0.1.3" | |
7743 | sources."chalk-0.5.1" |
|
7761 | sources."chalk-0.5.1" | |
7744 |
(sources."chokidar-2.1. |
|
7762 | (sources."chokidar-2.1.5" // { | |
7745 | dependencies = [ |
|
7763 | dependencies = [ | |
7746 |
sources."is-glob-4.0. |
|
7764 | sources."is-glob-4.0.1" | |
7747 | ]; |
|
7765 | ]; | |
7748 | }) |
|
7766 | }) | |
7749 | sources."chownr-1.1.1" |
|
7767 | sources."chownr-1.1.1" | |
@@ -7783,7 +7801,7 b' let' | |||||
7783 | }) |
|
7801 | }) | |
7784 | (sources."cli-1.0.1" // { |
|
7802 | (sources."cli-1.0.1" // { | |
7785 | dependencies = [ |
|
7803 | dependencies = [ | |
7786 |
sources."glob-7.1. |
|
7804 | sources."glob-7.1.4" | |
7787 | sources."minimatch-3.0.4" |
|
7805 | sources."minimatch-3.0.4" | |
7788 | ]; |
|
7806 | ]; | |
7789 | }) |
|
7807 | }) | |
@@ -7806,10 +7824,10 b' let' | |||||
7806 | sources."color-string-0.3.0" |
|
7824 | sources."color-string-0.3.0" | |
7807 | sources."colormin-1.1.2" |
|
7825 | sources."colormin-1.1.2" | |
7808 | sources."colors-0.6.2" |
|
7826 | sources."colors-0.6.2" | |
7809 |
sources."combined-stream-1.0. |
|
7827 | sources."combined-stream-1.0.8" | |
7810 | sources."commander-2.14.1" |
|
7828 | sources."commander-2.14.1" | |
7811 | sources."commondir-1.0.1" |
|
7829 | sources."commondir-1.0.1" | |
7812 |
sources."component-emitter-1. |
|
7830 | sources."component-emitter-1.3.0" | |
7813 | sources."concat-map-0.0.1" |
|
7831 | sources."concat-map-0.0.1" | |
7814 | (sources."concat-stream-1.6.2" // { |
|
7832 | (sources."concat-stream-1.6.2" // { | |
7815 | dependencies = [ |
|
7833 | dependencies = [ | |
@@ -7822,7 +7840,7 b' let' | |||||
7822 | sources."convert-source-map-1.6.0" |
|
7840 | sources."convert-source-map-1.6.0" | |
7823 | (sources."copy-concurrently-1.0.5" // { |
|
7841 | (sources."copy-concurrently-1.0.5" // { | |
7824 | dependencies = [ |
|
7842 | dependencies = [ | |
7825 |
sources."glob-7.1. |
|
7843 | sources."glob-7.1.4" | |
7826 | sources."minimatch-3.0.4" |
|
7844 | sources."minimatch-3.0.4" | |
7827 | sources."rimraf-2.6.3" |
|
7845 | sources."rimraf-2.6.3" | |
7828 | ]; |
|
7846 | ]; | |
@@ -7830,7 +7848,7 b' let' | |||||
7830 | sources."copy-descriptor-0.1.1" |
|
7848 | sources."copy-descriptor-0.1.1" | |
7831 | (sources."copy-webpack-plugin-4.6.0" // { |
|
7849 | (sources."copy-webpack-plugin-4.6.0" // { | |
7832 | dependencies = [ |
|
7850 | dependencies = [ | |
7833 |
sources."is-glob-4.0. |
|
7851 | sources."is-glob-4.0.1" | |
7834 | sources."minimatch-3.0.4" |
|
7852 | sources."minimatch-3.0.4" | |
7835 | ]; |
|
7853 | ]; | |
7836 | }) |
|
7854 | }) | |
@@ -7896,6 +7914,7 b' let' | |||||
7896 | sources."domelementtype-1.3.1" |
|
7914 | sources."domelementtype-1.3.1" | |
7897 | sources."domhandler-2.3.0" |
|
7915 | sources."domhandler-2.3.0" | |
7898 | sources."domutils-1.5.1" |
|
7916 | sources."domutils-1.5.1" | |
|
7917 | sources."dropzone-5.5.1" | |||
7899 | (sources."duplexify-3.7.1" // { |
|
7918 | (sources."duplexify-3.7.1" // { | |
7900 | dependencies = [ |
|
7919 | dependencies = [ | |
7901 | sources."readable-stream-2.3.6" |
|
7920 | sources."readable-stream-2.3.6" | |
@@ -7903,7 +7922,7 b' let' | |||||
7903 | ]; |
|
7922 | ]; | |
7904 | }) |
|
7923 | }) | |
7905 | sources."ecc-jsbn-0.1.2" |
|
7924 | sources."ecc-jsbn-0.1.2" | |
7906 |
sources."electron-to-chromium-1.3.1 |
|
7925 | sources."electron-to-chromium-1.3.133" | |
7907 | sources."elliptic-6.4.1" |
|
7926 | sources."elliptic-6.4.1" | |
7908 | sources."emojis-list-2.1.0" |
|
7927 | sources."emojis-list-2.1.0" | |
7909 | sources."end-of-stream-1.4.1" |
|
7928 | sources."end-of-stream-1.4.1" | |
@@ -7918,7 +7937,7 b' let' | |||||
7918 | sources."es-to-primitive-1.2.0" |
|
7937 | sources."es-to-primitive-1.2.0" | |
7919 | sources."es6-templates-0.2.3" |
|
7938 | sources."es6-templates-0.2.3" | |
7920 | sources."escape-string-regexp-1.0.5" |
|
7939 | sources."escape-string-regexp-1.0.5" | |
7921 |
sources."eslint-scope-4.0. |
|
7940 | sources."eslint-scope-4.0.3" | |
7922 | sources."espree-3.5.4" |
|
7941 | sources."espree-3.5.4" | |
7923 | sources."esprima-1.0.4" |
|
7942 | sources."esprima-1.0.4" | |
7924 | sources."esrecurse-4.2.1" |
|
7943 | sources."esrecurse-4.2.1" | |
@@ -7982,7 +8001,7 b' let' | |||||
7982 | sources."minimatch-0.3.0" |
|
8001 | sources."minimatch-0.3.0" | |
7983 | ]; |
|
8002 | ]; | |
7984 | }) |
|
8003 | }) | |
7985 |
sources."fined-1. |
|
8004 | sources."fined-1.2.0" | |
7986 | sources."flagged-respawn-1.0.1" |
|
8005 | sources."flagged-respawn-1.0.1" | |
7987 | sources."flatten-1.0.2" |
|
8006 | sources."flatten-1.0.2" | |
7988 | (sources."flush-write-stream-1.1.1" // { |
|
8007 | (sources."flush-write-stream-1.1.1" // { | |
@@ -8008,7 +8027,7 b' let' | |||||
8008 | ]; |
|
8027 | ]; | |
8009 | }) |
|
8028 | }) | |
8010 | sources."fs.realpath-1.0.0" |
|
8029 | sources."fs.realpath-1.0.0" | |
8011 |
sources."fsevents-1.2. |
|
8030 | sources."fsevents-1.2.9" | |
8012 | sources."function-bind-1.1.1" |
|
8031 | sources."function-bind-1.1.1" | |
8013 | sources."gaze-0.5.2" |
|
8032 | sources."gaze-0.5.2" | |
8014 | sources."get-caller-file-1.0.3" |
|
8033 | sources."get-caller-file-1.0.3" | |
@@ -8040,7 +8059,7 b' let' | |||||
8040 | sources."globals-9.18.0" |
|
8059 | sources."globals-9.18.0" | |
8041 | (sources."globby-7.1.1" // { |
|
8060 | (sources."globby-7.1.1" // { | |
8042 | dependencies = [ |
|
8061 | dependencies = [ | |
8043 |
sources."glob-7.1. |
|
8062 | sources."glob-7.1.4" | |
8044 | sources."minimatch-3.0.4" |
|
8063 | sources."minimatch-3.0.4" | |
8045 | ]; |
|
8064 | ]; | |
8046 | }) |
|
8065 | }) | |
@@ -8166,7 +8185,7 b' let' | |||||
8166 | sources."supports-color-5.5.0" |
|
8185 | sources."supports-color-5.5.0" | |
8167 | ]; |
|
8186 | ]; | |
8168 | }) |
|
8187 | }) | |
8169 |
sources."ieee754-1.1.1 |
|
8188 | sources."ieee754-1.1.13" | |
8170 | sources."iferr-0.1.5" |
|
8189 | sources."iferr-0.1.5" | |
8171 | sources."ignore-3.3.10" |
|
8190 | sources."ignore-3.3.10" | |
8172 | sources."image-size-0.5.5" |
|
8191 | sources."image-size-0.5.5" | |
@@ -8174,9 +8193,9 b' let' | |||||
8174 | dependencies = [ |
|
8193 | dependencies = [ | |
8175 | sources."find-up-3.0.0" |
|
8194 | sources."find-up-3.0.0" | |
8176 | sources."locate-path-3.0.0" |
|
8195 | sources."locate-path-3.0.0" | |
8177 |
sources."p-limit-2. |
|
8196 | sources."p-limit-2.2.0" | |
8178 | sources."p-locate-3.0.0" |
|
8197 | sources."p-locate-3.0.0" | |
8179 |
sources."p-try-2. |
|
8198 | sources."p-try-2.2.0" | |
8180 | sources."pkg-dir-3.0.0" |
|
8199 | sources."pkg-dir-3.0.0" | |
8181 | ]; |
|
8200 | ]; | |
8182 | }) |
|
8201 | }) | |
@@ -8229,7 +8248,7 b' let' | |||||
8229 | sources."js-yaml-2.0.5" |
|
8248 | sources."js-yaml-2.0.5" | |
8230 | sources."jsbn-0.1.1" |
|
8249 | sources."jsbn-0.1.1" | |
8231 | sources."jsesc-1.3.0" |
|
8250 | sources."jsesc-1.3.0" | |
8232 |
(sources."jshint-2.10. |
|
8251 | (sources."jshint-2.10.2" // { | |
8233 | dependencies = [ |
|
8252 | dependencies = [ | |
8234 | sources."lodash-4.17.11" |
|
8253 | sources."lodash-4.17.11" | |
8235 | sources."minimatch-3.0.4" |
|
8254 | sources."minimatch-3.0.4" | |
@@ -8280,7 +8299,7 b' let' | |||||
8280 | sources."mark.js-8.11.1" |
|
8299 | sources."mark.js-8.11.1" | |
8281 | sources."math-expression-evaluator-1.2.17" |
|
8300 | sources."math-expression-evaluator-1.2.17" | |
8282 | sources."md5.js-1.3.5" |
|
8301 | sources."md5.js-1.3.5" | |
8283 |
sources."mem-4. |
|
8302 | sources."mem-4.3.0" | |
8284 | (sources."memory-fs-0.4.1" // { |
|
8303 | (sources."memory-fs-0.4.1" // { | |
8285 | dependencies = [ |
|
8304 | dependencies = [ | |
8286 | sources."readable-stream-2.3.6" |
|
8305 | sources."readable-stream-2.3.6" | |
@@ -8290,9 +8309,9 b' let' | |||||
8290 | sources."micromatch-3.1.10" |
|
8309 | sources."micromatch-3.1.10" | |
8291 | sources."miller-rabin-4.0.1" |
|
8310 | sources."miller-rabin-4.0.1" | |
8292 | sources."mime-1.6.0" |
|
8311 | sources."mime-1.6.0" | |
8293 |
sources."mime-db-1. |
|
8312 | sources."mime-db-1.40.0" | |
8294 |
sources."mime-types-2.1.2 |
|
8313 | sources."mime-types-2.1.24" | |
8295 |
sources."mimic-fn-1 |
|
8314 | sources."mimic-fn-2.1.0" | |
8296 | sources."minimalistic-assert-1.0.1" |
|
8315 | sources."minimalistic-assert-1.0.1" | |
8297 | sources."minimalistic-crypto-utils-1.0.1" |
|
8316 | sources."minimalistic-crypto-utils-1.0.1" | |
8298 | sources."minimatch-0.2.14" |
|
8317 | sources."minimatch-0.2.14" | |
@@ -8309,18 +8328,18 b' let' | |||||
8309 | ]; |
|
8328 | ]; | |
8310 | }) |
|
8329 | }) | |
8311 | sources."moment-2.24.0" |
|
8330 | sources."moment-2.24.0" | |
8312 |
sources."mousetrap-1.6. |
|
8331 | sources."mousetrap-1.6.3" | |
8313 | (sources."move-concurrently-1.0.1" // { |
|
8332 | (sources."move-concurrently-1.0.1" // { | |
8314 | dependencies = [ |
|
8333 | dependencies = [ | |
8315 |
sources."glob-7.1. |
|
8334 | sources."glob-7.1.4" | |
8316 | sources."minimatch-3.0.4" |
|
8335 | sources."minimatch-3.0.4" | |
8317 | sources."rimraf-2.6.3" |
|
8336 | sources."rimraf-2.6.3" | |
8318 | ]; |
|
8337 | ]; | |
8319 | }) |
|
8338 | }) | |
8320 | sources."ms-2.0.0" |
|
8339 | sources."ms-2.0.0" | |
8321 |
sources."nan-2.12 |
|
8340 | sources."nan-2.13.2" | |
8322 | sources."nanomatch-1.2.13" |
|
8341 | sources."nanomatch-1.2.13" | |
8323 |
sources."neo-async-2.6. |
|
8342 | sources."neo-async-2.6.1" | |
8324 | sources."nice-try-1.0.5" |
|
8343 | sources."nice-try-1.0.5" | |
8325 | sources."no-case-2.3.2" |
|
8344 | sources."no-case-2.3.2" | |
8326 | (sources."node-libs-browser-2.2.0" // { |
|
8345 | (sources."node-libs-browser-2.2.0" // { | |
@@ -8361,7 +8380,7 b' let' | |||||
8361 | sources."kind-of-3.2.2" |
|
8380 | sources."kind-of-3.2.2" | |
8362 | ]; |
|
8381 | ]; | |
8363 | }) |
|
8382 | }) | |
8364 |
sources."object-keys-1.1. |
|
8383 | sources."object-keys-1.1.1" | |
8365 | sources."object-visit-1.0.1" |
|
8384 | sources."object-visit-1.0.1" | |
8366 | sources."object.defaults-1.1.0" |
|
8385 | sources."object.defaults-1.1.0" | |
8367 | sources."object.getownpropertydescriptors-2.0.3" |
|
8386 | sources."object.getownpropertydescriptors-2.0.3" | |
@@ -8375,11 +8394,11 b' let' | |||||
8375 | sources."osenv-0.1.5" |
|
8394 | sources."osenv-0.1.5" | |
8376 | sources."p-defer-1.0.0" |
|
8395 | sources."p-defer-1.0.0" | |
8377 | sources."p-finally-1.0.0" |
|
8396 | sources."p-finally-1.0.0" | |
8378 |
sources."p-is-promise-2. |
|
8397 | sources."p-is-promise-2.1.0" | |
8379 | sources."p-limit-1.3.0" |
|
8398 | sources."p-limit-1.3.0" | |
8380 | sources."p-locate-2.0.0" |
|
8399 | sources."p-locate-2.0.0" | |
8381 | sources."p-try-1.0.0" |
|
8400 | sources."p-try-1.0.0" | |
8382 |
sources."pako-1.0. |
|
8401 | sources."pako-1.0.10" | |
8383 | (sources."parallel-transform-1.1.0" // { |
|
8402 | (sources."parallel-transform-1.1.0" // { | |
8384 | dependencies = [ |
|
8403 | dependencies = [ | |
8385 | sources."readable-stream-2.3.6" |
|
8404 | sources."readable-stream-2.3.6" | |
@@ -8582,7 +8601,7 b' let' | |||||
8582 | sources."request-2.81.0" |
|
8601 | sources."request-2.81.0" | |
8583 | sources."require-directory-2.1.1" |
|
8602 | sources."require-directory-2.1.1" | |
8584 | sources."require-main-filename-1.0.1" |
|
8603 | sources."require-main-filename-1.0.1" | |
8585 |
sources."resolve-1.10. |
|
8604 | sources."resolve-1.10.1" | |
8586 | sources."resolve-cwd-2.0.0" |
|
8605 | sources."resolve-cwd-2.0.0" | |
8587 | sources."resolve-dir-1.0.1" |
|
8606 | sources."resolve-dir-1.0.1" | |
8588 | sources."resolve-from-3.0.0" |
|
8607 | sources."resolve-from-3.0.0" | |
@@ -8598,12 +8617,12 b' let' | |||||
8598 | sources."sax-1.2.4" |
|
8617 | sources."sax-1.2.4" | |
8599 | (sources."schema-utils-0.4.7" // { |
|
8618 | (sources."schema-utils-0.4.7" // { | |
8600 | dependencies = [ |
|
8619 | dependencies = [ | |
8601 |
sources."ajv-6. |
|
8620 | sources."ajv-6.10.0" | |
8602 | ]; |
|
8621 | ]; | |
8603 | }) |
|
8622 | }) | |
8604 | sources."select-1.1.2" |
|
8623 | sources."select-1.1.2" | |
8605 |
sources."semver-5. |
|
8624 | sources."semver-5.7.0" | |
8606 |
sources."serialize-javascript-1. |
|
8625 | sources."serialize-javascript-1.7.0" | |
8607 | sources."set-blocking-2.0.0" |
|
8626 | sources."set-blocking-2.0.0" | |
8608 | (sources."set-value-2.0.0" // { |
|
8627 | (sources."set-value-2.0.0" // { | |
8609 | dependencies = [ |
|
8628 | dependencies = [ | |
@@ -8716,7 +8735,7 b' let' | |||||
8716 | sources."js-yaml-3.7.0" |
|
8735 | sources."js-yaml-3.7.0" | |
8717 | ]; |
|
8736 | ]; | |
8718 | }) |
|
8737 | }) | |
8719 |
sources."tapable-1.1. |
|
8738 | sources."tapable-1.1.3" | |
8720 | sources."through-2.3.8" |
|
8739 | sources."through-2.3.8" | |
8721 | (sources."through2-2.0.5" // { |
|
8740 | (sources."through2-2.0.5" // { | |
8722 | dependencies = [ |
|
8741 | dependencies = [ | |
@@ -8765,9 +8784,9 b' let' | |||||
8765 | sources."source-map-0.6.1" |
|
8784 | sources."source-map-0.6.1" | |
8766 | ]; |
|
8785 | ]; | |
8767 | }) |
|
8786 | }) | |
8768 |
(sources."uglify-js-3.4. |
|
8787 | (sources."uglify-js-3.4.10" // { | |
8769 | dependencies = [ |
|
8788 | dependencies = [ | |
8770 |
sources."commander-2.1 |
|
8789 | sources."commander-2.19.0" | |
8771 | sources."source-map-0.6.1" |
|
8790 | sources."source-map-0.6.1" | |
8772 | ]; |
|
8791 | ]; | |
8773 | }) |
|
8792 | }) | |
@@ -8800,7 +8819,7 b' let' | |||||
8800 | sources."has-values-0.1.4" |
|
8819 | sources."has-values-0.1.4" | |
8801 | ]; |
|
8820 | ]; | |
8802 | }) |
|
8821 | }) | |
8803 |
sources."upath-1.1. |
|
8822 | sources."upath-1.1.2" | |
8804 | sources."upper-case-1.1.3" |
|
8823 | sources."upper-case-1.1.3" | |
8805 | (sources."uri-js-4.2.2" // { |
|
8824 | (sources."uri-js-4.2.2" // { | |
8806 | dependencies = [ |
|
8825 | dependencies = [ | |
@@ -8819,9 +8838,9 b' let' | |||||
8819 | sources."util.promisify-1.0.0" |
|
8838 | sources."util.promisify-1.0.0" | |
8820 | sources."utila-0.4.0" |
|
8839 | sources."utila-0.4.0" | |
8821 | sources."uuid-3.3.2" |
|
8840 | sources."uuid-3.3.2" | |
8822 |
sources."v8-compile-cache-2.0. |
|
8841 | sources."v8-compile-cache-2.0.3" | |
8823 |
sources."v8flags-3.1. |
|
8842 | sources."v8flags-3.1.3" | |
8824 |
sources."vendors-1.0. |
|
8843 | sources."vendors-1.0.3" | |
8825 | (sources."verror-1.10.0" // { |
|
8844 | (sources."verror-1.10.0" // { | |
8826 | dependencies = [ |
|
8845 | dependencies = [ | |
8827 | sources."assert-plus-1.0.0" |
|
8846 | sources."assert-plus-1.0.0" | |
@@ -8836,7 +8855,7 b' let' | |||||
8836 | sources."waypoints-4.0.1" |
|
8855 | sources."waypoints-4.0.1" | |
8837 | (sources."webpack-4.23.1" // { |
|
8856 | (sources."webpack-4.23.1" // { | |
8838 | dependencies = [ |
|
8857 | dependencies = [ | |
8839 |
sources."ajv-6. |
|
8858 | sources."ajv-6.10.0" | |
8840 | ]; |
|
8859 | ]; | |
8841 | }) |
|
8860 | }) | |
8842 | (sources."webpack-cli-3.1.2" // { |
|
8861 | (sources."webpack-cli-3.1.2" // { | |
@@ -8876,7 +8895,7 b' let' | |||||
8876 | sources."which-module-2.0.0" |
|
8895 | sources."which-module-2.0.0" | |
8877 | sources."window-size-0.1.0" |
|
8896 | sources."window-size-0.1.0" | |
8878 | sources."wordwrap-0.0.2" |
|
8897 | sources."wordwrap-0.0.2" | |
8879 |
sources."worker-farm-1. |
|
8898 | sources."worker-farm-1.7.0" | |
8880 | (sources."wrap-ansi-2.1.0" // { |
|
8899 | (sources."wrap-ansi-2.1.0" // { | |
8881 | dependencies = [ |
|
8900 | dependencies = [ | |
8882 | sources."ansi-regex-2.1.1" |
|
8901 | sources."ansi-regex-2.1.1" | |
@@ -8892,9 +8911,9 b' let' | |||||
8892 | dependencies = [ |
|
8911 | dependencies = [ | |
8893 | sources."find-up-3.0.0" |
|
8912 | sources."find-up-3.0.0" | |
8894 | sources."locate-path-3.0.0" |
|
8913 | sources."locate-path-3.0.0" | |
8895 |
sources."p-limit-2. |
|
8914 | sources."p-limit-2.2.0" | |
8896 | sources."p-locate-3.0.0" |
|
8915 | sources."p-locate-3.0.0" | |
8897 |
sources."p-try-2. |
|
8916 | sources."p-try-2.2.0" | |
8898 | ]; |
|
8917 | ]; | |
8899 | }) |
|
8918 | }) | |
8900 | sources."yargs-parser-11.1.1" |
|
8919 | sources."yargs-parser-11.1.1" |
@@ -88,8 +88,8 b' self: super: {' | |||||
88 | name = "authomatic-0.1.0.post1"; |
|
88 | name = "authomatic-0.1.0.post1"; | |
89 | doCheck = false; |
|
89 | doCheck = false; | |
90 | src = fetchurl { |
|
90 | src = fetchurl { | |
91 | url = "https://code.rhodecode.com/upstream/authomatic/archive/90a9ce60cc405ae8a2bf5c3713acd5d78579a04e.tar.gz?md5=3c68720a1322b25254009518d1ff6801"; |
|
91 | url = "https://code.rhodecode.com/upstream/authomatic/artifacts/download/0-4fe9c041-a567-4f84-be4c-7efa2a606d3c.tar.gz?md5=f6bdc3c769688212db68233e8d2b0383"; | |
92 | sha256 = "1cgk0a86sbsjbri06gf5z5l4npwkjdxw6fdnwl4vvfmxs2sx9yxw"; |
|
92 | sha256 = "0pc716mva0ym6xd8jwzjbjp8dqxy9069wwwv2aqwb8lyhl4757ab"; | |
93 | }; |
|
93 | }; | |
94 | meta = { |
|
94 | meta = { | |
95 | license = [ pkgs.lib.licenses.mit ]; |
|
95 | license = [ pkgs.lib.licenses.mit ]; | |
@@ -277,8 +277,8 b' self: super: {' | |||||
277 | self."six" |
|
277 | self."six" | |
278 | ]; |
|
278 | ]; | |
279 | src = fetchurl { |
|
279 | src = fetchurl { | |
280 |
url = "https://code.rhodecode.com/upstream/configobj/arc |
|
280 | url = "https://code.rhodecode.com/upstream/configobj/artifacts/download/0-012de99a-b1e1-4f64-a5c0-07a98a41b324.tar.gz?md5=6a513f51fe04b2c18cf84c1395a7c626"; | |
281 | sha256 = "1hhcxirwvg58grlfr177b3awhbq8hlx1l3lh69ifl1ki7lfd1s1x"; |
|
281 | sha256 = "0kqfrdfr14mw8yd8qwq14dv2xghpkjmd3yjsy8dfcbvpcc17xnxp"; | |
282 | }; |
|
282 | }; | |
283 | meta = { |
|
283 | meta = { | |
284 | license = [ pkgs.lib.licenses.bsdOriginal ]; |
|
284 | license = [ pkgs.lib.licenses.bsdOriginal ]; | |
@@ -442,11 +442,11 b' self: super: {' | |||||
442 | }; |
|
442 | }; | |
443 | }; |
|
443 | }; | |
444 | "ecdsa" = super.buildPythonPackage { |
|
444 | "ecdsa" = super.buildPythonPackage { | |
445 | name = "ecdsa-0.13"; |
|
445 | name = "ecdsa-0.13.2"; | |
446 | doCheck = false; |
|
446 | doCheck = false; | |
447 | src = fetchurl { |
|
447 | src = fetchurl { | |
448 |
url = "https://files.pythonhosted.org/packages/ |
|
448 | url = "https://files.pythonhosted.org/packages/51/76/139bf6e9b7b6684d5891212cdbd9e0739f2bfc03f380a1a6ffa700f392ac/ecdsa-0.13.2.tar.gz"; | |
449 | sha256 = "1yj31j0asmrx4an9xvsaj2icdmzy6pw0glfpqrrkrphwdpi1xkv4"; |
|
449 | sha256 = "116qaq7bh4lcynzi613960jhsnn19v0kmsqwahiwjfj14gx4y0sw"; | |
450 | }; |
|
450 | }; | |
451 | meta = { |
|
451 | meta = { | |
452 | license = [ pkgs.lib.licenses.mit ]; |
|
452 | license = [ pkgs.lib.licenses.mit ]; | |
@@ -534,8 +534,8 b' self: super: {' | |||||
534 | self."configparser" |
|
534 | self."configparser" | |
535 | ]; |
|
535 | ]; | |
536 | src = fetchurl { |
|
536 | src = fetchurl { | |
537 | url = "https://code.rhodecode.com/upstream/entrypoints/archive/96e6d645684e1af3d7df5b5272f3fe85a546b233.tar.gz?md5=7db37771aea9ac9fefe093e5d6987313"; |
|
537 | url = "https://code.rhodecode.com/upstream/entrypoints/artifacts/download/0-8e9ee9e4-c4db-409c-b07e-81568fd1832d.tar.gz?md5=3a027b8ff1d257b91fe257de6c43357d"; | |
538 | sha256 = "0bihrdp8ahsys437kxdhk52gz6kib8rxjv71i93wkw7594fcaxll"; |
|
538 | sha256 = "0qih72n2myclanplqipqxpgpj9d2yhff1pz5d02zq1cfqyd173w5"; | |
539 | }; |
|
539 | }; | |
540 | meta = { |
|
540 | meta = { | |
541 | license = [ pkgs.lib.licenses.mit ]; |
|
541 | license = [ pkgs.lib.licenses.mit ]; | |
@@ -845,14 +845,14 b' self: super: {' | |||||
845 | }; |
|
845 | }; | |
846 | }; |
|
846 | }; | |
847 | "jupyter-core" = super.buildPythonPackage { |
|
847 | "jupyter-core" = super.buildPythonPackage { | |
848 |
name = "jupyter-core-4. |
|
848 | name = "jupyter-core-4.5.0"; | |
849 | doCheck = false; |
|
849 | doCheck = false; | |
850 | propagatedBuildInputs = [ |
|
850 | propagatedBuildInputs = [ | |
851 | self."traitlets" |
|
851 | self."traitlets" | |
852 | ]; |
|
852 | ]; | |
853 | src = fetchurl { |
|
853 | src = fetchurl { | |
854 |
url = "https://files.pythonhosted.org/packages/b |
|
854 | url = "https://files.pythonhosted.org/packages/4a/de/ff4ca734656d17ebe0450807b59d728f45277e2e7f4b82bc9aae6cb82961/jupyter_core-4.5.0.tar.gz"; | |
855 | sha256 = "1dy083rarba8prn9f9srxq3c7n7vyql02ycrqq306c40lr57aw5s"; |
|
855 | sha256 = "1xr4pbghwk5hayn5wwnhb7z95380r45p79gf5if5pi1akwg7qvic"; | |
856 | }; |
|
856 | }; | |
857 | meta = { |
|
857 | meta = { | |
858 | license = [ pkgs.lib.licenses.bsdOriginal ]; |
|
858 | license = [ pkgs.lib.licenses.bsdOriginal ]; | |
@@ -1092,15 +1092,15 b' self: super: {' | |||||
1092 | }; |
|
1092 | }; | |
1093 | }; |
|
1093 | }; | |
1094 | "pathlib2" = super.buildPythonPackage { |
|
1094 | "pathlib2" = super.buildPythonPackage { | |
1095 |
name = "pathlib2-2.3. |
|
1095 | name = "pathlib2-2.3.4"; | |
1096 | doCheck = false; |
|
1096 | doCheck = false; | |
1097 | propagatedBuildInputs = [ |
|
1097 | propagatedBuildInputs = [ | |
1098 | self."six" |
|
1098 | self."six" | |
1099 | self."scandir" |
|
1099 | self."scandir" | |
1100 | ]; |
|
1100 | ]; | |
1101 | src = fetchurl { |
|
1101 | src = fetchurl { | |
1102 |
url = "https://files.pythonhosted.org/packages/b |
|
1102 | url = "https://files.pythonhosted.org/packages/b5/f4/9c7cc726ece2498b6c8b62d3262aa43f59039b953fe23c9964ac5e18d40b/pathlib2-2.3.4.tar.gz"; | |
1103 | sha256 = "0hpp92vqqgcd8h92msm9slv161b1q160igjwnkf2ag6cx0c96695"; |
|
1103 | sha256 = "1y0f9rkm1924zrc5dn4bwxlhgdkbml82lkcc28l5rgmr7d918q24"; | |
1104 | }; |
|
1104 | }; | |
1105 | meta = { |
|
1105 | meta = { | |
1106 | license = [ pkgs.lib.licenses.mit ]; |
|
1106 | license = [ pkgs.lib.licenses.mit ]; | |
@@ -1212,11 +1212,11 b' self: super: {' | |||||
1212 | }; |
|
1212 | }; | |
1213 | }; |
|
1213 | }; | |
1214 | "psycopg2" = super.buildPythonPackage { |
|
1214 | "psycopg2" = super.buildPythonPackage { | |
1215 |
name = "psycopg2-2.8. |
|
1215 | name = "psycopg2-2.8.3"; | |
1216 | doCheck = false; |
|
1216 | doCheck = false; | |
1217 | src = fetchurl { |
|
1217 | src = fetchurl { | |
1218 |
url = "https://files.pythonhosted.org/packages/2 |
|
1218 | url = "https://files.pythonhosted.org/packages/5c/1c/6997288da181277a0c29bc39a5f9143ff20b8c99f2a7d059cfb55163e165/psycopg2-2.8.3.tar.gz"; | |
1219 | sha256 = "122mn2z3r0zgs8jyq682jjjr6vq5690qmxqf22gj6g41dwdz5b2w"; |
|
1219 | sha256 = "0ms4kx0p5n281l89awccix4d05ybmdngnjjpi9jbzd0rhf1nwyl9"; | |
1220 | }; |
|
1220 | }; | |
1221 | meta = { |
|
1221 | meta = { | |
1222 | license = [ pkgs.lib.licenses.zpl21 { fullName = "GNU Library or Lesser General Public License (LGPL)"; } { fullName = "LGPL with exceptions or ZPL"; } ]; |
|
1222 | license = [ pkgs.lib.licenses.zpl21 { fullName = "GNU Library or Lesser General Public License (LGPL)"; } { fullName = "LGPL with exceptions or ZPL"; } ]; | |
@@ -1329,11 +1329,11 b' self: super: {' | |||||
1329 | }; |
|
1329 | }; | |
1330 | }; |
|
1330 | }; | |
1331 | "pygments" = super.buildPythonPackage { |
|
1331 | "pygments" = super.buildPythonPackage { | |
1332 |
name = "pygments-2. |
|
1332 | name = "pygments-2.4.2"; | |
1333 | doCheck = false; |
|
1333 | doCheck = false; | |
1334 | src = fetchurl { |
|
1334 | src = fetchurl { | |
1335 |
url = "https://files.pythonhosted.org/packages/6 |
|
1335 | url = "https://files.pythonhosted.org/packages/7e/ae/26808275fc76bf2832deb10d3a3ed3107bc4de01b85dcccbe525f2cd6d1e/Pygments-2.4.2.tar.gz"; | |
1336 | sha256 = "0ji87g09jph8jqcvclgb02qvxasdnr9pzvk90rl66d90yqcxmyjz"; |
|
1336 | sha256 = "15v2sqm5g12bqa0c7wikfh9ck2nl97ayizy1hpqhmws5gqalq748"; | |
1337 | }; |
|
1337 | }; | |
1338 | meta = { |
|
1338 | meta = { | |
1339 | license = [ pkgs.lib.licenses.bsdOriginal ]; |
|
1339 | license = [ pkgs.lib.licenses.bsdOriginal ]; | |
@@ -1395,21 +1395,6 b' self: super: {' | |||||
1395 | license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ]; |
|
1395 | license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ]; | |
1396 | }; |
|
1396 | }; | |
1397 | }; |
|
1397 | }; | |
1398 | "pyramid-beaker" = super.buildPythonPackage { |
|
|||
1399 | name = "pyramid-beaker-0.8"; |
|
|||
1400 | doCheck = false; |
|
|||
1401 | propagatedBuildInputs = [ |
|
|||
1402 | self."pyramid" |
|
|||
1403 | self."beaker" |
|
|||
1404 | ]; |
|
|||
1405 | src = fetchurl { |
|
|||
1406 | url = "https://files.pythonhosted.org/packages/d9/6e/b85426e00fd3d57f4545f74e1c3828552d8700f13ededeef9233f7bca8be/pyramid_beaker-0.8.tar.gz"; |
|
|||
1407 | sha256 = "0hflx3qkcdml1mwpq53sz46s7jickpfn0zy0ns2c7j445j66bp3p"; |
|
|||
1408 | }; |
|
|||
1409 | meta = { |
|
|||
1410 | license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ]; |
|
|||
1411 | }; |
|
|||
1412 | }; |
|
|||
1413 | "pyramid-debugtoolbar" = super.buildPythonPackage { |
|
1398 | "pyramid-debugtoolbar" = super.buildPythonPackage { | |
1414 | name = "pyramid-debugtoolbar-4.5"; |
|
1399 | name = "pyramid-debugtoolbar-4.5"; | |
1415 | doCheck = false; |
|
1400 | doCheck = false; | |
@@ -1783,6 +1768,7 b' self: super: {' | |||||
1783 | self."msgpack-python" |
|
1768 | self."msgpack-python" | |
1784 | self."pyotp" |
|
1769 | self."pyotp" | |
1785 | self."packaging" |
|
1770 | self."packaging" | |
|
1771 | self."pathlib2" | |||
1786 | self."paste" |
|
1772 | self."paste" | |
1787 | self."pastedeploy" |
|
1773 | self."pastedeploy" | |
1788 | self."pastescript" |
|
1774 | self."pastescript" | |
@@ -1793,7 +1779,6 b' self: super: {' | |||||
1793 | self."pycrypto" |
|
1779 | self."pycrypto" | |
1794 | self."pygments" |
|
1780 | self."pygments" | |
1795 | self."pyparsing" |
|
1781 | self."pyparsing" | |
1796 | self."pyramid-beaker" |
|
|||
1797 | self."pyramid-debugtoolbar" |
|
1782 | self."pyramid-debugtoolbar" | |
1798 | self."pyramid-mako" |
|
1783 | self."pyramid-mako" | |
1799 | self."pyramid" |
|
1784 | self."pyramid" | |
@@ -1886,8 +1871,8 b' self: super: {' | |||||
1886 | self."elasticsearch1-dsl" |
|
1871 | self."elasticsearch1-dsl" | |
1887 | ]; |
|
1872 | ]; | |
1888 | src = fetchurl { |
|
1873 | src = fetchurl { | |
1889 |
url = "https://code.rhodecode.com/rhodecode-tools-ce/arc |
|
1874 | url = "https://code.rhodecode.com/rhodecode-tools-ce/artifacts/download/0-10ac93f4-bb7d-4b97-baea-68110743dd5a.tar.gz?md5=962dc77c06aceee62282b98d33149661"; | |
1890 | sha256 = "1k8l3s4mvshza1zay6dfxprq54fyb5dc85dqdva9wa3f466y0adk"; |
|
1875 | sha256 = "1vfhgf46inbx7jvlfx4fdzh3vz7lh37r291gzb5hx447pfm3qllg"; | |
1891 | }; |
|
1876 | }; | |
1892 | meta = { |
|
1877 | meta = { | |
1893 | license = [ { fullName = "Apache 2.0 and Proprietary"; } ]; |
|
1878 | license = [ { fullName = "Apache 2.0 and Proprietary"; } ]; | |
@@ -2001,25 +1986,25 b' self: super: {' | |||||
2001 | }; |
|
1986 | }; | |
2002 | }; |
|
1987 | }; | |
2003 | "subprocess32" = super.buildPythonPackage { |
|
1988 | "subprocess32" = super.buildPythonPackage { | |
2004 |
name = "subprocess32-3.5. |
|
1989 | name = "subprocess32-3.5.4"; | |
2005 | doCheck = false; |
|
1990 | doCheck = false; | |
2006 | src = fetchurl { |
|
1991 | src = fetchurl { | |
2007 | url = "https://files.pythonhosted.org/packages/be/2b/beeba583e9877e64db10b52a96915afc0feabf7144dcbf2a0d0ea68bf73d/subprocess32-3.5.3.tar.gz"; |
|
1992 | url = "https://files.pythonhosted.org/packages/32/c8/564be4d12629b912ea431f1a50eb8b3b9d00f1a0b1ceff17f266be190007/subprocess32-3.5.4.tar.gz"; | |
2008 | sha256 = "1hr5fan8i719hmlmz73hf8rhq74014w07d8ryg7krvvf6692kj3b"; |
|
1993 | sha256 = "17f7mvwx2271s1wrl0qac3wjqqnrqag866zs3qc8v5wp0k43fagb"; | |
2009 | }; |
|
1994 | }; | |
2010 | meta = { |
|
1995 | meta = { | |
2011 | license = [ pkgs.lib.licenses.psfl ]; |
|
1996 | license = [ pkgs.lib.licenses.psfl ]; | |
2012 | }; |
|
1997 | }; | |
2013 | }; |
|
1998 | }; | |
2014 | "supervisor" = super.buildPythonPackage { |
|
1999 | "supervisor" = super.buildPythonPackage { | |
2015 |
name = "supervisor-4.0. |
|
2000 | name = "supervisor-4.0.3"; | |
2016 | doCheck = false; |
|
2001 | doCheck = false; | |
2017 | propagatedBuildInputs = [ |
|
2002 | propagatedBuildInputs = [ | |
2018 | self."meld3" |
|
2003 | self."meld3" | |
2019 | ]; |
|
2004 | ]; | |
2020 | src = fetchurl { |
|
2005 | src = fetchurl { | |
2021 |
url = "https://files.pythonhosted.org/packages/ |
|
2006 | url = "https://files.pythonhosted.org/packages/97/48/f38bf70bd9282d1a18d591616557cc1a77a1c627d57dff66ead65c891dc8/supervisor-4.0.3.tar.gz"; | |
2022 | sha256 = "0xg5c41wd51wnf2ihc47gwkwjf29zq2q44lcwx8di2gvliyla12n"; |
|
2007 | sha256 = "17hla7mx6w5m5jzkkjxgqa8wpswqmfhbhf49f692hw78fg0ans7p"; | |
2023 | }; |
|
2008 | }; | |
2024 | meta = { |
|
2009 | meta = { | |
2025 | license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ]; |
|
2010 | license = [ { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ]; | |
@@ -2159,11 +2144,11 b' self: super: {' | |||||
2159 | }; |
|
2144 | }; | |
2160 | }; |
|
2145 | }; | |
2161 | "waitress" = super.buildPythonPackage { |
|
2146 | "waitress" = super.buildPythonPackage { | |
2162 |
name = "waitress-1. |
|
2147 | name = "waitress-1.3.0"; | |
2163 | doCheck = false; |
|
2148 | doCheck = false; | |
2164 | src = fetchurl { |
|
2149 | src = fetchurl { | |
2165 |
url = "https://files.pythonhosted.org/packages/3 |
|
2150 | url = "https://files.pythonhosted.org/packages/43/50/9890471320d5ad22761ae46661cf745f487b1c8c4ec49352b99e1078b970/waitress-1.3.0.tar.gz"; | |
2166 | sha256 = "1a85gyji0kajc3p0s1pwwfm06w4wfxjkvvl4rnrz3h164kbd6g6k"; |
|
2151 | sha256 = "09j5dzbbcxib7vdskhx39s1qsydlr4n2p2png71d7mjnr9pnwajf"; | |
2167 | }; |
|
2152 | }; | |
2168 | meta = { |
|
2153 | meta = { | |
2169 | license = [ pkgs.lib.licenses.zpl21 ]; |
|
2154 | license = [ pkgs.lib.licenses.zpl21 ]; |
@@ -2,7 +2,7 b'' | |||||
2 |
|
2 | |||
3 | amqp==2.3.1 |
|
3 | amqp==2.3.1 | |
4 | # not released authomatic that has updated some oauth providers |
|
4 | # not released authomatic that has updated some oauth providers | |
5 |
https://code.rhodecode.com/upstream/authomatic/ar |
|
5 | https://code.rhodecode.com/upstream/authomatic/artifacts/download/0-4fe9c041-a567-4f84-be4c-7efa2a606d3c.tar.gz?md5=f6bdc3c769688212db68233e8d2b0383#egg=authomatic==0.1.0.post1 | |
6 |
|
6 | |||
7 | babel==1.3 |
|
7 | babel==1.3 | |
8 | beaker==1.9.1 |
|
8 | beaker==1.9.1 | |
@@ -12,7 +12,7 b' channelstream==0.5.2' | |||||
12 | click==7.0 |
|
12 | click==7.0 | |
13 | colander==1.7.0 |
|
13 | colander==1.7.0 | |
14 | # our custom configobj |
|
14 | # our custom configobj | |
15 |
https://code.rhodecode.com/upstream/configobj/ar |
|
15 | https://code.rhodecode.com/upstream/configobj/artifacts/download/0-012de99a-b1e1-4f64-a5c0-07a98a41b324.tar.gz?md5=6a513f51fe04b2c18cf84c1395a7c626#egg=configobj==5.0.6 | |
16 | cssselect==1.0.3 |
|
16 | cssselect==1.0.3 | |
17 | cryptography==2.6.1 |
|
17 | cryptography==2.6.1 | |
18 | decorator==4.1.2 |
|
18 | decorator==4.1.2 | |
@@ -34,6 +34,7 b' markupsafe==1.1.0' | |||||
34 | msgpack-python==0.5.6 |
|
34 | msgpack-python==0.5.6 | |
35 | pyotp==2.2.7 |
|
35 | pyotp==2.2.7 | |
36 | packaging==15.2 |
|
36 | packaging==15.2 | |
|
37 | pathlib2==2.3.4 | |||
37 | paste==3.0.8 |
|
38 | paste==3.0.8 | |
38 | pastedeploy==2.0.1 |
|
39 | pastedeploy==2.0.1 | |
39 | pastescript==3.1.0 |
|
40 | pastescript==3.1.0 | |
@@ -42,9 +43,8 b' psutil==5.5.1' | |||||
42 | py-bcrypt==0.4 |
|
43 | py-bcrypt==0.4 | |
43 | pycurl==7.43.0.2 |
|
44 | pycurl==7.43.0.2 | |
44 | pycrypto==2.6.1 |
|
45 | pycrypto==2.6.1 | |
45 |
pygments==2. |
|
46 | pygments==2.4.2 | |
46 | pyparsing==2.3.0 |
|
47 | pyparsing==2.3.0 | |
47 | pyramid-beaker==0.8 |
|
|||
48 | pyramid-debugtoolbar==4.5.0 |
|
48 | pyramid-debugtoolbar==4.5.0 | |
49 | pyramid-mako==1.0.2 |
|
49 | pyramid-mako==1.0.2 | |
50 | pyramid==1.10.4 |
|
50 | pyramid==1.10.4 | |
@@ -66,8 +66,8 b' simplejson==3.16.0' | |||||
66 | six==1.11.0 |
|
66 | six==1.11.0 | |
67 | sqlalchemy==1.1.18 |
|
67 | sqlalchemy==1.1.18 | |
68 | sshpubkeys==3.1.0 |
|
68 | sshpubkeys==3.1.0 | |
69 |
subprocess32==3.5. |
|
69 | subprocess32==3.5.4 | |
70 |
supervisor==4.0. |
|
70 | supervisor==4.0.3 | |
71 | translationstring==1.3 |
|
71 | translationstring==1.3 | |
72 | urllib3==1.24.1 |
|
72 | urllib3==1.24.1 | |
73 | urlobject==2.4.3 |
|
73 | urlobject==2.4.3 | |
@@ -87,11 +87,11 b' zope.interface==4.6.0' | |||||
87 | mysql-python==1.2.5 |
|
87 | mysql-python==1.2.5 | |
88 | pymysql==0.8.1 |
|
88 | pymysql==0.8.1 | |
89 | pysqlite==2.8.3 |
|
89 | pysqlite==2.8.3 | |
90 |
psycopg2==2.8. |
|
90 | psycopg2==2.8.3 | |
91 |
|
91 | |||
92 | # IPYTHON RENDERING |
|
92 | # IPYTHON RENDERING | |
93 | # entrypoints backport, pypi version doesn't support egg installs |
|
93 | # entrypoints backport, pypi version doesn't support egg installs | |
94 |
https://code.rhodecode.com/upstream/entrypoints/ar |
|
94 | https://code.rhodecode.com/upstream/entrypoints/artifacts/download/0-8e9ee9e4-c4db-409c-b07e-81568fd1832d.tar.gz?md5=3a027b8ff1d257b91fe257de6c43357d#egg=entrypoints==0.2.2.rhodecode-upstream1 | |
95 | nbconvert==5.3.1 |
|
95 | nbconvert==5.3.1 | |
96 | nbformat==4.4.0 |
|
96 | nbformat==4.4.0 | |
97 | jupyter_client==5.0.0 |
|
97 | jupyter_client==5.0.0 | |
@@ -105,14 +105,14 b' bumpversion==0.5.3' | |||||
105 | gevent==1.4.0 |
|
105 | gevent==1.4.0 | |
106 | greenlet==0.4.15 |
|
106 | greenlet==0.4.15 | |
107 | gunicorn==19.9.0 |
|
107 | gunicorn==19.9.0 | |
108 |
waitress==1. |
|
108 | waitress==1.3.0 | |
109 |
|
109 | |||
110 | ## debug |
|
110 | ## debug | |
111 | ipdb==0.12.0 |
|
111 | ipdb==0.12.0 | |
112 | ipython==5.1.0 |
|
112 | ipython==5.1.0 | |
113 |
|
113 | |||
114 | ## rhodecode-tools, special case |
|
114 | ## rhodecode-tools, special case | |
115 |
https://code.rhodecode.com/rhodecode-tools-ce/ar |
|
115 | https://code.rhodecode.com/rhodecode-tools-ce/artifacts/download/0-10ac93f4-bb7d-4b97-baea-68110743dd5a.tar.gz?md5=962dc77c06aceee62282b98d33149661#egg=rhodecode-tools==1.2.1 | |
116 |
|
116 | |||
117 | ## appenlight |
|
117 | ## appenlight | |
118 | appenlight-client==0.6.26 |
|
118 | appenlight-client==0.6.26 |
@@ -5,15 +5,15 b' attrs==18.2.0' | |||||
5 | billiard==3.5.0.3 |
|
5 | billiard==3.5.0.3 | |
6 | chameleon==2.24 |
|
6 | chameleon==2.24 | |
7 | cffi==1.12.2 |
|
7 | cffi==1.12.2 | |
8 | ecdsa==0.13 |
|
8 | ecdsa==0.13.2 | |
9 | hupper==1.6.1 |
|
9 | hupper==1.6.1 | |
10 | gnureadline==6.3.8 |
|
10 | gnureadline==6.3.8 | |
11 | jinja2==2.9.6 |
|
11 | jinja2==2.9.6 | |
12 | jsonschema==2.6.0 |
|
12 | jsonschema==2.6.0 | |
13 | pathlib2==2.3.3 |
|
|||
14 | pyramid-jinja2==2.7 |
|
13 | pyramid-jinja2==2.7 | |
|
14 | pluggy==0.11.0 | |||
15 | setproctitle==1.1.10 |
|
15 | setproctitle==1.1.10 | |
16 | scandir==1.10.0 |
|
16 | scandir==1.10.0 | |
17 | tempita==0.5.2 |
|
17 | tempita==0.5.2 | |
18 | vine==1.3.0 |
|
18 | vine==1.3.0 | |
19 | configparser==3.7.4 No newline at end of file |
|
19 | configparser==3.7.4 |
@@ -45,7 +45,7 b' PYRAMID_SETTINGS = {}' | |||||
45 | EXTENSIONS = {} |
|
45 | EXTENSIONS = {} | |
46 |
|
46 | |||
47 | __version__ = ('.'.join((str(each) for each in VERSION[:3]))) |
|
47 | __version__ = ('.'.join((str(each) for each in VERSION[:3]))) | |
48 |
__dbversion__ = 9 |
|
48 | __dbversion__ = 98 # defines current db version for migrations | |
49 | __platform__ = platform.system() |
|
49 | __platform__ = platform.system() | |
50 | __license__ = 'AGPLv3, and Commercial License' |
|
50 | __license__ = 'AGPLv3, and Commercial License' | |
51 | __author__ = 'RhodeCode GmbH' |
|
51 | __author__ = 'RhodeCode GmbH' |
@@ -37,11 +37,11 b' class TestCommentCommit(object):' | |||||
37 | assert_error(id_, expected, given=response.body) |
|
37 | assert_error(id_, expected, given=response.body) | |
38 |
|
38 | |||
39 | @pytest.mark.parametrize("commit_id, expected_err", [ |
|
39 | @pytest.mark.parametrize("commit_id, expected_err", [ | |
40 | ('abcabca', {'hg': 'Commit {commit} does not exist for {repo}', |
|
40 | ('abcabca', {'hg': 'Commit {commit} does not exist for `{repo}`', | |
41 | 'git': 'Commit {commit} does not exist for {repo}', |
|
41 | 'git': 'Commit {commit} does not exist for `{repo}`', | |
42 | 'svn': 'Commit id {commit} not understood.'}), |
|
42 | 'svn': 'Commit id {commit} not understood.'}), | |
43 | ('idontexist', {'hg': 'Commit {commit} does not exist for {repo}', |
|
43 | ('idontexist', {'hg': 'Commit {commit} does not exist for `{repo}`', | |
44 | 'git': 'Commit {commit} does not exist for {repo}', |
|
44 | 'git': 'Commit {commit} does not exist for `{repo}`', | |
45 | 'svn': 'Commit id {commit} not understood.'}), |
|
45 | 'svn': 'Commit id {commit} not understood.'}), | |
46 | ]) |
|
46 | ]) | |
47 | def test_api_comment_commit_wrong_hash(self, backend, commit_id, expected_err): |
|
47 | def test_api_comment_commit_wrong_hash(self, backend, commit_id, expected_err): | |
@@ -53,7 +53,7 b' class TestCommentCommit(object):' | |||||
53 |
|
53 | |||
54 | expected_err = expected_err[backend.alias] |
|
54 | expected_err = expected_err[backend.alias] | |
55 | expected_err = expected_err.format( |
|
55 | expected_err = expected_err.format( | |
56 | repo=backend.repo.scm_instance(), commit=commit_id) |
|
56 | repo=backend.repo.scm_instance().name, commit=commit_id) | |
57 | assert_error(id_, expected_err, given=response.body) |
|
57 | assert_error(id_, expected_err, given=response.body) | |
58 |
|
58 | |||
59 | @pytest.mark.parametrize("status_change, message, commit_id", [ |
|
59 | @pytest.mark.parametrize("status_change, message, commit_id", [ |
@@ -44,6 +44,7 b' class TestGetRepo(object):' | |||||
44 | self, apikey_attr, expect_secrets, cache_param, backend, |
|
44 | self, apikey_attr, expect_secrets, cache_param, backend, | |
45 | user_util): |
|
45 | user_util): | |
46 | repo = backend.create_repo() |
|
46 | repo = backend.create_repo() | |
|
47 | repo_id = repo.repo_id | |||
47 | usr = UserModel().get_by_username(TEST_USER_ADMIN_LOGIN) |
|
48 | usr = UserModel().get_by_username(TEST_USER_ADMIN_LOGIN) | |
48 | group = user_util.create_user_group(members=[usr]) |
|
49 | group = user_util.create_user_group(members=[usr]) | |
49 | user_util.grant_user_group_permission_to_repo( |
|
50 | user_util.grant_user_group_permission_to_repo( | |
@@ -64,6 +65,8 b' class TestGetRepo(object):' | |||||
64 | permissions = expected_permissions(repo) |
|
65 | permissions = expected_permissions(repo) | |
65 |
|
66 | |||
66 | followers = [] |
|
67 | followers = [] | |
|
68 | ||||
|
69 | repo = RepoModel().get(repo_id) | |||
67 | for user in repo.followers: |
|
70 | for user in repo.followers: | |
68 | followers.append(user.user.get_api_data( |
|
71 | followers.append(user.user.get_api_data( | |
69 | include_secrets=expect_secrets)) |
|
72 | include_secrets=expect_secrets)) | |
@@ -84,6 +87,7 b' class TestGetRepo(object):' | |||||
84 | # TODO: Depending on which tests are running before this one, we |
|
87 | # TODO: Depending on which tests are running before this one, we | |
85 | # start with a different number of permissions in the database. |
|
88 | # start with a different number of permissions in the database. | |
86 | repo = RepoModel().get_by_repo_name(backend.repo_name) |
|
89 | repo = RepoModel().get_by_repo_name(backend.repo_name) | |
|
90 | repo_id = repo.repo_id | |||
87 | permission_count = len(repo.repo_to_perm) |
|
91 | permission_count = len(repo.repo_to_perm) | |
88 |
|
92 | |||
89 | RepoModel().grant_user_permission(repo=backend.repo_name, |
|
93 | RepoModel().grant_user_permission(repo=backend.repo_name, | |
@@ -102,6 +106,8 b' class TestGetRepo(object):' | |||||
102 | permissions = expected_permissions(repo) |
|
106 | permissions = expected_permissions(repo) | |
103 |
|
107 | |||
104 | followers = [] |
|
108 | followers = [] | |
|
109 | ||||
|
110 | repo = RepoModel().get(repo_id) | |||
105 | for user in repo.followers: |
|
111 | for user in repo.followers: | |
106 | followers.append(user.user.get_api_data()) |
|
112 | followers.append(user.user.get_api_data()) | |
107 |
|
113 |
@@ -444,7 +444,7 b' def get_repo_nodes(request, apiuser, rep' | |||||
444 | result: [ |
|
444 | result: [ | |
445 | { |
|
445 | { | |
446 | "binary": false, |
|
446 | "binary": false, | |
447 |
"content": "File line |
|
447 | "content": "File line", | |
448 | "extension": "md", |
|
448 | "extension": "md", | |
449 | "lines": 2, |
|
449 | "lines": 2, | |
450 | "md5": "059fa5d29b19c0657e384749480f6422", |
|
450 | "md5": "059fa5d29b19c0657e384749480f6422", | |
@@ -529,6 +529,7 b' def get_repo_file(request, apiuser, repo' | |||||
529 | :param cache: Use internal caches for fetching files. If disabled fetching |
|
529 | :param cache: Use internal caches for fetching files. If disabled fetching | |
530 | files is slower but more memory efficient |
|
530 | files is slower but more memory efficient | |
531 | :type cache: Optional(bool) |
|
531 | :type cache: Optional(bool) | |
|
532 | ||||
532 | Example output: |
|
533 | Example output: | |
533 |
|
534 | |||
534 | .. code-block:: bash |
|
535 | .. code-block:: bash |
@@ -168,6 +168,28 b' class BaseAppView(object):' | |||||
168 | from rhodecode.lib.base import attach_context_attributes |
|
168 | from rhodecode.lib.base import attach_context_attributes | |
169 | attach_context_attributes(c, self.request, self.request.user.user_id) |
|
169 | attach_context_attributes(c, self.request, self.request.user.user_id) | |
170 |
|
170 | |||
|
171 | c.is_super_admin = c.auth_user.is_admin | |||
|
172 | ||||
|
173 | c.can_create_repo = c.is_super_admin | |||
|
174 | c.can_create_repo_group = c.is_super_admin | |||
|
175 | c.can_create_user_group = c.is_super_admin | |||
|
176 | ||||
|
177 | c.is_delegated_admin = False | |||
|
178 | ||||
|
179 | if not c.auth_user.is_default and not c.is_super_admin: | |||
|
180 | c.can_create_repo = h.HasPermissionAny('hg.create.repository')( | |||
|
181 | user=self.request.user) | |||
|
182 | repositories = c.auth_user.repositories_admin or c.can_create_repo | |||
|
183 | ||||
|
184 | c.can_create_repo_group = h.HasPermissionAny('hg.repogroup.create.true')( | |||
|
185 | user=self.request.user) | |||
|
186 | repository_groups = c.auth_user.repository_groups_admin or c.can_create_repo_group | |||
|
187 | ||||
|
188 | c.can_create_user_group = h.HasPermissionAny('hg.usergroup.create.true')( | |||
|
189 | user=self.request.user) | |||
|
190 | user_groups = c.auth_user.user_groups_admin or c.can_create_user_group | |||
|
191 | # delegated admin can create, or manage some objects | |||
|
192 | c.is_delegated_admin = repositories or repository_groups or user_groups | |||
171 | return c |
|
193 | return c | |
172 |
|
194 | |||
173 | def _get_template_context(self, tmpl_args, **kwargs): |
|
195 | def _get_template_context(self, tmpl_args, **kwargs): | |
@@ -215,12 +237,17 b' class RepoAppView(BaseAppView):' | |||||
215 | c.rhodecode_db_repo = self.db_repo |
|
237 | c.rhodecode_db_repo = self.db_repo | |
216 | c.repo_name = self.db_repo_name |
|
238 | c.repo_name = self.db_repo_name | |
217 | c.repository_pull_requests = self.db_repo_pull_requests |
|
239 | c.repository_pull_requests = self.db_repo_pull_requests | |
|
240 | c.repository_is_user_following = ScmModel().is_following_repo( | |||
|
241 | self.db_repo_name, self._rhodecode_user.user_id) | |||
218 | self.path_filter = PathFilter(None) |
|
242 | self.path_filter = PathFilter(None) | |
219 |
|
243 | |||
220 | c.repository_requirements_missing = {} |
|
244 | c.repository_requirements_missing = {} | |
221 | try: |
|
245 | try: | |
222 | self.rhodecode_vcs_repo = self.db_repo.scm_instance() |
|
246 | self.rhodecode_vcs_repo = self.db_repo.scm_instance() | |
223 | if self.rhodecode_vcs_repo: |
|
247 | # NOTE(marcink): | |
|
248 | # comparison to None since if it's an object __bool__ is expensive to | |||
|
249 | # calculate | |||
|
250 | if self.rhodecode_vcs_repo is not None: | |||
224 | path_perms = self.rhodecode_vcs_repo.get_path_permissions( |
|
251 | path_perms = self.rhodecode_vcs_repo.get_path_permissions( | |
225 | c.auth_user.username) |
|
252 | c.auth_user.username) | |
226 | self.path_filter = PathFilter(path_perms) |
|
253 | self.path_filter = PathFilter(path_perms) |
@@ -85,8 +85,6 b' class NavigationRegistry(object):' | |||||
85 | 'admin_settings_hooks'), |
|
85 | 'admin_settings_hooks'), | |
86 | NavEntry('search', _('Full Text Search'), |
|
86 | NavEntry('search', _('Full Text Search'), | |
87 | 'admin_settings_search'), |
|
87 | 'admin_settings_search'), | |
88 | NavEntry('integrations', _('Integrations'), |
|
|||
89 | 'global_integrations_home'), |
|
|||
90 | NavEntry('system', _('System Info'), |
|
88 | NavEntry('system', _('System Info'), | |
91 | 'admin_settings_system'), |
|
89 | 'admin_settings_system'), | |
92 | NavEntry('exceptions', _('Exceptions Tracker'), |
|
90 | NavEntry('exceptions', _('Exceptions Tracker'), |
@@ -46,10 +46,10 b' def route_path(name, params=None, **kwar' | |||||
46 |
|
46 | |||
47 | class TestAdminMainView(TestController): |
|
47 | class TestAdminMainView(TestController): | |
48 |
|
48 | |||
49 |
def test_ |
|
49 | def test_access_admin_home(self): | |
50 | self.log_user() |
|
50 | self.log_user() | |
51 |
response = self.app.get(route_path('admin_home'), status= |
|
51 | response = self.app.get(route_path('admin_home'), status=200) | |
52 | assert response.location.endswith('/audit_logs') |
|
52 | response.mustcontain("Administration area") | |
53 |
|
53 | |||
54 | def test_redirect_pull_request_view(self, view): |
|
54 | def test_redirect_pull_request_view(self, view): | |
55 | self.log_user() |
|
55 | self.log_user() |
@@ -20,12 +20,12 b'' | |||||
20 |
|
20 | |||
21 | import logging |
|
21 | import logging | |
22 |
|
22 | |||
23 | from pyramid.httpexceptions import HTTPFound |
|
23 | from pyramid.httpexceptions import HTTPFound, HTTPNotFound | |
24 | from pyramid.view import view_config |
|
24 | from pyramid.view import view_config | |
25 |
|
25 | |||
26 | from rhodecode.apps._base import BaseAppView |
|
26 | from rhodecode.apps._base import BaseAppView | |
27 | from rhodecode.lib import helpers as h |
|
27 | from rhodecode.lib import helpers as h | |
28 |
from rhodecode.lib.auth import (LoginRequired, |
|
28 | from rhodecode.lib.auth import (LoginRequired, NotAnonymous) | |
29 | from rhodecode.model.db import PullRequest |
|
29 | from rhodecode.model.db import PullRequest | |
30 |
|
30 | |||
31 |
|
31 | |||
@@ -33,14 +33,23 b' log = logging.getLogger(__name__)' | |||||
33 |
|
33 | |||
34 |
|
34 | |||
35 | class AdminMainView(BaseAppView): |
|
35 | class AdminMainView(BaseAppView): | |
|
36 | def load_default_context(self): | |||
|
37 | c = self._get_local_tmpl_context() | |||
|
38 | return c | |||
36 |
|
39 | |||
37 | @LoginRequired() |
|
40 | @LoginRequired() | |
38 | @HasPermissionAllDecorator('hg.admin') |
|
41 | @NotAnonymous() | |
39 | @view_config( |
|
42 | @view_config( | |
40 |
route_name='admin_home', request_method='GET' |
|
43 | route_name='admin_home', request_method='GET', | |
|
44 | renderer='rhodecode:templates/admin/main.mako') | |||
41 | def admin_main(self): |
|
45 | def admin_main(self): | |
42 | # redirect _admin to audit logs... |
|
46 | c = self.load_default_context() | |
43 | raise HTTPFound(h.route_path('admin_audit_logs')) |
|
47 | c.active = 'admin' | |
|
48 | ||||
|
49 | if not (c.is_super_admin or c.is_delegated_admin): | |||
|
50 | raise HTTPNotFound() | |||
|
51 | ||||
|
52 | return self._get_template_context(c) | |||
44 |
|
53 | |||
45 | @LoginRequired() |
|
54 | @LoginRequired() | |
46 | @view_config(route_name='pull_requests_global_0', request_method='GET') |
|
55 | @view_config(route_name='pull_requests_global_0', request_method='GET') | |
@@ -49,8 +58,7 b' class AdminMainView(BaseAppView):' | |||||
49 | def pull_requests(self): |
|
58 | def pull_requests(self): | |
50 | """ |
|
59 | """ | |
51 | Global redirect for Pull Requests |
|
60 | Global redirect for Pull Requests | |
52 |
|
61 | pull_request_id: id of pull requests in the system | ||
53 | :param pull_request_id: id of pull requests in the system |
|
|||
54 | """ |
|
62 | """ | |
55 |
|
63 | |||
56 | pull_request = PullRequest.get_or_404( |
|
64 | pull_request = PullRequest.get_or_404( |
@@ -38,19 +38,18 b' class LocalFileStorage(object):' | |||||
38 | """ |
|
38 | """ | |
39 | Resolves a unique name and the correct path. If a filename |
|
39 | Resolves a unique name and the correct path. If a filename | |
40 | for that path already exists then a numeric prefix with values > 0 will be |
|
40 | for that path already exists then a numeric prefix with values > 0 will be | |
41 |
added, for example test.jpg -> test |
|
41 | added, for example test.jpg -> 1-test.jpg etc. initially file would have 0 prefix. | |
42 |
|
42 | |||
43 | :param name: base name of file |
|
43 | :param name: base name of file | |
44 | :param directory: absolute directory path |
|
44 | :param directory: absolute directory path | |
45 | """ |
|
45 | """ | |
46 |
|
46 | |||
47 | basename, ext = os.path.splitext(name) |
|
|||
48 | counter = 0 |
|
47 | counter = 0 | |
49 | while True: |
|
48 | while True: | |
50 |
name = '% |
|
49 | name = '%d-%s' % (counter, name) | |
51 |
|
50 | |||
52 | # sub_store prefix to optimize disk usage, e.g some_path/ab/final_file |
|
51 | # sub_store prefix to optimize disk usage, e.g some_path/ab/final_file | |
53 |
sub_store = cls._sub_store_from_filename( |
|
52 | sub_store = cls._sub_store_from_filename(name) | |
54 | sub_store_path = os.path.join(directory, sub_store) |
|
53 | sub_store_path = os.path.join(directory, sub_store) | |
55 | if not os.path.exists(sub_store_path): |
|
54 | if not os.path.exists(sub_store_path): | |
56 | os.makedirs(sub_store_path) |
|
55 | os.makedirs(sub_store_path) | |
@@ -209,3 +208,16 b' class LocalFileStorage(object):' | |||||
209 | filename = os.path.join(directory, filename) |
|
208 | filename = os.path.join(directory, filename) | |
210 |
|
209 | |||
211 | return filename, metadata |
|
210 | return filename, metadata | |
|
211 | ||||
|
212 | def get_metadata(self, filename): | |||
|
213 | """ | |||
|
214 | Reads JSON stored metadata for a file | |||
|
215 | ||||
|
216 | :param filename: | |||
|
217 | :return: | |||
|
218 | """ | |||
|
219 | filename = self.store_path(filename) | |||
|
220 | filename_meta = filename + '.meta' | |||
|
221 | ||||
|
222 | with open(filename_meta, "rb") as source_meta: | |||
|
223 | return json.loads(source_meta.read()) |
@@ -21,6 +21,7 b' import os' | |||||
21 | import pytest |
|
21 | import pytest | |
22 |
|
22 | |||
23 | from rhodecode.lib.ext_json import json |
|
23 | from rhodecode.lib.ext_json import json | |
|
24 | from rhodecode.model.db import Session, FileStore | |||
24 | from rhodecode.tests import TestController |
|
25 | from rhodecode.tests import TestController | |
25 | from rhodecode.apps.file_store import utils, config_keys |
|
26 | from rhodecode.apps.file_store import utils, config_keys | |
26 |
|
27 | |||
@@ -46,9 +47,12 b' class TestFileStoreViews(TestController)' | |||||
46 | ('abcde-0.exe', "1234567", True), |
|
47 | ('abcde-0.exe', "1234567", True), | |
47 | ('abcde-0.jpg', "xxxxx", False), |
|
48 | ('abcde-0.jpg', "xxxxx", False), | |
48 | ]) |
|
49 | ]) | |
49 | def test_get_files_from_store(self, fid, content, exists, tmpdir): |
|
50 | def test_get_files_from_store(self, fid, content, exists, tmpdir, user_util): | |
50 | self.log_user() |
|
51 | user = self.log_user() | |
|
52 | user_id = user['user_id'] | |||
|
53 | repo_id = user_util.create_repo().repo_id | |||
51 | store_path = self.app._pyramid_settings[config_keys.store_path] |
|
54 | store_path = self.app._pyramid_settings[config_keys.store_path] | |
|
55 | store_uid = fid | |||
52 |
|
56 | |||
53 | if exists: |
|
57 | if exists: | |
54 | status = 200 |
|
58 | status = 200 | |
@@ -58,17 +62,28 b' class TestFileStoreViews(TestController)' | |||||
58 | f.write(content) |
|
62 | f.write(content) | |
59 |
|
63 | |||
60 | with open(filesystem_file, 'rb') as f: |
|
64 | with open(filesystem_file, 'rb') as f: | |
61 |
|
|
65 | store_uid, metadata = store.save_file(f, fid, extra_metadata={'filename': fid}) | |
|
66 | ||||
|
67 | entry = FileStore.create( | |||
|
68 | file_uid=store_uid, filename=metadata["filename"], | |||
|
69 | file_hash=metadata["sha256"], file_size=metadata["size"], | |||
|
70 | file_display_name='file_display_name', | |||
|
71 | file_description='repo artifact `{}`'.format(metadata["filename"]), | |||
|
72 | check_acl=True, user_id=user_id, | |||
|
73 | scope_repo_id=repo_id | |||
|
74 | ) | |||
|
75 | Session().add(entry) | |||
|
76 | Session().commit() | |||
62 |
|
77 | |||
63 | else: |
|
78 | else: | |
64 | status = 404 |
|
79 | status = 404 | |
65 |
|
80 | |||
66 |
response = self.app.get(route_path('download_file', fid= |
|
81 | response = self.app.get(route_path('download_file', fid=store_uid), status=status) | |
67 |
|
82 | |||
68 | if exists: |
|
83 | if exists: | |
69 | assert response.text == content |
|
84 | assert response.text == content | |
70 |
file_store_path = os.path.dirname(store.resolve_name( |
|
85 | file_store_path = os.path.dirname(store.resolve_name(store_uid, store_path)[1]) | |
71 |
metadata_file = os.path.join(file_store_path, |
|
86 | metadata_file = os.path.join(file_store_path, store_uid + '.meta') | |
72 | assert os.path.exists(metadata_file) |
|
87 | assert os.path.exists(metadata_file) | |
73 | with open(metadata_file, 'rb') as f: |
|
88 | with open(metadata_file, 'rb') as f: | |
74 | json_data = json.loads(f.read()) |
|
89 | json_data = json.loads(f.read()) |
@@ -19,9 +19,10 b'' | |||||
19 | # and proprietary license terms, please see https://rhodecode.com/licenses/ |
|
19 | # and proprietary license terms, please see https://rhodecode.com/licenses/ | |
20 |
|
20 | |||
21 |
|
21 | |||
22 | import os |
|
|||
23 | import uuid |
|
22 | import uuid | |
24 |
|
23 | |||
|
24 | import pathlib2 | |||
|
25 | ||||
25 |
|
26 | |||
26 | def get_file_storage(settings): |
|
27 | def get_file_storage(settings): | |
27 | from rhodecode.apps.file_store.local_store import LocalFileStorage |
|
28 | from rhodecode.apps.file_store.local_store import LocalFileStorage | |
@@ -30,6 +31,11 b' def get_file_storage(settings):' | |||||
30 | return LocalFileStorage(base_path=store_path) |
|
31 | return LocalFileStorage(base_path=store_path) | |
31 |
|
32 | |||
32 |
|
33 | |||
|
34 | def splitext(filename): | |||
|
35 | ext = ''.join(pathlib2.Path(filename).suffixes) | |||
|
36 | return filename, ext | |||
|
37 | ||||
|
38 | ||||
33 | def uid_filename(filename, randomized=True): |
|
39 | def uid_filename(filename, randomized=True): | |
34 | """ |
|
40 | """ | |
35 | Generates a randomized or stable (uuid) filename, |
|
41 | Generates a randomized or stable (uuid) filename, | |
@@ -38,7 +44,8 b' def uid_filename(filename, randomized=Tr' | |||||
38 | :param filename: the original filename |
|
44 | :param filename: the original filename | |
39 | :param randomized: define if filename should be stable (sha1 based) or randomized |
|
45 | :param randomized: define if filename should be stable (sha1 based) or randomized | |
40 | """ |
|
46 | """ | |
41 | _, ext = os.path.splitext(filename) |
|
47 | ||
|
48 | _, ext = splitext(filename) | |||
42 | if randomized: |
|
49 | if randomized: | |
43 | uid = uuid.uuid4() |
|
50 | uid = uuid.uuid4() | |
44 | else: |
|
51 | else: |
@@ -30,7 +30,7 b' from rhodecode.apps.file_store.exception' | |||||
30 |
|
30 | |||
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.auth import (CSRFRequired, NotAnonymous) |
|
33 | from rhodecode.lib.auth import (CSRFRequired, NotAnonymous, HasRepoPermissionAny, HasRepoGroupPermissionAny) | |
34 | from rhodecode.model.db import Session, FileStore |
|
34 | from rhodecode.model.db import Session, FileStore | |
35 |
|
35 | |||
36 | log = logging.getLogger(__name__) |
|
36 | log = logging.getLogger(__name__) | |
@@ -68,7 +68,7 b' class FileStoreView(BaseAppView):' | |||||
68 | 'user_id': self._rhodecode_user.user_id, |
|
68 | 'user_id': self._rhodecode_user.user_id, | |
69 | 'ip': self._rhodecode_user.ip_addr}} |
|
69 | 'ip': self._rhodecode_user.ip_addr}} | |
70 | try: |
|
70 | try: | |
71 |
store_ |
|
71 | store_uid, metadata = self.storage.save_file( | |
72 | file_obj.file, filename, extra_metadata=metadata) |
|
72 | file_obj.file, filename, extra_metadata=metadata) | |
73 | except FileNotAllowedException: |
|
73 | except FileNotAllowedException: | |
74 | return {'store_fid': None, |
|
74 | return {'store_fid': None, | |
@@ -82,7 +82,7 b' class FileStoreView(BaseAppView):' | |||||
82 |
|
82 | |||
83 | try: |
|
83 | try: | |
84 | entry = FileStore.create( |
|
84 | entry = FileStore.create( | |
85 |
file_uid=store_ |
|
85 | file_uid=store_uid, filename=metadata["filename"], | |
86 | file_hash=metadata["sha256"], file_size=metadata["size"], |
|
86 | file_hash=metadata["sha256"], file_size=metadata["size"], | |
87 | file_description='upload attachment', |
|
87 | file_description='upload attachment', | |
88 | check_acl=False, user_id=self._rhodecode_user.user_id |
|
88 | check_acl=False, user_id=self._rhodecode_user.user_id | |
@@ -96,8 +96,8 b' class FileStoreView(BaseAppView):' | |||||
96 | 'access_path': None, |
|
96 | 'access_path': None, | |
97 | 'error': 'File {} failed to store in DB.'.format(filename)} |
|
97 | 'error': 'File {} failed to store in DB.'.format(filename)} | |
98 |
|
98 | |||
99 |
return {'store_fid': store_ |
|
99 | return {'store_fid': store_uid, | |
100 |
'access_path': h.route_path('download_file', fid=store_ |
|
100 | 'access_path': h.route_path('download_file', fid=store_uid)} | |
101 |
|
101 | |||
102 | @view_config(route_name='download_file') |
|
102 | @view_config(route_name='download_file') | |
103 | def download_file(self): |
|
103 | def download_file(self): | |
@@ -109,6 +109,35 b' class FileStoreView(BaseAppView):' | |||||
109 | log.debug('File with FID:%s not found in the store', file_uid) |
|
109 | log.debug('File with FID:%s not found in the store', file_uid) | |
110 | raise HTTPNotFound() |
|
110 | raise HTTPNotFound() | |
111 |
|
111 | |||
|
112 | db_obj = FileStore().query().filter(FileStore.file_uid == file_uid).scalar() | |||
|
113 | if not db_obj: | |||
|
114 | raise HTTPNotFound() | |||
|
115 | ||||
|
116 | # private upload for user | |||
|
117 | if db_obj.check_acl and db_obj.scope_user_id: | |||
|
118 | user = db_obj.user | |||
|
119 | if self._rhodecode_db_user.user_id != user.user_id: | |||
|
120 | log.warning('Access to file store object forbidden') | |||
|
121 | raise HTTPNotFound() | |||
|
122 | ||||
|
123 | # scoped to repository permissions | |||
|
124 | if db_obj.check_acl and db_obj.scope_repo_id: | |||
|
125 | repo = db_obj.repo | |||
|
126 | perm_set = ['repository.read', 'repository.write', 'repository.admin'] | |||
|
127 | has_perm = HasRepoPermissionAny(*perm_set)(repo.repo_name, 'FileStore check') | |||
|
128 | if not has_perm: | |||
|
129 | log.warning('Access to file store object forbidden') | |||
|
130 | raise HTTPNotFound() | |||
|
131 | ||||
|
132 | # scoped to repository group permissions | |||
|
133 | if db_obj.check_acl and db_obj.scope_repo_group_id: | |||
|
134 | repo_group = db_obj.repo_group | |||
|
135 | perm_set = ['group.read', 'group.write', 'group.admin'] | |||
|
136 | has_perm = HasRepoGroupPermissionAny(*perm_set)(repo_group.group_name, 'FileStore check') | |||
|
137 | if not has_perm: | |||
|
138 | log.warning('Access to file store object forbidden') | |||
|
139 | raise HTTPNotFound() | |||
|
140 | ||||
112 | FileStore.bump_access_counter(file_uid) |
|
141 | FileStore.bump_access_counter(file_uid) | |
113 |
|
142 | |||
114 | file_path = self.storage.store_path(file_uid) |
|
143 | file_path = self.storage.store_path(file_uid) |
@@ -68,6 +68,10 b' def includeme(config):' | |||||
68 | pattern='/_markup_preview') |
|
68 | pattern='/_markup_preview') | |
69 |
|
69 | |||
70 | config.add_route( |
|
70 | config.add_route( | |
|
71 | name='file_preview', | |||
|
72 | pattern='/_file_preview') | |||
|
73 | ||||
|
74 | config.add_route( | |||
71 | name='store_user_session_value', |
|
75 | name='store_user_session_value', | |
72 | pattern='/_store_session_attr') |
|
76 | pattern='/_store_session_attr') | |
73 |
|
77 |
@@ -27,11 +27,12 b' from pyramid.view import view_config' | |||||
27 | from rhodecode.apps._base import BaseAppView |
|
27 | from rhodecode.apps._base import BaseAppView | |
28 | from rhodecode.lib import helpers as h |
|
28 | from rhodecode.lib import helpers as h | |
29 | from rhodecode.lib.auth import ( |
|
29 | from rhodecode.lib.auth import ( | |
30 | LoginRequired, NotAnonymous, HasRepoGroupPermissionAnyDecorator, |
|
30 | LoginRequired, NotAnonymous, HasRepoGroupPermissionAnyDecorator, CSRFRequired) | |
31 | CSRFRequired) |
|
31 | from rhodecode.lib.codeblocks import filenode_as_lines_tokens | |
32 | from rhodecode.lib.index import searcher_from_config |
|
32 | from rhodecode.lib.index import searcher_from_config | |
33 | from rhodecode.lib.utils2 import safe_unicode, str2bool, safe_int |
|
33 | from rhodecode.lib.utils2 import safe_unicode, str2bool, safe_int | |
34 | from rhodecode.lib.ext_json import json |
|
34 | from rhodecode.lib.ext_json import json | |
|
35 | from rhodecode.lib.vcs.nodes import FileNode | |||
35 | from rhodecode.model.db import ( |
|
36 | from rhodecode.model.db import ( | |
36 | func, true, or_, case, in_filter_generator, Repository, RepoGroup, User, UserGroup) |
|
37 | func, true, or_, case, in_filter_generator, Repository, RepoGroup, User, UserGroup) | |
37 | from rhodecode.model.repo import RepoModel |
|
38 | from rhodecode.model.repo import RepoModel | |
@@ -442,12 +443,14 b' class HomeView(BaseAppView):' | |||||
442 | def query_modifier(): |
|
443 | def query_modifier(): | |
443 | qry = query |
|
444 | qry = query | |
444 | return {'q': qry, 'type': 'content'} |
|
445 | return {'q': qry, 'type': 'content'} | |
445 | label = u'File search for `{}` in this repository.'.format(query) |
|
446 | ||
|
447 | label = u'File search for `{}`'.format(h.escape(query)) | |||
446 | file_qry = { |
|
448 | file_qry = { | |
447 | 'id': -10, |
|
449 | 'id': -10, | |
448 | 'value': query, |
|
450 | 'value': query, | |
449 | 'value_display': label, |
|
451 | 'value_display': label, | |
450 | 'type': 'search', |
|
452 | 'type': 'search', | |
|
453 | 'subtype': 'repo', | |||
451 | 'url': h.route_path('search_repo', |
|
454 | 'url': h.route_path('search_repo', | |
452 | repo_name=repo_name, |
|
455 | repo_name=repo_name, | |
453 | _query=query_modifier()) |
|
456 | _query=query_modifier()) | |
@@ -458,18 +461,19 b' class HomeView(BaseAppView):' | |||||
458 | qry = query |
|
461 | qry = query | |
459 | return {'q': qry, 'type': 'commit'} |
|
462 | return {'q': qry, 'type': 'commit'} | |
460 |
|
463 | |||
461 |
label = u'Commit search for `{}` |
|
464 | label = u'Commit search for `{}`'.format(h.escape(query)) | |
462 | commit_qry = { |
|
465 | commit_qry = { | |
463 | 'id': -20, |
|
466 | 'id': -20, | |
464 | 'value': query, |
|
467 | 'value': query, | |
465 | 'value_display': label, |
|
468 | 'value_display': label, | |
466 | 'type': 'search', |
|
469 | 'type': 'search', | |
|
470 | 'subtype': 'repo', | |||
467 | 'url': h.route_path('search_repo', |
|
471 | 'url': h.route_path('search_repo', | |
468 | repo_name=repo_name, |
|
472 | repo_name=repo_name, | |
469 | _query=query_modifier()) |
|
473 | _query=query_modifier()) | |
470 | } |
|
474 | } | |
471 |
|
475 | |||
472 |
if repo_context in ['commit', 'c |
|
476 | if repo_context in ['commit', 'commits']: | |
473 | queries.extend([commit_qry, file_qry]) |
|
477 | queries.extend([commit_qry, file_qry]) | |
474 | elif repo_context in ['files', 'summary']: |
|
478 | elif repo_context in ['files', 'summary']: | |
475 | queries.extend([file_qry, commit_qry]) |
|
479 | queries.extend([file_qry, commit_qry]) | |
@@ -482,12 +486,13 b' class HomeView(BaseAppView):' | |||||
482 | qry = query |
|
486 | qry = query | |
483 | return {'q': qry, 'type': 'content'} |
|
487 | return {'q': qry, 'type': 'content'} | |
484 |
|
488 | |||
485 |
label = u'File search for `{}` |
|
489 | label = u'File search for `{}`'.format(query) | |
486 | file_qry = { |
|
490 | file_qry = { | |
487 | 'id': -30, |
|
491 | 'id': -30, | |
488 | 'value': query, |
|
492 | 'value': query, | |
489 | 'value_display': label, |
|
493 | 'value_display': label, | |
490 | 'type': 'search', |
|
494 | 'type': 'search', | |
|
495 | 'subtype': 'repo_group', | |||
491 | 'url': h.route_path('search_repo_group', |
|
496 | 'url': h.route_path('search_repo_group', | |
492 | repo_group_name=repo_group_name, |
|
497 | repo_group_name=repo_group_name, | |
493 | _query=query_modifier()) |
|
498 | _query=query_modifier()) | |
@@ -498,18 +503,19 b' class HomeView(BaseAppView):' | |||||
498 | qry = query |
|
503 | qry = query | |
499 | return {'q': qry, 'type': 'commit'} |
|
504 | return {'q': qry, 'type': 'commit'} | |
500 |
|
505 | |||
501 |
label = u'Commit search for `{}` |
|
506 | label = u'Commit search for `{}`'.format(query) | |
502 | commit_qry = { |
|
507 | commit_qry = { | |
503 | 'id': -40, |
|
508 | 'id': -40, | |
504 | 'value': query, |
|
509 | 'value': query, | |
505 | 'value_display': label, |
|
510 | 'value_display': label, | |
506 | 'type': 'search', |
|
511 | 'type': 'search', | |
|
512 | 'subtype': 'repo_group', | |||
507 | 'url': h.route_path('search_repo_group', |
|
513 | 'url': h.route_path('search_repo_group', | |
508 | repo_group_name=repo_group_name, |
|
514 | repo_group_name=repo_group_name, | |
509 | _query=query_modifier()) |
|
515 | _query=query_modifier()) | |
510 | } |
|
516 | } | |
511 |
|
517 | |||
512 |
if repo_context in ['commit', 'c |
|
518 | if repo_context in ['commit', 'commits']: | |
513 | queries.extend([commit_qry, file_qry]) |
|
519 | queries.extend([commit_qry, file_qry]) | |
514 | elif repo_context in ['files', 'summary']: |
|
520 | elif repo_context in ['files', 'summary']: | |
515 | queries.extend([file_qry, commit_qry]) |
|
521 | queries.extend([file_qry, commit_qry]) | |
@@ -524,6 +530,7 b' class HomeView(BaseAppView):' | |||||
524 | 'value': query, |
|
530 | 'value': query, | |
525 | 'value_display': u'File search for: `{}`'.format(query), |
|
531 | 'value_display': u'File search for: `{}`'.format(query), | |
526 | 'type': 'search', |
|
532 | 'type': 'search', | |
|
533 | 'subtype': 'global', | |||
527 | 'url': h.route_path('search', |
|
534 | 'url': h.route_path('search', | |
528 | _query={'q': query, 'type': 'content'}) |
|
535 | _query={'q': query, 'type': 'content'}) | |
529 | }) |
|
536 | }) | |
@@ -533,6 +540,7 b' class HomeView(BaseAppView):' | |||||
533 | 'value': query, |
|
540 | 'value': query, | |
534 | 'value_display': u'Commit search for: `{}`'.format(query), |
|
541 | 'value_display': u'Commit search for: `{}`'.format(query), | |
535 | 'type': 'search', |
|
542 | 'type': 'search', | |
|
543 | 'subtype': 'global', | |||
536 | 'url': h.route_path('search', |
|
544 | 'url': h.route_path('search', | |
537 | _query={'q': query, 'type': 'commit'}) |
|
545 | _query={'q': query, 'type': 'commit'}) | |
538 | }) |
|
546 | }) | |
@@ -703,8 +711,11 b' class HomeView(BaseAppView):' | |||||
703 | def repo_group_main_page(self): |
|
711 | def repo_group_main_page(self): | |
704 | c = self.load_default_context() |
|
712 | c = self.load_default_context() | |
705 | c.repo_group = self.request.db_repo_group |
|
713 | c.repo_group = self.request.db_repo_group | |
706 | repo_data, repo_group_data = self._get_groups_and_repos( |
|
714 | repo_data, repo_group_data = self._get_groups_and_repos(c.repo_group.group_id) | |
707 | c.repo_group.group_id) |
|
715 | ||
|
716 | # update every 5 min | |||
|
717 | if self.request.db_repo_group.last_commit_cache_update_diff > 60 * 5: | |||
|
718 | self.request.db_repo_group.update_commit_cache() | |||
708 |
|
719 | |||
709 | # json used to render the grids |
|
720 | # json used to render the grids | |
710 | c.repos_data = json.dumps(repo_data) |
|
721 | c.repos_data = json.dumps(repo_data) | |
@@ -733,6 +744,34 b' class HomeView(BaseAppView):' | |||||
733 | @LoginRequired() |
|
744 | @LoginRequired() | |
734 | @CSRFRequired() |
|
745 | @CSRFRequired() | |
735 | @view_config( |
|
746 | @view_config( | |
|
747 | route_name='file_preview', request_method='POST', | |||
|
748 | renderer='string', xhr=True) | |||
|
749 | def file_preview(self): | |||
|
750 | # Technically a CSRF token is not needed as no state changes with this | |||
|
751 | # call. However, as this is a POST is better to have it, so automated | |||
|
752 | # tools don't flag it as potential CSRF. | |||
|
753 | # Post is required because the payload could be bigger than the maximum | |||
|
754 | # allowed by GET. | |||
|
755 | ||||
|
756 | text = self.request.POST.get('text') | |||
|
757 | file_path = self.request.POST.get('file_path') | |||
|
758 | ||||
|
759 | renderer = h.renderer_from_filename(file_path) | |||
|
760 | ||||
|
761 | if renderer: | |||
|
762 | return h.render(text, renderer=renderer, mentions=True) | |||
|
763 | else: | |||
|
764 | self.load_default_context() | |||
|
765 | _render = self.request.get_partial_renderer( | |||
|
766 | 'rhodecode:templates/files/file_content.mako') | |||
|
767 | ||||
|
768 | lines = filenode_as_lines_tokens(FileNode(file_path, text)) | |||
|
769 | ||||
|
770 | return _render('render_lines', lines) | |||
|
771 | ||||
|
772 | @LoginRequired() | |||
|
773 | @CSRFRequired() | |||
|
774 | @view_config( | |||
736 | route_name='store_user_session_value', request_method='POST', |
|
775 | route_name='store_user_session_value', request_method='POST', | |
737 | renderer='string', xhr=True) |
|
776 | renderer='string', xhr=True) | |
738 | def store_user_session_attr(self): |
|
777 | def store_user_session_attr(self): | |
@@ -743,4 +782,4 b' class HomeView(BaseAppView):' | |||||
743 | if existing_value != val: |
|
782 | if existing_value != val: | |
744 | self.request.session[key] = val |
|
783 | self.request.session[key] = val | |
745 |
|
784 | |||
746 | return 'stored:{}'.format(key) |
|
785 | return 'stored:{}:{}'.format(key, val) |
@@ -31,12 +31,12 b' from pyramid.renderers import render' | |||||
31 |
|
31 | |||
32 | from rhodecode.apps._base import BaseAppView |
|
32 | from rhodecode.apps._base import BaseAppView | |
33 | from rhodecode.model.db import ( |
|
33 | from rhodecode.model.db import ( | |
34 | or_, joinedload, UserLog, UserFollowing, User, UserApiKeys) |
|
34 | or_, joinedload, Repository, UserLog, UserFollowing, User, UserApiKeys) | |
35 | from rhodecode.model.meta import Session |
|
35 | from rhodecode.model.meta import Session | |
36 | import rhodecode.lib.helpers as h |
|
36 | import rhodecode.lib.helpers as h | |
37 | from rhodecode.lib.helpers import Page |
|
37 | from rhodecode.lib.helpers import Page | |
38 | from rhodecode.lib.user_log_filter import user_log_filter |
|
38 | from rhodecode.lib.user_log_filter import user_log_filter | |
39 | from rhodecode.lib.auth import LoginRequired, NotAnonymous, CSRFRequired |
|
39 | from rhodecode.lib.auth import LoginRequired, NotAnonymous, CSRFRequired, HasRepoPermissionAny | |
40 | from rhodecode.lib.utils2 import safe_int, AttributeDict, md5_safe |
|
40 | from rhodecode.lib.utils2 import safe_int, AttributeDict, md5_safe | |
41 | from rhodecode.model.scm import ScmModel |
|
41 | from rhodecode.model.scm import ScmModel | |
42 |
|
42 | |||
@@ -153,7 +153,7 b' class JournalView(BaseAppView):' | |||||
153 | desc = action_extra() |
|
153 | desc = action_extra() | |
154 | _url = h.route_url('home') |
|
154 | _url = h.route_url('home') | |
155 | if entry.repository is not None: |
|
155 | if entry.repository is not None: | |
156 |
_url = h.route_url('repo_c |
|
156 | _url = h.route_url('repo_commits', | |
157 | repo_name=entry.repository.repo_name) |
|
157 | repo_name=entry.repository.repo_name) | |
158 |
|
158 | |||
159 | feed.add_item( |
|
159 | feed.add_item( | |
@@ -199,7 +199,7 b' class JournalView(BaseAppView):' | |||||
199 | desc = action_extra() |
|
199 | desc = action_extra() | |
200 | _url = h.route_url('home') |
|
200 | _url = h.route_url('home') | |
201 | if entry.repository is not None: |
|
201 | if entry.repository is not None: | |
202 |
_url = h.route_url('repo_c |
|
202 | _url = h.route_url('repo_commits', | |
203 | repo_name=entry.repository.repo_name) |
|
203 | repo_name=entry.repository.repo_name) | |
204 |
|
204 | |||
205 | feed.add_item( |
|
205 | feed.add_item( | |
@@ -297,18 +297,19 b' class JournalView(BaseAppView):' | |||||
297 | user_id = self.request.POST.get('follows_user_id') |
|
297 | user_id = self.request.POST.get('follows_user_id') | |
298 | if user_id: |
|
298 | if user_id: | |
299 | try: |
|
299 | try: | |
300 | ScmModel().toggle_following_user( |
|
300 | ScmModel().toggle_following_user(user_id, self._rhodecode_user.user_id) | |
301 | user_id, self._rhodecode_user.user_id) |
|
|||
302 | Session().commit() |
|
301 | Session().commit() | |
303 | return 'ok' |
|
302 | return 'ok' | |
304 | except Exception: |
|
303 | except Exception: | |
305 | raise HTTPBadRequest() |
|
304 | raise HTTPBadRequest() | |
306 |
|
305 | |||
307 | repo_id = self.request.POST.get('follows_repo_id') |
|
306 | repo_id = self.request.POST.get('follows_repo_id') | |
308 | if repo_id: |
|
307 | repo = Repository.get_or_404(repo_id) | |
|
308 | perm_set = ['repository.read', 'repository.write', 'repository.admin'] | |||
|
309 | has_perm = HasRepoPermissionAny(*perm_set)(repo.repo_name, 'RepoWatch check') | |||
|
310 | if repo and has_perm: | |||
309 | try: |
|
311 | try: | |
310 | ScmModel().toggle_following_repo( |
|
312 | ScmModel().toggle_following_repo(repo_id, self._rhodecode_user.user_id) | |
311 | repo_id, self._rhodecode_user.user_id) |
|
|||
312 | Session().commit() |
|
313 | Session().commit() | |
313 | return 'ok' |
|
314 | return 'ok' | |
314 | except Exception: |
|
315 | except Exception: |
@@ -360,7 +360,7 b' class MyAccountView(BaseAppView, DataGri' | |||||
360 | 'repository.read', 'repository.write', 'repository.admin']) |
|
360 | 'repository.read', 'repository.write', 'repository.admin']) | |
361 |
|
361 | |||
362 | repos_data = RepoModel().get_repos_as_dict( |
|
362 | repos_data = RepoModel().get_repos_as_dict( | |
363 | repo_list=repo_list, admin=admin) |
|
363 | repo_list=repo_list, admin=admin, short_name=False) | |
364 | # json used to render the grid |
|
364 | # json used to render the grid | |
365 | return json.dumps(repos_data) |
|
365 | return json.dumps(repos_data) | |
366 |
|
366 | |||
@@ -423,7 +423,7 b' class MyAccountView(BaseAppView, DataGri' | |||||
423 | default_redirect_url = '' |
|
423 | default_redirect_url = '' | |
424 |
|
424 | |||
425 | # save repo |
|
425 | # save repo | |
426 | if entry.get('bookmark_repo'): |
|
426 | if entry.get('bookmark_repo') and safe_int(entry.get('bookmark_repo')): | |
427 | repo = Repository.get(entry['bookmark_repo']) |
|
427 | repo = Repository.get(entry['bookmark_repo']) | |
428 | perm_check = HasRepoPermissionAny( |
|
428 | perm_check = HasRepoPermissionAny( | |
429 | 'repository.read', 'repository.write', 'repository.admin') |
|
429 | 'repository.read', 'repository.write', 'repository.admin') | |
@@ -432,7 +432,7 b' class MyAccountView(BaseAppView, DataGri' | |||||
432 | should_save = True |
|
432 | should_save = True | |
433 | default_redirect_url = '${repo_url}' |
|
433 | default_redirect_url = '${repo_url}' | |
434 | # save repo group |
|
434 | # save repo group | |
435 | elif entry.get('bookmark_repo_group'): |
|
435 | elif entry.get('bookmark_repo_group') and safe_int(entry.get('bookmark_repo_group')): | |
436 | repo_group = RepoGroup.get(entry['bookmark_repo_group']) |
|
436 | repo_group = RepoGroup.get(entry['bookmark_repo_group']) | |
437 | perm_check = HasRepoGroupPermissionAny( |
|
437 | perm_check = HasRepoGroupPermissionAny( | |
438 | 'group.read', 'group.write', 'group.admin') |
|
438 | 'group.read', 'group.write', 'group.admin') |
@@ -90,7 +90,7 b' def includeme(config):' | |||||
90 | # Files |
|
90 | # Files | |
91 | config.add_route( |
|
91 | config.add_route( | |
92 | name='repo_archivefile', |
|
92 | name='repo_archivefile', | |
93 | pattern='/{repo_name:.*?[^/]}/archive/{fname}', repo_route=True) |
|
93 | pattern='/{repo_name:.*?[^/]}/archive/{fname:.*}', repo_route=True) | |
94 |
|
94 | |||
95 | config.add_route( |
|
95 | config.add_route( | |
96 | name='repo_files_diff', |
|
96 | name='repo_files_diff', | |
@@ -172,6 +172,10 b' def includeme(config):' | |||||
172 | pattern='/{repo_name:.*?[^/]}/add_file/{commit_id}/{f_path:.*}', |
|
172 | pattern='/{repo_name:.*?[^/]}/add_file/{commit_id}/{f_path:.*}', | |
173 | repo_route=True) |
|
173 | repo_route=True) | |
174 | config.add_route( |
|
174 | config.add_route( | |
|
175 | name='repo_files_upload_file', | |||
|
176 | pattern='/{repo_name:.*?[^/]}/upload_file/{commit_id}/{f_path:.*}', | |||
|
177 | repo_route=True) | |||
|
178 | config.add_route( | |||
175 | name='repo_files_create_file', |
|
179 | name='repo_files_create_file', | |
176 | pattern='/{repo_name:.*?[^/]}/create_file/{commit_id}/{f_path:.*}', |
|
180 | pattern='/{repo_name:.*?[^/]}/create_file/{commit_id}/{f_path:.*}', | |
177 | repo_route=True) |
|
181 | repo_route=True) | |
@@ -189,19 +193,27 b' def includeme(config):' | |||||
189 | name='repo_stats', |
|
193 | name='repo_stats', | |
190 | pattern='/{repo_name:.*?[^/]}/repo_stats/{commit_id}', repo_route=True) |
|
194 | pattern='/{repo_name:.*?[^/]}/repo_stats/{commit_id}', repo_route=True) | |
191 |
|
195 | |||
192 | # Changelog |
|
196 | # Commits | |
|
197 | config.add_route( | |||
|
198 | name='repo_commits', | |||
|
199 | pattern='/{repo_name:.*?[^/]}/commits', repo_route=True) | |||
|
200 | config.add_route( | |||
|
201 | name='repo_commits_file', | |||
|
202 | pattern='/{repo_name:.*?[^/]}/commits/{commit_id}/{f_path:.*}', repo_route=True) | |||
|
203 | config.add_route( | |||
|
204 | name='repo_commits_elements', | |||
|
205 | pattern='/{repo_name:.*?[^/]}/commits_elements', repo_route=True) | |||
|
206 | config.add_route( | |||
|
207 | name='repo_commits_elements_file', | |||
|
208 | pattern='/{repo_name:.*?[^/]}/commits_elements/{commit_id}/{f_path:.*}', repo_route=True) | |||
|
209 | ||||
|
210 | # Changelog (old deprecated name for commits page) | |||
193 | config.add_route( |
|
211 | config.add_route( | |
194 | name='repo_changelog', |
|
212 | name='repo_changelog', | |
195 | pattern='/{repo_name:.*?[^/]}/changelog', repo_route=True) |
|
213 | pattern='/{repo_name:.*?[^/]}/changelog', repo_route=True) | |
196 | config.add_route( |
|
214 | config.add_route( | |
197 | name='repo_changelog_file', |
|
215 | name='repo_changelog_file', | |
198 | pattern='/{repo_name:.*?[^/]}/changelog/{commit_id}/{f_path:.*}', repo_route=True) |
|
216 | pattern='/{repo_name:.*?[^/]}/changelog/{commit_id}/{f_path:.*}', repo_route=True) | |
199 | config.add_route( |
|
|||
200 | name='repo_changelog_elements', |
|
|||
201 | pattern='/{repo_name:.*?[^/]}/changelog_elements', repo_route=True) |
|
|||
202 | config.add_route( |
|
|||
203 | name='repo_changelog_elements_file', |
|
|||
204 | pattern='/{repo_name:.*?[^/]}/changelog_elements/{commit_id}/{f_path:.*}', repo_route=True) |
|
|||
205 |
|
217 | |||
206 | # Compare |
|
218 | # Compare | |
207 | config.add_route( |
|
219 | config.add_route( | |
@@ -312,6 +324,11 b' def includeme(config):' | |||||
312 | pattern='/{repo_name:.*?[^/]}/pull-request/{pull_request_id:\d+}/comment/{comment_id}/delete', |
|
324 | pattern='/{repo_name:.*?[^/]}/pull-request/{pull_request_id:\d+}/comment/{comment_id}/delete', | |
313 | repo_route=True, repo_accepted_types=['hg', 'git']) |
|
325 | repo_route=True, repo_accepted_types=['hg', 'git']) | |
314 |
|
326 | |||
|
327 | # Artifacts, (EE feature) | |||
|
328 | config.add_route( | |||
|
329 | name='repo_artifacts_list', | |||
|
330 | pattern='/{repo_name:.*?[^/]}/artifacts', repo_route=True) | |||
|
331 | ||||
315 | # Settings |
|
332 | # Settings | |
316 | config.add_route( |
|
333 | config.add_route( | |
317 | name='edit_repo', |
|
334 | name='edit_repo', |
@@ -40,11 +40,11 b' def route_path(name, params=None, **kwar' | |||||
40 | class TestPullRequestList(object): |
|
40 | class TestPullRequestList(object): | |
41 |
|
41 | |||
42 | @pytest.mark.parametrize('params, expected_title', [ |
|
42 | @pytest.mark.parametrize('params, expected_title', [ | |
43 |
({'source': 0, 'closed': 1}, 'Closed |
|
43 | ({'source': 0, 'closed': 1}, 'Closed'), | |
44 |
({'source': 0, 'my': 1}, ' |
|
44 | ({'source': 0, 'my': 1}, 'Opened by me'), | |
45 |
({'source': 0, 'awaiting_review': 1}, ' |
|
45 | ({'source': 0, 'awaiting_review': 1}, 'Awaiting review'), | |
46 |
({'source': 0, 'awaiting_my_review': 1}, ' |
|
46 | ({'source': 0, 'awaiting_my_review': 1}, 'Awaiting my review'), | |
47 |
({'source': 1}, ' |
|
47 | ({'source': 1}, 'From this repo'), | |
48 | ]) |
|
48 | ]) | |
49 | def test_showing_list_page(self, backend, pr_util, params, expected_title): |
|
49 | def test_showing_list_page(self, backend, pr_util, params, expected_title): | |
50 | pull_request = pr_util.create_pull_request() |
|
50 | pull_request = pr_util.create_pull_request() | |
@@ -55,9 +55,10 b' class TestPullRequestList(object):' | |||||
55 | params=params)) |
|
55 | params=params)) | |
56 |
|
56 | |||
57 | assert_response = response.assert_response() |
|
57 | assert_response = response.assert_response() | |
58 | assert_response.element_equals_to('.panel-title', expected_title) |
|
58 | ||
59 |
element = assert_response.get_element('. |
|
59 | element = assert_response.get_element('.title .active') | |
60 |
element_text = |
|
60 | element_text = element.text_content() | |
|
61 | assert expected_title == element_text | |||
61 |
|
62 | |||
62 | def test_showing_list_page_data(self, backend, pr_util, xhr_header): |
|
63 | def test_showing_list_page_data(self, backend, pr_util, xhr_header): | |
63 | pull_request = pr_util.create_pull_request() |
|
64 | pull_request = pr_util.create_pull_request() |
@@ -32,9 +32,10 b' def route_path(name, params=None, **kwar' | |||||
32 | import urllib |
|
32 | import urllib | |
33 |
|
33 | |||
34 | base_url = { |
|
34 | base_url = { | |
35 | 'repo_changelog':'/{repo_name}/changelog', |
|
35 | 'repo_changelog': '/{repo_name}/changelog', | |
36 |
'repo_c |
|
36 | 'repo_commits': '/{repo_name}/commits', | |
37 | 'repo_changelog_elements':'/{repo_name}/changelog_elements', |
|
37 | 'repo_commits_file': '/{repo_name}/commits/{commit_id}/{f_path}', | |
|
38 | 'repo_commits_elements': '/{repo_name}/commits_elements', | |||
38 | }[name].format(**kwargs) |
|
39 | }[name].format(**kwargs) | |
39 |
|
40 | |||
40 | if params: |
|
41 | if params: | |
@@ -42,8 +43,22 b' def route_path(name, params=None, **kwar' | |||||
42 | return base_url |
|
43 | return base_url | |
43 |
|
44 | |||
44 |
|
45 | |||
|
46 | def assert_commits_on_page(response, indexes): | |||
|
47 | found_indexes = [int(idx) for idx in MATCH_HASH.findall(response.body)] | |||
|
48 | assert found_indexes == indexes | |||
|
49 | ||||
|
50 | ||||
45 | class TestChangelogController(TestController): |
|
51 | class TestChangelogController(TestController): | |
46 |
|
52 | |||
|
53 | def test_commits_page(self, backend): | |||
|
54 | self.log_user() | |||
|
55 | response = self.app.get( | |||
|
56 | route_path('repo_commits', repo_name=backend.repo_name)) | |||
|
57 | ||||
|
58 | first_idx = -1 | |||
|
59 | last_idx = -DEFAULT_CHANGELOG_SIZE | |||
|
60 | self.assert_commit_range_on_page(response, first_idx, last_idx, backend) | |||
|
61 | ||||
47 | def test_changelog(self, backend): |
|
62 | def test_changelog(self, backend): | |
48 | self.log_user() |
|
63 | self.log_user() | |
49 | response = self.app.get( |
|
64 | response = self.app.get( | |
@@ -62,6 +77,14 b' class TestChangelogController(TestContro' | |||||
62 | params=dict(branch=backend.default_branch_name)), |
|
77 | params=dict(branch=backend.default_branch_name)), | |
63 | status=200) |
|
78 | status=200) | |
64 |
|
79 | |||
|
80 | @pytest.mark.backends("hg", "git") | |||
|
81 | def test_commits_filtered_by_branch(self, backend): | |||
|
82 | self.log_user() | |||
|
83 | self.app.get( | |||
|
84 | route_path('repo_commits', repo_name=backend.repo_name, | |||
|
85 | params=dict(branch=backend.default_branch_name)), | |||
|
86 | status=200) | |||
|
87 | ||||
65 | @pytest.mark.backends("svn") |
|
88 | @pytest.mark.backends("svn") | |
66 | def test_changelog_filtered_by_branch_svn(self, autologin_user, backend): |
|
89 | def test_changelog_filtered_by_branch_svn(self, autologin_user, backend): | |
67 | repo = backend['svn-simple-layout'] |
|
90 | repo = backend['svn-simple-layout'] | |
@@ -70,27 +93,22 b' class TestChangelogController(TestContro' | |||||
70 | params=dict(branch='trunk')), |
|
93 | params=dict(branch='trunk')), | |
71 | status=200) |
|
94 | status=200) | |
72 |
|
95 | |||
73 | self.assert_commits_on_page( |
|
96 | assert_commits_on_page(response, indexes=[15, 12, 7, 3, 2, 1]) | |
74 | response, indexes=[15, 12, 7, 3, 2, 1]) |
|
|||
75 |
|
97 | |||
76 |
def test_c |
|
98 | def test_commits_filtered_by_wrong_branch(self, backend): | |
77 | self.log_user() |
|
99 | self.log_user() | |
78 | branch = 'wrong-branch-name' |
|
100 | branch = 'wrong-branch-name' | |
79 | response = self.app.get( |
|
101 | response = self.app.get( | |
80 |
route_path('repo_c |
|
102 | route_path('repo_commits', repo_name=backend.repo_name, | |
81 | params=dict(branch=branch)), |
|
103 | params=dict(branch=branch)), | |
82 | status=302) |
|
104 | status=302) | |
83 |
expected_url = '/{repo}/c |
|
105 | expected_url = '/{repo}/commits/{branch}'.format( | |
84 | repo=backend.repo_name, branch=branch) |
|
106 | repo=backend.repo_name, branch=branch) | |
85 | assert expected_url in response.location |
|
107 | assert expected_url in response.location | |
86 | response = response.follow() |
|
108 | response = response.follow() | |
87 | expected_warning = 'Branch {} is not found.'.format(branch) |
|
109 | expected_warning = 'Branch {} is not found.'.format(branch) | |
88 | assert expected_warning in response.body |
|
110 | assert expected_warning in response.body | |
89 |
|
111 | |||
90 | def assert_commits_on_page(self, response, indexes): |
|
|||
91 | found_indexes = [int(idx) for idx in MATCH_HASH.findall(response.body)] |
|
|||
92 | assert found_indexes == indexes |
|
|||
93 |
|
||||
94 | @pytest.mark.xfail_backends("svn", reason="Depends on branch support") |
|
112 | @pytest.mark.xfail_backends("svn", reason="Depends on branch support") | |
95 | def test_changelog_filtered_by_branch_with_merges( |
|
113 | def test_changelog_filtered_by_branch_with_merges( | |
96 | self, autologin_user, backend): |
|
114 | self, autologin_user, backend): | |
@@ -112,21 +130,20 b' class TestChangelogController(TestContro' | |||||
112 | status=200) |
|
130 | status=200) | |
113 |
|
131 | |||
114 | @pytest.mark.backends("hg") |
|
132 | @pytest.mark.backends("hg") | |
115 |
def test_c |
|
133 | def test_commits_closed_branches(self, autologin_user, backend): | |
116 | repo = backend['closed_branch'] |
|
134 | repo = backend['closed_branch'] | |
117 | response = self.app.get( |
|
135 | response = self.app.get( | |
118 |
route_path('repo_c |
|
136 | route_path('repo_commits', repo_name=repo.repo_name, | |
119 | params=dict(branch='experimental')), |
|
137 | params=dict(branch='experimental')), | |
120 | status=200) |
|
138 | status=200) | |
121 |
|
139 | |||
122 |
|
|
140 | assert_commits_on_page(response, indexes=[3, 1]) | |
123 | response, indexes=[3, 1]) |
|
|||
124 |
|
141 | |||
125 | def test_changelog_pagination(self, backend): |
|
142 | def test_changelog_pagination(self, backend): | |
126 | self.log_user() |
|
143 | self.log_user() | |
127 | # pagination, walk up to page 6 |
|
144 | # pagination, walk up to page 6 | |
128 | changelog_url = route_path( |
|
145 | changelog_url = route_path( | |
129 |
'repo_c |
|
146 | 'repo_commits', repo_name=backend.repo_name) | |
130 |
|
147 | |||
131 | for page in range(1, 7): |
|
148 | for page in range(1, 7): | |
132 | response = self.app.get(changelog_url, {'page': page}) |
|
149 | response = self.app.get(changelog_url, {'page': page}) | |
@@ -138,22 +155,30 b' class TestChangelogController(TestContro' | |||||
138 | def assert_commit_range_on_page( |
|
155 | def assert_commit_range_on_page( | |
139 | self, response, first_idx, last_idx, backend): |
|
156 | self, response, first_idx, last_idx, backend): | |
140 | input_template = ( |
|
157 | input_template = ( | |
141 |
"""<input class="commit-range" |
|
158 | """<input class="commit-range" """ | |
|
159 | """data-commit-id="%(raw_id)s" data-commit-idx="%(idx)s" """ | |||
|
160 | """data-short-id="%(short_id)s" id="%(raw_id)s" """ | |||
142 | """name="%(raw_id)s" type="checkbox" value="1" />""" |
|
161 | """name="%(raw_id)s" type="checkbox" value="1" />""" | |
143 | ) |
|
162 | ) | |
|
163 | ||||
144 | commit_span_template = """<span class="commit_hash">r%s:%s</span>""" |
|
164 | commit_span_template = """<span class="commit_hash">r%s:%s</span>""" | |
145 | repo = backend.repo |
|
165 | repo = backend.repo | |
146 |
|
166 | |||
147 | first_commit_on_page = repo.get_commit(commit_idx=first_idx) |
|
167 | first_commit_on_page = repo.get_commit(commit_idx=first_idx) | |
148 | response.mustcontain( |
|
168 | response.mustcontain( | |
149 |
input_template % {'raw_id': first_commit_on_page.raw_id |
|
169 | input_template % {'raw_id': first_commit_on_page.raw_id, | |
|
170 | 'idx': first_commit_on_page.idx, | |||
|
171 | 'short_id': first_commit_on_page.short_id}) | |||
|
172 | ||||
150 | response.mustcontain(commit_span_template % ( |
|
173 | response.mustcontain(commit_span_template % ( | |
151 | first_commit_on_page.idx, first_commit_on_page.short_id) |
|
174 | first_commit_on_page.idx, first_commit_on_page.short_id) | |
152 | ) |
|
175 | ) | |
153 |
|
176 | |||
154 | last_commit_on_page = repo.get_commit(commit_idx=last_idx) |
|
177 | last_commit_on_page = repo.get_commit(commit_idx=last_idx) | |
155 | response.mustcontain( |
|
178 | response.mustcontain( | |
156 |
input_template % {'raw_id': last_commit_on_page.raw_id |
|
179 | input_template % {'raw_id': last_commit_on_page.raw_id, | |
|
180 | 'idx': last_commit_on_page.idx, | |||
|
181 | 'short_id': last_commit_on_page.short_id}) | |||
157 | response.mustcontain(commit_span_template % ( |
|
182 | response.mustcontain(commit_span_template % ( | |
158 | last_commit_on_page.idx, last_commit_on_page.short_id) |
|
183 | last_commit_on_page.idx, last_commit_on_page.short_id) | |
159 | ) |
|
184 | ) | |
@@ -168,10 +193,10 b' class TestChangelogController(TestContro' | |||||
168 | '/vcs/exceptions.py', |
|
193 | '/vcs/exceptions.py', | |
169 | '//vcs/exceptions.py' |
|
194 | '//vcs/exceptions.py' | |
170 | ]) |
|
195 | ]) | |
171 |
def test_c |
|
196 | def test_commits_with_filenode(self, backend, test_path): | |
172 | self.log_user() |
|
197 | self.log_user() | |
173 | response = self.app.get( |
|
198 | response = self.app.get( | |
174 |
route_path('repo_c |
|
199 | route_path('repo_commits_file', repo_name=backend.repo_name, | |
175 | commit_id='tip', f_path=test_path), |
|
200 | commit_id='tip', f_path=test_path), | |
176 | ) |
|
201 | ) | |
177 |
|
202 | |||
@@ -180,16 +205,16 b' class TestChangelogController(TestContro' | |||||
180 | response.mustcontain('Added not implemented hg backend test case') |
|
205 | response.mustcontain('Added not implemented hg backend test case') | |
181 | response.mustcontain('Added BaseChangeset class') |
|
206 | response.mustcontain('Added BaseChangeset class') | |
182 |
|
207 | |||
183 |
def test_c |
|
208 | def test_commits_with_filenode_that_is_dirnode(self, backend): | |
184 | self.log_user() |
|
209 | self.log_user() | |
185 | self.app.get( |
|
210 | self.app.get( | |
186 |
route_path('repo_c |
|
211 | route_path('repo_commits_file', repo_name=backend.repo_name, | |
187 | commit_id='tip', f_path='/tests'), |
|
212 | commit_id='tip', f_path='/tests'), | |
188 | status=302) |
|
213 | status=302) | |
189 |
|
214 | |||
190 |
def test_c |
|
215 | def test_commits_with_filenode_not_existing(self, backend): | |
191 | self.log_user() |
|
216 | self.log_user() | |
192 | self.app.get( |
|
217 | self.app.get( | |
193 |
route_path('repo_c |
|
218 | route_path('repo_commits_file', repo_name=backend.repo_name, | |
194 | commit_id='tip', f_path='wrong_path'), |
|
219 | commit_id='tip', f_path='wrong_path'), | |
195 | status=302) |
|
220 | status=302) |
@@ -94,6 +94,7 b' class TestCompareView(object):' | |||||
94 | origin_repo = origin.scm_instance(cache=False) |
|
94 | origin_repo = origin.scm_instance(cache=False) | |
95 | origin_repo.config.clear_section('hooks') |
|
95 | origin_repo.config.clear_section('hooks') | |
96 | origin_repo.pull(fork.repo_full_path, commit_ids=[commit3.raw_id]) |
|
96 | origin_repo.pull(fork.repo_full_path, commit_ids=[commit3.raw_id]) | |
|
97 | origin_repo = origin.scm_instance(cache=False) # cache rebuild | |||
97 |
|
98 | |||
98 | # Verify test fixture setup |
|
99 | # Verify test fixture setup | |
99 | # This does not work for git |
|
100 | # This does not work for git | |
@@ -162,8 +163,7 b' class TestCompareView(object):' | |||||
162 | compare_page.target_source_are_disabled() |
|
163 | compare_page.target_source_are_disabled() | |
163 |
|
164 | |||
164 | @pytest.mark.xfail_backends("svn", reason="Depends on branch support") |
|
165 | @pytest.mark.xfail_backends("svn", reason="Depends on branch support") | |
165 | def test_compare_forks_on_branch_extra_commits_origin_has_incomming( |
|
166 | def test_compare_forks_on_branch_extra_commits_origin_has_incomming(self, backend): | |
166 | self, backend): |
|
|||
167 | repo1 = backend.create_repo() |
|
167 | repo1 = backend.create_repo() | |
168 |
|
168 | |||
169 | # commit something ! |
|
169 | # commit something ! |
@@ -21,6 +21,7 b'' | |||||
21 | import pytest |
|
21 | import pytest | |
22 |
|
22 | |||
23 | from rhodecode.lib.vcs import nodes |
|
23 | from rhodecode.lib.vcs import nodes | |
|
24 | from rhodecode.lib.vcs.backends.base import EmptyCommit | |||
24 | from rhodecode.tests.fixture import Fixture |
|
25 | from rhodecode.tests.fixture import Fixture | |
25 | from rhodecode.tests.utils import commit_change |
|
26 | from rhodecode.tests.utils import commit_change | |
26 |
|
27 | |||
@@ -43,70 +44,7 b' def route_path(name, params=None, **kwar' | |||||
43 | @pytest.mark.usefixtures("autologin_user", "app") |
|
44 | @pytest.mark.usefixtures("autologin_user", "app") | |
44 | class TestSideBySideDiff(object): |
|
45 | class TestSideBySideDiff(object): | |
45 |
|
46 | |||
46 |
def test_diff_side |
|
47 | def test_diff_sidebyside_single_commit(self, app, backend): | |
47 | f_path = 'test_sidebyside_file.py' |
|
|||
48 | commit1_content = 'content-25d7e49c18b159446c\n' |
|
|||
49 | commit2_content = 'content-603d6c72c46d953420\n' |
|
|||
50 | repo = backend.create_repo() |
|
|||
51 |
|
||||
52 | commit1 = commit_change( |
|
|||
53 | repo.repo_name, filename=f_path, content=commit1_content, |
|
|||
54 | message='A', vcs_type=backend.alias, parent=None, newfile=True) |
|
|||
55 |
|
||||
56 | commit2 = commit_change( |
|
|||
57 | repo.repo_name, filename=f_path, content=commit2_content, |
|
|||
58 | message='B, child of A', vcs_type=backend.alias, parent=commit1) |
|
|||
59 |
|
||||
60 | response = self.app.get(route_path( |
|
|||
61 | 'repo_compare', |
|
|||
62 | repo_name=repo.repo_name, |
|
|||
63 | source_ref_type='rev', |
|
|||
64 | source_ref=commit1.raw_id, |
|
|||
65 | target_ref_type='rev', |
|
|||
66 | target_ref=commit2.raw_id, |
|
|||
67 | params=dict(f_path=f_path, target_repo=repo.repo_name, diffmode='sidebyside') |
|
|||
68 | )) |
|
|||
69 |
|
||||
70 | response.mustcontain('Expand 1 commit') |
|
|||
71 | response.mustcontain('1 file changed') |
|
|||
72 |
|
||||
73 | response.mustcontain( |
|
|||
74 | 'r%s:%s...r%s:%s' % ( |
|
|||
75 | commit1.idx, commit1.short_id, commit2.idx, commit2.short_id)) |
|
|||
76 |
|
||||
77 | response.mustcontain('<strong>{}</strong>'.format(f_path)) |
|
|||
78 |
|
||||
79 | def test_diff_side_by_side_with_empty_file(self, app, backend, backend_stub): |
|
|||
80 | commits = [ |
|
|||
81 | {'message': 'First commit'}, |
|
|||
82 | {'message': 'Commit with binary', |
|
|||
83 | 'added': [nodes.FileNode('file.empty', content='')]}, |
|
|||
84 | ] |
|
|||
85 | f_path = 'file.empty' |
|
|||
86 | repo = backend.create_repo(commits=commits) |
|
|||
87 | commit1 = repo.get_commit(commit_idx=0) |
|
|||
88 | commit2 = repo.get_commit(commit_idx=1) |
|
|||
89 |
|
||||
90 | response = self.app.get(route_path( |
|
|||
91 | 'repo_compare', |
|
|||
92 | repo_name=repo.repo_name, |
|
|||
93 | source_ref_type='rev', |
|
|||
94 | source_ref=commit1.raw_id, |
|
|||
95 | target_ref_type='rev', |
|
|||
96 | target_ref=commit2.raw_id, |
|
|||
97 | params=dict(f_path=f_path, target_repo=repo.repo_name, diffmode='sidebyside') |
|
|||
98 | )) |
|
|||
99 |
|
||||
100 | response.mustcontain('Expand 1 commit') |
|
|||
101 | response.mustcontain('1 file changed') |
|
|||
102 |
|
||||
103 | response.mustcontain( |
|
|||
104 | 'r%s:%s...r%s:%s' % ( |
|
|||
105 | commit1.idx, commit1.short_id, commit2.idx, commit2.short_id)) |
|
|||
106 |
|
||||
107 | response.mustcontain('<strong>{}</strong>'.format(f_path)) |
|
|||
108 |
|
||||
109 | def test_diff_sidebyside_two_commits(self, app, backend): |
|
|||
110 | commit_id_range = { |
|
48 | commit_id_range = { | |
111 | 'hg': { |
|
49 | 'hg': { | |
112 | 'commits': ['25d7e49c18b159446cadfa506a5cf8ad1cb04067', |
|
50 | 'commits': ['25d7e49c18b159446cadfa506a5cf8ad1cb04067', | |
@@ -141,26 +79,164 b' class TestSideBySideDiff(object):' | |||||
141 | params=dict(target_repo=backend.repo_name, diffmode='sidebyside') |
|
79 | params=dict(target_repo=backend.repo_name, diffmode='sidebyside') | |
142 | )) |
|
80 | )) | |
143 |
|
81 | |||
|
82 | response.mustcontain(file_changes) | |||
144 | response.mustcontain('Expand 1 commit') |
|
83 | response.mustcontain('Expand 1 commit') | |
145 | response.mustcontain(file_changes) |
|
|||
146 |
|
84 | |||
147 |
def test_diff_sidebyside_two_commits |
|
85 | def test_diff_sidebyside_two_commits(self, app, backend): | |
148 | commit_id_range = { |
|
86 | commit_id_range = { | |
149 | 'hg': { |
|
87 | 'hg': { | |
150 | 'commits': ['25d7e49c18b159446cadfa506a5cf8ad1cb04067', |
|
88 | 'commits': ['4fdd71e9427417b2e904e0464c634fdee85ec5a7', | |
151 | '603d6c72c46d953420c89d36372f08d9f305f5dd'], |
|
89 | '603d6c72c46d953420c89d36372f08d9f305f5dd'], | |
152 |
'changes': ' |
|
90 | 'changes': '32 files changed: 1165 inserted, 308 deleted' | |
153 | }, |
|
91 | }, | |
154 | 'git': { |
|
92 | 'git': { | |
155 | 'commits': ['6fc9270775aaf5544c1deb014f4ddd60c952fcbb', |
|
93 | 'commits': ['f5fbf9cfd5f1f1be146f6d3b38bcd791a7480c13', | |
156 | '03fa803d7e9fb14daa9a3089e0d1494eda75d986'], |
|
94 | '03fa803d7e9fb14daa9a3089e0d1494eda75d986'], | |
157 |
'changes': ' |
|
95 | 'changes': '32 files changed: 1165 inserted, 308 deleted' | |
158 | }, |
|
96 | }, | |
159 |
|
97 | |||
160 | 'svn': { |
|
98 | 'svn': { | |
161 |
'commits': ['33 |
|
99 | 'commits': ['335', | |
162 | '337'], |
|
100 | '337'], | |
163 |
'changes': ' |
|
101 | 'changes': '32 files changed: 1179 inserted, 310 deleted' | |
|
102 | }, | |||
|
103 | } | |||
|
104 | ||||
|
105 | commit_info = commit_id_range[backend.alias] | |||
|
106 | commit2, commit1 = commit_info['commits'] | |||
|
107 | file_changes = commit_info['changes'] | |||
|
108 | ||||
|
109 | response = self.app.get(route_path( | |||
|
110 | 'repo_compare', | |||
|
111 | repo_name=backend.repo_name, | |||
|
112 | source_ref_type='rev', | |||
|
113 | source_ref=commit2, | |||
|
114 | target_repo=backend.repo_name, | |||
|
115 | target_ref_type='rev', | |||
|
116 | target_ref=commit1, | |||
|
117 | params=dict(target_repo=backend.repo_name, diffmode='sidebyside') | |||
|
118 | )) | |||
|
119 | ||||
|
120 | response.mustcontain(file_changes) | |||
|
121 | response.mustcontain('Expand 2 commits') | |||
|
122 | ||||
|
123 | @pytest.mark.xfail(reason='GIT does not handle empty commit compare correct (missing 1 commit)') | |||
|
124 | def test_diff_side_by_side_from_0_commit(self, app, backend, backend_stub): | |||
|
125 | f_path = 'test_sidebyside_file.py' | |||
|
126 | commit1_content = 'content-25d7e49c18b159446c\n' | |||
|
127 | commit2_content = 'content-603d6c72c46d953420\n' | |||
|
128 | repo = backend.create_repo() | |||
|
129 | ||||
|
130 | commit1 = commit_change( | |||
|
131 | repo.repo_name, filename=f_path, content=commit1_content, | |||
|
132 | message='A', vcs_type=backend.alias, parent=None, newfile=True) | |||
|
133 | ||||
|
134 | commit2 = commit_change( | |||
|
135 | repo.repo_name, filename=f_path, content=commit2_content, | |||
|
136 | message='B, child of A', vcs_type=backend.alias, parent=commit1) | |||
|
137 | ||||
|
138 | response = self.app.get(route_path( | |||
|
139 | 'repo_compare', | |||
|
140 | repo_name=repo.repo_name, | |||
|
141 | source_ref_type='rev', | |||
|
142 | source_ref=EmptyCommit().raw_id, | |||
|
143 | target_ref_type='rev', | |||
|
144 | target_ref=commit2.raw_id, | |||
|
145 | params=dict(diffmode='sidebyside') | |||
|
146 | )) | |||
|
147 | ||||
|
148 | response.mustcontain('Expand 2 commits') | |||
|
149 | response.mustcontain('123 file changed') | |||
|
150 | ||||
|
151 | response.mustcontain( | |||
|
152 | 'r%s:%s...r%s:%s' % ( | |||
|
153 | commit1.idx, commit1.short_id, commit2.idx, commit2.short_id)) | |||
|
154 | ||||
|
155 | response.mustcontain('<strong>{}</strong>'.format(f_path)) | |||
|
156 | ||||
|
157 | @pytest.mark.xfail(reason='GIT does not handle empty commit compare correct (missing 1 commit)') | |||
|
158 | def test_diff_side_by_side_from_0_commit_with_file_filter(self, app, backend, backend_stub): | |||
|
159 | f_path = 'test_sidebyside_file.py' | |||
|
160 | commit1_content = 'content-25d7e49c18b159446c\n' | |||
|
161 | commit2_content = 'content-603d6c72c46d953420\n' | |||
|
162 | repo = backend.create_repo() | |||
|
163 | ||||
|
164 | commit1 = commit_change( | |||
|
165 | repo.repo_name, filename=f_path, content=commit1_content, | |||
|
166 | message='A', vcs_type=backend.alias, parent=None, newfile=True) | |||
|
167 | ||||
|
168 | commit2 = commit_change( | |||
|
169 | repo.repo_name, filename=f_path, content=commit2_content, | |||
|
170 | message='B, child of A', vcs_type=backend.alias, parent=commit1) | |||
|
171 | ||||
|
172 | response = self.app.get(route_path( | |||
|
173 | 'repo_compare', | |||
|
174 | repo_name=repo.repo_name, | |||
|
175 | source_ref_type='rev', | |||
|
176 | source_ref=EmptyCommit().raw_id, | |||
|
177 | target_ref_type='rev', | |||
|
178 | target_ref=commit2.raw_id, | |||
|
179 | params=dict(f_path=f_path, target_repo=repo.repo_name, diffmode='sidebyside') | |||
|
180 | )) | |||
|
181 | ||||
|
182 | response.mustcontain('Expand 2 commits') | |||
|
183 | response.mustcontain('1 file changed') | |||
|
184 | ||||
|
185 | response.mustcontain( | |||
|
186 | 'r%s:%s...r%s:%s' % ( | |||
|
187 | commit1.idx, commit1.short_id, commit2.idx, commit2.short_id)) | |||
|
188 | ||||
|
189 | response.mustcontain('<strong>{}</strong>'.format(f_path)) | |||
|
190 | ||||
|
191 | def test_diff_side_by_side_with_empty_file(self, app, backend, backend_stub): | |||
|
192 | commits = [ | |||
|
193 | {'message': 'First commit'}, | |||
|
194 | {'message': 'Second commit'}, | |||
|
195 | {'message': 'Commit with binary', | |||
|
196 | 'added': [nodes.FileNode('file.empty', content='')]}, | |||
|
197 | ] | |||
|
198 | f_path = 'file.empty' | |||
|
199 | repo = backend.create_repo(commits=commits) | |||
|
200 | commit1 = repo.get_commit(commit_idx=0) | |||
|
201 | commit2 = repo.get_commit(commit_idx=1) | |||
|
202 | commit3 = repo.get_commit(commit_idx=2) | |||
|
203 | ||||
|
204 | response = self.app.get(route_path( | |||
|
205 | 'repo_compare', | |||
|
206 | repo_name=repo.repo_name, | |||
|
207 | source_ref_type='rev', | |||
|
208 | source_ref=commit1.raw_id, | |||
|
209 | target_ref_type='rev', | |||
|
210 | target_ref=commit3.raw_id, | |||
|
211 | params=dict(f_path=f_path, target_repo=repo.repo_name, diffmode='sidebyside') | |||
|
212 | )) | |||
|
213 | ||||
|
214 | response.mustcontain('Expand 2 commits') | |||
|
215 | response.mustcontain('1 file changed') | |||
|
216 | ||||
|
217 | response.mustcontain( | |||
|
218 | 'r%s:%s...r%s:%s' % ( | |||
|
219 | commit2.idx, commit2.short_id, commit3.idx, commit3.short_id)) | |||
|
220 | ||||
|
221 | response.mustcontain('<strong>{}</strong>'.format(f_path)) | |||
|
222 | ||||
|
223 | def test_diff_sidebyside_two_commits_with_file_filter(self, app, backend): | |||
|
224 | commit_id_range = { | |||
|
225 | 'hg': { | |||
|
226 | 'commits': ['4fdd71e9427417b2e904e0464c634fdee85ec5a7', | |||
|
227 | '603d6c72c46d953420c89d36372f08d9f305f5dd'], | |||
|
228 | 'changes': '1 file changed: 3 inserted, 3 deleted' | |||
|
229 | }, | |||
|
230 | 'git': { | |||
|
231 | 'commits': ['f5fbf9cfd5f1f1be146f6d3b38bcd791a7480c13', | |||
|
232 | '03fa803d7e9fb14daa9a3089e0d1494eda75d986'], | |||
|
233 | 'changes': '1 file changed: 3 inserted, 3 deleted' | |||
|
234 | }, | |||
|
235 | ||||
|
236 | 'svn': { | |||
|
237 | 'commits': ['335', | |||
|
238 | '337'], | |||
|
239 | 'changes': '1 file changed: 3 inserted, 3 deleted' | |||
164 | }, |
|
240 | }, | |
165 | } |
|
241 | } | |
166 | f_path = 'docs/conf.py' |
|
242 | f_path = 'docs/conf.py' | |
@@ -179,5 +255,5 b' class TestSideBySideDiff(object):' | |||||
179 | params=dict(f_path=f_path, target_repo=backend.repo_name, diffmode='sidebyside') |
|
255 | params=dict(f_path=f_path, target_repo=backend.repo_name, diffmode='sidebyside') | |
180 | )) |
|
256 | )) | |
181 |
|
257 | |||
182 |
response.mustcontain('Expand |
|
258 | response.mustcontain('Expand 2 commits') | |
183 | response.mustcontain(file_changes) |
|
259 | response.mustcontain(file_changes) |
@@ -243,7 +243,7 b' class TestFilesViews(object):' | |||||
243 | repo_name=backend.repo_name, |
|
243 | repo_name=backend.repo_name, | |
244 | commit_id=commit.raw_id, f_path='vcs/nodes.py')) |
|
244 | commit_id=commit.raw_id, f_path='vcs/nodes.py')) | |
245 |
|
245 | |||
246 |
msgbox = """<div class="commit |
|
246 | msgbox = """<div class="commit">%s</div>""" | |
247 | response.mustcontain(msgbox % (commit.message, )) |
|
247 | response.mustcontain(msgbox % (commit.message, )) | |
248 |
|
248 | |||
249 | assert_response = response.assert_response() |
|
249 | assert_response = response.assert_response() | |
@@ -313,6 +313,7 b' class TestFilesViews(object):' | |||||
313 |
|
313 | |||
314 | expected_data = json.loads( |
|
314 | expected_data = json.loads( | |
315 | fixture.load_resource('svn_node_history_branches.json')) |
|
315 | fixture.load_resource('svn_node_history_branches.json')) | |
|
316 | ||||
316 | assert expected_data == response.json |
|
317 | assert expected_data == response.json | |
317 |
|
318 | |||
318 | def test_file_source_history_with_annotation(self, backend, xhr_header): |
|
319 | def test_file_source_history_with_annotation(self, backend, xhr_header): | |
@@ -521,10 +522,10 b' class TestRepositoryArchival(object):' | |||||
521 | def test_archival(self, backend): |
|
522 | def test_archival(self, backend): | |
522 | backend.enable_downloads() |
|
523 | backend.enable_downloads() | |
523 | commit = backend.repo.get_commit(commit_idx=173) |
|
524 | commit = backend.repo.get_commit(commit_idx=173) | |
524 |
for a |
|
525 | for a_type, content_type, extension in settings.ARCHIVE_SPECS: | |
525 | mime_type, arch_ext = info |
|
526 | ||
526 |
short = commit.short_id + |
|
527 | short = commit.short_id + extension | |
527 |
fname = commit.raw_id + |
|
528 | fname = commit.raw_id + extension | |
528 | filename = '%s-%s' % (backend.repo_name, short) |
|
529 | filename = '%s-%s' % (backend.repo_name, short) | |
529 | response = self.app.get( |
|
530 | response = self.app.get( | |
530 | route_path('repo_archivefile', |
|
531 | route_path('repo_archivefile', | |
@@ -534,7 +535,7 b' class TestRepositoryArchival(object):' | |||||
534 | assert response.status == '200 OK' |
|
535 | assert response.status == '200 OK' | |
535 | headers = [ |
|
536 | headers = [ | |
536 | ('Content-Disposition', 'attachment; filename=%s' % filename), |
|
537 | ('Content-Disposition', 'attachment; filename=%s' % filename), | |
537 |
('Content-Type', '%s' % |
|
538 | ('Content-Type', '%s' % content_type), | |
538 | ] |
|
539 | ] | |
539 |
|
540 | |||
540 | for header in headers: |
|
541 | for header in headers: | |
@@ -761,7 +762,7 b' class TestModifyFilesWithWebInterface(ob' | |||||
761 |
|
762 | |||
762 | @pytest.mark.xfail_backends("svn", reason="Depends on online editing") |
|
763 | @pytest.mark.xfail_backends("svn", reason="Depends on online editing") | |
763 | def test_add_file_into_repo_missing_content(self, backend, csrf_token): |
|
764 | def test_add_file_into_repo_missing_content(self, backend, csrf_token): | |
764 |
|
|
765 | backend.create_repo() | |
765 | filename = 'init.py' |
|
766 | filename = 'init.py' | |
766 | response = self.app.post( |
|
767 | response = self.app.post( | |
767 | route_path('repo_files_create_file', |
|
768 | route_path('repo_files_create_file', | |
@@ -770,26 +771,25 b' class TestModifyFilesWithWebInterface(ob' | |||||
770 | params={ |
|
771 | params={ | |
771 | 'content': "", |
|
772 | 'content': "", | |
772 | 'filename': filename, |
|
773 | 'filename': filename, | |
773 | 'location': "", |
|
|||
774 | 'csrf_token': csrf_token, |
|
774 | 'csrf_token': csrf_token, | |
775 | }, |
|
775 | }, | |
776 | status=302) |
|
776 | status=302) | |
777 | assert_session_flash(response, |
|
777 | expected_msg = 'Successfully committed new file `{}`'.format(os.path.join(filename)) | |
778 | 'Successfully committed new file `{}`'.format( |
|
778 | assert_session_flash(response, expected_msg) | |
779 | os.path.join(filename))) |
|
|||
780 |
|
779 | |||
781 | def test_add_file_into_repo_missing_filename(self, backend, csrf_token): |
|
780 | def test_add_file_into_repo_missing_filename(self, backend, csrf_token): | |
|
781 | commit_id = backend.repo.get_commit().raw_id | |||
782 | response = self.app.post( |
|
782 | response = self.app.post( | |
783 | route_path('repo_files_create_file', |
|
783 | route_path('repo_files_create_file', | |
784 | repo_name=backend.repo_name, |
|
784 | repo_name=backend.repo_name, | |
785 |
commit_id= |
|
785 | commit_id=commit_id, f_path='/'), | |
786 | params={ |
|
786 | params={ | |
787 | 'content': "foo", |
|
787 | 'content': "foo", | |
788 | 'csrf_token': csrf_token, |
|
788 | 'csrf_token': csrf_token, | |
789 | }, |
|
789 | }, | |
790 | status=302) |
|
790 | status=302) | |
791 |
|
791 | |||
792 | assert_session_flash(response, 'No filename') |
|
792 | assert_session_flash(response, 'No filename specified') | |
793 |
|
793 | |||
794 | def test_add_file_into_repo_errors_and_no_commits( |
|
794 | def test_add_file_into_repo_errors_and_no_commits( | |
795 | self, backend, csrf_token): |
|
795 | self, backend, csrf_token): | |
@@ -806,7 +806,7 b' class TestModifyFilesWithWebInterface(ob' | |||||
806 | }, |
|
806 | }, | |
807 | status=302) |
|
807 | status=302) | |
808 |
|
808 | |||
809 | assert_session_flash(response, 'No filename') |
|
809 | assert_session_flash(response, 'No filename specified') | |
810 |
|
810 | |||
811 | # Not allowed, redirect to the summary |
|
811 | # Not allowed, redirect to the summary | |
812 | redirected = response.follow() |
|
812 | redirected = response.follow() | |
@@ -817,52 +817,51 b' class TestModifyFilesWithWebInterface(ob' | |||||
817 |
|
817 | |||
818 | assert redirected.request.path == summary_url |
|
818 | assert redirected.request.path == summary_url | |
819 |
|
819 | |||
820 |
@pytest.mark.parametrize(" |
|
820 | @pytest.mark.parametrize("filename, clean_filename", [ | |
821 | ('/abs', 'foo'), |
|
821 | ('/abs/foo', 'abs/foo'), | |
822 | ('../rel', 'foo'), |
|
822 | ('../rel/foo', 'rel/foo'), | |
823 | ('file/../foo', 'foo'), |
|
823 | ('file/../foo/foo', 'file/foo/foo'), | |
824 | ]) |
|
824 | ]) | |
825 | def test_add_file_into_repo_bad_filenames( |
|
825 | def test_add_file_into_repo_bad_filenames(self, filename, clean_filename, backend, csrf_token): | |
826 | self, location, filename, backend, csrf_token): |
|
826 | repo = backend.create_repo() | |
|
827 | commit_id = repo.get_commit().raw_id | |||
|
828 | ||||
827 | response = self.app.post( |
|
829 | response = self.app.post( | |
828 | route_path('repo_files_create_file', |
|
830 | route_path('repo_files_create_file', | |
829 |
repo_name= |
|
831 | repo_name=repo.repo_name, | |
830 |
commit_id= |
|
832 | commit_id=commit_id, f_path='/'), | |
831 | params={ |
|
833 | params={ | |
832 | 'content': "foo", |
|
834 | 'content': "foo", | |
833 | 'filename': filename, |
|
835 | 'filename': filename, | |
834 | 'location': location, |
|
|||
835 | 'csrf_token': csrf_token, |
|
836 | 'csrf_token': csrf_token, | |
836 | }, |
|
837 | }, | |
837 | status=302) |
|
838 | status=302) | |
838 |
|
839 | |||
839 | assert_session_flash( |
|
840 | expected_msg = 'Successfully committed new file `{}`'.format(clean_filename) | |
840 | response, |
|
841 | assert_session_flash(response, expected_msg) | |
841 | 'The location specified must be a relative path and must not ' |
|
|||
842 | 'contain .. in the path') |
|
|||
843 |
|
842 | |||
844 |
@pytest.mark.parametrize("cnt, |
|
843 | @pytest.mark.parametrize("cnt, filename, content", [ | |
845 |
(1, '', |
|
844 | (1, 'foo.txt', "Content"), | |
846 |
(2, 'dir', |
|
845 | (2, 'dir/foo.rst', "Content"), | |
847 | (3, 'rel/dir', 'foo.bar'), |
|
846 | (3, 'dir/foo-second.rst', "Content"), | |
|
847 | (4, 'rel/dir/foo.bar', "Content"), | |||
848 | ]) |
|
848 | ]) | |
849 |
def test_add_file_into_repo(self, cnt, |
|
849 | def test_add_file_into_empty_repo(self, cnt, filename, content, backend, csrf_token): | |
850 | csrf_token): |
|
|||
851 | repo = backend.create_repo() |
|
850 | repo = backend.create_repo() | |
|
851 | commit_id = repo.get_commit().raw_id | |||
852 | response = self.app.post( |
|
852 | response = self.app.post( | |
853 | route_path('repo_files_create_file', |
|
853 | route_path('repo_files_create_file', | |
854 | repo_name=repo.repo_name, |
|
854 | repo_name=repo.repo_name, | |
855 |
commit_id= |
|
855 | commit_id=commit_id, f_path='/'), | |
856 | params={ |
|
856 | params={ | |
857 |
'content': |
|
857 | 'content': content, | |
858 | 'filename': filename, |
|
858 | 'filename': filename, | |
859 | 'location': location, |
|
|||
860 | 'csrf_token': csrf_token, |
|
859 | 'csrf_token': csrf_token, | |
861 | }, |
|
860 | }, | |
862 | status=302) |
|
861 | status=302) | |
863 | assert_session_flash(response, |
|
862 | ||
864 |
|
|
863 | expected_msg = 'Successfully committed new file `{}`'.format(filename) | |
865 | os.path.join(location, filename))) |
|
864 | assert_session_flash(response, expected_msg) | |
866 |
|
865 | |||
867 | def test_edit_file_view(self, backend): |
|
866 | def test_edit_file_view(self, backend): | |
868 | response = self.app.get( |
|
867 | response = self.app.get( | |
@@ -884,8 +883,7 b' class TestModifyFilesWithWebInterface(ob' | |||||
884 | f_path='vcs/nodes.py'), |
|
883 | f_path='vcs/nodes.py'), | |
885 | status=302) |
|
884 | status=302) | |
886 | assert_session_flash( |
|
885 | assert_session_flash( | |
887 | response, |
|
886 | response, 'Cannot modify file. Given commit `tip` is not head of a branch.') | |
888 | 'You can only edit files with commit being a valid branch') |
|
|||
889 |
|
887 | |||
890 | def test_edit_file_view_commit_changes(self, backend, csrf_token): |
|
888 | def test_edit_file_view_commit_changes(self, backend, csrf_token): | |
891 | repo = backend.create_repo() |
|
889 | repo = backend.create_repo() | |
@@ -953,8 +951,7 b' class TestModifyFilesWithWebInterface(ob' | |||||
953 | f_path='vcs/nodes.py'), |
|
951 | f_path='vcs/nodes.py'), | |
954 | status=302) |
|
952 | status=302) | |
955 | assert_session_flash( |
|
953 | assert_session_flash( | |
956 | response, |
|
954 | response, 'Cannot modify file. Given commit `tip` is not head of a branch.') | |
957 | 'You can only delete files with commit being a valid branch') |
|
|||
958 |
|
955 | |||
959 | def test_delete_file_view_commit_changes(self, backend, csrf_token): |
|
956 | def test_delete_file_view_commit_changes(self, backend, csrf_token): | |
960 | repo = backend.create_repo() |
|
957 | repo = backend.create_repo() | |
@@ -992,7 +989,7 b' class TestFilesViewOtherCases(object):' | |||||
992 | repo_file_add_url = route_path( |
|
989 | repo_file_add_url = route_path( | |
993 | 'repo_files_add_file', |
|
990 | 'repo_files_add_file', | |
994 | repo_name=repo.repo_name, |
|
991 | repo_name=repo.repo_name, | |
995 |
commit_id=0, f_path='') |
|
992 | commit_id=0, f_path='') | |
996 |
|
993 | |||
997 | assert_session_flash( |
|
994 | assert_session_flash( | |
998 | response, |
|
995 | response, | |
@@ -1009,7 +1006,7 b' class TestFilesViewOtherCases(object):' | |||||
1009 | repo_file_add_url = route_path( |
|
1006 | repo_file_add_url = route_path( | |
1010 | 'repo_files_add_file', |
|
1007 | 'repo_files_add_file', | |
1011 | repo_name=repo.repo_name, |
|
1008 | repo_name=repo.repo_name, | |
1012 |
commit_id=0, f_path='') |
|
1009 | commit_id=0, f_path='') | |
1013 |
|
1010 | |||
1014 | response = self.app.get( |
|
1011 | response = self.app.get( | |
1015 | route_path('repo_files', |
|
1012 | route_path('repo_files', |
@@ -40,6 +40,8 b' def route_path(name, params=None, **kwar' | |||||
40 | base_url = { |
|
40 | base_url = { | |
41 | 'repo_changelog': '/{repo_name}/changelog', |
|
41 | 'repo_changelog': '/{repo_name}/changelog', | |
42 | 'repo_changelog_file': '/{repo_name}/changelog/{commit_id}/{f_path}', |
|
42 | 'repo_changelog_file': '/{repo_name}/changelog/{commit_id}/{f_path}', | |
|
43 | 'repo_commits': '/{repo_name}/commits', | |||
|
44 | 'repo_commits_file': '/{repo_name}/commits/{commit_id}/{f_path}', | |||
43 | 'pullrequest_show': '/{repo_name}/pull-request/{pull_request_id}', |
|
45 | 'pullrequest_show': '/{repo_name}/pull-request/{pull_request_id}', | |
44 | 'pullrequest_show_all': '/{repo_name}/pull-request', |
|
46 | 'pullrequest_show_all': '/{repo_name}/pull-request', | |
45 | 'pullrequest_show_all_data': '/{repo_name}/pull-request-data', |
|
47 | 'pullrequest_show_all_data': '/{repo_name}/pull-request-data', | |
@@ -998,11 +1000,11 b' class TestPullrequestsView(object):' | |||||
998 | assert len(target_children) == 1 |
|
1000 | assert len(target_children) == 1 | |
999 |
|
1001 | |||
1000 | expected_origin_link = route_path( |
|
1002 | expected_origin_link = route_path( | |
1001 |
'repo_c |
|
1003 | 'repo_commits', | |
1002 | repo_name=pull_request.source_repo.scm_instance().name, |
|
1004 | repo_name=pull_request.source_repo.scm_instance().name, | |
1003 | params=dict(branch='origin')) |
|
1005 | params=dict(branch='origin')) | |
1004 | expected_target_link = route_path( |
|
1006 | expected_target_link = route_path( | |
1005 |
'repo_c |
|
1007 | 'repo_commits', | |
1006 | repo_name=pull_request.target_repo.scm_instance().name, |
|
1008 | repo_name=pull_request.target_repo.scm_instance().name, | |
1007 | params=dict(branch='target')) |
|
1009 | params=dict(branch='target')) | |
1008 | assert origin_children[0].attrib['href'] == expected_origin_link |
|
1010 | assert origin_children[0].attrib['href'] == expected_origin_link |
@@ -350,11 +350,11 b' class TestCreateReferenceData(object):' | |||||
350 | { |
|
350 | { | |
351 | 'children': [ |
|
351 | 'children': [ | |
352 | { |
|
352 | { | |
353 | 'id': 'a', 'raw_id': 'a_id', 'text': 'a', 'type': 't1', |
|
353 | 'id': 'a', 'idx': 0, 'raw_id': 'a_id', 'text': 'a', 'type': 't1', | |
354 | 'files_url': expected_files_url + 'a/?at=a', |
|
354 | 'files_url': expected_files_url + 'a/?at=a', | |
355 | }, |
|
355 | }, | |
356 | { |
|
356 | { | |
357 | 'id': 'b', 'raw_id': 'b_id', 'text': 'b', 'type': 't1', |
|
357 | 'id': 'b', 'idx': 0, 'raw_id': 'b_id', 'text': 'b', 'type': 't1', | |
358 | 'files_url': expected_files_url + 'b/?at=b', |
|
358 | 'files_url': expected_files_url + 'b/?at=b', | |
359 | } |
|
359 | } | |
360 | ], |
|
360 | ], | |
@@ -363,7 +363,7 b' class TestCreateReferenceData(object):' | |||||
363 | { |
|
363 | { | |
364 | 'children': [ |
|
364 | 'children': [ | |
365 | { |
|
365 | { | |
366 | 'id': 'c', 'raw_id': 'c_id', 'text': 'c', 'type': 't2', |
|
366 | 'id': 'c', 'idx': 0, 'raw_id': 'c_id', 'text': 'c', 'type': 't2', | |
367 | 'files_url': expected_files_url + 'c/?at=c', |
|
367 | 'files_url': expected_files_url + 'c/?at=c', | |
368 | } |
|
368 | } | |
369 | ], |
|
369 | ], | |
@@ -385,12 +385,12 b' class TestCreateReferenceData(object):' | |||||
385 | { |
|
385 | { | |
386 | 'children': [ |
|
386 | 'children': [ | |
387 | { |
|
387 | { | |
388 | 'id': 'a@a_id', 'raw_id': 'a_id', |
|
388 | 'id': 'a@a_id', 'idx': 0, 'raw_id': 'a_id', | |
389 | 'text': 'a', 'type': 't1', |
|
389 | 'text': 'a', 'type': 't1', | |
390 | 'files_url': expected_files_url + 'a_id/a?at=a', |
|
390 | 'files_url': expected_files_url + 'a_id/a?at=a', | |
391 | }, |
|
391 | }, | |
392 | { |
|
392 | { | |
393 | 'id': 'b@b_id', 'raw_id': 'b_id', |
|
393 | 'id': 'b@b_id', 'idx': 0, 'raw_id': 'b_id', | |
394 | 'text': 'b', 'type': 't1', |
|
394 | 'text': 'b', 'type': 't1', | |
395 | 'files_url': expected_files_url + 'b_id/b?at=b', |
|
395 | 'files_url': expected_files_url + 'b_id/b?at=b', | |
396 | } |
|
396 | } | |
@@ -400,7 +400,7 b' class TestCreateReferenceData(object):' | |||||
400 | { |
|
400 | { | |
401 | 'children': [ |
|
401 | 'children': [ | |
402 | { |
|
402 | { | |
403 | 'id': 'c@c_id', 'raw_id': 'c_id', |
|
403 | 'id': 'c@c_id', 'idx': 0, 'raw_id': 'c_id', | |
404 | 'text': 'c', 'type': 't2', |
|
404 | 'text': 'c', 'type': 't2', | |
405 | 'files_url': expected_files_url + 'c_id/c?at=c', |
|
405 | 'files_url': expected_files_url + 'c_id/c?at=c', | |
406 | } |
|
406 | } | |
@@ -516,6 +516,7 b' class TestReferenceItems(object):' | |||||
516 | 'text': ref_name, |
|
516 | 'text': ref_name, | |
517 | 'id': self._format_function(ref_name, ref_id), |
|
517 | 'id': self._format_function(ref_name, ref_id), | |
518 | 'raw_id': ref_id, |
|
518 | 'raw_id': ref_id, | |
|
519 | 'idx': 0, | |||
519 | 'type': self.ref_type, |
|
520 | 'type': self.ref_type, | |
520 | 'files_url': self.fake_url |
|
521 | 'files_url': self.fake_url | |
521 | } |
|
522 | } |
@@ -113,7 +113,7 b' class RepoChangelogView(RepoAppView):' | |||||
113 | h.flash('Branch {} is not found.'.format(h.escape(branch_name)), |
|
113 | h.flash('Branch {} is not found.'.format(h.escape(branch_name)), | |
114 | category='warning') |
|
114 | category='warning') | |
115 | redirect_url = h.route_path( |
|
115 | redirect_url = h.route_path( | |
116 |
'repo_c |
|
116 | 'repo_commits_file', repo_name=repo_name, | |
117 | commit_id=branch_name, f_path=f_path or '') |
|
117 | commit_id=branch_name, f_path=f_path or '') | |
118 | raise HTTPFound(redirect_url) |
|
118 | raise HTTPFound(redirect_url) | |
119 |
|
119 | |||
@@ -127,13 +127,13 b' class RepoChangelogView(RepoAppView):' | |||||
127 | if f_path: |
|
127 | if f_path: | |
128 | # changelog for file |
|
128 | # changelog for file | |
129 | return h.route_path( |
|
129 | return h.route_path( | |
130 |
'repo_c |
|
130 | 'repo_commits_file', | |
131 | repo_name=c.rhodecode_db_repo.repo_name, |
|
131 | repo_name=c.rhodecode_db_repo.repo_name, | |
132 | commit_id=commit_id, f_path=f_path, |
|
132 | commit_id=commit_id, f_path=f_path, | |
133 | _query=query_params) |
|
133 | _query=query_params) | |
134 | else: |
|
134 | else: | |
135 | return h.route_path( |
|
135 | return h.route_path( | |
136 |
'repo_c |
|
136 | 'repo_commits', | |
137 | repo_name=c.rhodecode_db_repo.repo_name, _query=query_params) |
|
137 | repo_name=c.rhodecode_db_repo.repo_name, _query=query_params) | |
138 |
|
138 | |||
139 | c.total_cs = len(collection) |
|
139 | c.total_cs = len(collection) | |
@@ -171,11 +171,18 b' class RepoChangelogView(RepoAppView):' | |||||
171 | @HasRepoPermissionAnyDecorator( |
|
171 | @HasRepoPermissionAnyDecorator( | |
172 | 'repository.read', 'repository.write', 'repository.admin') |
|
172 | 'repository.read', 'repository.write', 'repository.admin') | |
173 | @view_config( |
|
173 | @view_config( | |
|
174 | route_name='repo_commits', request_method='GET', | |||
|
175 | renderer='rhodecode:templates/commits/changelog.mako') | |||
|
176 | @view_config( | |||
|
177 | route_name='repo_commits_file', request_method='GET', | |||
|
178 | renderer='rhodecode:templates/commits/changelog.mako') | |||
|
179 | # old routes for backward compat | |||
|
180 | @view_config( | |||
174 | route_name='repo_changelog', request_method='GET', |
|
181 | route_name='repo_changelog', request_method='GET', | |
175 |
renderer='rhodecode:templates/c |
|
182 | renderer='rhodecode:templates/commits/changelog.mako') | |
176 | @view_config( |
|
183 | @view_config( | |
177 | route_name='repo_changelog_file', request_method='GET', |
|
184 | route_name='repo_changelog_file', request_method='GET', | |
178 |
renderer='rhodecode:templates/c |
|
185 | renderer='rhodecode:templates/commits/changelog.mako') | |
179 | def repo_changelog(self): |
|
186 | def repo_changelog(self): | |
180 | c = self.load_default_context() |
|
187 | c = self.load_default_context() | |
181 |
|
188 | |||
@@ -224,7 +231,7 b' class RepoChangelogView(RepoAppView):' | |||||
224 | except RepositoryError as e: |
|
231 | except RepositoryError as e: | |
225 | h.flash(safe_str(e), category='warning') |
|
232 | h.flash(safe_str(e), category='warning') | |
226 | redirect_url = h.route_path( |
|
233 | redirect_url = h.route_path( | |
227 |
'repo_c |
|
234 | 'repo_commits', repo_name=self.db_repo_name) | |
228 | raise HTTPFound(redirect_url) |
|
235 | raise HTTPFound(redirect_url) | |
229 | collection = list(reversed(collection)) |
|
236 | collection = list(reversed(collection)) | |
230 | else: |
|
237 | else: | |
@@ -246,14 +253,14 b' class RepoChangelogView(RepoAppView):' | |||||
246 | log.exception(safe_str(e)) |
|
253 | log.exception(safe_str(e)) | |
247 | h.flash(safe_str(h.escape(e)), category='error') |
|
254 | h.flash(safe_str(h.escape(e)), category='error') | |
248 | raise HTTPFound( |
|
255 | raise HTTPFound( | |
249 |
h.route_path('repo_c |
|
256 | h.route_path('repo_commits', repo_name=self.db_repo_name)) | |
250 |
|
257 | |||
251 | if partial_xhr or self.request.environ.get('HTTP_X_PJAX'): |
|
258 | if partial_xhr or self.request.environ.get('HTTP_X_PJAX'): | |
252 | # case when loading dynamic file history in file view |
|
259 | # case when loading dynamic file history in file view | |
253 | # loading from ajax, we don't want the first result, it's popped |
|
260 | # loading from ajax, we don't want the first result, it's popped | |
254 | # in the code above |
|
261 | # in the code above | |
255 | html = render( |
|
262 | html = render( | |
256 |
'rhodecode:templates/c |
|
263 | 'rhodecode:templates/commits/changelog_file_history.mako', | |
257 | self._get_template_context(c), self.request) |
|
264 | self._get_template_context(c), self.request) | |
258 | return Response(html) |
|
265 | return Response(html) | |
259 |
|
266 | |||
@@ -271,14 +278,14 b' class RepoChangelogView(RepoAppView):' | |||||
271 | @HasRepoPermissionAnyDecorator( |
|
278 | @HasRepoPermissionAnyDecorator( | |
272 | 'repository.read', 'repository.write', 'repository.admin') |
|
279 | 'repository.read', 'repository.write', 'repository.admin') | |
273 | @view_config( |
|
280 | @view_config( | |
274 |
route_name='repo_c |
|
281 | route_name='repo_commits_elements', request_method=('GET', 'POST'), | |
275 |
renderer='rhodecode:templates/c |
|
282 | renderer='rhodecode:templates/commits/changelog_elements.mako', | |
276 | xhr=True) |
|
283 | xhr=True) | |
277 | @view_config( |
|
284 | @view_config( | |
278 |
route_name='repo_c |
|
285 | route_name='repo_commits_elements_file', request_method=('GET', 'POST'), | |
279 |
renderer='rhodecode:templates/c |
|
286 | renderer='rhodecode:templates/commits/changelog_elements.mako', | |
280 | xhr=True) |
|
287 | xhr=True) | |
281 |
def repo_c |
|
288 | def repo_commits_elements(self): | |
282 | c = self.load_default_context() |
|
289 | c = self.load_default_context() | |
283 | commit_id = self.request.matchdict.get('commit_id') |
|
290 | commit_id = self.request.matchdict.get('commit_id') | |
284 | f_path = self._get_f_path(self.request.matchdict) |
|
291 | f_path = self._get_f_path(self.request.matchdict) | |
@@ -312,7 +319,7 b' class RepoChangelogView(RepoAppView):' | |||||
312 | except (RepositoryError, CommitDoesNotExistError, Exception) as e: |
|
319 | except (RepositoryError, CommitDoesNotExistError, Exception) as e: | |
313 | log.exception(safe_str(e)) |
|
320 | log.exception(safe_str(e)) | |
314 | raise HTTPFound( |
|
321 | raise HTTPFound( | |
315 |
h.route_path('repo_c |
|
322 | h.route_path('repo_commits', repo_name=self.db_repo_name)) | |
316 |
|
323 | |||
317 | collection = base_commit.get_path_history( |
|
324 | collection = base_commit.get_path_history( | |
318 | f_path, limit=hist_limit, pre_load=pre_load) |
|
325 | f_path, limit=hist_limit, pre_load=pre_load) |
@@ -105,10 +105,9 b' class RepoCommitsView(RepoAppView):' | |||||
105 |
|
105 | |||
106 | c.commit_ranges = commits |
|
106 | c.commit_ranges = commits | |
107 | if not c.commit_ranges: |
|
107 | if not c.commit_ranges: | |
108 | raise RepositoryError( |
|
108 | raise RepositoryError('The commit range returned an empty result') | |
109 | 'The commit range returned an empty result') |
|
109 | except CommitDoesNotExistError as e: | |
110 | except CommitDoesNotExistError: |
|
110 | msg = _('No such commit exists. Org exception: `{}`').format(e) | |
111 | msg = _('No such commit exists for this repository') |
|
|||
112 | h.flash(msg, category='error') |
|
111 | h.flash(msg, category='error') | |
113 | raise HTTPNotFound() |
|
112 | raise HTTPNotFound() | |
114 | except Exception: |
|
113 | except Exception: |
@@ -214,29 +214,23 b' class RepoCompareView(RepoAppView):' | |||||
214 | pre_load = ["author", "branch", "date", "message"] |
|
214 | pre_load = ["author", "branch", "date", "message"] | |
215 | c.ancestor = None |
|
215 | c.ancestor = None | |
216 |
|
216 | |||
217 | if c.file_path: |
|
217 | try: | |
218 | if source_commit == target_commit: |
|
218 | c.commit_ranges = source_scm.compare( | |
219 | c.commit_ranges = [] |
|
219 | source_commit.raw_id, target_commit.raw_id, | |
220 | else: |
|
220 | target_scm, merge, pre_load=pre_load) or [] | |
221 | c.commit_ranges = [target_commit] |
|
221 | if merge: | |
222 | else: |
|
222 | c.ancestor = source_scm.get_common_ancestor( | |
223 | try: |
|
223 | source_commit.raw_id, target_commit.raw_id, target_scm) | |
224 | c.commit_ranges = source_scm.compare( |
|
224 | except RepositoryRequirementError: | |
225 | source_commit.raw_id, target_commit.raw_id, |
|
225 | msg = _('Could not compare repos with different ' | |
226 | target_scm, merge, pre_load=pre_load) |
|
226 | 'large file settings') | |
227 | if merge: |
|
227 | log.error(msg) | |
228 | c.ancestor = source_scm.get_common_ancestor( |
|
228 | if partial: | |
229 | source_commit.raw_id, target_commit.raw_id, target_scm) |
|
229 | return Response(msg) | |
230 | except RepositoryRequirementError: |
|
230 | h.flash(msg, category='error') | |
231 | msg = _('Could not compare repos with different ' |
|
231 | raise HTTPFound( | |
232 | 'large file settings') |
|
232 | h.route_path('repo_compare_select', | |
233 | log.error(msg) |
|
233 | repo_name=self.db_repo_name)) | |
234 | if partial: |
|
|||
235 | return Response(msg) |
|
|||
236 | h.flash(msg, category='error') |
|
|||
237 | raise HTTPFound( |
|
|||
238 | h.route_path('repo_compare_select', |
|
|||
239 | repo_name=self.db_repo_name)) |
|
|||
240 |
|
234 | |||
241 | c.statuses = self.db_repo.statuses( |
|
235 | c.statuses = self.db_repo.statuses( | |
242 | [x.raw_id for x in c.commit_ranges]) |
|
236 | [x.raw_id for x in c.commit_ranges]) |
This diff has been collapsed as it changes many lines, (503 lines changed) Show them Hide them | |||||
@@ -25,6 +25,7 b' import shutil' | |||||
25 | import tempfile |
|
25 | import tempfile | |
26 | import collections |
|
26 | import collections | |
27 | import urllib |
|
27 | import urllib | |
|
28 | import pathlib2 | |||
28 |
|
29 | |||
29 | from pyramid.httpexceptions import HTTPNotFound, HTTPBadRequest, HTTPFound |
|
30 | from pyramid.httpexceptions import HTTPNotFound, HTTPBadRequest, HTTPFound | |
30 | from pyramid.view import view_config |
|
31 | from pyramid.view import view_config | |
@@ -42,7 +43,7 b' from rhodecode.lib.exceptions import Non' | |||||
42 | from rhodecode.lib.codeblocks import ( |
|
43 | from rhodecode.lib.codeblocks import ( | |
43 | filenode_as_lines_tokens, filenode_as_annotated_lines_tokens) |
|
44 | filenode_as_lines_tokens, filenode_as_annotated_lines_tokens) | |
44 | from rhodecode.lib.utils2 import ( |
|
45 | from rhodecode.lib.utils2 import ( | |
45 | convert_line_endings, detect_mode, safe_str, str2bool, safe_int) |
|
46 | convert_line_endings, detect_mode, safe_str, str2bool, safe_int, sha1, safe_unicode) | |
46 | from rhodecode.lib.auth import ( |
|
47 | from rhodecode.lib.auth import ( | |
47 | LoginRequired, HasRepoPermissionAnyDecorator, CSRFRequired) |
|
48 | LoginRequired, HasRepoPermissionAnyDecorator, CSRFRequired) | |
48 | from rhodecode.lib.vcs import path as vcspath |
|
49 | from rhodecode.lib.vcs import path as vcspath | |
@@ -87,7 +88,7 b' class RepoFilesView(RepoAppView):' | |||||
87 | c.enable_downloads = self.db_repo.enable_downloads |
|
88 | c.enable_downloads = self.db_repo.enable_downloads | |
88 | return c |
|
89 | return c | |
89 |
|
90 | |||
90 | def _ensure_not_locked(self): |
|
91 | def _ensure_not_locked(self, commit_id='tip'): | |
91 | _ = self.request.translate |
|
92 | _ = self.request.translate | |
92 |
|
93 | |||
93 | repo = self.db_repo |
|
94 | repo = self.db_repo | |
@@ -98,21 +99,41 b' class RepoFilesView(RepoAppView):' | |||||
98 | 'warning') |
|
99 | 'warning') | |
99 | files_url = h.route_path( |
|
100 | files_url = h.route_path( | |
100 | 'repo_files:default_path', |
|
101 | 'repo_files:default_path', | |
101 |
repo_name=self.db_repo_name, commit_id= |
|
102 | repo_name=self.db_repo_name, commit_id=commit_id) | |
102 | raise HTTPFound(files_url) |
|
103 | raise HTTPFound(files_url) | |
103 |
|
104 | |||
104 | def check_branch_permission(self, branch_name): |
|
105 | def forbid_non_head(self, is_head, f_path, commit_id='tip', json_mode=False): | |
|
106 | _ = self.request.translate | |||
|
107 | ||||
|
108 | if not is_head: | |||
|
109 | message = _('Cannot modify file. ' | |||
|
110 | 'Given commit `{}` is not head of a branch.').format(commit_id) | |||
|
111 | h.flash(message, category='warning') | |||
|
112 | ||||
|
113 | if json_mode: | |||
|
114 | return message | |||
|
115 | ||||
|
116 | files_url = h.route_path( | |||
|
117 | 'repo_files', repo_name=self.db_repo_name, commit_id=commit_id, | |||
|
118 | f_path=f_path) | |||
|
119 | raise HTTPFound(files_url) | |||
|
120 | ||||
|
121 | def check_branch_permission(self, branch_name, commit_id='tip', json_mode=False): | |||
105 | _ = self.request.translate |
|
122 | _ = self.request.translate | |
106 |
|
123 | |||
107 | rule, branch_perm = self._rhodecode_user.get_rule_and_branch_permission( |
|
124 | rule, branch_perm = self._rhodecode_user.get_rule_and_branch_permission( | |
108 | self.db_repo_name, branch_name) |
|
125 | self.db_repo_name, branch_name) | |
109 | if branch_perm and branch_perm not in ['branch.push', 'branch.push_force']: |
|
126 | if branch_perm and branch_perm not in ['branch.push', 'branch.push_force']: | |
110 | h.flash( |
|
127 | message = _('Branch `{}` changes forbidden by rule {}.').format( | |
111 | _('Branch `{}` changes forbidden by rule {}.').format(branch_name, rule), |
|
128 | branch_name, rule) | |
112 |
|
|
129 | h.flash(message, 'warning') | |
|
130 | ||||
|
131 | if json_mode: | |||
|
132 | return message | |||
|
133 | ||||
113 | files_url = h.route_path( |
|
134 | files_url = h.route_path( | |
114 | 'repo_files:default_path', |
|
135 | 'repo_files:default_path', repo_name=self.db_repo_name, commit_id=commit_id) | |
115 | repo_name=self.db_repo_name, commit_id='tip') |
|
136 | ||
116 | raise HTTPFound(files_url) |
|
137 | raise HTTPFound(files_url) | |
117 |
|
138 | |||
118 | def _get_commit_and_path(self): |
|
139 | def _get_commit_and_path(self): | |
@@ -146,8 +167,7 b' class RepoFilesView(RepoAppView):' | |||||
146 |
|
167 | |||
147 | _url = h.route_path( |
|
168 | _url = h.route_path( | |
148 | 'repo_files_add_file', |
|
169 | 'repo_files_add_file', | |
149 |
repo_name=self.db_repo_name, commit_id=0, f_path='' |
|
170 | repo_name=self.db_repo_name, commit_id=0, f_path='') | |
150 | _anchor='edit') |
|
|||
151 |
|
171 | |||
152 | if h.HasRepoPermissionAny( |
|
172 | if h.HasRepoPermissionAny( | |
153 | 'repository.write', 'repository.admin')(self.db_repo_name): |
|
173 | 'repository.write', 'repository.admin')(self.db_repo_name): | |
@@ -185,8 +205,7 b' class RepoFilesView(RepoAppView):' | |||||
185 | h.flash(_('No such commit exists for this repository'), category='error') |
|
205 | h.flash(_('No such commit exists for this repository'), category='error') | |
186 | raise HTTPNotFound() |
|
206 | raise HTTPNotFound() | |
187 | except RepositoryError as e: |
|
207 | except RepositoryError as e: | |
188 | log.warning('Repository error while fetching ' |
|
208 | log.warning('Repository error while fetching filenode `%s`. Err:%s', path, e) | |
189 | 'filenode `%s`. Err:%s', path, e) |
|
|||
190 | h.flash(safe_str(h.escape(e)), category='error') |
|
209 | h.flash(safe_str(h.escape(e)), category='error') | |
191 | raise HTTPNotFound() |
|
210 | raise HTTPNotFound() | |
192 |
|
211 | |||
@@ -195,12 +214,7 b' class RepoFilesView(RepoAppView):' | |||||
195 | def _is_valid_head(self, commit_id, repo): |
|
214 | def _is_valid_head(self, commit_id, repo): | |
196 | branch_name = sha_commit_id = '' |
|
215 | branch_name = sha_commit_id = '' | |
197 | is_head = False |
|
216 | is_head = False | |
198 |
|
217 | log.debug('Checking if commit_id `%s` is a head for %s.', commit_id, repo) | ||
199 | if h.is_svn(repo) and not repo.is_empty(): |
|
|||
200 | # Note: Subversion only has one head. |
|
|||
201 | if commit_id == repo.get_commit(commit_idx=-1).raw_id: |
|
|||
202 | is_head = True |
|
|||
203 | return branch_name, sha_commit_id, is_head |
|
|||
204 |
|
218 | |||
205 | for _branch_name, branch_commit_id in repo.branches.items(): |
|
219 | for _branch_name, branch_commit_id in repo.branches.items(): | |
206 | # simple case we pass in branch name, it's a HEAD |
|
220 | # simple case we pass in branch name, it's a HEAD | |
@@ -216,8 +230,14 b' class RepoFilesView(RepoAppView):' | |||||
216 | sha_commit_id = branch_commit_id |
|
230 | sha_commit_id = branch_commit_id | |
217 | break |
|
231 | break | |
218 |
|
232 | |||
|
233 | if h.is_svn(repo) and not repo.is_empty(): | |||
|
234 | # Note: Subversion only has one head. | |||
|
235 | if commit_id == repo.get_commit(commit_idx=-1).raw_id: | |||
|
236 | is_head = True | |||
|
237 | return branch_name, sha_commit_id, is_head | |||
|
238 | ||||
219 | # checked branches, means we only need to try to get the branch/commit_sha |
|
239 | # checked branches, means we only need to try to get the branch/commit_sha | |
220 | if not repo.is_empty: |
|
240 | if not repo.is_empty(): | |
221 | commit = repo.get_commit(commit_id=commit_id) |
|
241 | commit = repo.get_commit(commit_id=commit_id) | |
222 | if commit: |
|
242 | if commit: | |
223 | branch_name = commit.branch |
|
243 | branch_name = commit.branch | |
@@ -225,8 +245,7 b' class RepoFilesView(RepoAppView):' | |||||
225 |
|
245 | |||
226 | return branch_name, sha_commit_id, is_head |
|
246 | return branch_name, sha_commit_id, is_head | |
227 |
|
247 | |||
228 | def _get_tree_at_commit( |
|
248 | def _get_tree_at_commit(self, c, commit_id, f_path, full_load=False): | |
229 | self, c, commit_id, f_path, full_load=False): |
|
|||
230 |
|
249 | |||
231 | repo_id = self.db_repo.repo_id |
|
250 | repo_id = self.db_repo.repo_id | |
232 | force_recache = self.get_recache_flag() |
|
251 | force_recache = self.get_recache_flag() | |
@@ -244,16 +263,16 b' class RepoFilesView(RepoAppView):' | |||||
244 |
|
263 | |||
245 | @region.conditional_cache_on_arguments(namespace=cache_namespace_uid, |
|
264 | @region.conditional_cache_on_arguments(namespace=cache_namespace_uid, | |
246 | condition=cache_on) |
|
265 | condition=cache_on) | |
247 | def compute_file_tree(repo_id, commit_id, f_path, full_load): |
|
266 | def compute_file_tree(ver, repo_id, commit_id, f_path, full_load): | |
248 | log.debug('Generating cached file tree for repo_id: %s, %s, %s', |
|
267 | log.debug('Generating cached file tree at ver:%s for repo_id: %s, %s, %s', | |
249 | repo_id, commit_id, f_path) |
|
268 | ver, repo_id, commit_id, f_path) | |
250 |
|
269 | |||
251 | c.full_load = full_load |
|
270 | c.full_load = full_load | |
252 | return render( |
|
271 | return render( | |
253 | 'rhodecode:templates/files/files_browser_tree.mako', |
|
272 | 'rhodecode:templates/files/files_browser_tree.mako', | |
254 | self._get_template_context(c), self.request) |
|
273 | self._get_template_context(c), self.request) | |
255 |
|
274 | |||
256 | return compute_file_tree(self.db_repo.repo_id, commit_id, f_path, full_load) |
|
275 | return compute_file_tree('v1', self.db_repo.repo_id, commit_id, f_path, full_load) | |
257 |
|
276 | |||
258 | def _get_archive_spec(self, fname): |
|
277 | def _get_archive_spec(self, fname): | |
259 | log.debug('Detecting archive spec for: `%s`', fname) |
|
278 | log.debug('Detecting archive spec for: `%s`', fname) | |
@@ -261,8 +280,7 b' class RepoFilesView(RepoAppView):' | |||||
261 | fileformat = None |
|
280 | fileformat = None | |
262 | ext = None |
|
281 | ext = None | |
263 | content_type = None |
|
282 | content_type = None | |
264 |
for a_type, |
|
283 | for a_type, content_type, extension in settings.ARCHIVE_SPECS: | |
265 | content_type, extension = ext_data |
|
|||
266 |
|
284 | |||
267 | if fname.endswith(extension): |
|
285 | if fname.endswith(extension): | |
268 | fileformat = a_type |
|
286 | fileformat = a_type | |
@@ -278,6 +296,15 b' class RepoFilesView(RepoAppView):' | |||||
278 |
|
296 | |||
279 | return commit_id, ext, fileformat, content_type |
|
297 | return commit_id, ext, fileformat, content_type | |
280 |
|
298 | |||
|
299 | def create_pure_path(self, *parts): | |||
|
300 | # Split paths and sanitize them, removing any ../ etc | |||
|
301 | sanitized_path = [ | |||
|
302 | x for x in pathlib2.PurePath(*parts).parts | |||
|
303 | if x not in ['.', '..']] | |||
|
304 | ||||
|
305 | pure_path = pathlib2.PurePath(*sanitized_path) | |||
|
306 | return pure_path | |||
|
307 | ||||
281 | @LoginRequired() |
|
308 | @LoginRequired() | |
282 | @HasRepoPermissionAnyDecorator( |
|
309 | @HasRepoPermissionAnyDecorator( | |
283 | 'repository.read', 'repository.write', 'repository.admin') |
|
310 | 'repository.read', 'repository.write', 'repository.admin') | |
@@ -289,9 +316,10 b' class RepoFilesView(RepoAppView):' | |||||
289 | from rhodecode import CONFIG |
|
316 | from rhodecode import CONFIG | |
290 | _ = self.request.translate |
|
317 | _ = self.request.translate | |
291 | self.load_default_context() |
|
318 | self.load_default_context() | |
292 |
|
319 | default_at_path = '/' | ||
293 | fname = self.request.matchdict['fname'] |
|
320 | fname = self.request.matchdict['fname'] | |
294 | subrepos = self.request.GET.get('subrepos') == 'true' |
|
321 | subrepos = self.request.GET.get('subrepos') == 'true' | |
|
322 | at_path = self.request.GET.get('at_path') or default_at_path | |||
295 |
|
323 | |||
296 | if not self.db_repo.enable_downloads: |
|
324 | if not self.db_repo.enable_downloads: | |
297 | return Response(_('Downloads disabled')) |
|
325 | return Response(_('Downloads disabled')) | |
@@ -311,10 +339,31 b' class RepoFilesView(RepoAppView):' | |||||
311 | except EmptyRepositoryError: |
|
339 | except EmptyRepositoryError: | |
312 | return Response(_('Empty repository')) |
|
340 | return Response(_('Empty repository')) | |
313 |
|
341 | |||
314 | archive_name = '%s-%s%s%s' % ( |
|
342 | try: | |
315 | safe_str(self.db_repo_name.replace('/', '_')), |
|
343 | at_path = commit.get_node(at_path).path or default_at_path | |
316 | '-sub' if subrepos else '', |
|
344 | except Exception: | |
317 | safe_str(commit.short_id), ext) |
|
345 | return Response(_('No node at path {} for this repository').format(at_path)) | |
|
346 | ||||
|
347 | path_sha = sha1(at_path)[:8] | |||
|
348 | ||||
|
349 | # original backward compat name of archive | |||
|
350 | clean_name = safe_str(self.db_repo_name.replace('/', '_')) | |||
|
351 | short_sha = safe_str(commit.short_id) | |||
|
352 | ||||
|
353 | if at_path == default_at_path: | |||
|
354 | archive_name = '{}-{}{}{}'.format( | |||
|
355 | clean_name, | |||
|
356 | '-sub' if subrepos else '', | |||
|
357 | short_sha, | |||
|
358 | ext) | |||
|
359 | # custom path and new name | |||
|
360 | else: | |||
|
361 | archive_name = '{}-{}{}-{}{}'.format( | |||
|
362 | clean_name, | |||
|
363 | '-sub' if subrepos else '', | |||
|
364 | short_sha, | |||
|
365 | path_sha, | |||
|
366 | ext) | |||
318 |
|
367 | |||
319 | use_cached_archive = False |
|
368 | use_cached_archive = False | |
320 | archive_cache_enabled = CONFIG.get( |
|
369 | archive_cache_enabled = CONFIG.get( | |
@@ -339,7 +388,8 b' class RepoFilesView(RepoAppView):' | |||||
339 | fd, archive = tempfile.mkstemp() |
|
388 | fd, archive = tempfile.mkstemp() | |
340 | log.debug('Creating new temp archive in %s', archive) |
|
389 | log.debug('Creating new temp archive in %s', archive) | |
341 | try: |
|
390 | try: | |
342 |
commit.archive_repo(archive, kind=fileformat, subrepos=subrepos |
|
391 | commit.archive_repo(archive, kind=fileformat, subrepos=subrepos, | |
|
392 | archive_at_path=at_path) | |||
343 | except ImproperArchiveTypeError: |
|
393 | except ImproperArchiveTypeError: | |
344 | return _('Unknown archive type') |
|
394 | return _('Unknown archive type') | |
345 | if archive_cache_enabled: |
|
395 | if archive_cache_enabled: | |
@@ -632,8 +682,7 b' class RepoFilesView(RepoAppView):' | |||||
632 | c.authors = [] |
|
682 | c.authors = [] | |
633 | # this loads a simple tree without metadata to speed things up |
|
683 | # this loads a simple tree without metadata to speed things up | |
634 | # later via ajax we call repo_nodetree_full and fetch whole |
|
684 | # later via ajax we call repo_nodetree_full and fetch whole | |
635 | c.file_tree = self._get_tree_at_commit( |
|
685 | c.file_tree = self._get_tree_at_commit(c, c.commit.raw_id, f_path) | |
636 | c, c.commit.raw_id, f_path) |
|
|||
637 |
|
686 | |||
638 | except RepositoryError as e: |
|
687 | except RepositoryError as e: | |
639 | h.flash(safe_str(h.escape(e)), category='error') |
|
688 | h.flash(safe_str(h.escape(e)), category='error') | |
@@ -875,18 +924,17 b' class RepoFilesView(RepoAppView):' | |||||
875 | self.db_repo_name, self.db_repo.repo_id, commit.raw_id, f_path) |
|
924 | self.db_repo_name, self.db_repo.repo_id, commit.raw_id, f_path) | |
876 | return {'nodes': metadata} |
|
925 | return {'nodes': metadata} | |
877 |
|
926 | |||
878 | def _create_references( |
|
927 | def _create_references(self, branches_or_tags, symbolic_reference, f_path, ref_type): | |
879 | self, branches_or_tags, symbolic_reference, f_path): |
|
|||
880 | items = [] |
|
928 | items = [] | |
881 | for name, commit_id in branches_or_tags.items(): |
|
929 | for name, commit_id in branches_or_tags.items(): | |
882 | sym_ref = symbolic_reference(commit_id, name, f_path) |
|
930 | sym_ref = symbolic_reference(commit_id, name, f_path, ref_type) | |
883 | items.append((sym_ref, name)) |
|
931 | items.append((sym_ref, name, ref_type)) | |
884 | return items |
|
932 | return items | |
885 |
|
933 | |||
886 | def _symbolic_reference(self, commit_id, name, f_path): |
|
934 | def _symbolic_reference(self, commit_id, name, f_path, ref_type): | |
887 | return commit_id |
|
935 | return commit_id | |
888 |
|
936 | |||
889 | def _symbolic_reference_svn(self, commit_id, name, f_path): |
|
937 | def _symbolic_reference_svn(self, commit_id, name, f_path, ref_type): | |
890 | new_f_path = vcspath.join(name, f_path) |
|
938 | new_f_path = vcspath.join(name, f_path) | |
891 | return u'%s@%s' % (new_f_path, commit_id) |
|
939 | return u'%s@%s' % (new_f_path, commit_id) | |
892 |
|
940 | |||
@@ -916,7 +964,7 b' class RepoFilesView(RepoAppView):' | |||||
916 | for commit in commits: |
|
964 | for commit in commits: | |
917 | branch = ' (%s)' % commit.branch if commit.branch else '' |
|
965 | branch = ' (%s)' % commit.branch if commit.branch else '' | |
918 | n_desc = 'r%s:%s%s' % (commit.idx, commit.short_id, branch) |
|
966 | n_desc = 'r%s:%s%s' % (commit.idx, commit.short_id, branch) | |
919 | commits_group[0].append((commit.raw_id, n_desc,)) |
|
967 | commits_group[0].append((commit.raw_id, n_desc, 'sha')) | |
920 | history.append(commits_group) |
|
968 | history.append(commits_group) | |
921 |
|
969 | |||
922 | symbolic_reference = self._symbolic_reference |
|
970 | symbolic_reference = self._symbolic_reference | |
@@ -932,11 +980,11 b' class RepoFilesView(RepoAppView):' | |||||
932 | symbolic_reference = self._symbolic_reference_svn |
|
980 | symbolic_reference = self._symbolic_reference_svn | |
933 |
|
981 | |||
934 | branches = self._create_references( |
|
982 | branches = self._create_references( | |
935 | self.rhodecode_vcs_repo.branches, symbolic_reference, f_path) |
|
983 | self.rhodecode_vcs_repo.branches, symbolic_reference, f_path, 'branch') | |
936 | branches_group = (branches, _("Branches")) |
|
984 | branches_group = (branches, _("Branches")) | |
937 |
|
985 | |||
938 | tags = self._create_references( |
|
986 | tags = self._create_references( | |
939 | self.rhodecode_vcs_repo.tags, symbolic_reference, f_path) |
|
987 | self.rhodecode_vcs_repo.tags, symbolic_reference, f_path, 'tag') | |
940 | tags_group = (tags, _("Tags")) |
|
988 | tags_group = (tags, _("Tags")) | |
941 |
|
989 | |||
942 | history.append(branches_group) |
|
990 | history.append(branches_group) | |
@@ -964,7 +1012,7 b' class RepoFilesView(RepoAppView):' | |||||
964 | for obj in file_history: |
|
1012 | for obj in file_history: | |
965 | res.append({ |
|
1013 | res.append({ | |
966 | 'text': obj[1], |
|
1014 | 'text': obj[1], | |
967 | 'children': [{'id': o[0], 'text': o[1]} for o in obj[0]] |
|
1015 | 'children': [{'id': o[0], 'text': o[1], 'type': o[2]} for o in obj[0]] | |
968 | }) |
|
1016 | }) | |
969 |
|
1017 | |||
970 | data = { |
|
1018 | data = { | |
@@ -1035,15 +1083,9 b' class RepoFilesView(RepoAppView):' | |||||
1035 | _branch_name, _sha_commit_id, is_head = \ |
|
1083 | _branch_name, _sha_commit_id, is_head = \ | |
1036 | self._is_valid_head(commit_id, self.rhodecode_vcs_repo) |
|
1084 | self._is_valid_head(commit_id, self.rhodecode_vcs_repo) | |
1037 |
|
1085 | |||
1038 | if not is_head: |
|
1086 | self.forbid_non_head(is_head, f_path) | |
1039 | h.flash(_('You can only delete files with commit ' |
|
1087 | self.check_branch_permission(_branch_name) | |
1040 | 'being a valid branch head.'), category='warning') |
|
|||
1041 | raise HTTPFound( |
|
|||
1042 | h.route_path('repo_files', |
|
|||
1043 | repo_name=self.db_repo_name, commit_id='tip', |
|
|||
1044 | f_path=f_path)) |
|
|||
1045 |
|
1088 | |||
1046 | self.check_branch_permission(_branch_name) |
|
|||
1047 | c.commit = self._get_commit_or_redirect(commit_id) |
|
1089 | c.commit = self._get_commit_or_redirect(commit_id) | |
1048 | c.file = self._get_filenode_or_redirect(c.commit, f_path) |
|
1090 | c.file = self._get_filenode_or_redirect(c.commit, f_path) | |
1049 |
|
1091 | |||
@@ -1069,13 +1111,7 b' class RepoFilesView(RepoAppView):' | |||||
1069 | _branch_name, _sha_commit_id, is_head = \ |
|
1111 | _branch_name, _sha_commit_id, is_head = \ | |
1070 | self._is_valid_head(commit_id, self.rhodecode_vcs_repo) |
|
1112 | self._is_valid_head(commit_id, self.rhodecode_vcs_repo) | |
1071 |
|
1113 | |||
1072 | if not is_head: |
|
1114 | self.forbid_non_head(is_head, f_path) | |
1073 | h.flash(_('You can only delete files with commit ' |
|
|||
1074 | 'being a valid branch head.'), category='warning') |
|
|||
1075 | raise HTTPFound( |
|
|||
1076 | h.route_path('repo_files', |
|
|||
1077 | repo_name=self.db_repo_name, commit_id='tip', |
|
|||
1078 | f_path=f_path)) |
|
|||
1079 | self.check_branch_permission(_branch_name) |
|
1115 | self.check_branch_permission(_branch_name) | |
1080 |
|
1116 | |||
1081 | c.commit = self._get_commit_or_redirect(commit_id) |
|
1117 | c.commit = self._get_commit_or_redirect(commit_id) | |
@@ -1125,14 +1161,8 b' class RepoFilesView(RepoAppView):' | |||||
1125 | _branch_name, _sha_commit_id, is_head = \ |
|
1161 | _branch_name, _sha_commit_id, is_head = \ | |
1126 | self._is_valid_head(commit_id, self.rhodecode_vcs_repo) |
|
1162 | self._is_valid_head(commit_id, self.rhodecode_vcs_repo) | |
1127 |
|
1163 | |||
1128 | if not is_head: |
|
1164 | self.forbid_non_head(is_head, f_path, commit_id=commit_id) | |
1129 | h.flash(_('You can only edit files with commit ' |
|
1165 | self.check_branch_permission(_branch_name, commit_id=commit_id) | |
1130 | 'being a valid branch head.'), category='warning') |
|
|||
1131 | raise HTTPFound( |
|
|||
1132 | h.route_path('repo_files', |
|
|||
1133 | repo_name=self.db_repo_name, commit_id='tip', |
|
|||
1134 | f_path=f_path)) |
|
|||
1135 | self.check_branch_permission(_branch_name) |
|
|||
1136 |
|
1166 | |||
1137 | c.commit = self._get_commit_or_redirect(commit_id) |
|
1167 | c.commit = self._get_commit_or_redirect(commit_id) | |
1138 | c.file = self._get_filenode_or_redirect(c.commit, f_path) |
|
1168 | c.file = self._get_filenode_or_redirect(c.commit, f_path) | |
@@ -1144,8 +1174,7 b' class RepoFilesView(RepoAppView):' | |||||
1144 | commit_id=c.commit.raw_id, f_path=f_path) |
|
1174 | commit_id=c.commit.raw_id, f_path=f_path) | |
1145 | raise HTTPFound(files_url) |
|
1175 | raise HTTPFound(files_url) | |
1146 |
|
1176 | |||
1147 | c.default_message = _( |
|
1177 | c.default_message = _('Edited file {} via RhodeCode Enterprise').format(f_path) | |
1148 | 'Edited file {} via RhodeCode Enterprise').format(f_path) |
|
|||
1149 | c.f_path = f_path |
|
1178 | c.f_path = f_path | |
1150 |
|
1179 | |||
1151 | return self._get_template_context(c) |
|
1180 | return self._get_template_context(c) | |
@@ -1162,32 +1191,23 b' class RepoFilesView(RepoAppView):' | |||||
1162 | commit_id, f_path = self._get_commit_and_path() |
|
1191 | commit_id, f_path = self._get_commit_and_path() | |
1163 |
|
1192 | |||
1164 | self._ensure_not_locked() |
|
1193 | self._ensure_not_locked() | |
1165 | _branch_name, _sha_commit_id, is_head = \ |
|
|||
1166 | self._is_valid_head(commit_id, self.rhodecode_vcs_repo) |
|
|||
1167 |
|
||||
1168 | if not is_head: |
|
|||
1169 | h.flash(_('You can only edit files with commit ' |
|
|||
1170 | 'being a valid branch head.'), category='warning') |
|
|||
1171 | raise HTTPFound( |
|
|||
1172 | h.route_path('repo_files', |
|
|||
1173 | repo_name=self.db_repo_name, commit_id='tip', |
|
|||
1174 | f_path=f_path)) |
|
|||
1175 |
|
||||
1176 | self.check_branch_permission(_branch_name) |
|
|||
1177 |
|
1194 | |||
1178 | c.commit = self._get_commit_or_redirect(commit_id) |
|
1195 | c.commit = self._get_commit_or_redirect(commit_id) | |
1179 | c.file = self._get_filenode_or_redirect(c.commit, f_path) |
|
1196 | c.file = self._get_filenode_or_redirect(c.commit, f_path) | |
1180 |
|
1197 | |||
1181 | if c.file.is_binary: |
|
1198 | if c.file.is_binary: | |
1182 | raise HTTPFound( |
|
1199 | raise HTTPFound(h.route_path('repo_files', repo_name=self.db_repo_name, | |
1183 | h.route_path('repo_files', |
|
1200 | commit_id=c.commit.raw_id, f_path=f_path)) | |
1184 | repo_name=self.db_repo_name, |
|
1201 | ||
1185 | commit_id=c.commit.raw_id, |
|
1202 | _branch_name, _sha_commit_id, is_head = \ | |
1186 | f_path=f_path)) |
|
1203 | self._is_valid_head(commit_id, self.rhodecode_vcs_repo) | |
1187 |
|
1204 | |||
1188 | c.default_message = _( |
|
1205 | self.forbid_non_head(is_head, f_path, commit_id=commit_id) | |
1189 | 'Edited file {} via RhodeCode Enterprise').format(f_path) |
|
1206 | self.check_branch_permission(_branch_name, commit_id=commit_id) | |
|
1207 | ||||
|
1208 | c.default_message = _('Edited file {} via RhodeCode Enterprise').format(f_path) | |||
1190 | c.f_path = f_path |
|
1209 | c.f_path = f_path | |
|
1210 | ||||
1191 | old_content = c.file.content |
|
1211 | old_content = c.file.content | |
1192 | sl = old_content.splitlines(1) |
|
1212 | sl = old_content.splitlines(1) | |
1193 | first_line = sl[0] if sl else '' |
|
1213 | first_line = sl[0] if sl else '' | |
@@ -1198,20 +1218,25 b' class RepoFilesView(RepoAppView):' | |||||
1198 | content = convert_line_endings(r_post.get('content', ''), line_ending_mode) |
|
1218 | content = convert_line_endings(r_post.get('content', ''), line_ending_mode) | |
1199 |
|
1219 | |||
1200 | message = r_post.get('message') or c.default_message |
|
1220 | message = r_post.get('message') or c.default_message | |
1201 |
org_ |
|
1221 | org_node_path = c.file.unicode_path | |
1202 | filename = r_post['filename'] |
|
1222 | filename = r_post['filename'] | |
1203 | org_filename = c.file.name |
|
1223 | ||
|
1224 | root_path = c.file.dir_path | |||
|
1225 | pure_path = self.create_pure_path(root_path, filename) | |||
|
1226 | node_path = safe_unicode(bytes(pure_path)) | |||
1204 |
|
1227 | |||
1205 | if content == old_content and filename == org_filename: |
|
1228 | default_redirect_url = h.route_path('repo_commit', repo_name=self.db_repo_name, | |
1206 | h.flash(_('No changes'), category='warning') |
|
1229 | commit_id=commit_id) | |
1207 | raise HTTPFound( |
|
1230 | if content == old_content and node_path == org_node_path: | |
1208 | h.route_path('repo_commit', repo_name=self.db_repo_name, |
|
1231 | h.flash(_('No changes detected on {}').format(org_node_path), | |
1209 |
|
|
1232 | category='warning') | |
|
1233 | raise HTTPFound(default_redirect_url) | |||
|
1234 | ||||
1210 | try: |
|
1235 | try: | |
1211 | mapping = { |
|
1236 | mapping = { | |
1212 |
org_ |
|
1237 | org_node_path: { | |
1213 |
'org_filename': org_ |
|
1238 | 'org_filename': org_node_path, | |
1214 |
'filename': |
|
1239 | 'filename': node_path, | |
1215 | 'content': content, |
|
1240 | 'content': content, | |
1216 | 'lexer': '', |
|
1241 | 'lexer': '', | |
1217 | 'op': 'mod', |
|
1242 | 'op': 'mod', | |
@@ -1219,7 +1244,7 b' class RepoFilesView(RepoAppView):' | |||||
1219 | } |
|
1244 | } | |
1220 | } |
|
1245 | } | |
1221 |
|
1246 | |||
1222 | ScmModel().update_nodes( |
|
1247 | commit = ScmModel().update_nodes( | |
1223 | user=self._rhodecode_db_user.user_id, |
|
1248 | user=self._rhodecode_db_user.user_id, | |
1224 | repo=self.db_repo, |
|
1249 | repo=self.db_repo, | |
1225 | message=message, |
|
1250 | message=message, | |
@@ -1227,21 +1252,25 b' class RepoFilesView(RepoAppView):' | |||||
1227 | parent_commit=c.commit, |
|
1252 | parent_commit=c.commit, | |
1228 | ) |
|
1253 | ) | |
1229 |
|
1254 | |||
1230 | h.flash( |
|
1255 | h.flash(_('Successfully committed changes to file `{}`').format( | |
1231 | _('Successfully committed changes to file `{}`').format( |
|
|||
1232 | h.escape(f_path)), category='success') |
|
1256 | h.escape(f_path)), category='success') | |
|
1257 | default_redirect_url = h.route_path( | |||
|
1258 | 'repo_commit', repo_name=self.db_repo_name, commit_id=commit.raw_id) | |||
|
1259 | ||||
1233 | except Exception: |
|
1260 | except Exception: | |
1234 | log.exception('Error occurred during commit') |
|
1261 | log.exception('Error occurred during commit') | |
1235 | h.flash(_('Error occurred during commit'), category='error') |
|
1262 | h.flash(_('Error occurred during commit'), category='error') | |
1236 | raise HTTPFound( |
|
1263 | ||
1237 | h.route_path('repo_commit', repo_name=self.db_repo_name, |
|
1264 | raise HTTPFound(default_redirect_url) | |
1238 | commit_id='tip')) |
|
|||
1239 |
|
1265 | |||
1240 | @LoginRequired() |
|
1266 | @LoginRequired() | |
1241 | @HasRepoPermissionAnyDecorator('repository.write', 'repository.admin') |
|
1267 | @HasRepoPermissionAnyDecorator('repository.write', 'repository.admin') | |
1242 | @view_config( |
|
1268 | @view_config( | |
1243 | route_name='repo_files_add_file', request_method='GET', |
|
1269 | route_name='repo_files_add_file', request_method='GET', | |
1244 | renderer='rhodecode:templates/files/files_add.mako') |
|
1270 | renderer='rhodecode:templates/files/files_add.mako') | |
|
1271 | @view_config( | |||
|
1272 | route_name='repo_files_upload_file', request_method='GET', | |||
|
1273 | renderer='rhodecode:templates/files/files_upload.mako') | |||
1245 | def repo_files_add_file(self): |
|
1274 | def repo_files_add_file(self): | |
1246 | _ = self.request.translate |
|
1275 | _ = self.request.translate | |
1247 | c = self.load_default_context() |
|
1276 | c = self.load_default_context() | |
@@ -1252,27 +1281,20 b' class RepoFilesView(RepoAppView):' | |||||
1252 | c.commit = self._get_commit_or_redirect(commit_id, redirect_after=False) |
|
1281 | c.commit = self._get_commit_or_redirect(commit_id, redirect_after=False) | |
1253 | if c.commit is None: |
|
1282 | if c.commit is None: | |
1254 | c.commit = EmptyCommit(alias=self.rhodecode_vcs_repo.alias) |
|
1283 | c.commit = EmptyCommit(alias=self.rhodecode_vcs_repo.alias) | |
1255 | c.default_message = (_('Added file via RhodeCode Enterprise')) |
|
|||
1256 | c.f_path = f_path.lstrip('/') # ensure not relative path |
|
|||
1257 |
|
1284 | |||
1258 | if self.rhodecode_vcs_repo.is_empty: |
|
1285 | if self.rhodecode_vcs_repo.is_empty(): | |
1259 | # for empty repository we cannot check for current branch, we rely on |
|
1286 | # for empty repository we cannot check for current branch, we rely on | |
1260 | # c.commit.branch instead |
|
1287 | # c.commit.branch instead | |
1261 | _branch_name = c.commit.branch |
|
1288 | _branch_name, _sha_commit_id, is_head = c.commit.branch, '', True | |
1262 | is_head = True |
|
|||
1263 | else: |
|
1289 | else: | |
1264 | _branch_name, _sha_commit_id, is_head = \ |
|
1290 | _branch_name, _sha_commit_id, is_head = \ | |
1265 | self._is_valid_head(commit_id, self.rhodecode_vcs_repo) |
|
1291 | self._is_valid_head(commit_id, self.rhodecode_vcs_repo) | |
1266 |
|
1292 | |||
1267 | if not is_head: |
|
1293 | self.forbid_non_head(is_head, f_path, commit_id=commit_id) | |
1268 | h.flash(_('You can only add files with commit ' |
|
1294 | self.check_branch_permission(_branch_name, commit_id=commit_id) | |
1269 | 'being a valid branch head.'), category='warning') |
|
|||
1270 | raise HTTPFound( |
|
|||
1271 | h.route_path('repo_files', |
|
|||
1272 | repo_name=self.db_repo_name, commit_id='tip', |
|
|||
1273 | f_path=f_path)) |
|
|||
1274 |
|
1295 | |||
1275 | self.check_branch_permission(_branch_name) |
|
1296 | c.default_message = (_('Added file via RhodeCode Enterprise')) | |
|
1297 | c.f_path = f_path.lstrip('/') # ensure not relative path | |||
1276 |
|
1298 | |||
1277 | return self._get_template_context(c) |
|
1299 | return self._get_template_context(c) | |
1278 |
|
1300 | |||
@@ -1289,86 +1311,62 b' class RepoFilesView(RepoAppView):' | |||||
1289 |
|
1311 | |||
1290 | self._ensure_not_locked() |
|
1312 | self._ensure_not_locked() | |
1291 |
|
1313 | |||
1292 | r_post = self.request.POST |
|
1314 | c.commit = self._get_commit_or_redirect(commit_id, redirect_after=False) | |
1293 |
|
||||
1294 | c.commit = self._get_commit_or_redirect( |
|
|||
1295 | commit_id, redirect_after=False) |
|
|||
1296 | if c.commit is None: |
|
1315 | if c.commit is None: | |
1297 | c.commit = EmptyCommit(alias=self.rhodecode_vcs_repo.alias) |
|
1316 | c.commit = EmptyCommit(alias=self.rhodecode_vcs_repo.alias) | |
1298 |
|
1317 | |||
1299 | if self.rhodecode_vcs_repo.is_empty: |
|
1318 | # calculate redirect URL | |
1300 | # for empty repository we cannot check for current branch, we rely on |
|
1319 | if self.rhodecode_vcs_repo.is_empty(): | |
1301 | # c.commit.branch instead |
|
|||
1302 | _branch_name = c.commit.branch |
|
|||
1303 | is_head = True |
|
|||
1304 | else: |
|
|||
1305 | _branch_name, _sha_commit_id, is_head = \ |
|
|||
1306 | self._is_valid_head(commit_id, self.rhodecode_vcs_repo) |
|
|||
1307 |
|
||||
1308 | if not is_head: |
|
|||
1309 | h.flash(_('You can only add files with commit ' |
|
|||
1310 | 'being a valid branch head.'), category='warning') |
|
|||
1311 | raise HTTPFound( |
|
|||
1312 | h.route_path('repo_files', |
|
|||
1313 | repo_name=self.db_repo_name, commit_id='tip', |
|
|||
1314 | f_path=f_path)) |
|
|||
1315 |
|
||||
1316 | self.check_branch_permission(_branch_name) |
|
|||
1317 |
|
||||
1318 | c.default_message = (_('Added file via RhodeCode Enterprise')) |
|
|||
1319 | c.f_path = f_path |
|
|||
1320 | unix_mode = 0 |
|
|||
1321 | content = convert_line_endings(r_post.get('content', ''), unix_mode) |
|
|||
1322 |
|
||||
1323 | message = r_post.get('message') or c.default_message |
|
|||
1324 | filename = r_post.get('filename') |
|
|||
1325 | location = r_post.get('location', '') # dir location |
|
|||
1326 | file_obj = r_post.get('upload_file', None) |
|
|||
1327 |
|
||||
1328 | if file_obj is not None and hasattr(file_obj, 'filename'): |
|
|||
1329 | filename = r_post.get('filename_upload') |
|
|||
1330 | content = file_obj.file |
|
|||
1331 |
|
||||
1332 | if hasattr(content, 'file'): |
|
|||
1333 | # non posix systems store real file under file attr |
|
|||
1334 | content = content.file |
|
|||
1335 |
|
||||
1336 | if self.rhodecode_vcs_repo.is_empty: |
|
|||
1337 | default_redirect_url = h.route_path( |
|
1320 | default_redirect_url = h.route_path( | |
1338 | 'repo_summary', repo_name=self.db_repo_name) |
|
1321 | 'repo_summary', repo_name=self.db_repo_name) | |
1339 | else: |
|
1322 | else: | |
1340 | default_redirect_url = h.route_path( |
|
1323 | default_redirect_url = h.route_path( | |
1341 | 'repo_commit', repo_name=self.db_repo_name, commit_id='tip') |
|
1324 | 'repo_commit', repo_name=self.db_repo_name, commit_id='tip') | |
1342 |
|
1325 | |||
1343 | # If there's no commit, redirect to repo summary |
|
1326 | if self.rhodecode_vcs_repo.is_empty(): | |
1344 | if type(c.commit) is EmptyCommit: |
|
1327 | # for empty repository we cannot check for current branch, we rely on | |
1345 | redirect_url = h.route_path( |
|
1328 | # c.commit.branch instead | |
1346 | 'repo_summary', repo_name=self.db_repo_name) |
|
1329 | _branch_name, _sha_commit_id, is_head = c.commit.branch, '', True | |
1347 | else: |
|
1330 | else: | |
1348 | redirect_url = default_redirect_url |
|
1331 | _branch_name, _sha_commit_id, is_head = \ | |
|
1332 | self._is_valid_head(commit_id, self.rhodecode_vcs_repo) | |||
|
1333 | ||||
|
1334 | self.forbid_non_head(is_head, f_path, commit_id=commit_id) | |||
|
1335 | self.check_branch_permission(_branch_name, commit_id=commit_id) | |||
|
1336 | ||||
|
1337 | c.default_message = (_('Added file via RhodeCode Enterprise')) | |||
|
1338 | c.f_path = f_path | |||
|
1339 | ||||
|
1340 | r_post = self.request.POST | |||
|
1341 | message = r_post.get('message') or c.default_message | |||
|
1342 | filename = r_post.get('filename') | |||
|
1343 | unix_mode = 0 | |||
|
1344 | content = convert_line_endings(r_post.get('content', ''), unix_mode) | |||
1349 |
|
1345 | |||
1350 | if not filename: |
|
1346 | if not filename: | |
1351 | h.flash(_('No filename'), category='warning') |
|
1347 | # If there's no commit, redirect to repo summary | |
|
1348 | if type(c.commit) is EmptyCommit: | |||
|
1349 | redirect_url = h.route_path( | |||
|
1350 | 'repo_summary', repo_name=self.db_repo_name) | |||
|
1351 | else: | |||
|
1352 | redirect_url = default_redirect_url | |||
|
1353 | h.flash(_('No filename specified'), category='warning') | |||
1352 | raise HTTPFound(redirect_url) |
|
1354 | raise HTTPFound(redirect_url) | |
1353 |
|
1355 | |||
1354 | # extract the location from filename, |
|
1356 | root_path = f_path | |
1355 | # allows using foo/bar.txt syntax to create subdirectories |
|
1357 | pure_path = self.create_pure_path(root_path, filename) | |
1356 | subdir_loc = filename.rsplit('/', 1) |
|
1358 | node_path = safe_unicode(bytes(pure_path).lstrip('/')) | |
1357 | if len(subdir_loc) == 2: |
|
|||
1358 | location = os.path.join(location, subdir_loc[0]) |
|
|||
1359 |
|
1359 | |||
1360 | # strip all crap out of file, just leave the basename |
|
|||
1361 | filename = os.path.basename(filename) |
|
|||
1362 | node_path = os.path.join(location, filename) |
|
|||
1363 | author = self._rhodecode_db_user.full_contact |
|
1360 | author = self._rhodecode_db_user.full_contact | |
|
1361 | nodes = { | |||
|
1362 | node_path: { | |||
|
1363 | 'content': content | |||
|
1364 | } | |||
|
1365 | } | |||
1364 |
|
1366 | |||
1365 | try: |
|
1367 | try: | |
1366 | nodes = { |
|
1368 | ||
1367 | node_path: { |
|
1369 | commit = ScmModel().create_nodes( | |
1368 | 'content': content |
|
|||
1369 | } |
|
|||
1370 | } |
|
|||
1371 | ScmModel().create_nodes( |
|
|||
1372 | user=self._rhodecode_db_user.user_id, |
|
1370 | user=self._rhodecode_db_user.user_id, | |
1373 | repo=self.db_repo, |
|
1371 | repo=self.db_repo, | |
1374 | message=message, |
|
1372 | message=message, | |
@@ -1377,14 +1375,16 b' class RepoFilesView(RepoAppView):' | |||||
1377 | author=author, |
|
1375 | author=author, | |
1378 | ) |
|
1376 | ) | |
1379 |
|
1377 | |||
1380 | h.flash( |
|
1378 | h.flash(_('Successfully committed new file `{}`').format( | |
1381 | _('Successfully committed new file `{}`').format( |
|
|||
1382 | h.escape(node_path)), category='success') |
|
1379 | h.escape(node_path)), category='success') | |
|
1380 | ||||
|
1381 | default_redirect_url = h.route_path( | |||
|
1382 | 'repo_commit', repo_name=self.db_repo_name, commit_id=commit.raw_id) | |||
|
1383 | ||||
1383 | except NonRelativePathError: |
|
1384 | except NonRelativePathError: | |
1384 | log.exception('Non Relative path found') |
|
1385 | log.exception('Non Relative path found') | |
1385 | h.flash(_( |
|
1386 | h.flash(_('The location specified must be a relative path and must not ' | |
1386 | 'The location specified must be a relative path and must not ' |
|
1387 | 'contain .. in the path'), category='warning') | |
1387 | 'contain .. in the path'), category='warning') |
|
|||
1388 | raise HTTPFound(default_redirect_url) |
|
1388 | raise HTTPFound(default_redirect_url) | |
1389 | except (NodeError, NodeAlreadyExistsError) as e: |
|
1389 | except (NodeError, NodeAlreadyExistsError) as e: | |
1390 | h.flash(_(h.escape(e)), category='error') |
|
1390 | h.flash(_(h.escape(e)), category='error') | |
@@ -1393,3 +1393,134 b' class RepoFilesView(RepoAppView):' | |||||
1393 | h.flash(_('Error occurred during commit'), category='error') |
|
1393 | h.flash(_('Error occurred during commit'), category='error') | |
1394 |
|
1394 | |||
1395 | raise HTTPFound(default_redirect_url) |
|
1395 | raise HTTPFound(default_redirect_url) | |
|
1396 | ||||
|
1397 | @LoginRequired() | |||
|
1398 | @HasRepoPermissionAnyDecorator('repository.write', 'repository.admin') | |||
|
1399 | @CSRFRequired() | |||
|
1400 | @view_config( | |||
|
1401 | route_name='repo_files_upload_file', request_method='POST', | |||
|
1402 | renderer='json_ext') | |||
|
1403 | def repo_files_upload_file(self): | |||
|
1404 | _ = self.request.translate | |||
|
1405 | c = self.load_default_context() | |||
|
1406 | commit_id, f_path = self._get_commit_and_path() | |||
|
1407 | ||||
|
1408 | self._ensure_not_locked() | |||
|
1409 | ||||
|
1410 | c.commit = self._get_commit_or_redirect(commit_id, redirect_after=False) | |||
|
1411 | if c.commit is None: | |||
|
1412 | c.commit = EmptyCommit(alias=self.rhodecode_vcs_repo.alias) | |||
|
1413 | ||||
|
1414 | # calculate redirect URL | |||
|
1415 | if self.rhodecode_vcs_repo.is_empty(): | |||
|
1416 | default_redirect_url = h.route_path( | |||
|
1417 | 'repo_summary', repo_name=self.db_repo_name) | |||
|
1418 | else: | |||
|
1419 | default_redirect_url = h.route_path( | |||
|
1420 | 'repo_commit', repo_name=self.db_repo_name, commit_id='tip') | |||
|
1421 | ||||
|
1422 | if self.rhodecode_vcs_repo.is_empty(): | |||
|
1423 | # for empty repository we cannot check for current branch, we rely on | |||
|
1424 | # c.commit.branch instead | |||
|
1425 | _branch_name, _sha_commit_id, is_head = c.commit.branch, '', True | |||
|
1426 | else: | |||
|
1427 | _branch_name, _sha_commit_id, is_head = \ | |||
|
1428 | self._is_valid_head(commit_id, self.rhodecode_vcs_repo) | |||
|
1429 | ||||
|
1430 | error = self.forbid_non_head(is_head, f_path, json_mode=True) | |||
|
1431 | if error: | |||
|
1432 | return { | |||
|
1433 | 'error': error, | |||
|
1434 | 'redirect_url': default_redirect_url | |||
|
1435 | } | |||
|
1436 | error = self.check_branch_permission(_branch_name, json_mode=True) | |||
|
1437 | if error: | |||
|
1438 | return { | |||
|
1439 | 'error': error, | |||
|
1440 | 'redirect_url': default_redirect_url | |||
|
1441 | } | |||
|
1442 | ||||
|
1443 | c.default_message = (_('Uploaded file via RhodeCode Enterprise')) | |||
|
1444 | c.f_path = f_path | |||
|
1445 | ||||
|
1446 | r_post = self.request.POST | |||
|
1447 | ||||
|
1448 | message = c.default_message | |||
|
1449 | user_message = r_post.getall('message') | |||
|
1450 | if isinstance(user_message, list) and user_message: | |||
|
1451 | # we take the first from duplicated results if it's not empty | |||
|
1452 | message = user_message[0] if user_message[0] else message | |||
|
1453 | ||||
|
1454 | nodes = {} | |||
|
1455 | ||||
|
1456 | for file_obj in r_post.getall('files_upload') or []: | |||
|
1457 | content = file_obj.file | |||
|
1458 | filename = file_obj.filename | |||
|
1459 | ||||
|
1460 | root_path = f_path | |||
|
1461 | pure_path = self.create_pure_path(root_path, filename) | |||
|
1462 | node_path = safe_unicode(bytes(pure_path).lstrip('/')) | |||
|
1463 | ||||
|
1464 | nodes[node_path] = { | |||
|
1465 | 'content': content | |||
|
1466 | } | |||
|
1467 | ||||
|
1468 | if not nodes: | |||
|
1469 | error = 'missing files' | |||
|
1470 | return { | |||
|
1471 | 'error': error, | |||
|
1472 | 'redirect_url': default_redirect_url | |||
|
1473 | } | |||
|
1474 | ||||
|
1475 | author = self._rhodecode_db_user.full_contact | |||
|
1476 | ||||
|
1477 | try: | |||
|
1478 | commit = ScmModel().create_nodes( | |||
|
1479 | user=self._rhodecode_db_user.user_id, | |||
|
1480 | repo=self.db_repo, | |||
|
1481 | message=message, | |||
|
1482 | nodes=nodes, | |||
|
1483 | parent_commit=c.commit, | |||
|
1484 | author=author, | |||
|
1485 | ) | |||
|
1486 | if len(nodes) == 1: | |||
|
1487 | flash_message = _('Successfully committed {} new files').format(len(nodes)) | |||
|
1488 | else: | |||
|
1489 | flash_message = _('Successfully committed 1 new file') | |||
|
1490 | ||||
|
1491 | h.flash(flash_message, category='success') | |||
|
1492 | ||||
|
1493 | default_redirect_url = h.route_path( | |||
|
1494 | 'repo_commit', repo_name=self.db_repo_name, commit_id=commit.raw_id) | |||
|
1495 | ||||
|
1496 | except NonRelativePathError: | |||
|
1497 | log.exception('Non Relative path found') | |||
|
1498 | error = _('The location specified must be a relative path and must not ' | |||
|
1499 | 'contain .. in the path') | |||
|
1500 | h.flash(error, category='warning') | |||
|
1501 | ||||
|
1502 | return { | |||
|
1503 | 'error': error, | |||
|
1504 | 'redirect_url': default_redirect_url | |||
|
1505 | } | |||
|
1506 | except (NodeError, NodeAlreadyExistsError) as e: | |||
|
1507 | error = h.escape(e) | |||
|
1508 | h.flash(error, category='error') | |||
|
1509 | ||||
|
1510 | return { | |||
|
1511 | 'error': error, | |||
|
1512 | 'redirect_url': default_redirect_url | |||
|
1513 | } | |||
|
1514 | except Exception: | |||
|
1515 | log.exception('Error occurred during commit') | |||
|
1516 | error = _('Error occurred during commit') | |||
|
1517 | h.flash(error, category='error') | |||
|
1518 | return { | |||
|
1519 | 'error': error, | |||
|
1520 | 'redirect_url': default_redirect_url | |||
|
1521 | } | |||
|
1522 | ||||
|
1523 | return { | |||
|
1524 | 'error': None, | |||
|
1525 | 'redirect_url': default_redirect_url | |||
|
1526 | } |
@@ -72,6 +72,7 b' class RepoSummaryView(RepoAppView):' | |||||
72 | log.debug("Searching for a README file.") |
|
72 | log.debug("Searching for a README file.") | |
73 | readme_node = ReadmeFinder(_renderer_type).search(commit) |
|
73 | readme_node = ReadmeFinder(_renderer_type).search(commit) | |
74 | if readme_node: |
|
74 | if readme_node: | |
|
75 | log.debug('Found README node: %s', readme_node) | |||
75 | relative_urls = { |
|
76 | relative_urls = { | |
76 | 'raw': h.route_path( |
|
77 | 'raw': h.route_path( | |
77 | 'repo_file_raw', repo_name=_repo_name, |
|
78 | 'repo_file_raw', repo_name=_repo_name, | |
@@ -82,7 +83,8 b' class RepoSummaryView(RepoAppView):' | |||||
82 | } |
|
83 | } | |
83 | readme_data = self._render_readme_or_none( |
|
84 | readme_data = self._render_readme_or_none( | |
84 | commit, readme_node, relative_urls) |
|
85 | commit, readme_node, relative_urls) | |
85 | readme_filename = readme_node.path |
|
86 | readme_filename = readme_node.unicode_path | |
|
87 | ||||
86 | return readme_data, readme_filename |
|
88 | return readme_data, readme_filename | |
87 |
|
89 | |||
88 | inv_context_manager = rc_cache.InvalidationContext( |
|
90 | inv_context_manager = rc_cache.InvalidationContext( | |
@@ -202,6 +204,10 b' class RepoSummaryView(RepoAppView):' | |||||
202 | # Prepare the clone URL |
|
204 | # Prepare the clone URL | |
203 | self._prepare_and_set_clone_url(c) |
|
205 | self._prepare_and_set_clone_url(c) | |
204 |
|
206 | |||
|
207 | # update every 5 min | |||
|
208 | if self.db_repo.last_commit_cache_update_diff > 60 * 5: | |||
|
209 | self.db_repo.update_commit_cache() | |||
|
210 | ||||
205 | # If enabled, get statistics data |
|
211 | # If enabled, get statistics data | |
206 |
|
212 | |||
207 | c.show_stats = bool(self.db_repo.enable_statistics) |
|
213 | c.show_stats = bool(self.db_repo.enable_statistics) | |
@@ -233,8 +239,6 b' class RepoSummaryView(RepoAppView):' | |||||
233 | c.enable_downloads = self.db_repo.enable_downloads |
|
239 | c.enable_downloads = self.db_repo.enable_downloads | |
234 | c.repository_followers = scm_model.get_followers(self.db_repo) |
|
240 | c.repository_followers = scm_model.get_followers(self.db_repo) | |
235 | c.repository_forks = scm_model.get_forks(self.db_repo) |
|
241 | c.repository_forks = scm_model.get_forks(self.db_repo) | |
236 | c.repository_is_user_following = scm_model.is_following_repo( |
|
|||
237 | self.db_repo_name, self._rhodecode_user.user_id) |
|
|||
238 |
|
242 | |||
239 | # first interaction with the VCS instance after here... |
|
243 | # first interaction with the VCS instance after here... | |
240 | if c.repository_requirements_missing: |
|
244 | if c.repository_requirements_missing: | |
@@ -319,8 +323,7 b' class RepoSummaryView(RepoAppView):' | |||||
319 | (_("Tag"), repo.tags, 'tag'), |
|
323 | (_("Tag"), repo.tags, 'tag'), | |
320 | (_("Bookmark"), repo.bookmarks, 'book'), |
|
324 | (_("Bookmark"), repo.bookmarks, 'book'), | |
321 | ] |
|
325 | ] | |
322 | res = self._create_reference_data( |
|
326 | res = self._create_reference_data(repo, self.db_repo_name, refs_to_create) | |
323 | repo, self.db_repo_name, refs_to_create) |
|
|||
324 | data = { |
|
327 | data = { | |
325 | 'more': False, |
|
328 | 'more': False, | |
326 | 'results': res |
|
329 | 'results': res | |
@@ -367,8 +370,7 b' class RepoSummaryView(RepoAppView):' | |||||
367 | }) |
|
370 | }) | |
368 | return result |
|
371 | return result | |
369 |
|
372 | |||
370 | def _create_reference_items(self, repo, full_repo_name, refs, ref_type, |
|
373 | def _create_reference_items(self, repo, full_repo_name, refs, ref_type, format_ref_id): | |
371 | format_ref_id): |
|
|||
372 | result = [] |
|
374 | result = [] | |
373 | is_svn = h.is_svn(repo) |
|
375 | is_svn = h.is_svn(repo) | |
374 | for ref_name, raw_id in refs.iteritems(): |
|
376 | for ref_name, raw_id in refs.iteritems(): | |
@@ -380,6 +382,7 b' class RepoSummaryView(RepoAppView):' | |||||
380 | 'raw_id': raw_id, |
|
382 | 'raw_id': raw_id, | |
381 | 'type': ref_type, |
|
383 | 'type': ref_type, | |
382 | 'files_url': files_url, |
|
384 | 'files_url': files_url, | |
|
385 | 'idx': 0, | |||
383 | }) |
|
386 | }) | |
384 | return result |
|
387 | return result | |
385 |
|
388 |
@@ -250,7 +250,7 b' def includeme(config):' | |||||
250 |
|
250 | |||
251 | # Includes which are required. The application would fail without them. |
|
251 | # Includes which are required. The application would fail without them. | |
252 | config.include('pyramid_mako') |
|
252 | config.include('pyramid_mako') | |
253 |
config.include(' |
|
253 | config.include('rhodecode.lib.rc_beaker') | |
254 | config.include('rhodecode.lib.rc_cache') |
|
254 | config.include('rhodecode.lib.rc_cache') | |
255 |
|
255 | |||
256 | config.include('rhodecode.apps._base.navigation') |
|
256 | config.include('rhodecode.apps._base.navigation') |
@@ -28,8 +28,8 b' def _pre_push_hook(*args, **kwargs):' | |||||
28 | [{u'hg_env|git_env': ..., |
|
28 | [{u'hg_env|git_env': ..., | |
29 | u'multiple_heads': [], |
|
29 | u'multiple_heads': [], | |
30 | u'name': u'default', |
|
30 | u'name': u'default', | |
31 |
u'new_rev': u'd0b |
|
31 | u'new_rev': u'd0b2ae0692e722e01d5677f27a104631cf798b69', | |
32 |
u'old_rev': u'd0b |
|
32 | u'old_rev': u'd0b1ae0692e722e01d5677f27a104631cf798b69', | |
33 | u'ref': u'', |
|
33 | u'ref': u'', | |
34 | u'total_commits': 2, |
|
34 | u'total_commits': 2, | |
35 | u'type': u'branch'}] |
|
35 | u'type': u'branch'}] | |
@@ -47,13 +47,17 b' def _pre_push_hook(*args, **kwargs):' | |||||
47 | forbid_files = repo_extra_fields.get('forbid_files_glob', {}).get('field_value') |
|
47 | forbid_files = repo_extra_fields.get('forbid_files_glob', {}).get('field_value') | |
48 | forbid_files = aslist(forbid_files) |
|
48 | forbid_files = aslist(forbid_files) | |
49 |
|
49 | |||
|
50 | # forbid_files = ['*'] # example pattern | |||
|
51 | ||||
50 | # optionally get bytes limit for a single file, e.g 1024 for 1KB |
|
52 | # optionally get bytes limit for a single file, e.g 1024 for 1KB | |
51 | forbid_size_over = repo_extra_fields.get('forbid_size_over', {}).get('field_value') |
|
53 | forbid_size_over = repo_extra_fields.get('forbid_size_over', {}).get('field_value') | |
52 | forbid_size_over = int(forbid_size_over or 0) |
|
54 | forbid_size_over = int(forbid_size_over or 0) | |
53 |
|
55 | |||
|
56 | # forbid_size_over = 1024 # example 1024 | |||
|
57 | ||||
54 | def validate_file_name_and_size(file_data, forbidden_files=None, size_limit=None): |
|
58 | def validate_file_name_and_size(file_data, forbidden_files=None, size_limit=None): | |
55 | """ |
|
59 | """ | |
56 |
This function validates com |
|
60 | This function validates comited files against some sort of rules. | |
57 | It should return a valid boolean, and a reason for failure |
|
61 | It should return a valid boolean, and a reason for failure | |
58 |
|
62 | |||
59 | file_data =[ |
|
63 | file_data =[ | |
@@ -87,7 +91,10 b' def _pre_push_hook(*args, **kwargs):' | |||||
87 |
|
91 | |||
88 | # validate A(dded) files and size |
|
92 | # validate A(dded) files and size | |
89 | if size_limit and operation == 'A': |
|
93 | if size_limit and operation == 'A': | |
90 |
|
|
94 | if 'file_size' in file_data: | |
|
95 | size = file_data['file_size'] | |||
|
96 | else: | |||
|
97 | size = len(file_data['raw_diff']) | |||
91 |
|
98 | |||
92 | reason = 'File {} size of {} bytes exceeds limit {}'.format( |
|
99 | reason = 'File {} size of {} bytes exceeds limit {}'.format( | |
93 | file_name, format_byte_size_binary(size), |
|
100 | file_name, format_byte_size_binary(size), |
@@ -34,12 +34,51 b' from rhodecode.lib.vcs.backends.hg.diff ' | |||||
34 | from rhodecode.lib.vcs.backends.git.diff import GitDiff |
|
34 | from rhodecode.lib.vcs.backends.git.diff import GitDiff | |
35 |
|
35 | |||
36 |
|
36 | |||
37 |
def get_ |
|
37 | def get_svn_files(repo, vcs_repo, refs): | |
|
38 | txn_id = refs[0] | |||
|
39 | files = [] | |||
|
40 | stdout, stderr = vcs_repo.run_svn_command( | |||
|
41 | ['svnlook', 'changed', repo.repo_full_path, '--transaction', txn_id]) | |||
|
42 | ||||
|
43 | svn_op_to_rc_op = { | |||
|
44 | 'A': 'A', | |||
|
45 | 'U': 'M', | |||
|
46 | 'D': 'D', | |||
|
47 | } | |||
|
48 | ||||
|
49 | for entry in stdout.splitlines(): | |||
|
50 | parsed_entry = { | |||
|
51 | 'raw_diff': '', | |||
|
52 | 'filename': '', | |||
|
53 | 'chunks': [], | |||
|
54 | 'ops': {}, | |||
|
55 | 'file_size': 0 | |||
|
56 | } | |||
|
57 | ||||
|
58 | op = entry[0] | |||
|
59 | path = entry[1:].strip() | |||
|
60 | ||||
|
61 | rc_op = svn_op_to_rc_op.get(op) or '?' | |||
|
62 | parsed_entry['filename'] = path | |||
|
63 | parsed_entry['operation'] = rc_op | |||
|
64 | ||||
|
65 | if rc_op in ['A', 'M']: | |||
|
66 | stdout, stderr = vcs_repo.run_svn_command( | |||
|
67 | ['svnlook', 'filesize', repo.repo_full_path, path, '--transaction', txn_id]) | |||
|
68 | file_size = int(stdout.strip()) | |||
|
69 | parsed_entry['file_size'] = file_size | |||
|
70 | ||||
|
71 | files.append(parsed_entry) | |||
|
72 | ||||
|
73 | return files | |||
|
74 | ||||
|
75 | ||||
|
76 | def get_hg_files(repo, vcs_repo, refs): | |||
38 | files = [] |
|
77 | files = [] | |
39 | return files |
|
78 | return files | |
40 |
|
79 | |||
41 |
|
80 | |||
42 | def get_git_files(repo, refs): |
|
81 | def get_git_files(repo, vcs_repo, refs): | |
43 | files = [] |
|
82 | files = [] | |
44 |
|
83 | |||
45 | for data in refs: |
|
84 | for data in refs: | |
@@ -57,7 +96,7 b' def get_git_files(repo, refs):' | |||||
57 | 'diff', old_rev, new_rev |
|
96 | 'diff', old_rev, new_rev | |
58 | ] |
|
97 | ] | |
59 |
|
98 | |||
60 | stdout, stderr = repo.run_git_command(cmd, extra_env=git_env) |
|
99 | stdout, stderr = vcs_repo.run_git_command(cmd, extra_env=git_env) | |
61 | vcs_diff = GitDiff(stdout) |
|
100 | vcs_diff = GitDiff(stdout) | |
62 |
|
101 | |||
63 | diff_processor = diffs.DiffProcessor(vcs_diff, format='newdiff') |
|
102 | diff_processor = diffs.DiffProcessor(vcs_diff, format='newdiff') | |
@@ -86,11 +125,14 b' def run(*args, **kwargs):' | |||||
86 | if vcs_type == 'git': |
|
125 | if vcs_type == 'git': | |
87 | for rev_data in kwargs['commit_ids']: |
|
126 | for rev_data in kwargs['commit_ids']: | |
88 | new_environ = dict((k, v) for k, v in rev_data['git_env']) |
|
127 | new_environ = dict((k, v) for k, v in rev_data['git_env']) | |
89 | files = get_git_files(vcs_repo, kwargs['commit_ids']) |
|
128 | files = get_git_files(repo, vcs_repo, kwargs['commit_ids']) | |
90 |
|
129 | |||
91 | if vcs_type == 'hg': |
|
130 | if vcs_type == 'hg': | |
92 | for rev_data in kwargs['commit_ids']: |
|
131 | for rev_data in kwargs['commit_ids']: | |
93 | new_environ = dict((k, v) for k, v in rev_data['hg_env']) |
|
132 | new_environ = dict((k, v) for k, v in rev_data['hg_env']) | |
94 | files = get_hg_files(vcs_repo, kwargs['commit_ids']) |
|
133 | files = get_hg_files(repo, vcs_repo, kwargs['commit_ids']) | |
|
134 | ||||
|
135 | if vcs_type == 'svn': | |||
|
136 | files = get_svn_files(repo, vcs_repo, kwargs['commit_ids']) | |||
95 |
|
137 | |||
96 | return files |
|
138 | return files |
@@ -402,7 +402,8 b' class RepoIntegrationsView(IntegrationSe' | |||||
402 | c.rhodecode_db_repo = self.repo |
|
402 | c.rhodecode_db_repo = self.repo | |
403 | c.repo_name = self.db_repo.repo_name |
|
403 | c.repo_name = self.db_repo.repo_name | |
404 | c.repository_pull_requests = ScmModel().get_pull_requests(self.repo) |
|
404 | c.repository_pull_requests = ScmModel().get_pull_requests(self.repo) | |
405 |
|
405 | c.repository_is_user_following = ScmModel().is_following_repo( | ||
|
406 | c.repo_name, self._rhodecode_user.user_id) | |||
406 | c.has_origin_repo_read_perm = False |
|
407 | c.has_origin_repo_read_perm = False | |
407 | if self.db_repo.fork: |
|
408 | if self.db_repo.fork: | |
408 | c.has_origin_repo_read_perm = h.HasRepoPermissionAny( |
|
409 | c.has_origin_repo_read_perm = h.HasRepoPermissionAny( |
@@ -92,6 +92,9 b' ACTIONS_V1 = {' | |||||
92 | 'repo.commit.comment.delete': {'data': {}}, |
|
92 | 'repo.commit.comment.delete': {'data': {}}, | |
93 | 'repo.commit.vote': '', |
|
93 | 'repo.commit.vote': '', | |
94 |
|
94 | |||
|
95 | 'repo.artifact.add': '', | |||
|
96 | 'repo.artifact.delete': '', | |||
|
97 | ||||
95 | 'repo_group.create': {'data': {}}, |
|
98 | 'repo_group.create': {'data': {}}, | |
96 | 'repo_group.edit': {'old_data': {}}, |
|
99 | 'repo_group.edit': {'old_data': {}}, | |
97 | 'repo_group.edit.permissions': {}, |
|
100 | 'repo_group.edit.permissions': {}, |
@@ -2078,8 +2078,7 b' class HasRepoPermissionAny(PermsFunction' | |||||
2078 | class HasRepoGroupPermissionAny(PermsFunction): |
|
2078 | class HasRepoGroupPermissionAny(PermsFunction): | |
2079 | def __call__(self, group_name=None, check_location='', user=None): |
|
2079 | def __call__(self, group_name=None, check_location='', user=None): | |
2080 | self.repo_group_name = group_name |
|
2080 | self.repo_group_name = group_name | |
2081 | return super(HasRepoGroupPermissionAny, self).__call__( |
|
2081 | return super(HasRepoGroupPermissionAny, self).__call__(check_location, user) | |
2082 | check_location, user) |
|
|||
2083 |
|
2082 | |||
2084 | def check_permissions(self, user): |
|
2083 | def check_permissions(self, user): | |
2085 | perms = user.permissions |
|
2084 | perms = user.permissions | |
@@ -2095,8 +2094,7 b' class HasRepoGroupPermissionAny(PermsFun' | |||||
2095 | class HasRepoGroupPermissionAll(PermsFunction): |
|
2094 | class HasRepoGroupPermissionAll(PermsFunction): | |
2096 | def __call__(self, group_name=None, check_location='', user=None): |
|
2095 | def __call__(self, group_name=None, check_location='', user=None): | |
2097 | self.repo_group_name = group_name |
|
2096 | self.repo_group_name = group_name | |
2098 | return super(HasRepoGroupPermissionAll, self).__call__( |
|
2097 | return super(HasRepoGroupPermissionAll, self).__call__(check_location, user) | |
2099 | check_location, user) |
|
|||
2100 |
|
2098 | |||
2101 | def check_permissions(self, user): |
|
2099 | def check_permissions(self, user): | |
2102 | perms = user.permissions |
|
2100 | perms = user.permissions | |
@@ -2112,8 +2110,7 b' class HasRepoGroupPermissionAll(PermsFun' | |||||
2112 | class HasUserGroupPermissionAny(PermsFunction): |
|
2110 | class HasUserGroupPermissionAny(PermsFunction): | |
2113 | def __call__(self, user_group_name=None, check_location='', user=None): |
|
2111 | def __call__(self, user_group_name=None, check_location='', user=None): | |
2114 | self.user_group_name = user_group_name |
|
2112 | self.user_group_name = user_group_name | |
2115 | return super(HasUserGroupPermissionAny, self).__call__( |
|
2113 | return super(HasUserGroupPermissionAny, self).__call__(check_location, user) | |
2116 | check_location, user) |
|
|||
2117 |
|
2114 | |||
2118 | def check_permissions(self, user): |
|
2115 | def check_permissions(self, user): | |
2119 | perms = user.permissions |
|
2116 | perms = user.permissions | |
@@ -2129,8 +2126,7 b' class HasUserGroupPermissionAny(PermsFun' | |||||
2129 | class HasUserGroupPermissionAll(PermsFunction): |
|
2126 | class HasUserGroupPermissionAll(PermsFunction): | |
2130 | def __call__(self, user_group_name=None, check_location='', user=None): |
|
2127 | def __call__(self, user_group_name=None, check_location='', user=None): | |
2131 | self.user_group_name = user_group_name |
|
2128 | self.user_group_name = user_group_name | |
2132 | return super(HasUserGroupPermissionAll, self).__call__( |
|
2129 | return super(HasUserGroupPermissionAll, self).__call__(check_location, user) | |
2133 | check_location, user) |
|
|||
2134 |
|
2130 | |||
2135 | def check_permissions(self, user): |
|
2131 | def check_permissions(self, user): | |
2136 | perms = user.permissions |
|
2132 | perms = user.permissions |
@@ -288,7 +288,6 b' def attach_context_attributes(context, r' | |||||
288 | """ |
|
288 | """ | |
289 | config = request.registry.settings |
|
289 | config = request.registry.settings | |
290 |
|
290 | |||
291 |
|
||||
292 | rc_config = SettingsModel().get_all_settings(cache=True) |
|
291 | rc_config = SettingsModel().get_all_settings(cache=True) | |
293 |
|
292 | |||
294 | context.rhodecode_version = rhodecode.__version__ |
|
293 | context.rhodecode_version = rhodecode.__version__ | |
@@ -375,20 +374,25 b' def attach_context_attributes(context, r' | |||||
375 | "sideside": "sideside" |
|
374 | "sideside": "sideside" | |
376 | }.get(request.GET.get('diffmode')) |
|
375 | }.get(request.GET.get('diffmode')) | |
377 |
|
376 | |||
378 | if diffmode and diffmode != request.session.get('rc_user_session_attr.diffmode'): |
|
377 | is_api = hasattr(request, 'rpc_user') | |
379 | request.session['rc_user_session_attr.diffmode'] = diffmode |
|
|||
380 |
|
||||
381 | # session settings per user |
|
|||
382 | session_attrs = { |
|
378 | session_attrs = { | |
383 | # defaults |
|
379 | # defaults | |
384 | "clone_url_format": "http", |
|
380 | "clone_url_format": "http", | |
385 | "diffmode": "sideside" |
|
381 | "diffmode": "sideside" | |
386 | } |
|
382 | } | |
387 | for k, v in request.session.items(): |
|
383 | ||
388 | pref = 'rc_user_session_attr.' |
|
384 | if not is_api: | |
389 | if k and k.startswith(pref): |
|
385 | # don't access pyramid session for API calls | |
390 | k = k[len(pref):] |
|
386 | if diffmode and diffmode != request.session.get('rc_user_session_attr.diffmode'): | |
391 | session_attrs[k] = v |
|
387 | request.session['rc_user_session_attr.diffmode'] = diffmode | |
|
388 | ||||
|
389 | # session settings per user | |||
|
390 | ||||
|
391 | for k, v in request.session.items(): | |||
|
392 | pref = 'rc_user_session_attr.' | |||
|
393 | if k and k.startswith(pref): | |||
|
394 | k = k[len(pref):] | |||
|
395 | session_attrs[k] = v | |||
392 |
|
396 | |||
393 | context.user_session_attrs = session_attrs |
|
397 | context.user_session_attrs = session_attrs | |
394 |
|
398 | |||
@@ -420,8 +424,12 b' def attach_context_attributes(context, r' | |||||
420 | 'extra': {'plugins': {}} |
|
424 | 'extra': {'plugins': {}} | |
421 | } |
|
425 | } | |
422 | # END CONFIG VARS |
|
426 | # END CONFIG VARS | |
|
427 | if is_api: | |||
|
428 | csrf_token = None | |||
|
429 | else: | |||
|
430 | csrf_token = auth.get_csrf_token(session=request.session) | |||
423 |
|
431 | |||
424 |
context.csrf_token = |
|
432 | context.csrf_token = csrf_token | |
425 | context.backends = rhodecode.BACKENDS.keys() |
|
433 | context.backends = rhodecode.BACKENDS.keys() | |
426 | context.backends.sort() |
|
434 | context.backends.sort() | |
427 | unread_count = 0 |
|
435 | unread_count = 0 | |
@@ -537,7 +545,7 b' def bootstrap_config(request):' | |||||
537 |
|
545 | |||
538 | # allow pyramid lookup in testing |
|
546 | # allow pyramid lookup in testing | |
539 | config.include('pyramid_mako') |
|
547 | config.include('pyramid_mako') | |
540 |
config.include(' |
|
548 | config.include('rhodecode.lib.rc_beaker') | |
541 | config.include('rhodecode.lib.rc_cache') |
|
549 | config.include('rhodecode.lib.rc_cache') | |
542 |
|
550 | |||
543 | add_events_routes(config) |
|
551 | add_events_routes(config) |
@@ -485,9 +485,6 b' class DbManage(object):' | |||||
485 | self.populate_default_permissions() |
|
485 | self.populate_default_permissions() | |
486 | return fixed |
|
486 | return fixed | |
487 |
|
487 | |||
488 | def update_repo_info(self): |
|
|||
489 | RepoModel.update_repoinfo() |
|
|||
490 |
|
||||
491 | def config_prompt(self, test_repo_path='', retries=3): |
|
488 | def config_prompt(self, test_repo_path='', retries=3): | |
492 | defaults = self.cli_args |
|
489 | defaults = self.cli_args | |
493 | _path = defaults.get('repos_location') |
|
490 | _path = defaults.get('repos_location') |
@@ -614,7 +614,7 b' class Repository(Base, BaseModel):' | |||||
614 | if (cs_cache != self.changeset_cache or not self.changeset_cache): |
|
614 | if (cs_cache != self.changeset_cache or not self.changeset_cache): | |
615 | _default = datetime.datetime.fromtimestamp(0) |
|
615 | _default = datetime.datetime.fromtimestamp(0) | |
616 | last_change = cs_cache.get('date') or _default |
|
616 | last_change = cs_cache.get('date') or _default | |
617 |
log.debug('updated repo %s with new c |
|
617 | log.debug('updated repo %s with new commit cache %s', self.repo_name, cs_cache) | |
618 | self.updated_on = last_change |
|
618 | self.updated_on = last_change | |
619 | self.changeset_cache = cs_cache |
|
619 | self.changeset_cache = cs_cache | |
620 | Session().add(self) |
|
620 | Session().add(self) |
@@ -2164,7 +2164,7 b' class Repository(Base, BaseModel):' | |||||
2164 | if is_outdated(cs_cache) or not self.changeset_cache: |
|
2164 | if is_outdated(cs_cache) or not self.changeset_cache: | |
2165 | _default = datetime.datetime.fromtimestamp(0) |
|
2165 | _default = datetime.datetime.fromtimestamp(0) | |
2166 | last_change = cs_cache.get('date') or _default |
|
2166 | last_change = cs_cache.get('date') or _default | |
2167 |
log.debug('updated repo %s with new c |
|
2167 | log.debug('updated repo %s with new commit cache %s', | |
2168 | self.repo_name, cs_cache) |
|
2168 | self.repo_name, cs_cache) | |
2169 | self.updated_on = last_change |
|
2169 | self.updated_on = last_change | |
2170 | self.changeset_cache = cs_cache |
|
2170 | self.changeset_cache = cs_cache |
@@ -2230,7 +2230,7 b' class Repository(Base, BaseModel):' | |||||
2230 | if is_outdated(cs_cache) or not self.changeset_cache: |
|
2230 | if is_outdated(cs_cache) or not self.changeset_cache: | |
2231 | _default = datetime.datetime.fromtimestamp(0) |
|
2231 | _default = datetime.datetime.fromtimestamp(0) | |
2232 | last_change = cs_cache.get('date') or _default |
|
2232 | last_change = cs_cache.get('date') or _default | |
2233 |
log.debug('updated repo %s with new c |
|
2233 | log.debug('updated repo %s with new commit cache %s', | |
2234 | self.repo_name, cs_cache) |
|
2234 | self.repo_name, cs_cache) | |
2235 | self.updated_on = last_change |
|
2235 | self.updated_on = last_change | |
2236 | self.changeset_cache = cs_cache |
|
2236 | self.changeset_cache = cs_cache |
@@ -2278,7 +2278,7 b' class Repository(Base, BaseModel):' | |||||
2278 | # if yes, we use the current timestamp instead. Imagine you get |
|
2278 | # if yes, we use the current timestamp instead. Imagine you get | |
2279 | # old commit pushed 1y ago, we'd set last update 1y to ago. |
|
2279 | # old commit pushed 1y ago, we'd set last update 1y to ago. | |
2280 | last_change = _default |
|
2280 | last_change = _default | |
2281 |
log.debug('updated repo %s with new c |
|
2281 | log.debug('updated repo %s with new commit cache %s', | |
2282 | self.repo_name, cs_cache) |
|
2282 | self.repo_name, cs_cache) | |
2283 | self.updated_on = last_change |
|
2283 | self.updated_on = last_change | |
2284 | self.changeset_cache = cs_cache |
|
2284 | self.changeset_cache = cs_cache |
@@ -2301,7 +2301,7 b' class Repository(Base, BaseModel):' | |||||
2301 | # if yes, we use the current timestamp instead. Imagine you get |
|
2301 | # if yes, we use the current timestamp instead. Imagine you get | |
2302 | # old commit pushed 1y ago, we'd set last update 1y to ago. |
|
2302 | # old commit pushed 1y ago, we'd set last update 1y to ago. | |
2303 | last_change = _default |
|
2303 | last_change = _default | |
2304 |
log.debug('updated repo %s with new c |
|
2304 | log.debug('updated repo %s with new commit cache %s', | |
2305 | self.repo_name, cs_cache) |
|
2305 | self.repo_name, cs_cache) | |
2306 | self.updated_on = last_change |
|
2306 | self.updated_on = last_change | |
2307 | self.changeset_cache = cs_cache |
|
2307 | self.changeset_cache = cs_cache |
@@ -2301,7 +2301,7 b' class Repository(Base, BaseModel):' | |||||
2301 | # if yes, we use the current timestamp instead. Imagine you get |
|
2301 | # if yes, we use the current timestamp instead. Imagine you get | |
2302 | # old commit pushed 1y ago, we'd set last update 1y to ago. |
|
2302 | # old commit pushed 1y ago, we'd set last update 1y to ago. | |
2303 | last_change = _default |
|
2303 | last_change = _default | |
2304 |
log.debug('updated repo %s with new c |
|
2304 | log.debug('updated repo %s with new commit cache %s', | |
2305 | self.repo_name, cs_cache) |
|
2305 | self.repo_name, cs_cache) | |
2306 | self.updated_on = last_change |
|
2306 | self.updated_on = last_change | |
2307 | self.changeset_cache = cs_cache |
|
2307 | self.changeset_cache = cs_cache |
@@ -1865,7 +1865,7 b' class Repository(Base, BaseModel):' | |||||
1865 | if is_outdated(cs_cache) or not self.changeset_cache: |
|
1865 | if is_outdated(cs_cache) or not self.changeset_cache: | |
1866 | _default = datetime.datetime.fromtimestamp(0) |
|
1866 | _default = datetime.datetime.fromtimestamp(0) | |
1867 | last_change = cs_cache.get('date') or _default |
|
1867 | last_change = cs_cache.get('date') or _default | |
1868 |
log.debug('updated repo %s with new c |
|
1868 | log.debug('updated repo %s with new commit cache %s', | |
1869 | self.repo_name, cs_cache) |
|
1869 | self.repo_name, cs_cache) | |
1870 | self.updated_on = last_change |
|
1870 | self.updated_on = last_change | |
1871 | self.changeset_cache = cs_cache |
|
1871 | self.changeset_cache = cs_cache |
@@ -1868,7 +1868,7 b' class Repository(Base, BaseModel):' | |||||
1868 | if is_outdated(cs_cache) or not self.changeset_cache: |
|
1868 | if is_outdated(cs_cache) or not self.changeset_cache: | |
1869 | _default = datetime.datetime.fromtimestamp(0) |
|
1869 | _default = datetime.datetime.fromtimestamp(0) | |
1870 | last_change = cs_cache.get('date') or _default |
|
1870 | last_change = cs_cache.get('date') or _default | |
1871 |
log.debug('updated repo %s with new c |
|
1871 | log.debug('updated repo %s with new commit cache %s', | |
1872 | self.repo_name, cs_cache) |
|
1872 | self.repo_name, cs_cache) | |
1873 | self.updated_on = last_change |
|
1873 | self.updated_on = last_change | |
1874 | self.changeset_cache = cs_cache |
|
1874 | self.changeset_cache = cs_cache |
@@ -1867,7 +1867,7 b' class Repository(Base, BaseModel):' | |||||
1867 | if is_outdated(cs_cache) or not self.changeset_cache: |
|
1867 | if is_outdated(cs_cache) or not self.changeset_cache: | |
1868 | _default = datetime.datetime.fromtimestamp(0) |
|
1868 | _default = datetime.datetime.fromtimestamp(0) | |
1869 | last_change = cs_cache.get('date') or _default |
|
1869 | last_change = cs_cache.get('date') or _default | |
1870 |
log.debug('updated repo %s with new c |
|
1870 | log.debug('updated repo %s with new commit cache %s', | |
1871 | self.repo_name, cs_cache) |
|
1871 | self.repo_name, cs_cache) | |
1872 | self.updated_on = last_change |
|
1872 | self.updated_on = last_change | |
1873 | self.changeset_cache = cs_cache |
|
1873 | self.changeset_cache = cs_cache |
@@ -1869,7 +1869,7 b' class Repository(Base, BaseModel):' | |||||
1869 | if is_outdated(cs_cache) or not self.changeset_cache: |
|
1869 | if is_outdated(cs_cache) or not self.changeset_cache: | |
1870 | _default = datetime.datetime.fromtimestamp(0) |
|
1870 | _default = datetime.datetime.fromtimestamp(0) | |
1871 | last_change = cs_cache.get('date') or _default |
|
1871 | last_change = cs_cache.get('date') or _default | |
1872 |
log.debug('updated repo %s with new c |
|
1872 | log.debug('updated repo %s with new commit cache %s', | |
1873 | self.repo_name, cs_cache) |
|
1873 | self.repo_name, cs_cache) | |
1874 | self.updated_on = last_change |
|
1874 | self.updated_on = last_change | |
1875 | self.changeset_cache = cs_cache |
|
1875 | self.changeset_cache = cs_cache |
@@ -1869,7 +1869,7 b' class Repository(Base, BaseModel):' | |||||
1869 | if is_outdated(cs_cache) or not self.changeset_cache: |
|
1869 | if is_outdated(cs_cache) or not self.changeset_cache: | |
1870 | _default = datetime.datetime.fromtimestamp(0) |
|
1870 | _default = datetime.datetime.fromtimestamp(0) | |
1871 | last_change = cs_cache.get('date') or _default |
|
1871 | last_change = cs_cache.get('date') or _default | |
1872 |
log.debug('updated repo %s with new c |
|
1872 | log.debug('updated repo %s with new commit cache %s', | |
1873 | self.repo_name, cs_cache) |
|
1873 | self.repo_name, cs_cache) | |
1874 | self.updated_on = last_change |
|
1874 | self.updated_on = last_change | |
1875 | self.changeset_cache = cs_cache |
|
1875 | self.changeset_cache = cs_cache |
@@ -1912,7 +1912,7 b' class Repository(Base, BaseModel):' | |||||
1912 | if is_outdated(cs_cache) or not self.changeset_cache: |
|
1912 | if is_outdated(cs_cache) or not self.changeset_cache: | |
1913 | _default = datetime.datetime.fromtimestamp(0) |
|
1913 | _default = datetime.datetime.fromtimestamp(0) | |
1914 | last_change = cs_cache.get('date') or _default |
|
1914 | last_change = cs_cache.get('date') or _default | |
1915 |
log.debug('updated repo %s with new c |
|
1915 | log.debug('updated repo %s with new commit cache %s', | |
1916 | self.repo_name, cs_cache) |
|
1916 | self.repo_name, cs_cache) | |
1917 | self.updated_on = last_change |
|
1917 | self.updated_on = last_change | |
1918 | self.changeset_cache = cs_cache |
|
1918 | self.changeset_cache = cs_cache |
@@ -1913,7 +1913,7 b' class Repository(Base, BaseModel):' | |||||
1913 | if is_outdated(cs_cache) or not self.changeset_cache: |
|
1913 | if is_outdated(cs_cache) or not self.changeset_cache: | |
1914 | _default = datetime.datetime.fromtimestamp(0) |
|
1914 | _default = datetime.datetime.fromtimestamp(0) | |
1915 | last_change = cs_cache.get('date') or _default |
|
1915 | last_change = cs_cache.get('date') or _default | |
1916 |
log.debug('updated repo %s with new c |
|
1916 | log.debug('updated repo %s with new commit cache %s', | |
1917 | self.repo_name, cs_cache) |
|
1917 | self.repo_name, cs_cache) | |
1918 | self.updated_on = last_change |
|
1918 | self.updated_on = last_change | |
1919 | self.changeset_cache = cs_cache |
|
1919 | self.changeset_cache = cs_cache |
@@ -2100,7 +2100,7 b' class Repository(Base, BaseModel):' | |||||
2100 | if is_outdated(cs_cache) or not self.changeset_cache: |
|
2100 | if is_outdated(cs_cache) or not self.changeset_cache: | |
2101 | _default = datetime.datetime.fromtimestamp(0) |
|
2101 | _default = datetime.datetime.fromtimestamp(0) | |
2102 | last_change = cs_cache.get('date') or _default |
|
2102 | last_change = cs_cache.get('date') or _default | |
2103 |
log.debug('updated repo %s with new c |
|
2103 | log.debug('updated repo %s with new commit cache %s', | |
2104 | self.repo_name, cs_cache) |
|
2104 | self.repo_name, cs_cache) | |
2105 | self.updated_on = last_change |
|
2105 | self.updated_on = last_change | |
2106 | self.changeset_cache = cs_cache |
|
2106 | self.changeset_cache = cs_cache |
@@ -8,6 +8,7 b' from sqlalchemy import String, Column' | |||||
8 | from sqlalchemy.sql import text |
|
8 | from sqlalchemy.sql import text | |
9 |
|
9 | |||
10 | from rhodecode.lib.dbmigrate.versions import _reset_base |
|
10 | from rhodecode.lib.dbmigrate.versions import _reset_base | |
|
11 | from rhodecode.lib.utils2 import safe_str | |||
11 | from rhodecode.model import meta, init_model_encryption |
|
12 | from rhodecode.model import meta, init_model_encryption | |
12 | from rhodecode.model.db import RepoGroup |
|
13 | from rhodecode.model.db import RepoGroup | |
13 |
|
14 | |||
@@ -29,7 +30,7 b' def upgrade(migrate_engine):' | |||||
29 | op = Operations(context) |
|
30 | op = Operations(context) | |
30 |
|
31 | |||
31 | repo_group = db_4_16_0_2.RepoGroup.__table__ |
|
32 | repo_group = db_4_16_0_2.RepoGroup.__table__ | |
32 |
|
33 | |||
33 | with op.batch_alter_table(repo_group.name) as batch_op: |
|
34 | with op.batch_alter_table(repo_group.name) as batch_op: | |
34 | batch_op.add_column( |
|
35 | batch_op.add_column( | |
35 | Column("repo_group_name_hash", String(1024), nullable=True, unique=False)) |
|
36 | Column("repo_group_name_hash", String(1024), nullable=True, unique=False)) | |
@@ -44,7 +45,7 b' def downgrade(migrate_engine):' | |||||
44 | def _generate_repo_group_name_hashes(models, op, session): |
|
45 | def _generate_repo_group_name_hashes(models, op, session): | |
45 | repo_groups = models.RepoGroup.get_all() |
|
46 | repo_groups = models.RepoGroup.get_all() | |
46 | for repo_group in repo_groups: |
|
47 | for repo_group in repo_groups: | |
47 | print(repo_group.group_name) |
|
48 | print(safe_str(repo_group.group_name)) | |
48 | hash_ = RepoGroup.hash_repo_group_name(repo_group.group_name) |
|
49 | hash_ = RepoGroup.hash_repo_group_name(repo_group.group_name) | |
49 | params = {'hash': hash_, 'id': repo_group.group_id} |
|
50 | params = {'hash': hash_, 'id': repo_group.group_id} | |
50 | query = text( |
|
51 | query = text( |
@@ -26,14 +26,10 b' def upgrade(migrate_engine):' | |||||
26 | op = Operations(context) |
|
26 | op = Operations(context) | |
27 |
|
27 | |||
28 | repo_group = db_4_16_0_2.RepoGroup.__table__ |
|
28 | repo_group = db_4_16_0_2.RepoGroup.__table__ | |
29 |
|
29 | |||
30 | with op.batch_alter_table(repo_group.name) as batch_op: |
|
30 | with op.batch_alter_table(repo_group.name) as batch_op: | |
31 | batch_op.alter_column("repo_group_name_hash", nullable=False) |
|
31 | batch_op.alter_column("repo_group_name_hash", nullable=False) | |
32 |
|
32 | |||
33 |
|
33 | |||
34 | def downgrade(migrate_engine): |
|
34 | def downgrade(migrate_engine): | |
35 | pass |
|
35 | pass | |
36 |
|
||||
37 |
|
||||
38 | def _generate_repo_group_name_hashes(models, op, session): |
|
|||
39 | pass |
|
@@ -199,6 +199,7 b' class _GetError(object):' | |||||
199 | if form_errors and field_name in form_errors: |
|
199 | if form_errors and field_name in form_errors: | |
200 | return literal(tmpl % form_errors.get(field_name)) |
|
200 | return literal(tmpl % form_errors.get(field_name)) | |
201 |
|
201 | |||
|
202 | ||||
202 | get_error = _GetError() |
|
203 | get_error = _GetError() | |
203 |
|
204 | |||
204 |
|
205 | |||
@@ -214,38 +215,45 b' class _ToolTip(object):' | |||||
214 | tooltip_title = escape(tooltip_title) |
|
215 | tooltip_title = escape(tooltip_title) | |
215 | tooltip_title = tooltip_title.replace('<', '<').replace('>', '>') |
|
216 | tooltip_title = tooltip_title.replace('<', '<').replace('>', '>') | |
216 | return tooltip_title |
|
217 | return tooltip_title | |
|
218 | ||||
|
219 | ||||
217 | tooltip = _ToolTip() |
|
220 | tooltip = _ToolTip() | |
218 |
|
221 | |||
|
222 | files_icon = u'<i class="file-breadcrumb-copy tooltip icon-clipboard clipboard-action" data-clipboard-text="{}" title="Copy the full path"></i>' | |||
219 |
|
223 | |||
220 | def files_breadcrumbs(repo_name, commit_id, file_path): |
|
224 | ||
|
225 | def files_breadcrumbs(repo_name, commit_id, file_path, at_ref=None, limit_items=False, linkify_last_item=False): | |||
221 | if isinstance(file_path, str): |
|
226 | if isinstance(file_path, str): | |
222 | file_path = safe_unicode(file_path) |
|
227 | file_path = safe_unicode(file_path) | |
223 |
|
228 | |||
224 | # TODO: johbo: Is this always a url like path, or is this operating |
|
229 | route_qry = {'at': at_ref} if at_ref else None | |
225 | # system dependent? |
|
|||
226 | path_segments = file_path.split('/') |
|
|||
227 |
|
230 | |||
228 | repo_name_html = escape(repo_name) |
|
231 | # first segment is a `..` link to repo files | |
229 | if len(path_segments) == 1 and path_segments[0] == '': |
|
232 | root_name = literal(u'<i class="icon-home"></i>') | |
230 |
|
|
233 | url_segments = [ | |
231 | else: |
|
234 | link_to( | |
232 | url_segments = [ |
|
235 | root_name, | |
233 |
|
|
236 | route_path( | |
234 |
|
|
237 | 'repo_files', | |
235 |
r |
|
238 | repo_name=repo_name, | |
236 | 'repo_files', |
|
239 | commit_id=commit_id, | |
237 |
|
|
240 | f_path='', | |
238 | commit_id=commit_id, |
|
241 | _query=route_qry), | |
239 | f_path=''), |
|
242 | )] | |
240 | class_='pjax-link')] |
|
|||
241 |
|
243 | |||
|
244 | path_segments = file_path.split('/') | |||
242 | last_cnt = len(path_segments) - 1 |
|
245 | last_cnt = len(path_segments) - 1 | |
243 | for cnt, segment in enumerate(path_segments): |
|
246 | for cnt, segment in enumerate(path_segments): | |
244 | if not segment: |
|
247 | if not segment: | |
245 | continue |
|
248 | continue | |
246 | segment_html = escape(segment) |
|
249 | segment_html = escape(segment) | |
247 |
|
250 | |||
248 |
|
|
251 | last_item = cnt == last_cnt | |
|
252 | ||||
|
253 | if last_item and linkify_last_item is False: | |||
|
254 | # plain version | |||
|
255 | url_segments.append(segment_html) | |||
|
256 | else: | |||
249 | url_segments.append( |
|
257 | url_segments.append( | |
250 | link_to( |
|
258 | link_to( | |
251 | segment_html, |
|
259 | segment_html, | |
@@ -253,12 +261,32 b' def files_breadcrumbs(repo_name, commit_' | |||||
253 | 'repo_files', |
|
261 | 'repo_files', | |
254 | repo_name=repo_name, |
|
262 | repo_name=repo_name, | |
255 | commit_id=commit_id, |
|
263 | commit_id=commit_id, | |
256 |
f_path='/'.join(path_segments[:cnt + 1]) |
|
264 | f_path='/'.join(path_segments[:cnt + 1]), | |
257 | class_='pjax-link')) |
|
265 | _query=route_qry), | |
258 | else: |
|
266 | )) | |
259 | url_segments.append(segment_html) |
|
267 | ||
|
268 | limited_url_segments = url_segments[:1] + ['...'] + url_segments[-5:] | |||
|
269 | if limit_items and len(limited_url_segments) < len(url_segments): | |||
|
270 | url_segments = limited_url_segments | |||
260 |
|
271 | |||
261 | return literal('/'.join(url_segments)) |
|
272 | full_path = file_path | |
|
273 | icon = files_icon.format(escape(full_path)) | |||
|
274 | if file_path == '': | |||
|
275 | return root_name | |||
|
276 | else: | |||
|
277 | return literal(' / '.join(url_segments) + icon) | |||
|
278 | ||||
|
279 | ||||
|
280 | def files_url_data(request): | |||
|
281 | matchdict = request.matchdict | |||
|
282 | ||||
|
283 | if 'f_path' not in matchdict: | |||
|
284 | matchdict['f_path'] = '' | |||
|
285 | ||||
|
286 | if 'commit_id' not in matchdict: | |||
|
287 | matchdict['commit_id'] = 'tip' | |||
|
288 | ||||
|
289 | return json.dumps(matchdict) | |||
262 |
|
290 | |||
263 |
|
291 | |||
264 | def code_highlight(code, lexer, formatter, use_hl_filter=False): |
|
292 | def code_highlight(code, lexer, formatter, use_hl_filter=False): | |
@@ -1196,7 +1224,7 b' class InitialsGravatar(object):' | |||||
1196 | </text> |
|
1224 | </text> | |
1197 | </svg>""".format( |
|
1225 | </svg>""".format( | |
1198 | size=self.size, |
|
1226 | size=self.size, | |
1199 |
f_size=self.size/ |
|
1227 | f_size=self.size/2.05, # scale the text inside the box nicely | |
1200 | background=self.background, |
|
1228 | background=self.background, | |
1201 | text_color=self.text_color, |
|
1229 | text_color=self.text_color, | |
1202 | text=initials.upper(), |
|
1230 | text=initials.upper(), | |
@@ -1486,10 +1514,12 b' def breadcrumb_repo_link(repo):' | |||||
1486 | """ |
|
1514 | """ | |
1487 |
|
1515 | |||
1488 | path = [ |
|
1516 | path = [ | |
1489 |
link_to(group.name, route_path('repo_group_home', repo_group_name=group.group_name) |
|
1517 | link_to(group.name, route_path('repo_group_home', repo_group_name=group.group_name), | |
|
1518 | title='last change:{}'.format(format_date(group.last_commit_change))) | |||
1490 | for group in repo.groups_with_parents |
|
1519 | for group in repo.groups_with_parents | |
1491 | ] + [ |
|
1520 | ] + [ | |
1492 |
link_to(repo.just_name, route_path('repo_summary', repo_name=repo.repo_name) |
|
1521 | link_to(repo.just_name, route_path('repo_summary', repo_name=repo.repo_name), | |
|
1522 | title='last change:{}'.format(format_date(repo.last_commit_change))) | |||
1493 | ] |
|
1523 | ] | |
1494 |
|
1524 | |||
1495 | return literal(' » '.join(path)) |
|
1525 | return literal(' » '.join(path)) | |
@@ -1507,11 +1537,13 b' def breadcrumb_repo_group_link(repo_grou' | |||||
1507 |
|
1537 | |||
1508 | path = [ |
|
1538 | path = [ | |
1509 | link_to(group.name, |
|
1539 | link_to(group.name, | |
1510 |
route_path('repo_group_home', repo_group_name=group.group_name) |
|
1540 | route_path('repo_group_home', repo_group_name=group.group_name), | |
|
1541 | title='last change:{}'.format(format_date(group.last_commit_change))) | |||
1511 | for group in repo_group.parents |
|
1542 | for group in repo_group.parents | |
1512 | ] + [ |
|
1543 | ] + [ | |
1513 | link_to(repo_group.name, |
|
1544 | link_to(repo_group.name, | |
1514 |
route_path('repo_group_home', repo_group_name=repo_group.group_name) |
|
1545 | route_path('repo_group_home', repo_group_name=repo_group.group_name), | |
|
1546 | title='last change:{}'.format(format_date(repo_group.last_commit_change))) | |||
1515 | ] |
|
1547 | ] | |
1516 |
|
1548 | |||
1517 | return literal(' » '.join(path)) |
|
1549 | return literal(' » '.join(path)) | |
@@ -1907,23 +1939,26 b' def secure_form(form_url, method="POST",' | |||||
1907 |
|
1939 | |||
1908 | def dropdownmenu(name, selected, options, enable_filter=False, **attrs): |
|
1940 | def dropdownmenu(name, selected, options, enable_filter=False, **attrs): | |
1909 | select_html = select(name, selected, options, **attrs) |
|
1941 | select_html = select(name, selected, options, **attrs) | |
|
1942 | ||||
1910 | select2 = """ |
|
1943 | select2 = """ | |
1911 | <script> |
|
1944 | <script> | |
1912 | $(document).ready(function() { |
|
1945 | $(document).ready(function() { | |
1913 | $('#%s').select2({ |
|
1946 | $('#%s').select2({ | |
1914 | containerCssClass: 'drop-menu', |
|
1947 | containerCssClass: 'drop-menu %s', | |
1915 | dropdownCssClass: 'drop-menu-dropdown', |
|
1948 | dropdownCssClass: 'drop-menu-dropdown', | |
1916 | dropdownAutoWidth: true%s |
|
1949 | dropdownAutoWidth: true%s | |
1917 | }); |
|
1950 | }); | |
1918 | }); |
|
1951 | }); | |
1919 | </script> |
|
1952 | </script> | |
1920 | """ |
|
1953 | """ | |
|
1954 | ||||
1921 | filter_option = """, |
|
1955 | filter_option = """, | |
1922 | minimumResultsForSearch: -1 |
|
1956 | minimumResultsForSearch: -1 | |
1923 | """ |
|
1957 | """ | |
1924 | input_id = attrs.get('id') or name |
|
1958 | input_id = attrs.get('id') or name | |
|
1959 | extra_classes = ' '.join(attrs.pop('extra_classes', [])) | |||
1925 | filter_enabled = "" if enable_filter else filter_option |
|
1960 | filter_enabled = "" if enable_filter else filter_option | |
1926 | select_script = literal(select2 % (input_id, filter_enabled)) |
|
1961 | select_script = literal(select2 % (input_id, extra_classes, filter_enabled)) | |
1927 |
|
1962 | |||
1928 | return literal(select_html+select_script) |
|
1963 | return literal(select_html+select_script) | |
1929 |
|
1964 | |||
@@ -1944,7 +1979,7 b' def get_visual_attr(tmpl_context_var, at' | |||||
1944 |
|
1979 | |||
1945 | def get_last_path_part(file_node): |
|
1980 | def get_last_path_part(file_node): | |
1946 | if not file_node.path: |
|
1981 | if not file_node.path: | |
1947 | return u'' |
|
1982 | return u'/' | |
1948 |
|
1983 | |||
1949 | path = safe_unicode(file_node.path.split('/')[-1]) |
|
1984 | path = safe_unicode(file_node.path.split('/')[-1]) | |
1950 | return u'../' + path |
|
1985 | return u'../' + path | |
@@ -2033,7 +2068,8 b' def reviewer_as_json(*args, **kwargs):' | |||||
2033 | def get_repo_view_type(request): |
|
2068 | def get_repo_view_type(request): | |
2034 | route_name = request.matched_route.name |
|
2069 | route_name = request.matched_route.name | |
2035 | route_to_view_type = { |
|
2070 | route_to_view_type = { | |
2036 |
'repo_changelog': 'c |
|
2071 | 'repo_changelog': 'commits', | |
|
2072 | 'repo_commits': 'commits', | |||
2037 | 'repo_files': 'files', |
|
2073 | 'repo_files': 'files', | |
2038 | 'repo_summary': 'summary', |
|
2074 | 'repo_summary': 'summary', | |
2039 | 'repo_commit': 'commit' |
|
2075 | 'repo_commit': 'commit' |
@@ -20,7 +20,55 b'' | |||||
20 |
|
20 | |||
21 | import markdown |
|
21 | import markdown | |
22 |
|
22 | |||
23 | from mdx_gfm import GithubFlavoredMarkdownExtension # pragma: no cover |
|
23 | from markdown.extensions import Extension | |
|
24 | from markdown.extensions.fenced_code import FencedCodeExtension | |||
|
25 | from markdown.extensions.smart_strong import SmartEmphasisExtension | |||
|
26 | from markdown.extensions.tables import TableExtension | |||
|
27 | from markdown.extensions.nl2br import Nl2BrExtension | |||
|
28 | ||||
|
29 | import gfm | |||
|
30 | ||||
|
31 | ||||
|
32 | class GithubFlavoredMarkdownExtension(Extension): | |||
|
33 | """ | |||
|
34 | An extension that is as compatible as possible with GitHub-flavored | |||
|
35 | Markdown (GFM). | |||
|
36 | ||||
|
37 | This extension aims to be compatible with the variant of GFM that GitHub | |||
|
38 | uses for Markdown-formatted gists and files (including READMEs). This | |||
|
39 | variant seems to have all the extensions described in the `GFM | |||
|
40 | documentation`_, except: | |||
|
41 | ||||
|
42 | - Newlines in paragraphs are not transformed into ``br`` tags. | |||
|
43 | - Intra-GitHub links to commits, repositories, and issues are not | |||
|
44 | supported. | |||
|
45 | ||||
|
46 | If you need support for features specific to GitHub comments and issues, | |||
|
47 | please use :class:`mdx_gfm.GithubFlavoredMarkdownExtension`. | |||
|
48 | ||||
|
49 | .. _GFM documentation: https://guides.github.com/features/mastering-markdown/ | |||
|
50 | """ | |||
|
51 | ||||
|
52 | def extendMarkdown(self, md, md_globals): | |||
|
53 | # Built-in extensions | |||
|
54 | FencedCodeExtension().extendMarkdown(md, md_globals) | |||
|
55 | SmartEmphasisExtension().extendMarkdown(md, md_globals) | |||
|
56 | TableExtension().extendMarkdown(md, md_globals) | |||
|
57 | ||||
|
58 | # Custom extensions | |||
|
59 | gfm.AutolinkExtension().extendMarkdown(md, md_globals) | |||
|
60 | gfm.AutomailExtension().extendMarkdown(md, md_globals) | |||
|
61 | gfm.HiddenHiliteExtension([ | |||
|
62 | ('guess_lang', 'False'), | |||
|
63 | ('css_class', 'highlight') | |||
|
64 | ]).extendMarkdown(md, md_globals) | |||
|
65 | gfm.SemiSaneListExtension().extendMarkdown(md, md_globals) | |||
|
66 | gfm.SpacedLinkExtension().extendMarkdown(md, md_globals) | |||
|
67 | gfm.StrikethroughExtension().extendMarkdown(md, md_globals) | |||
|
68 | gfm.TaskListExtension([ | |||
|
69 | ('list_attrs', {'class': 'checkbox'}) | |||
|
70 | ]).extendMarkdown(md, md_globals) | |||
|
71 | Nl2BrExtension().extendMarkdown(md, md_globals) | |||
24 |
|
72 | |||
25 |
|
73 | |||
26 | # Global Vars |
|
74 | # Global Vars |
@@ -33,6 +33,8 b' import collections' | |||||
33 | import warnings |
|
33 | import warnings | |
34 |
|
34 | |||
35 | from zope.cachedescriptors.property import Lazy as LazyProperty |
|
35 | from zope.cachedescriptors.property import Lazy as LazyProperty | |
|
36 | from zope.cachedescriptors.property import CachedProperty | |||
|
37 | ||||
36 | from pyramid import compat |
|
38 | from pyramid import compat | |
37 |
|
39 | |||
38 | from rhodecode.translation import lazy_ugettext |
|
40 | from rhodecode.translation import lazy_ugettext | |
@@ -53,6 +55,7 b' log = logging.getLogger(__name__)' | |||||
53 |
|
55 | |||
54 | FILEMODE_DEFAULT = 0o100644 |
|
56 | FILEMODE_DEFAULT = 0o100644 | |
55 | FILEMODE_EXECUTABLE = 0o100755 |
|
57 | FILEMODE_EXECUTABLE = 0o100755 | |
|
58 | EMPTY_COMMIT_ID = '0' * 40 | |||
56 |
|
59 | |||
57 | Reference = collections.namedtuple('Reference', ('type', 'name', 'commit_id')) |
|
60 | Reference = collections.namedtuple('Reference', ('type', 'name', 'commit_id')) | |
58 |
|
61 | |||
@@ -261,6 +264,7 b' class BaseRepository(object):' | |||||
261 | EMPTY_COMMIT_ID = '0' * 40 |
|
264 | EMPTY_COMMIT_ID = '0' * 40 | |
262 |
|
265 | |||
263 | path = None |
|
266 | path = None | |
|
267 | _commit_ids_ver = 0 | |||
264 |
|
268 | |||
265 | def __init__(self, repo_path, config=None, create=False, **kwargs): |
|
269 | def __init__(self, repo_path, config=None, create=False, **kwargs): | |
266 | """ |
|
270 | """ | |
@@ -383,7 +387,7 b' class BaseRepository(object):' | |||||
383 | return commit.size |
|
387 | return commit.size | |
384 |
|
388 | |||
385 | def is_empty(self): |
|
389 | def is_empty(self): | |
386 |
return |
|
390 | return self._remote.is_empty() | |
387 |
|
391 | |||
388 | @staticmethod |
|
392 | @staticmethod | |
389 | def check_url(url, config): |
|
393 | def check_url(url, config): | |
@@ -404,6 +408,15 b' class BaseRepository(object):' | |||||
404 | # COMMITS |
|
408 | # COMMITS | |
405 | # ========================================================================== |
|
409 | # ========================================================================== | |
406 |
|
410 | |||
|
411 | @CachedProperty('_commit_ids_ver') | |||
|
412 | def commit_ids(self): | |||
|
413 | raise NotImplementedError | |||
|
414 | ||||
|
415 | def append_commit_id(self, commit_id): | |||
|
416 | if commit_id not in self.commit_ids: | |||
|
417 | self._rebuild_cache(self.commit_ids + [commit_id]) | |||
|
418 | self._commit_ids_ver = time.time() | |||
|
419 | ||||
407 | def get_commit(self, commit_id=None, commit_idx=None, pre_load=None, translate_tag=None): |
|
420 | def get_commit(self, commit_id=None, commit_idx=None, pre_load=None, translate_tag=None): | |
408 | """ |
|
421 | """ | |
409 | Returns instance of `BaseCommit` class. If `commit_id` and `commit_idx` |
|
422 | Returns instance of `BaseCommit` class. If `commit_id` and `commit_idx` | |
@@ -1094,12 +1107,12 b' class BaseCommit(object):' | |||||
1094 | """ |
|
1107 | """ | |
1095 | return None |
|
1108 | return None | |
1096 |
|
1109 | |||
1097 |
def archive_repo(self, |
|
1110 | def archive_repo(self, archive_dest_path, kind='tgz', subrepos=None, | |
1098 | prefix=None, write_metadata=False, mtime=None): |
|
1111 | prefix=None, write_metadata=False, mtime=None, archive_at_path='/'): | |
1099 | """ |
|
1112 | """ | |
1100 | Creates an archive containing the contents of the repository. |
|
1113 | Creates an archive containing the contents of the repository. | |
1101 |
|
1114 | |||
1102 |
:param |
|
1115 | :param archive_dest_path: path to the file which to create the archive. | |
1103 | :param kind: one of following: ``"tbz2"``, ``"tgz"``, ``"zip"``. |
|
1116 | :param kind: one of following: ``"tbz2"``, ``"tgz"``, ``"zip"``. | |
1104 | :param prefix: name of root directory in archive. |
|
1117 | :param prefix: name of root directory in archive. | |
1105 | Default is repository name and commit's short_id joined with dash: |
|
1118 | Default is repository name and commit's short_id joined with dash: | |
@@ -1107,10 +1120,11 b' class BaseCommit(object):' | |||||
1107 | :param write_metadata: write a metadata file into archive. |
|
1120 | :param write_metadata: write a metadata file into archive. | |
1108 | :param mtime: custom modification time for archive creation, defaults |
|
1121 | :param mtime: custom modification time for archive creation, defaults | |
1109 | to time.time() if not given. |
|
1122 | to time.time() if not given. | |
|
1123 | :param archive_at_path: pack files at this path (default '/') | |||
1110 |
|
1124 | |||
1111 | :raise VCSError: If prefix has a problem. |
|
1125 | :raise VCSError: If prefix has a problem. | |
1112 | """ |
|
1126 | """ | |
1113 |
allowed_kinds = settings.ARCHIVE_SPECS |
|
1127 | allowed_kinds = [x[0] for x in settings.ARCHIVE_SPECS] | |
1114 | if kind not in allowed_kinds: |
|
1128 | if kind not in allowed_kinds: | |
1115 | raise ImproperArchiveTypeError( |
|
1129 | raise ImproperArchiveTypeError( | |
1116 | 'Archive kind (%s) not supported use one of %s' % |
|
1130 | 'Archive kind (%s) not supported use one of %s' % | |
@@ -1118,11 +1132,11 b' class BaseCommit(object):' | |||||
1118 |
|
1132 | |||
1119 | prefix = self._validate_archive_prefix(prefix) |
|
1133 | prefix = self._validate_archive_prefix(prefix) | |
1120 |
|
1134 | |||
1121 | mtime = mtime or time.mktime(self.date.timetuple()) |
|
1135 | mtime = mtime is not None or time.mktime(self.date.timetuple()) | |
1122 |
|
1136 | |||
1123 | file_info = [] |
|
1137 | file_info = [] | |
1124 | cur_rev = self.repository.get_commit(commit_id=self.raw_id) |
|
1138 | cur_rev = self.repository.get_commit(commit_id=self.raw_id) | |
1125 |
for _r, _d, files in cur_rev.walk( |
|
1139 | for _r, _d, files in cur_rev.walk(archive_at_path): | |
1126 | for f in files: |
|
1140 | for f in files: | |
1127 | f_path = os.path.join(prefix, f.path) |
|
1141 | f_path = os.path.join(prefix, f.path) | |
1128 | file_info.append( |
|
1142 | file_info.append( | |
@@ -1131,15 +1145,15 b' class BaseCommit(object):' | |||||
1131 | if write_metadata: |
|
1145 | if write_metadata: | |
1132 | metadata = [ |
|
1146 | metadata = [ | |
1133 | ('repo_name', self.repository.name), |
|
1147 | ('repo_name', self.repository.name), | |
1134 |
(' |
|
1148 | ('commit_id', self.raw_id), | |
1135 |
(' |
|
1149 | ('mtime', mtime), | |
1136 | ('branch', self.branch), |
|
1150 | ('branch', self.branch), | |
1137 | ('tags', ','.join(self.tags)), |
|
1151 | ('tags', ','.join(self.tags)), | |
1138 | ] |
|
1152 | ] | |
1139 | meta = ["%s:%s" % (f_name, value) for f_name, value in metadata] |
|
1153 | meta = ["%s:%s" % (f_name, value) for f_name, value in metadata] | |
1140 | file_info.append(('.archival.txt', 0o644, False, '\n'.join(meta))) |
|
1154 | file_info.append(('.archival.txt', 0o644, False, '\n'.join(meta))) | |
1141 |
|
1155 | |||
1142 |
connection.Hg.archive_repo( |
|
1156 | connection.Hg.archive_repo(archive_dest_path, mtime, file_info, kind) | |
1143 |
|
1157 | |||
1144 | def _validate_archive_prefix(self, prefix): |
|
1158 | def _validate_archive_prefix(self, prefix): | |
1145 | if prefix is None: |
|
1159 | if prefix is None: | |
@@ -1508,9 +1522,7 b' class BaseInMemoryCommit(object):' | |||||
1508 | "Cannot remove node at %s from " |
|
1522 | "Cannot remove node at %s from " | |
1509 | "following parents: %s" % (not_removed, parents)) |
|
1523 | "following parents: %s" % (not_removed, parents)) | |
1510 |
|
1524 | |||
1511 | def commit( |
|
1525 | def commit(self, message, author, parents=None, branch=None, date=None, **kwargs): | |
1512 | self, message, author, parents=None, branch=None, date=None, |
|
|||
1513 | **kwargs): |
|
|||
1514 | """ |
|
1526 | """ | |
1515 | Performs in-memory commit (doesn't check workdir in any way) and |
|
1527 | Performs in-memory commit (doesn't check workdir in any way) and | |
1516 | returns newly created :class:`BaseCommit`. Updates repository's |
|
1528 | returns newly created :class:`BaseCommit`. Updates repository's | |
@@ -1558,7 +1570,7 b' class EmptyCommit(BaseCommit):' | |||||
1558 | """ |
|
1570 | """ | |
1559 |
|
1571 | |||
1560 | def __init__( |
|
1572 | def __init__( | |
1561 |
self, commit_id= |
|
1573 | self, commit_id=EMPTY_COMMIT_ID, repo=None, alias=None, idx=-1, | |
1562 | message='', author='', date=None): |
|
1574 | message='', author='', date=None): | |
1563 | self._empty_commit_id = commit_id |
|
1575 | self._empty_commit_id = commit_id | |
1564 | # TODO: johbo: Solve idx parameter, default value does not make |
|
1576 | # TODO: johbo: Solve idx parameter, default value does not make | |
@@ -1618,7 +1630,7 b' class EmptyChangeset(EmptyCommit):' | |||||
1618 | "Use EmptyCommit instead of EmptyChangeset", DeprecationWarning) |
|
1630 | "Use EmptyCommit instead of EmptyChangeset", DeprecationWarning) | |
1619 | return super(EmptyCommit, cls).__new__(cls, *args, **kwargs) |
|
1631 | return super(EmptyCommit, cls).__new__(cls, *args, **kwargs) | |
1620 |
|
1632 | |||
1621 |
def __init__(self, cs= |
|
1633 | def __init__(self, cs=EMPTY_COMMIT_ID, repo=None, requested_revision=None, | |
1622 | alias=None, revision=-1, message='', author='', date=None): |
|
1634 | alias=None, revision=-1, message='', author='', date=None): | |
1623 | if requested_revision is not None: |
|
1635 | if requested_revision is not None: | |
1624 | warnings.warn( |
|
1636 | warnings.warn( |
@@ -234,8 +234,7 b' class GitCommit(base.BaseCommit):' | |||||
234 | path = self._fix_path(path) |
|
234 | path = self._fix_path(path) | |
235 | if self._get_kind(path) != NodeKind.FILE: |
|
235 | if self._get_kind(path) != NodeKind.FILE: | |
236 | raise CommitError( |
|
236 | raise CommitError( | |
237 | "File does not exist for commit %s at '%s'" % |
|
237 | "File does not exist for commit %s at '%s'" % (self.raw_id, path)) | |
238 | (self.raw_id, path)) |
|
|||
239 | return path |
|
238 | return path | |
240 |
|
239 | |||
241 | def _get_file_nodes(self): |
|
240 | def _get_file_nodes(self): | |
@@ -353,8 +352,7 b' class GitCommit(base.BaseCommit):' | |||||
353 | def get_nodes(self, path): |
|
352 | def get_nodes(self, path): | |
354 | if self._get_kind(path) != NodeKind.DIR: |
|
353 | if self._get_kind(path) != NodeKind.DIR: | |
355 | raise CommitError( |
|
354 | raise CommitError( | |
356 | "Directory does not exist for commit %s at " |
|
355 | "Directory does not exist for commit %s at '%s'" % (self.raw_id, path)) | |
357 | " '%s'" % (self.raw_id, path)) |
|
|||
358 | path = self._fix_path(path) |
|
356 | path = self._fix_path(path) | |
359 | id_, _ = self._get_id_for_path(path) |
|
357 | id_, _ = self._get_id_for_path(path) | |
360 | tree_id = self._remote[id_]['id'] |
|
358 | tree_id = self._remote[id_]['id'] |
@@ -29,8 +29,7 b' from rhodecode.lib.vcs.backends import b' | |||||
29 |
|
29 | |||
30 | class GitInMemoryCommit(base.BaseInMemoryCommit): |
|
30 | class GitInMemoryCommit(base.BaseInMemoryCommit): | |
31 |
|
31 | |||
32 | def commit(self, message, author, parents=None, branch=None, date=None, |
|
32 | def commit(self, message, author, parents=None, branch=None, date=None, **kwargs): | |
33 | **kwargs): |
|
|||
34 | """ |
|
33 | """ | |
35 | Performs in-memory commit (doesn't check workdir in any way) and |
|
34 | Performs in-memory commit (doesn't check workdir in any way) and | |
36 | returns newly created `GitCommit`. Updates repository's |
|
35 | returns newly created `GitCommit`. Updates repository's | |
@@ -94,12 +93,12 b' class GitInMemoryCommit(base.BaseInMemor' | |||||
94 | commit_data, branch, commit_tree, updated, removed) |
|
93 | commit_data, branch, commit_tree, updated, removed) | |
95 |
|
94 | |||
96 | # Update vcs repository object |
|
95 | # Update vcs repository object | |
97 |
self.repository.commit_id |
|
96 | self.repository.append_commit_id(commit_id) | |
98 | self.repository._rebuild_cache(self.repository.commit_ids) |
|
|||
99 |
|
97 | |||
100 | # invalidate parsed refs after commit |
|
98 | # invalidate parsed refs after commit | |
101 | self.repository._refs = self.repository._get_refs() |
|
99 | self.repository._refs = self.repository._get_refs() | |
102 | self.repository.branches = self.repository._get_branches() |
|
100 | self.repository.branches = self.repository._get_branches() | |
103 | tip = self.repository.get_commit() |
|
101 | tip = self.repository.get_commit(commit_id) | |
|
102 | ||||
104 | self.reset() |
|
103 | self.reset() | |
105 | return tip |
|
104 | return tip |
@@ -25,8 +25,10 b' GIT repository module' | |||||
25 | import logging |
|
25 | import logging | |
26 | import os |
|
26 | import os | |
27 | import re |
|
27 | import re | |
|
28 | import time | |||
28 |
|
29 | |||
29 | from zope.cachedescriptors.property import Lazy as LazyProperty |
|
30 | from zope.cachedescriptors.property import Lazy as LazyProperty | |
|
31 | from zope.cachedescriptors.property import CachedProperty | |||
30 |
|
32 | |||
31 | from rhodecode.lib.compat import OrderedDict |
|
33 | from rhodecode.lib.compat import OrderedDict | |
32 | from rhodecode.lib.datelib import ( |
|
34 | from rhodecode.lib.datelib import ( | |
@@ -69,6 +71,9 b' class GitRepository(BaseRepository):' | |||||
69 | # caches |
|
71 | # caches | |
70 | self._commit_ids = {} |
|
72 | self._commit_ids = {} | |
71 |
|
73 | |||
|
74 | # dependent that trigger re-computation of commit_ids | |||
|
75 | self._commit_ids_ver = 0 | |||
|
76 | ||||
72 | @LazyProperty |
|
77 | @LazyProperty | |
73 | def _remote(self): |
|
78 | def _remote(self): | |
74 | return connection.Git(self.path, self.config, with_wire=self.with_wire) |
|
79 | return connection.Git(self.path, self.config, with_wire=self.with_wire) | |
@@ -81,7 +86,7 b' class GitRepository(BaseRepository):' | |||||
81 | def head(self): |
|
86 | def head(self): | |
82 | return self._remote.head() |
|
87 | return self._remote.head() | |
83 |
|
88 | |||
84 | @LazyProperty |
|
89 | @CachedProperty('_commit_ids_ver') | |
85 | def commit_ids(self): |
|
90 | def commit_ids(self): | |
86 | """ |
|
91 | """ | |
87 | Returns list of commit ids, in ascending order. Being lazy |
|
92 | Returns list of commit ids, in ascending order. Being lazy | |
@@ -222,13 +227,10 b' class GitRepository(BaseRepository):' | |||||
222 | return [] |
|
227 | return [] | |
223 | return output.splitlines() |
|
228 | return output.splitlines() | |
224 |
|
229 | |||
225 |
def _ |
|
230 | def _lookup_commit(self, commit_id_or_idx, translate_tag=True): | |
226 | def is_null(value): |
|
231 | def is_null(value): | |
227 | return len(value) == commit_id_or_idx.count('0') |
|
232 | return len(value) == commit_id_or_idx.count('0') | |
228 |
|
233 | |||
229 | if self.is_empty(): |
|
|||
230 | raise EmptyRepositoryError("There are no commits yet") |
|
|||
231 |
|
||||
232 | if commit_id_or_idx in (None, '', 'tip', 'HEAD', 'head', -1): |
|
234 | if commit_id_or_idx in (None, '', 'tip', 'HEAD', 'head', -1): | |
233 | return self.commit_ids[-1] |
|
235 | return self.commit_ids[-1] | |
234 |
|
236 | |||
@@ -238,8 +240,7 b' class GitRepository(BaseRepository):' | |||||
238 | try: |
|
240 | try: | |
239 | commit_id_or_idx = self.commit_ids[int(commit_id_or_idx)] |
|
241 | commit_id_or_idx = self.commit_ids[int(commit_id_or_idx)] | |
240 | except Exception: |
|
242 | except Exception: | |
241 |
msg = "Commit |
|
243 | msg = "Commit {} does not exist for `{}`".format(commit_id_or_idx, self.name) | |
242 | commit_id_or_idx, self) |
|
|||
243 | raise CommitDoesNotExistError(msg) |
|
244 | raise CommitDoesNotExistError(msg) | |
244 |
|
245 | |||
245 | elif is_bstr: |
|
246 | elif is_bstr: | |
@@ -261,8 +262,7 b' class GitRepository(BaseRepository):' | |||||
261 |
|
262 | |||
262 | if (not SHA_PATTERN.match(commit_id_or_idx) or |
|
263 | if (not SHA_PATTERN.match(commit_id_or_idx) or | |
263 | commit_id_or_idx not in self.commit_ids): |
|
264 | commit_id_or_idx not in self.commit_ids): | |
264 |
msg = "Commit |
|
265 | msg = "Commit {} does not exist for `{}`".format(commit_id_or_idx, self.name) | |
265 | commit_id_or_idx, self) |
|
|||
266 | raise CommitDoesNotExistError(msg) |
|
266 | raise CommitDoesNotExistError(msg) | |
267 |
|
267 | |||
268 | # Ensure we return full id |
|
268 | # Ensure we return full id | |
@@ -431,19 +431,42 b' class GitRepository(BaseRepository):' | |||||
431 | Returns `GitCommit` object representing commit from git repository |
|
431 | Returns `GitCommit` object representing commit from git repository | |
432 | at the given `commit_id` or head (most recent commit) if None given. |
|
432 | at the given `commit_id` or head (most recent commit) if None given. | |
433 | """ |
|
433 | """ | |
|
434 | if self.is_empty(): | |||
|
435 | raise EmptyRepositoryError("There are no commits yet") | |||
|
436 | ||||
434 | if commit_id is not None: |
|
437 | if commit_id is not None: | |
435 | self._validate_commit_id(commit_id) |
|
438 | self._validate_commit_id(commit_id) | |
|
439 | try: | |||
|
440 | # we have cached idx, use it without contacting the remote | |||
|
441 | idx = self._commit_ids[commit_id] | |||
|
442 | return GitCommit(self, commit_id, idx, pre_load=pre_load) | |||
|
443 | except KeyError: | |||
|
444 | pass | |||
|
445 | ||||
436 | elif commit_idx is not None: |
|
446 | elif commit_idx is not None: | |
437 | self._validate_commit_idx(commit_idx) |
|
447 | self._validate_commit_idx(commit_idx) | |
438 | commit_id = commit_idx |
|
448 | try: | |
439 |
commit_id = self. |
|
449 | _commit_id = self.commit_ids[commit_idx] | |
|
450 | if commit_idx < 0: | |||
|
451 | commit_idx = self.commit_ids.index(_commit_id) | |||
|
452 | return GitCommit(self, _commit_id, commit_idx, pre_load=pre_load) | |||
|
453 | except IndexError: | |||
|
454 | commit_id = commit_idx | |||
|
455 | else: | |||
|
456 | commit_id = "tip" | |||
|
457 | ||||
|
458 | commit_id = self._lookup_commit(commit_id) | |||
|
459 | remote_idx = None | |||
|
460 | if translate_tag: | |||
|
461 | # Need to call remote to translate id for tagging scenario | |||
|
462 | remote_data = self._remote.get_object(commit_id) | |||
|
463 | commit_id = remote_data["commit_id"] | |||
|
464 | remote_idx = remote_data["idx"] | |||
|
465 | ||||
440 | try: |
|
466 | try: | |
441 | if translate_tag: |
|
|||
442 | # Need to call remote to translate id for tagging scenario |
|
|||
443 | commit_id = self._remote.get_object(commit_id)["commit_id"] |
|
|||
444 | idx = self._commit_ids[commit_id] |
|
467 | idx = self._commit_ids[commit_id] | |
445 | except KeyError: |
|
468 | except KeyError: | |
446 | raise RepositoryError("Cannot get object with id %s" % commit_id) |
|
469 | idx = remote_idx or 0 | |
447 |
|
470 | |||
448 | return GitCommit(self, commit_id, idx, pre_load=pre_load) |
|
471 | return GitCommit(self, commit_id, idx, pre_load=pre_load) | |
449 |
|
472 | |||
@@ -472,6 +495,7 b' class GitRepository(BaseRepository):' | |||||
472 | """ |
|
495 | """ | |
473 | if self.is_empty(): |
|
496 | if self.is_empty(): | |
474 | raise EmptyRepositoryError("There are no commits yet") |
|
497 | raise EmptyRepositoryError("There are no commits yet") | |
|
498 | ||||
475 | self._validate_branch_name(branch_name) |
|
499 | self._validate_branch_name(branch_name) | |
476 |
|
500 | |||
477 | if start_id is not None: |
|
501 | if start_id is not None: | |
@@ -479,9 +503,9 b' class GitRepository(BaseRepository):' | |||||
479 | if end_id is not None: |
|
503 | if end_id is not None: | |
480 | self._validate_commit_id(end_id) |
|
504 | self._validate_commit_id(end_id) | |
481 |
|
505 | |||
482 |
start_raw_id = self._ |
|
506 | start_raw_id = self._lookup_commit(start_id) | |
483 | start_pos = self._commit_ids[start_raw_id] if start_id else None |
|
507 | start_pos = self._commit_ids[start_raw_id] if start_id else None | |
484 |
end_raw_id = self._ |
|
508 | end_raw_id = self._lookup_commit(end_id) | |
485 | end_pos = max(0, self._commit_ids[end_raw_id]) if end_id else None |
|
509 | end_pos = max(0, self._commit_ids[end_raw_id]) if end_id else None | |
486 |
|
510 | |||
487 | if None not in [start_id, end_id] and start_pos > end_pos: |
|
511 | if None not in [start_id, end_id] and start_pos > end_pos: | |
@@ -589,8 +613,9 b' class GitRepository(BaseRepository):' | |||||
589 | commit = commit.parents[0] |
|
613 | commit = commit.parents[0] | |
590 | self._remote.set_refs('refs/heads/%s' % branch_name, commit.raw_id) |
|
614 | self._remote.set_refs('refs/heads/%s' % branch_name, commit.raw_id) | |
591 |
|
615 | |||
592 | self.commit_ids = self._get_all_commit_ids() |
|
616 | self._commit_ids_ver = time.time() | |
593 | self._rebuild_cache(self.commit_ids) |
|
617 | # we updated _commit_ids_ver so accessing self.commit_ids will re-compute it | |
|
618 | return len(self.commit_ids) | |||
594 |
|
619 | |||
595 | def get_common_ancestor(self, commit_id1, commit_id2, repo2): |
|
620 | def get_common_ancestor(self, commit_id1, commit_id2, repo2): | |
596 | if commit_id1 == commit_id2: |
|
621 | if commit_id1 == commit_id2: |
@@ -30,8 +30,7 b' from rhodecode.lib.vcs.exceptions import' | |||||
30 |
|
30 | |||
31 | class MercurialInMemoryCommit(BaseInMemoryCommit): |
|
31 | class MercurialInMemoryCommit(BaseInMemoryCommit): | |
32 |
|
32 | |||
33 | def commit(self, message, author, parents=None, branch=None, date=None, |
|
33 | def commit(self, message, author, parents=None, branch=None, date=None, **kwargs): | |
34 | **kwargs): |
|
|||
35 | """ |
|
34 | """ | |
36 | Performs in-memory commit (doesn't check workdir in any way) and |
|
35 | Performs in-memory commit (doesn't check workdir in any way) and | |
37 | returns newly created `MercurialCommit`. Updates repository's |
|
36 | returns newly created `MercurialCommit`. Updates repository's | |
@@ -83,15 +82,14 b' class MercurialInMemoryCommit(BaseInMemo' | |||||
83 |
|
82 | |||
84 | date, tz = date_to_timestamp_plus_offset(date) |
|
83 | date, tz = date_to_timestamp_plus_offset(date) | |
85 |
|
84 | |||
86 |
|
|
85 | commit_id = self.repository._remote.commitctx( | |
87 | message=message, parents=parent_ids, |
|
86 | message=message, parents=parent_ids, | |
88 | commit_time=date, commit_timezone=tz, user=author, |
|
87 | commit_time=date, commit_timezone=tz, user=author, | |
89 | files=self.get_paths(), extra=kwargs, removed=removed, |
|
88 | files=self.get_paths(), extra=kwargs, removed=removed, | |
90 | updated=updated) |
|
89 | updated=updated) | |
|
90 | self.repository.append_commit_id(commit_id) | |||
91 |
|
91 | |||
92 | self.repository.commit_ids.append(new_id) |
|
|||
93 | self.repository._rebuild_cache(self.repository.commit_ids) |
|
|||
94 | self.repository.branches = self.repository._get_branches() |
|
92 | self.repository.branches = self.repository._get_branches() | |
95 | tip = self.repository.get_commit() |
|
93 | tip = self.repository.get_commit(commit_id) | |
96 | self.reset() |
|
94 | self.reset() | |
97 | return tip |
|
95 | return tip |
@@ -24,9 +24,11 b' HG repository module' | |||||
24 | import os |
|
24 | import os | |
25 | import logging |
|
25 | import logging | |
26 | import binascii |
|
26 | import binascii | |
|
27 | import time | |||
27 | import urllib |
|
28 | import urllib | |
28 |
|
29 | |||
29 | from zope.cachedescriptors.property import Lazy as LazyProperty |
|
30 | from zope.cachedescriptors.property import Lazy as LazyProperty | |
|
31 | from zope.cachedescriptors.property import CachedProperty | |||
30 |
|
32 | |||
31 | from rhodecode.lib.compat import OrderedDict |
|
33 | from rhodecode.lib.compat import OrderedDict | |
32 | from rhodecode.lib.datelib import ( |
|
34 | from rhodecode.lib.datelib import ( | |
@@ -85,11 +87,14 b' class MercurialRepository(BaseRepository' | |||||
85 | # caches |
|
87 | # caches | |
86 | self._commit_ids = {} |
|
88 | self._commit_ids = {} | |
87 |
|
89 | |||
|
90 | # dependent that trigger re-computation of commit_ids | |||
|
91 | self._commit_ids_ver = 0 | |||
|
92 | ||||
88 | @LazyProperty |
|
93 | @LazyProperty | |
89 | def _remote(self): |
|
94 | def _remote(self): | |
90 | return connection.Hg(self.path, self.config, with_wire=self.with_wire) |
|
95 | return connection.Hg(self.path, self.config, with_wire=self.with_wire) | |
91 |
|
96 | |||
92 | @LazyProperty |
|
97 | @CachedProperty('_commit_ids_ver') | |
93 | def commit_ids(self): |
|
98 | def commit_ids(self): | |
94 | """ |
|
99 | """ | |
95 | Returns list of commit ids, in ascending order. Being lazy |
|
100 | Returns list of commit ids, in ascending order. Being lazy | |
@@ -157,8 +162,7 b' class MercurialRepository(BaseRepository' | |||||
157 |
|
162 | |||
158 | return OrderedDict(sorted(_tags, key=get_name, reverse=True)) |
|
163 | return OrderedDict(sorted(_tags, key=get_name, reverse=True)) | |
159 |
|
164 | |||
160 | def tag(self, name, user, commit_id=None, message=None, date=None, |
|
165 | def tag(self, name, user, commit_id=None, message=None, date=None, **kwargs): | |
161 | **kwargs): |
|
|||
162 | """ |
|
166 | """ | |
163 | Creates and returns a tag for the given ``commit_id``. |
|
167 | Creates and returns a tag for the given ``commit_id``. | |
164 |
|
168 | |||
@@ -172,6 +176,7 b' class MercurialRepository(BaseRepository' | |||||
172 | """ |
|
176 | """ | |
173 | if name in self.tags: |
|
177 | if name in self.tags: | |
174 | raise TagAlreadyExistError("Tag %s already exists" % name) |
|
178 | raise TagAlreadyExistError("Tag %s already exists" % name) | |
|
179 | ||||
175 | commit = self.get_commit(commit_id=commit_id) |
|
180 | commit = self.get_commit(commit_id=commit_id) | |
176 | local = kwargs.setdefault('local', False) |
|
181 | local = kwargs.setdefault('local', False) | |
177 |
|
182 | |||
@@ -180,8 +185,7 b' class MercurialRepository(BaseRepository' | |||||
180 |
|
185 | |||
181 | date, tz = date_to_timestamp_plus_offset(date) |
|
186 | date, tz = date_to_timestamp_plus_offset(date) | |
182 |
|
187 | |||
183 | self._remote.tag( |
|
188 | self._remote.tag(name, commit.raw_id, message, local, user, date, tz) | |
184 | name, commit.raw_id, message, local, user, date, tz) |
|
|||
185 | self._remote.invalidate_vcs_cache() |
|
189 | self._remote.invalidate_vcs_cache() | |
186 |
|
190 | |||
187 | # Reinitialize tags |
|
191 | # Reinitialize tags | |
@@ -203,6 +207,7 b' class MercurialRepository(BaseRepository' | |||||
203 | """ |
|
207 | """ | |
204 | if name not in self.tags: |
|
208 | if name not in self.tags: | |
205 | raise TagDoesNotExistError("Tag %s does not exist" % name) |
|
209 | raise TagDoesNotExistError("Tag %s does not exist" % name) | |
|
210 | ||||
206 | if message is None: |
|
211 | if message is None: | |
207 | message = "Removed tag %s" % name |
|
212 | message = "Removed tag %s" % name | |
208 | local = False |
|
213 | local = False | |
@@ -271,8 +276,9 b' class MercurialRepository(BaseRepository' | |||||
271 | self._remote.strip(commit_id, update=False, backup="none") |
|
276 | self._remote.strip(commit_id, update=False, backup="none") | |
272 |
|
277 | |||
273 | self._remote.invalidate_vcs_cache() |
|
278 | self._remote.invalidate_vcs_cache() | |
274 | self.commit_ids = self._get_all_commit_ids() |
|
279 | self._commit_ids_ver = time.time() | |
275 | self._rebuild_cache(self.commit_ids) |
|
280 | # we updated _commit_ids_ver so accessing self.commit_ids will re-compute it | |
|
281 | return len(self.commit_ids) | |||
276 |
|
282 | |||
277 | def verify(self): |
|
283 | def verify(self): | |
278 | verify = self._remote.verify() |
|
284 | verify = self._remote.verify() | |
@@ -425,18 +431,20 b' class MercurialRepository(BaseRepository' | |||||
425 | if commit_id is not None: |
|
431 | if commit_id is not None: | |
426 | self._validate_commit_id(commit_id) |
|
432 | self._validate_commit_id(commit_id) | |
427 | try: |
|
433 | try: | |
|
434 | # we have cached idx, use it without contacting the remote | |||
428 | idx = self._commit_ids[commit_id] |
|
435 | idx = self._commit_ids[commit_id] | |
429 | return MercurialCommit(self, commit_id, idx, pre_load=pre_load) |
|
436 | return MercurialCommit(self, commit_id, idx, pre_load=pre_load) | |
430 | except KeyError: |
|
437 | except KeyError: | |
431 | pass |
|
438 | pass | |
|
439 | ||||
432 | elif commit_idx is not None: |
|
440 | elif commit_idx is not None: | |
433 | self._validate_commit_idx(commit_idx) |
|
441 | self._validate_commit_idx(commit_idx) | |
434 | try: |
|
442 | try: | |
435 |
|
|
443 | _commit_id = self.commit_ids[commit_idx] | |
436 | if commit_idx < 0: |
|
444 | if commit_idx < 0: | |
437 |
commit_idx |
|
445 | commit_idx = self.commit_ids.index(_commit_id) | |
438 | return MercurialCommit( |
|
446 | ||
439 |
|
|
447 | return MercurialCommit(self, _commit_id, commit_idx, pre_load=pre_load) | |
440 | except IndexError: |
|
448 | except IndexError: | |
441 | commit_id = commit_idx |
|
449 | commit_id = commit_idx | |
442 | else: |
|
450 | else: | |
@@ -448,8 +456,8 b' class MercurialRepository(BaseRepository' | |||||
448 | try: |
|
456 | try: | |
449 | raw_id, idx = self._remote.lookup(commit_id, both=True) |
|
457 | raw_id, idx = self._remote.lookup(commit_id, both=True) | |
450 | except CommitDoesNotExistError: |
|
458 | except CommitDoesNotExistError: | |
451 |
msg = "Commit |
|
459 | msg = "Commit {} does not exist for `{}`".format( | |
452 | commit_id, self) |
|
460 | *map(safe_str, [commit_id, self.name])) | |
453 | raise CommitDoesNotExistError(msg) |
|
461 | raise CommitDoesNotExistError(msg) | |
454 |
|
462 | |||
455 | return MercurialCommit(self, raw_id, idx, pre_load=pre_load) |
|
463 | return MercurialCommit(self, raw_id, idx, pre_load=pre_load) | |
@@ -477,11 +485,11 b' class MercurialRepository(BaseRepository' | |||||
477 | ``end`` could not be found. |
|
485 | ``end`` could not be found. | |
478 | """ |
|
486 | """ | |
479 | # actually we should check now if it's not an empty repo |
|
487 | # actually we should check now if it's not an empty repo | |
480 | branch_ancestors = False |
|
|||
481 | if self.is_empty(): |
|
488 | if self.is_empty(): | |
482 | raise EmptyRepositoryError("There are no commits yet") |
|
489 | raise EmptyRepositoryError("There are no commits yet") | |
483 | self._validate_branch_name(branch_name) |
|
490 | self._validate_branch_name(branch_name) | |
484 |
|
491 | |||
|
492 | branch_ancestors = False | |||
485 | if start_id is not None: |
|
493 | if start_id is not None: | |
486 | self._validate_commit_id(start_id) |
|
494 | self._validate_commit_id(start_id) | |
487 | c_start = self.get_commit(commit_id=start_id) |
|
495 | c_start = self.get_commit(commit_id=start_id) |
@@ -30,8 +30,7 b' from rhodecode.lib.vcs.backends import b' | |||||
30 |
|
30 | |||
31 | class SubversionInMemoryCommit(base.BaseInMemoryCommit): |
|
31 | class SubversionInMemoryCommit(base.BaseInMemoryCommit): | |
32 |
|
32 | |||
33 | def commit(self, message, author, parents=None, branch=None, date=None, |
|
33 | def commit(self, message, author, parents=None, branch=None, date=None, **kwargs): | |
34 | **kwargs): |
|
|||
35 | if branch not in (None, self.repository.DEFAULT_BRANCH_NAME): |
|
34 | if branch not in (None, self.repository.DEFAULT_BRANCH_NAME): | |
36 | raise NotImplementedError("Branches are not yet supported") |
|
35 | raise NotImplementedError("Branches are not yet supported") | |
37 |
|
36 | |||
@@ -74,8 +73,7 b' class SubversionInMemoryCommit(base.Base' | |||||
74 | # we should not add the commit_id, if it is already evaluated, it |
|
73 | # we should not add the commit_id, if it is already evaluated, it | |
75 | # will not be evaluated again. |
|
74 | # will not be evaluated again. | |
76 | commit_id = str(svn_rev) |
|
75 | commit_id = str(svn_rev) | |
77 |
|
|
76 | self.repository.append_commit_id(commit_id) | |
78 | self.repository.commit_ids.append(commit_id) |
|
|||
79 | tip = self.repository.get_commit() |
|
77 | tip = self.repository.get_commit() | |
80 | self.reset() |
|
78 | self.reset() | |
81 | return tip |
|
79 | return tip |
@@ -27,6 +27,7 b' import os' | |||||
27 | import urllib |
|
27 | import urllib | |
28 |
|
28 | |||
29 | from zope.cachedescriptors.property import Lazy as LazyProperty |
|
29 | from zope.cachedescriptors.property import Lazy as LazyProperty | |
|
30 | from zope.cachedescriptors.property import CachedProperty | |||
30 |
|
31 | |||
31 | from rhodecode.lib.compat import OrderedDict |
|
32 | from rhodecode.lib.compat import OrderedDict | |
32 | from rhodecode.lib.datelib import date_astimestamp |
|
33 | from rhodecode.lib.datelib import date_astimestamp | |
@@ -75,6 +76,9 b' class SubversionRepository(base.BaseRepo' | |||||
75 |
|
76 | |||
76 | self._init_repo(create, src_url) |
|
77 | self._init_repo(create, src_url) | |
77 |
|
78 | |||
|
79 | # dependent that trigger re-computation of commit_ids | |||
|
80 | self._commit_ids_ver = 0 | |||
|
81 | ||||
78 | @LazyProperty |
|
82 | @LazyProperty | |
79 | def _remote(self): |
|
83 | def _remote(self): | |
80 | return connection.Svn(self.path, self.config) |
|
84 | return connection.Svn(self.path, self.config) | |
@@ -93,11 +97,14 b' class SubversionRepository(base.BaseRepo' | |||||
93 | else: |
|
97 | else: | |
94 | self._check_path() |
|
98 | self._check_path() | |
95 |
|
99 | |||
96 | @LazyProperty |
|
100 | @CachedProperty('_commit_ids_ver') | |
97 | def commit_ids(self): |
|
101 | def commit_ids(self): | |
98 | head = self._remote.lookup(None) |
|
102 | head = self._remote.lookup(None) | |
99 | return [str(r) for r in xrange(1, head + 1)] |
|
103 | return [str(r) for r in xrange(1, head + 1)] | |
100 |
|
104 | |||
|
105 | def _rebuild_cache(self, commit_ids): | |||
|
106 | pass | |||
|
107 | ||||
101 | def run_svn_command(self, cmd, **opts): |
|
108 | def run_svn_command(self, cmd, **opts): | |
102 | """ |
|
109 | """ | |
103 | Runs given ``cmd`` as svn command and returns tuple |
|
110 | Runs given ``cmd`` as svn command and returns tuple | |
@@ -277,7 +284,7 b' class SubversionRepository(base.BaseRepo' | |||||
277 | try: |
|
284 | try: | |
278 | commit_id = self.commit_ids[commit_idx] |
|
285 | commit_id = self.commit_ids[commit_idx] | |
279 | except IndexError: |
|
286 | except IndexError: | |
280 | raise CommitDoesNotExistError |
|
287 | raise CommitDoesNotExistError('No commit with idx: {}'.format(commit_idx)) | |
281 |
|
288 | |||
282 | commit_id = self._sanitize_commit_id(commit_id) |
|
289 | commit_id = self._sanitize_commit_id(commit_id) | |
283 | commit = SubversionCommit(repository=self, commit_id=commit_id) |
|
290 | commit = SubversionCommit(repository=self, commit_id=commit_id) |
@@ -42,12 +42,16 b' BACKENDS = {' | |||||
42 | 'svn': 'rhodecode.lib.vcs.backends.svn.SubversionRepository', |
|
42 | 'svn': 'rhodecode.lib.vcs.backends.svn.SubversionRepository', | |
43 | } |
|
43 | } | |
44 |
|
44 | |||
45 | # TODO: Remove once controllers/files.py is adjusted |
|
45 | ||
46 |
ARCHIVE_SPECS = |
|
46 | ARCHIVE_SPECS = [ | |
47 |
'tbz2' |
|
47 | ('tbz2', 'application/x-bzip2', 'tbz2'), | |
48 |
|
|
48 | ('tbz2', 'application/x-bzip2', '.tar.bz2'), | |
49 | 'zip': ('application/zip', '.zip'), |
|
49 | ||
50 | } |
|
50 | ('tgz', 'application/x-gzip', '.tgz'), | |
|
51 | ('tgz', 'application/x-gzip', '.tar.gz'), | |||
|
52 | ||||
|
53 | ('zip', 'application/zip', '.zip'), | |||
|
54 | ] | |||
51 |
|
55 | |||
52 | HOOKS_PROTOCOL = None |
|
56 | HOOKS_PROTOCOL = None | |
53 | HOOKS_DIRECT_CALLS = False |
|
57 | HOOKS_DIRECT_CALLS = False |
@@ -101,23 +101,35 b' def parse_datetime(text):' | |||||
101 | :param text: string of desired date/datetime or something more verbose, |
|
101 | :param text: string of desired date/datetime or something more verbose, | |
102 | like *yesterday*, *2weeks 3days*, etc. |
|
102 | like *yesterday*, *2weeks 3days*, etc. | |
103 | """ |
|
103 | """ | |
|
104 | if not text: | |||
|
105 | raise ValueError('Wrong date: "%s"' % text) | |||
104 |
|
106 | |||
105 | text = text.strip().lower() |
|
107 | if isinstance(text, datetime.datetime): | |
|
108 | return text | |||
106 |
|
109 | |||
107 | INPUT_FORMATS = ( |
|
110 | # we limit a format to no include microseconds e.g 2017-10-17t17:48:23.XXXX | |
|
111 | text = text.strip().lower()[:19] | |||
|
112 | ||||
|
113 | input_formats = ( | |||
108 | '%Y-%m-%d %H:%M:%S', |
|
114 | '%Y-%m-%d %H:%M:%S', | |
|
115 | '%Y-%m-%dt%H:%M:%S', | |||
109 | '%Y-%m-%d %H:%M', |
|
116 | '%Y-%m-%d %H:%M', | |
|
117 | '%Y-%m-%dt%H:%M', | |||
110 | '%Y-%m-%d', |
|
118 | '%Y-%m-%d', | |
111 | '%m/%d/%Y %H:%M:%S', |
|
119 | '%m/%d/%Y %H:%M:%S', | |
|
120 | '%m/%d/%Yt%H:%M:%S', | |||
112 | '%m/%d/%Y %H:%M', |
|
121 | '%m/%d/%Y %H:%M', | |
|
122 | '%m/%d/%Yt%H:%M', | |||
113 | '%m/%d/%Y', |
|
123 | '%m/%d/%Y', | |
114 | '%m/%d/%y %H:%M:%S', |
|
124 | '%m/%d/%y %H:%M:%S', | |
|
125 | '%m/%d/%yt%H:%M:%S', | |||
115 | '%m/%d/%y %H:%M', |
|
126 | '%m/%d/%y %H:%M', | |
|
127 | '%m/%d/%yt%H:%M', | |||
116 | '%m/%d/%y', |
|
128 | '%m/%d/%y', | |
117 | ) |
|
129 | ) | |
118 | for format in INPUT_FORMATS: |
|
130 | for format_def in input_formats: | |
119 | try: |
|
131 | try: | |
120 | return datetime.datetime(*time.strptime(text, format)[:6]) |
|
132 | return datetime.datetime(*time.strptime(text, format_def)[:6]) | |
121 | except ValueError: |
|
133 | except ValueError: | |
122 | pass |
|
134 | pass | |
123 |
|
135 |
@@ -59,7 +59,7 b' from rhodecode.lib.vcs.backends.base imp' | |||||
59 | from rhodecode.lib.utils2 import ( |
|
59 | from rhodecode.lib.utils2 import ( | |
60 | str2bool, safe_str, get_commit_safe, safe_unicode, sha1_safe, |
|
60 | str2bool, safe_str, get_commit_safe, safe_unicode, sha1_safe, | |
61 | time_to_datetime, aslist, Optional, safe_int, get_clone_url, AttributeDict, |
|
61 | time_to_datetime, aslist, Optional, safe_int, get_clone_url, AttributeDict, | |
62 | glob2re, StrictAttributeDict, cleaned_uri) |
|
62 | glob2re, StrictAttributeDict, cleaned_uri, datetime_to_time, OrderedDefaultDict) | |
63 | from rhodecode.lib.jsonalchemy import MutationObj, MutationList, JsonType, \ |
|
63 | from rhodecode.lib.jsonalchemy import MutationObj, MutationList, JsonType, \ | |
64 | JsonRaw |
|
64 | JsonRaw | |
65 | from rhodecode.lib.ext_json import json |
|
65 | from rhodecode.lib.ext_json import json | |
@@ -1678,11 +1678,12 b' class Repository(Base, BaseModel):' | |||||
1678 | cascade="all, delete, delete-orphan") |
|
1678 | cascade="all, delete, delete-orphan") | |
1679 | ui = relationship('RepoRhodeCodeUi', cascade="all") |
|
1679 | ui = relationship('RepoRhodeCodeUi', cascade="all") | |
1680 | settings = relationship('RepoRhodeCodeSetting', cascade="all") |
|
1680 | settings = relationship('RepoRhodeCodeSetting', cascade="all") | |
1681 | integrations = relationship('Integration', |
|
1681 | integrations = relationship('Integration', cascade="all, delete, delete-orphan") | |
1682 | cascade="all, delete, delete-orphan") |
|
|||
1683 |
|
1682 | |||
1684 | scoped_tokens = relationship('UserApiKeys', cascade="all") |
|
1683 | scoped_tokens = relationship('UserApiKeys', cascade="all") | |
1685 |
|
1684 | |||
|
1685 | artifacts = relationship('FileStore', cascade="all") | |||
|
1686 | ||||
1686 | def __unicode__(self): |
|
1687 | def __unicode__(self): | |
1687 | return u"<%s('%s:%s')>" % (self.__class__.__name__, self.repo_id, |
|
1688 | return u"<%s('%s:%s')>" % (self.__class__.__name__, self.repo_id, | |
1688 | safe_unicode(self.repo_name)) |
|
1689 | safe_unicode(self.repo_name)) | |
@@ -1730,7 +1731,9 b' class Repository(Base, BaseModel):' | |||||
1730 | from rhodecode.lib.vcs.backends.base import EmptyCommit |
|
1731 | from rhodecode.lib.vcs.backends.base import EmptyCommit | |
1731 | dummy = EmptyCommit().__json__() |
|
1732 | dummy = EmptyCommit().__json__() | |
1732 | if not self._changeset_cache: |
|
1733 | if not self._changeset_cache: | |
1733 | return dummy |
|
1734 | dummy['source_repo_id'] = self.repo_id | |
|
1735 | return json.loads(json.dumps(dummy)) | |||
|
1736 | ||||
1734 | try: |
|
1737 | try: | |
1735 | return json.loads(self._changeset_cache) |
|
1738 | return json.loads(self._changeset_cache) | |
1736 | except TypeError: |
|
1739 | except TypeError: | |
@@ -2183,6 +2186,20 b' class Repository(Base, BaseModel):' | |||||
2183 | return make_lock, currently_locked, lock_info |
|
2186 | return make_lock, currently_locked, lock_info | |
2184 |
|
2187 | |||
2185 | @property |
|
2188 | @property | |
|
2189 | def last_commit_cache_update_diff(self): | |||
|
2190 | return time.time() - (safe_int(self.changeset_cache.get('updated_on')) or 0) | |||
|
2191 | ||||
|
2192 | @property | |||
|
2193 | def last_commit_change(self): | |||
|
2194 | from rhodecode.lib.vcs.utils.helpers import parse_datetime | |||
|
2195 | empty_date = datetime.datetime.fromtimestamp(0) | |||
|
2196 | date_latest = self.changeset_cache.get('date', empty_date) | |||
|
2197 | try: | |||
|
2198 | return parse_datetime(date_latest) | |||
|
2199 | except Exception: | |||
|
2200 | return empty_date | |||
|
2201 | ||||
|
2202 | @property | |||
2186 | def last_db_change(self): |
|
2203 | def last_db_change(self): | |
2187 | return self.updated_on |
|
2204 | return self.updated_on | |
2188 |
|
2205 | |||
@@ -2275,6 +2292,7 b' class Repository(Base, BaseModel):' | |||||
2275 | """ |
|
2292 | """ | |
2276 | Update cache of last changeset for repository, keys should be:: |
|
2293 | Update cache of last changeset for repository, keys should be:: | |
2277 |
|
2294 | |||
|
2295 | source_repo_id | |||
2278 | short_id |
|
2296 | short_id | |
2279 | raw_id |
|
2297 | raw_id | |
2280 | revision |
|
2298 | revision | |
@@ -2282,15 +2300,15 b' class Repository(Base, BaseModel):' | |||||
2282 | message |
|
2300 | message | |
2283 | date |
|
2301 | date | |
2284 | author |
|
2302 | author | |
2285 |
|
2303 | updated_on | ||
2286 | :param cs_cache: |
|
2304 | ||
2287 | """ |
|
2305 | """ | |
2288 | from rhodecode.lib.vcs.backends.base import BaseChangeset |
|
2306 | from rhodecode.lib.vcs.backends.base import BaseChangeset | |
2289 | if cs_cache is None: |
|
2307 | if cs_cache is None: | |
2290 | # use no-cache version here |
|
2308 | # use no-cache version here | |
2291 | scm_repo = self.scm_instance(cache=False, config=config) |
|
2309 | scm_repo = self.scm_instance(cache=False, config=config) | |
2292 |
|
2310 | |||
2293 |
empty = |
|
2311 | empty = scm_repo is None or scm_repo.is_empty() | |
2294 | if not empty: |
|
2312 | if not empty: | |
2295 | cs_cache = scm_repo.get_commit( |
|
2313 | cs_cache = scm_repo.get_commit( | |
2296 | pre_load=["author", "date", "message", "parents"]) |
|
2314 | pre_load=["author", "date", "message", "parents"]) | |
@@ -2310,18 +2328,28 b' class Repository(Base, BaseModel):' | |||||
2310 | if is_outdated(cs_cache) or not self.changeset_cache: |
|
2328 | if is_outdated(cs_cache) or not self.changeset_cache: | |
2311 | _default = datetime.datetime.utcnow() |
|
2329 | _default = datetime.datetime.utcnow() | |
2312 | last_change = cs_cache.get('date') or _default |
|
2330 | last_change = cs_cache.get('date') or _default | |
2313 | if self.updated_on and self.updated_on > last_change: |
|
2331 | # we check if last update is newer than the new value | |
2314 | # we check if last update is newer than the new value |
|
2332 | # if yes, we use the current timestamp instead. Imagine you get | |
2315 | # if yes, we use the current timestamp instead. Imagine you get |
|
2333 | # old commit pushed 1y ago, we'd set last update 1y to ago. | |
2316 | # old commit pushed 1y ago, we'd set last update 1y to ago. |
|
2334 | last_change_timestamp = datetime_to_time(last_change) | |
2317 | last_change = _default |
|
2335 | current_timestamp = datetime_to_time(last_change) | |
2318 | log.debug('updated repo %s with new cs cache %s', |
|
2336 | if last_change_timestamp > current_timestamp: | |
2319 | self.repo_name, cs_cache) |
|
2337 | cs_cache['date'] = _default | |
2320 | self.updated_on = last_change |
|
2338 | ||
|
2339 | cs_cache['updated_on'] = time.time() | |||
2321 | self.changeset_cache = cs_cache |
|
2340 | self.changeset_cache = cs_cache | |
2322 | Session().add(self) |
|
2341 | Session().add(self) | |
2323 | Session().commit() |
|
2342 | Session().commit() | |
|
2343 | ||||
|
2344 | log.debug('updated repo %s with new commit cache %s', | |||
|
2345 | self.repo_name, cs_cache) | |||
2324 | else: |
|
2346 | else: | |
|
2347 | cs_cache = self.changeset_cache | |||
|
2348 | cs_cache['updated_on'] = time.time() | |||
|
2349 | self.changeset_cache = cs_cache | |||
|
2350 | Session().add(self) | |||
|
2351 | Session().commit() | |||
|
2352 | ||||
2325 | log.debug('Skipping update_commit_cache for repo:`%s` ' |
|
2353 | log.debug('Skipping update_commit_cache for repo:`%s` ' | |
2326 | 'commit already with latest changes', self.repo_name) |
|
2354 | 'commit already with latest changes', self.repo_name) | |
2327 |
|
2355 | |||
@@ -2410,6 +2438,7 b' class Repository(Base, BaseModel):' | |||||
2410 | # control over cache behaviour |
|
2438 | # control over cache behaviour | |
2411 | if cache is None and full_cache and not config: |
|
2439 | if cache is None and full_cache and not config: | |
2412 | return self._get_instance_cached() |
|
2440 | return self._get_instance_cached() | |
|
2441 | # cache here is sent to the "vcs server" | |||
2413 | return self._get_instance(cache=bool(cache), config=config) |
|
2442 | return self._get_instance(cache=bool(cache), config=config) | |
2414 |
|
2443 | |||
2415 | def _get_instance_cached(self): |
|
2444 | def _get_instance_cached(self): | |
@@ -2438,8 +2467,7 b' class Repository(Base, BaseModel):' | |||||
2438 | else: |
|
2467 | else: | |
2439 | instance = get_instance_cached(*args) |
|
2468 | instance = get_instance_cached(*args) | |
2440 |
|
2469 | |||
2441 | log.debug( |
|
2470 | log.debug('Repo instance fetched in %.3fs', inv_context_manager.compute_time) | |
2442 | 'Repo instance fetched in %.3fs', inv_context_manager.compute_time) |
|
|||
2443 | return instance |
|
2471 | return instance | |
2444 |
|
2472 | |||
2445 | def _get_instance(self, cache=True, config=None): |
|
2473 | def _get_instance(self, cache=True, config=None): | |
@@ -2453,7 +2481,8 b' class Repository(Base, BaseModel):' | |||||
2453 | with_wire=custom_wire, |
|
2481 | with_wire=custom_wire, | |
2454 | create=False, |
|
2482 | create=False, | |
2455 | _vcs_alias=self.repo_type) |
|
2483 | _vcs_alias=self.repo_type) | |
2456 |
|
2484 | if repo is not None: | ||
|
2485 | repo.count() # cache rebuild | |||
2457 | return repo |
|
2486 | return repo | |
2458 |
|
2487 | |||
2459 | def __json__(self): |
|
2488 | def __json__(self): | |
@@ -2489,6 +2518,8 b' class RepoGroup(Base, BaseModel):' | |||||
2489 | created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now) |
|
2518 | created_on = Column('created_on', DateTime(timezone=False), nullable=False, default=datetime.datetime.now) | |
2490 | updated_on = Column('updated_on', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now) |
|
2519 | updated_on = Column('updated_on', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now) | |
2491 | personal = Column('personal', Boolean(), nullable=True, unique=None, default=None) |
|
2520 | personal = Column('personal', Boolean(), nullable=True, unique=None, default=None) | |
|
2521 | _changeset_cache = Column( | |||
|
2522 | "changeset_cache", LargeBinary(), nullable=True) # JSON data | |||
2492 |
|
2523 | |||
2493 | repo_group_to_perm = relationship('UserRepoGroupToPerm', cascade='all', order_by='UserRepoGroupToPerm.group_to_perm_id') |
|
2524 | repo_group_to_perm = relationship('UserRepoGroupToPerm', cascade='all', order_by='UserRepoGroupToPerm.group_to_perm_id') | |
2494 | users_group_to_perm = relationship('UserGroupRepoGroupToPerm', cascade='all') |
|
2525 | users_group_to_perm = relationship('UserGroupRepoGroupToPerm', cascade='all') | |
@@ -2513,6 +2544,29 b' class RepoGroup(Base, BaseModel):' | |||||
2513 | self._group_name = value |
|
2544 | self._group_name = value | |
2514 | self.group_name_hash = self.hash_repo_group_name(value) |
|
2545 | self.group_name_hash = self.hash_repo_group_name(value) | |
2515 |
|
2546 | |||
|
2547 | @hybrid_property | |||
|
2548 | def changeset_cache(self): | |||
|
2549 | from rhodecode.lib.vcs.backends.base import EmptyCommit | |||
|
2550 | dummy = EmptyCommit().__json__() | |||
|
2551 | if not self._changeset_cache: | |||
|
2552 | dummy['source_repo_id'] = '' | |||
|
2553 | return json.loads(json.dumps(dummy)) | |||
|
2554 | ||||
|
2555 | try: | |||
|
2556 | return json.loads(self._changeset_cache) | |||
|
2557 | except TypeError: | |||
|
2558 | return dummy | |||
|
2559 | except Exception: | |||
|
2560 | log.error(traceback.format_exc()) | |||
|
2561 | return dummy | |||
|
2562 | ||||
|
2563 | @changeset_cache.setter | |||
|
2564 | def changeset_cache(self, val): | |||
|
2565 | try: | |||
|
2566 | self._changeset_cache = json.dumps(val) | |||
|
2567 | except Exception: | |||
|
2568 | log.error(traceback.format_exc()) | |||
|
2569 | ||||
2516 | @validates('group_parent_id') |
|
2570 | @validates('group_parent_id') | |
2517 | def validate_group_parent_id(self, key, val): |
|
2571 | def validate_group_parent_id(self, key, val): | |
2518 | """ |
|
2572 | """ | |
@@ -2608,8 +2662,7 b' class RepoGroup(Base, BaseModel):' | |||||
2608 | return q.all() |
|
2662 | return q.all() | |
2609 |
|
2663 | |||
2610 | @property |
|
2664 | @property | |
2611 | def parents(self): |
|
2665 | def parents(self, parents_recursion_limit = 10): | |
2612 | parents_recursion_limit = 10 |
|
|||
2613 | groups = [] |
|
2666 | groups = [] | |
2614 | if self.parent_group is None: |
|
2667 | if self.parent_group is None: | |
2615 | return groups |
|
2668 | return groups | |
@@ -2632,6 +2685,20 b' class RepoGroup(Base, BaseModel):' | |||||
2632 | return groups |
|
2685 | return groups | |
2633 |
|
2686 | |||
2634 | @property |
|
2687 | @property | |
|
2688 | def last_commit_cache_update_diff(self): | |||
|
2689 | return time.time() - (safe_int(self.changeset_cache.get('updated_on')) or 0) | |||
|
2690 | ||||
|
2691 | @property | |||
|
2692 | def last_commit_change(self): | |||
|
2693 | from rhodecode.lib.vcs.utils.helpers import parse_datetime | |||
|
2694 | empty_date = datetime.datetime.fromtimestamp(0) | |||
|
2695 | date_latest = self.changeset_cache.get('date', empty_date) | |||
|
2696 | try: | |||
|
2697 | return parse_datetime(date_latest) | |||
|
2698 | except Exception: | |||
|
2699 | return empty_date | |||
|
2700 | ||||
|
2701 | @property | |||
2635 | def last_db_change(self): |
|
2702 | def last_db_change(self): | |
2636 | return self.updated_on |
|
2703 | return self.updated_on | |
2637 |
|
2704 | |||
@@ -2670,7 +2737,7 b' class RepoGroup(Base, BaseModel):' | |||||
2670 |
|
2737 | |||
2671 | return cnt + children_count(self) |
|
2738 | return cnt + children_count(self) | |
2672 |
|
2739 | |||
2673 | def _recursive_objects(self, include_repos=True): |
|
2740 | def _recursive_objects(self, include_repos=True, include_groups=True): | |
2674 | all_ = [] |
|
2741 | all_ = [] | |
2675 |
|
2742 | |||
2676 | def _get_members(root_gr): |
|
2743 | def _get_members(root_gr): | |
@@ -2680,11 +2747,16 b' class RepoGroup(Base, BaseModel):' | |||||
2680 | childs = root_gr.children.all() |
|
2747 | childs = root_gr.children.all() | |
2681 | if childs: |
|
2748 | if childs: | |
2682 | for gr in childs: |
|
2749 | for gr in childs: | |
2683 |
|
|
2750 | if include_groups: | |
|
2751 | all_.append(gr) | |||
2684 | _get_members(gr) |
|
2752 | _get_members(gr) | |
2685 |
|
2753 | |||
|
2754 | root_group = [] | |||
|
2755 | if include_groups: | |||
|
2756 | root_group = [self] | |||
|
2757 | ||||
2686 | _get_members(self) |
|
2758 | _get_members(self) | |
2687 |
return |
|
2759 | return root_group + all_ | |
2688 |
|
2760 | |||
2689 | def recursive_groups_and_repos(self): |
|
2761 | def recursive_groups_and_repos(self): | |
2690 | """ |
|
2762 | """ | |
@@ -2698,6 +2770,12 b' class RepoGroup(Base, BaseModel):' | |||||
2698 | """ |
|
2770 | """ | |
2699 | return self._recursive_objects(include_repos=False) |
|
2771 | return self._recursive_objects(include_repos=False) | |
2700 |
|
2772 | |||
|
2773 | def recursive_repos(self): | |||
|
2774 | """ | |||
|
2775 | Returns all children repositories for this group | |||
|
2776 | """ | |||
|
2777 | return self._recursive_objects(include_groups=False) | |||
|
2778 | ||||
2701 | def get_new_name(self, group_name): |
|
2779 | def get_new_name(self, group_name): | |
2702 | """ |
|
2780 | """ | |
2703 | returns new full group name based on parent and new name |
|
2781 | returns new full group name based on parent and new name | |
@@ -2708,6 +2786,63 b' class RepoGroup(Base, BaseModel):' | |||||
2708 | self.parent_group else []) |
|
2786 | self.parent_group else []) | |
2709 | return RepoGroup.url_sep().join(path_prefix + [group_name]) |
|
2787 | return RepoGroup.url_sep().join(path_prefix + [group_name]) | |
2710 |
|
2788 | |||
|
2789 | def update_commit_cache(self, config=None): | |||
|
2790 | """ | |||
|
2791 | Update cache of last changeset for newest repository inside this group, keys should be:: | |||
|
2792 | ||||
|
2793 | source_repo_id | |||
|
2794 | short_id | |||
|
2795 | raw_id | |||
|
2796 | revision | |||
|
2797 | parents | |||
|
2798 | message | |||
|
2799 | date | |||
|
2800 | author | |||
|
2801 | ||||
|
2802 | """ | |||
|
2803 | from rhodecode.lib.vcs.utils.helpers import parse_datetime | |||
|
2804 | ||||
|
2805 | def repo_groups_and_repos(): | |||
|
2806 | all_entries = OrderedDefaultDict(list) | |||
|
2807 | ||||
|
2808 | def _get_members(root_gr, pos=0): | |||
|
2809 | ||||
|
2810 | for repo in root_gr.repositories: | |||
|
2811 | all_entries[root_gr].append(repo) | |||
|
2812 | ||||
|
2813 | # fill in all parent positions | |||
|
2814 | for parent_group in root_gr.parents: | |||
|
2815 | all_entries[parent_group].extend(all_entries[root_gr]) | |||
|
2816 | ||||
|
2817 | children_groups = root_gr.children.all() | |||
|
2818 | if children_groups: | |||
|
2819 | for cnt, gr in enumerate(children_groups, 1): | |||
|
2820 | _get_members(gr, pos=pos+cnt) | |||
|
2821 | ||||
|
2822 | _get_members(root_gr=self) | |||
|
2823 | return all_entries | |||
|
2824 | ||||
|
2825 | empty_date = datetime.datetime.fromtimestamp(0) | |||
|
2826 | for repo_group, repos in repo_groups_and_repos().items(): | |||
|
2827 | ||||
|
2828 | latest_repo_cs_cache = {} | |||
|
2829 | for repo in repos: | |||
|
2830 | repo_cs_cache = repo.changeset_cache | |||
|
2831 | date_latest = latest_repo_cs_cache.get('date', empty_date) | |||
|
2832 | date_current = repo_cs_cache.get('date', empty_date) | |||
|
2833 | current_timestamp = datetime_to_time(parse_datetime(date_latest)) | |||
|
2834 | if current_timestamp < datetime_to_time(parse_datetime(date_current)): | |||
|
2835 | latest_repo_cs_cache = repo_cs_cache | |||
|
2836 | latest_repo_cs_cache['source_repo_id'] = repo.repo_id | |||
|
2837 | ||||
|
2838 | latest_repo_cs_cache['updated_on'] = time.time() | |||
|
2839 | repo_group.changeset_cache = latest_repo_cs_cache | |||
|
2840 | Session().add(repo_group) | |||
|
2841 | Session().commit() | |||
|
2842 | ||||
|
2843 | log.debug('updated repo group %s with new commit cache %s', | |||
|
2844 | repo_group.group_name, latest_repo_cs_cache) | |||
|
2845 | ||||
2711 | def permissions(self, with_admins=True, with_owner=True, |
|
2846 | def permissions(self, with_admins=True, with_owner=True, | |
2712 | expand_from_user_groups=False): |
|
2847 | expand_from_user_groups=False): | |
2713 | """ |
|
2848 | """ | |
@@ -4301,9 +4436,9 b' class Gist(Base, BaseModel):' | |||||
4301 |
|
4436 | |||
4302 | def scm_instance(self, **kwargs): |
|
4437 | def scm_instance(self, **kwargs): | |
4303 | """ |
|
4438 | """ | |
4304 | Get explicit Mercurial repository used |
|
4439 | Get an instance of VCS Repository | |
|
4440 | ||||
4305 | :param kwargs: |
|
4441 | :param kwargs: | |
4306 | :return: |
|
|||
4307 | """ |
|
4442 | """ | |
4308 | from rhodecode.model.gist import GistModel |
|
4443 | from rhodecode.model.gist import GistModel | |
4309 | full_repo_path = os.path.join(self.base_path(), self.gist_access_id) |
|
4444 | full_repo_path = os.path.join(self.base_path(), self.gist_access_id) | |
@@ -4953,8 +5088,8 b' class FileStore(Base, BaseModel):' | |||||
4953 |
|
5088 | |||
4954 | @classmethod |
|
5089 | @classmethod | |
4955 | def create(cls, file_uid, filename, file_hash, file_size, file_display_name='', |
|
5090 | def create(cls, file_uid, filename, file_hash, file_size, file_display_name='', | |
4956 | file_description='', enabled=True, check_acl=True, |
|
5091 | file_description='', enabled=True, check_acl=True, user_id=None, | |
4957 | user_id=None, scope_repo_id=None, scope_repo_group_id=None): |
|
5092 | scope_user_id=None, scope_repo_id=None, scope_repo_group_id=None): | |
4958 |
|
5093 | |||
4959 | store_entry = FileStore() |
|
5094 | store_entry = FileStore() | |
4960 | store_entry.file_uid = file_uid |
|
5095 | store_entry.file_uid = file_uid | |
@@ -4968,6 +5103,7 b' class FileStore(Base, BaseModel):' | |||||
4968 | store_entry.enabled = enabled |
|
5103 | store_entry.enabled = enabled | |
4969 |
|
5104 | |||
4970 | store_entry.user_id = user_id |
|
5105 | store_entry.user_id = user_id | |
|
5106 | store_entry.scope_user_id = scope_user_id | |||
4971 | store_entry.scope_repo_id = scope_repo_id |
|
5107 | store_entry.scope_repo_id = scope_repo_id | |
4972 | store_entry.scope_repo_group_id = scope_repo_group_id |
|
5108 | store_entry.scope_repo_group_id = scope_repo_group_id | |
4973 | return store_entry |
|
5109 | return store_entry |
@@ -683,6 +683,7 b' class PullRequestModel(BaseModel):' | |||||
683 |
|
683 | |||
684 | # source repo |
|
684 | # source repo | |
685 | source_repo = pull_request.source_repo.scm_instance() |
|
685 | source_repo = pull_request.source_repo.scm_instance() | |
|
686 | ||||
686 | try: |
|
687 | try: | |
687 | source_commit = source_repo.get_commit(commit_id=source_ref_name) |
|
688 | source_commit = source_repo.get_commit(commit_id=source_ref_name) | |
688 | except CommitDoesNotExistError: |
|
689 | except CommitDoesNotExistError: | |
@@ -696,6 +697,7 b' class PullRequestModel(BaseModel):' | |||||
696 |
|
697 | |||
697 | # target repo |
|
698 | # target repo | |
698 | target_repo = pull_request.target_repo.scm_instance() |
|
699 | target_repo = pull_request.target_repo.scm_instance() | |
|
700 | ||||
699 | try: |
|
701 | try: | |
700 | target_commit = target_repo.get_commit(commit_id=target_ref_name) |
|
702 | target_commit = target_repo.get_commit(commit_id=target_ref_name) | |
701 | except CommitDoesNotExistError: |
|
703 | except CommitDoesNotExistError: | |
@@ -752,8 +754,8 b' class PullRequestModel(BaseModel):' | |||||
752 | target_commit.raw_id, source_commit.raw_id, source_repo, merge=True, |
|
754 | target_commit.raw_id, source_commit.raw_id, source_repo, merge=True, | |
753 | pre_load=pre_load) |
|
755 | pre_load=pre_load) | |
754 |
|
756 | |||
755 |
ancestor = |
|
757 | ancestor = source_repo.get_common_ancestor( | |
756 |
target_commit.raw_id, |
|
758 | source_commit.raw_id, target_commit.raw_id, target_repo) | |
757 |
|
759 | |||
758 | pull_request.source_ref = '%s:%s:%s' % ( |
|
760 | pull_request.source_ref = '%s:%s:%s' % ( | |
759 | source_ref_type, source_ref_name, source_commit.raw_id) |
|
761 | source_ref_type, source_ref_name, source_commit.raw_id) | |
@@ -1337,6 +1339,7 b' class PullRequestModel(BaseModel):' | |||||
1337 | name_or_id = reference.name |
|
1339 | name_or_id = reference.name | |
1338 | else: |
|
1340 | else: | |
1339 | name_or_id = reference.commit_id |
|
1341 | name_or_id = reference.commit_id | |
|
1342 | ||||
1340 | refreshed_commit = vcs_repository.get_commit(name_or_id) |
|
1343 | refreshed_commit = vcs_repository.get_commit(name_or_id) | |
1341 | refreshed_reference = Reference( |
|
1344 | refreshed_reference = Reference( | |
1342 | reference.type, reference.name, refreshed_commit.raw_id) |
|
1345 | reference.type, reference.name, refreshed_commit.raw_id) |
@@ -192,14 +192,14 b' class RepoModel(BaseModel):' | |||||
192 | return repo_log |
|
192 | return repo_log | |
193 |
|
193 | |||
194 | @classmethod |
|
194 | @classmethod | |
195 |
def update_ |
|
195 | def update_commit_cache(cls, repositories=None): | |
196 | if not repositories: |
|
196 | if not repositories: | |
197 | repositories = Repository.getAll() |
|
197 | repositories = Repository.getAll() | |
198 | for repo in repositories: |
|
198 | for repo in repositories: | |
199 | repo.update_commit_cache() |
|
199 | repo.update_commit_cache() | |
200 |
|
200 | |||
201 | def get_repos_as_dict(self, repo_list=None, admin=False, |
|
201 | def get_repos_as_dict(self, repo_list=None, admin=False, | |
202 | super_user_actions=False): |
|
202 | super_user_actions=False, short_name=None): | |
203 | _render = get_current_request().get_partial_renderer( |
|
203 | _render = get_current_request().get_partial_renderer( | |
204 | 'rhodecode:templates/data_table/_dt_elements.mako') |
|
204 | 'rhodecode:templates/data_table/_dt_elements.mako') | |
205 | c = _render.get_call_context() |
|
205 | c = _render.get_call_context() | |
@@ -208,8 +208,12 b' class RepoModel(BaseModel):' | |||||
208 | return _render('quick_menu', repo_name) |
|
208 | return _render('quick_menu', repo_name) | |
209 |
|
209 | |||
210 | def repo_lnk(name, rtype, rstate, private, archived, fork_of): |
|
210 | def repo_lnk(name, rtype, rstate, private, archived, fork_of): | |
|
211 | if short_name is not None: | |||
|
212 | short_name_var = short_name | |||
|
213 | else: | |||
|
214 | short_name_var = not admin | |||
211 | return _render('repo_name', name, rtype, rstate, private, archived, fork_of, |
|
215 | return _render('repo_name', name, rtype, rstate, private, archived, fork_of, | |
212 |
short_name= |
|
216 | short_name=short_name_var, admin=False) | |
213 |
|
217 | |||
214 | def last_change(last_change): |
|
218 | def last_change(last_change): | |
215 | if admin and isinstance(last_change, datetime.datetime) and not last_change.tzinfo: |
|
219 | if admin and isinstance(last_change, datetime.datetime) and not last_change.tzinfo: | |
@@ -250,8 +254,8 b' class RepoModel(BaseModel):' | |||||
250 | repo.private, repo.archived, repo.fork), |
|
254 | repo.private, repo.archived, repo.fork), | |
251 | "name_raw": repo.repo_name.lower(), |
|
255 | "name_raw": repo.repo_name.lower(), | |
252 |
|
256 | |||
253 |
"last_change": last_change(repo.last_ |
|
257 | "last_change": last_change(repo.last_commit_change), | |
254 |
"last_change_raw": datetime_to_time(repo.last_ |
|
258 | "last_change_raw": datetime_to_time(repo.last_commit_change), | |
255 |
|
259 | |||
256 | "last_changeset": last_rev(repo.repo_name, cs_cache), |
|
260 | "last_changeset": last_rev(repo.repo_name, cs_cache), | |
257 | "last_changeset_raw": cs_cache.get('revision'), |
|
261 | "last_changeset_raw": cs_cache.get('revision'), |
@@ -309,6 +309,10 b' class RepoGroupModel(BaseModel):' | |||||
309 | # trigger the post hook |
|
309 | # trigger the post hook | |
310 | from rhodecode.lib.hooks_base import log_create_repository_group |
|
310 | from rhodecode.lib.hooks_base import log_create_repository_group | |
311 | repo_group = RepoGroup.get_by_group_name(group_name) |
|
311 | repo_group = RepoGroup.get_by_group_name(group_name) | |
|
312 | ||||
|
313 | # update repo group commit caches initially | |||
|
314 | repo_group.update_commit_cache() | |||
|
315 | ||||
312 | log_create_repository_group( |
|
316 | log_create_repository_group( | |
313 | created_by=user.username, **repo_group.get_dict()) |
|
317 | created_by=user.username, **repo_group.get_dict()) | |
314 |
|
318 | |||
@@ -686,6 +690,13 b' class RepoGroupModel(BaseModel):' | |||||
686 | 'revoked permission from usergroup: {} on repogroup: {}'.format( |
|
690 | 'revoked permission from usergroup: {} on repogroup: {}'.format( | |
687 | group_name, repo_group), namespace='security.repogroup') |
|
691 | group_name, repo_group), namespace='security.repogroup') | |
688 |
|
692 | |||
|
693 | @classmethod | |||
|
694 | def update_commit_cache(cls, repo_groups=None): | |||
|
695 | if not repo_groups: | |||
|
696 | repo_groups = RepoGroup.getAll() | |||
|
697 | for repo_group in repo_groups: | |||
|
698 | repo_group.update_commit_cache() | |||
|
699 | ||||
689 | def get_repo_groups_as_dict(self, repo_group_list=None, admin=False, |
|
700 | def get_repo_groups_as_dict(self, repo_group_list=None, admin=False, | |
690 | super_user_actions=False): |
|
701 | super_user_actions=False): | |
691 |
|
702 | |||
@@ -707,6 +718,11 b' class RepoGroupModel(BaseModel):' | |||||
707 | (datetime.datetime.now() - datetime.datetime.utcnow()).seconds) |
|
718 | (datetime.datetime.now() - datetime.datetime.utcnow()).seconds) | |
708 | return _render("last_change", last_change) |
|
719 | return _render("last_change", last_change) | |
709 |
|
720 | |||
|
721 | def last_rev(repo_name, cs_cache): | |||
|
722 | return _render('revision', repo_name, cs_cache.get('revision'), | |||
|
723 | cs_cache.get('raw_id'), cs_cache.get('author'), | |||
|
724 | cs_cache.get('message'), cs_cache.get('date')) | |||
|
725 | ||||
710 | def desc(desc, personal): |
|
726 | def desc(desc, personal): | |
711 | return _render( |
|
727 | return _render( | |
712 | 'repo_group_desc', desc, personal, c.visual.stylify_metatags) |
|
728 | 'repo_group_desc', desc, personal, c.visual.stylify_metatags) | |
@@ -723,13 +739,15 b' class RepoGroupModel(BaseModel):' | |||||
723 |
|
739 | |||
724 | repo_group_data = [] |
|
740 | repo_group_data = [] | |
725 | for group in repo_group_list: |
|
741 | for group in repo_group_list: | |
|
742 | cs_cache = group.changeset_cache | |||
|
743 | last_repo_name = cs_cache.get('source_repo_name') | |||
726 |
|
744 | |||
727 | row = { |
|
745 | row = { | |
728 | "menu": quick_menu(group.group_name), |
|
746 | "menu": quick_menu(group.group_name), | |
729 | "name": repo_group_lnk(group.group_name), |
|
747 | "name": repo_group_lnk(group.group_name), | |
730 | "name_raw": group.group_name, |
|
748 | "name_raw": group.group_name, | |
731 |
"last_change": last_change(group.last_ |
|
749 | "last_change": last_change(group.last_commit_change), | |
732 |
"last_change_raw": datetime_to_time(group.last_ |
|
750 | "last_change_raw": datetime_to_time(group.last_commit_change), | |
733 |
|
751 | |||
734 | "last_changeset": "", |
|
752 | "last_changeset": "", | |
735 | "last_changeset_raw": "", |
|
753 | "last_changeset_raw": "", |
@@ -818,6 +818,8 b' class ScmModel(BaseModel):' | |||||
818 | repo_name=repo.repo_name, repo_alias=scm_instance.alias, |
|
818 | repo_name=repo.repo_name, repo_alias=scm_instance.alias, | |
819 | commit_ids=[tip.raw_id]) |
|
819 | commit_ids=[tip.raw_id]) | |
820 |
|
820 | |||
|
821 | return tip | |||
|
822 | ||||
821 | def delete_nodes(self, user, repo, message, nodes, parent_commit=None, |
|
823 | def delete_nodes(self, user, repo, message, nodes, parent_commit=None, | |
822 | author=None, trigger_push_hook=True): |
|
824 | author=None, trigger_push_hook=True): | |
823 | """ |
|
825 | """ |
@@ -14,11 +14,11 b' input[type="button"] {' | |||||
14 | font-family: @text-light; |
|
14 | font-family: @text-light; | |
15 | text-decoration: none; |
|
15 | text-decoration: none; | |
16 | text-shadow: none; |
|
16 | text-shadow: none; | |
17 |
color: @grey |
|
17 | color: @grey2; | |
18 | background-color: white; |
|
18 | background-color: white; | |
19 | background-image: none; |
|
19 | background-image: none; | |
20 | border: none; |
|
20 | border: none; | |
21 |
.border ( @border-thickness-buttons, @grey |
|
21 | .border ( @border-thickness-buttons, @grey5 ); | |
22 | .border-radius (@border-radius); |
|
22 | .border-radius (@border-radius); | |
23 | cursor: pointer; |
|
23 | cursor: pointer; | |
24 | white-space: nowrap; |
|
24 | white-space: nowrap; | |
@@ -26,6 +26,10 b' input[type="button"] {' | |||||
26 | -moz-transition: background .3s,color .3s; |
|
26 | -moz-transition: background .3s,color .3s; | |
27 | -o-transition: background .3s,color .3s; |
|
27 | -o-transition: background .3s,color .3s; | |
28 | transition: background .3s,color .3s; |
|
28 | transition: background .3s,color .3s; | |
|
29 | box-shadow: @button-shadow; | |||
|
30 | -webkit-box-shadow: @button-shadow; | |||
|
31 | ||||
|
32 | ||||
29 |
|
33 | |||
30 | a { |
|
34 | a { | |
31 | display: block; |
|
35 | display: block; | |
@@ -44,8 +48,9 b' input[type="button"] {' | |||||
44 | outline:none; |
|
48 | outline:none; | |
45 | } |
|
49 | } | |
46 | &:hover { |
|
50 | &:hover { | |
47 |
color: |
|
51 | color: @rcdarkblue; | |
48 |
background-color: @ |
|
52 | background-color: @white; | |
|
53 | .border ( @border-thickness, @grey4 ); | |||
49 | } |
|
54 | } | |
50 |
|
55 | |||
51 | .icon-remove-sign { |
|
56 | .icon-remove-sign { | |
@@ -70,26 +75,26 b' input[type="button"] {' | |||||
70 |
|
75 | |||
71 |
|
76 | |||
72 | .btn-default { |
|
77 | .btn-default { | |
73 |
|
|
78 | border: @border-thickness solid @grey5; | |
74 | background-image: none; |
|
79 | background-image: none; | |
75 |
color: @r |
|
80 | color: @grey2; | |
76 |
|
81 | |||
77 | a { |
|
82 | a { | |
78 |
color: @r |
|
83 | color: @grey2; | |
79 | } |
|
84 | } | |
80 |
|
85 | |||
81 | &:hover, |
|
86 | &:hover, | |
82 | &.active { |
|
87 | &.active { | |
83 |
color: |
|
88 | color: @rcdarkblue; | |
84 |
background-color: @ |
|
89 | background-color: @white; | |
85 |
.border ( @border-thickness, @r |
|
90 | .border ( @border-thickness, @grey4 ); | |
86 |
|
91 | |||
87 | a { |
|
92 | a { | |
88 |
color: |
|
93 | color: @grey2; | |
89 | } |
|
94 | } | |
90 | } |
|
95 | } | |
91 | &:disabled { |
|
96 | &:disabled { | |
92 |
.border ( @border-thickness-buttons, @grey |
|
97 | .border ( @border-thickness-buttons, @grey5 ); | |
93 | background-color: transparent; |
|
98 | background-color: transparent; | |
94 | } |
|
99 | } | |
95 | } |
|
100 | } | |
@@ -326,6 +331,7 b' input[type="submit"] {' | |||||
326 | .border ( @border-thickness-buttons, @rcblue ); |
|
331 | .border ( @border-thickness-buttons, @rcblue ); | |
327 | background-color: @rcblue; |
|
332 | background-color: @rcblue; | |
328 | color: white; |
|
333 | color: white; | |
|
334 | opacity: 0.5; | |||
329 | } |
|
335 | } | |
330 | } |
|
336 | } | |
331 |
|
337 | |||
@@ -416,3 +422,23 b' input[type="reset"] {' | |||||
416 | } |
|
422 | } | |
417 | } |
|
423 | } | |
418 |
|
424 | |||
|
425 | ||||
|
426 | .button-links { | |||
|
427 | float: left; | |||
|
428 | display: inline; | |||
|
429 | margin: 0; | |||
|
430 | padding-left: 0; | |||
|
431 | list-style: none; | |||
|
432 | text-align: right; | |||
|
433 | ||||
|
434 | li { | |||
|
435 | ||||
|
436 | ||||
|
437 | } | |||
|
438 | ||||
|
439 | li.active { | |||
|
440 | background-color: @grey6; | |||
|
441 | .border ( @border-thickness, @grey4 ); | |||
|
442 | } | |||
|
443 | ||||
|
444 | } |
@@ -404,12 +404,9 b' div.codeblock {' | |||||
404 |
|
404 | |||
405 | // TODO: johbo: Added interim to get rid of the margin around |
|
405 | // TODO: johbo: Added interim to get rid of the margin around | |
406 | // Select2 widgets. This needs further cleanup. |
|
406 | // Select2 widgets. This needs further cleanup. | |
407 | margin-top: @padding; |
|
|||
408 |
|
||||
409 | overflow: auto; |
|
407 | overflow: auto; | |
410 | padding: 0px; |
|
408 | padding: 0px; | |
411 |
border: @border-thickness solid @grey |
|
409 | border: @border-thickness solid @grey6; | |
412 | background: @grey6; |
|
|||
413 | .border-radius(@border-radius); |
|
410 | .border-radius(@border-radius); | |
414 |
|
411 | |||
415 | #remove_gist { |
|
412 | #remove_gist { | |
@@ -479,7 +476,7 b' div.codeblock {' | |||||
479 | } |
|
476 | } | |
480 |
|
477 | |||
481 | .code-body { |
|
478 | .code-body { | |
482 |
padding: |
|
479 | padding: 0.8em 1em; | |
483 | background-color: #ffffff; |
|
480 | background-color: #ffffff; | |
484 | min-width: 100%; |
|
481 | min-width: 100%; | |
485 | box-sizing: border-box; |
|
482 | box-sizing: border-box; | |
@@ -492,6 +489,21 b' div.codeblock {' | |||||
492 | height: auto; |
|
489 | height: auto; | |
493 | width: 100%; |
|
490 | width: 100%; | |
494 | } |
|
491 | } | |
|
492 | ||||
|
493 | .markdown-block { | |||
|
494 | padding: 1em 0; | |||
|
495 | } | |||
|
496 | } | |||
|
497 | ||||
|
498 | .codeblock-header { | |||
|
499 | background: @grey7; | |||
|
500 | height: 36px; | |||
|
501 | } | |||
|
502 | ||||
|
503 | .path { | |||
|
504 | border-bottom: 1px solid @grey6; | |||
|
505 | padding: .65em 1em; | |||
|
506 | height: 18px; | |||
495 | } |
|
507 | } | |
496 | } |
|
508 | } | |
497 |
|
509 |
@@ -27,7 +27,7 b'' | |||||
27 |
|
27 | |||
28 | .CodeMirror-gutters { |
|
28 | .CodeMirror-gutters { | |
29 | border-right: 1px solid #ddd; |
|
29 | border-right: 1px solid #ddd; | |
30 |
background-color: |
|
30 | background-color: white; | |
31 | white-space: nowrap; |
|
31 | white-space: nowrap; | |
32 | } |
|
32 | } | |
33 | .CodeMirror-linenumbers {} |
|
33 | .CodeMirror-linenumbers {} |
@@ -14,7 +14,7 b' tr.inline-comments div {' | |||||
14 | max-width: 100%; |
|
14 | max-width: 100%; | |
15 |
|
15 | |||
16 | p { |
|
16 | p { | |
17 |
white-space: normal; |
|
17 | white-space: normal; | |
18 | } |
|
18 | } | |
19 |
|
19 | |||
20 | code, pre, .code, dd { |
|
20 | code, pre, .code, dd { | |
@@ -227,7 +227,7 b' tr.inline-comments div {' | |||||
227 | .delete-comment { |
|
227 | .delete-comment { | |
228 | display: inline-block; |
|
228 | display: inline-block; | |
229 | color: @rcblue; |
|
229 | color: @rcblue; | |
230 |
|
230 | |||
231 | &:hover { |
|
231 | &:hover { | |
232 | cursor: pointer; |
|
232 | cursor: pointer; | |
233 | } |
|
233 | } | |
@@ -377,13 +377,13 b' form.comment-form {' | |||||
377 | position: relative; |
|
377 | position: relative; | |
378 | width: 100%; |
|
378 | width: 100%; | |
379 | min-height: 42px; |
|
379 | min-height: 42px; | |
380 |
|
380 | |||
381 | .status_box, |
|
381 | .status_box, | |
382 | .cancel-button { |
|
382 | .cancel-button { | |
383 | float: left; |
|
383 | float: left; | |
384 | display: inline-block; |
|
384 | display: inline-block; | |
385 | } |
|
385 | } | |
386 |
|
386 | |||
387 | .action-buttons { |
|
387 | .action-buttons { | |
388 | float: right; |
|
388 | float: right; | |
389 | display: inline-block; |
|
389 | display: inline-block; | |
@@ -426,10 +426,10 b' form.comment-form {' | |||||
426 |
|
426 | |||
427 | .comment-form-login { |
|
427 | .comment-form-login { | |
428 | .comment-help { |
|
428 | .comment-help { | |
429 |
padding: 0. |
|
429 | padding: 0.7em; //same as the button | |
430 | } |
|
430 | } | |
431 |
|
431 | |||
432 |
div.clearfix { |
|
432 | div.clearfix { | |
433 | clear: both; |
|
433 | clear: both; | |
434 | width: 100%; |
|
434 | width: 100%; | |
435 | display: block; |
|
435 | display: block; |
@@ -38,7 +38,7 b'' | |||||
38 |
|
38 | |||
39 | .form-control { |
|
39 | .form-control { | |
40 | width: 100%; |
|
40 | width: 100%; | |
41 |
padding: 0. |
|
41 | padding: 0.7em; | |
42 | border: 1px solid #979797; |
|
42 | border: 1px solid #979797; | |
43 | border-radius: 2px; |
|
43 | border-radius: 2px; | |
44 | } |
|
44 | } |
@@ -60,13 +60,13 b' form.rcform {' | |||||
60 | max-width: 500px; |
|
60 | max-width: 500px; | |
61 | margin: 0 0 @padding -@legend-width; |
|
61 | margin: 0 0 @padding -@legend-width; | |
62 | padding: 0 0 0 @legend-width; |
|
62 | padding: 0 0 0 @legend-width; | |
63 |
|
63 | |||
64 | .btn { |
|
64 | .btn { | |
65 | display: inline-block; |
|
65 | display: inline-block; | |
66 | margin: 0 1em @padding 0; |
|
66 | margin: 0 1em @padding 0; | |
67 | } |
|
67 | } | |
68 | } |
|
68 | } | |
69 |
|
69 | |||
70 | input, |
|
70 | input, | |
71 | textarea { |
|
71 | textarea { | |
72 | float: left; |
|
72 | float: left; | |
@@ -113,7 +113,7 b' form.rcform {' | |||||
113 | opacity: 0.5; |
|
113 | opacity: 0.5; | |
114 | } |
|
114 | } | |
115 | } |
|
115 | } | |
116 |
|
116 | |||
117 | input[type="radio"]:not(#ie), |
|
117 | input[type="radio"]:not(#ie), | |
118 | input[type="checkbox"]:not(#ie) { |
|
118 | input[type="checkbox"]:not(#ie) { | |
119 | // Hide the input, but have it still be clickable |
|
119 | // Hide the input, but have it still be clickable | |
@@ -187,13 +187,13 b' form.rcform {' | |||||
187 | filter: progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=0.7071067811865476, M12=-0.7071067811865475, M21=0.7071067811865475, M22=0.7071067811865476); /* IE6,IE7 */ |
|
187 | filter: progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=0.7071067811865476, M12=-0.7071067811865475, M21=0.7071067811865475, M22=0.7071067811865476); /* IE6,IE7 */ | |
188 |
|
188 | |||
189 | -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(SizingMethod='auto expand', M11=0.7071067811865476, M12=-0.7071067811865475, M21=0.7071067811865475, M22=0.7071067811865476)"; /* IE8 */ } |
|
189 | -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(SizingMethod='auto expand', M11=0.7071067811865476, M12=-0.7071067811865475, M21=0.7071067811865475, M22=0.7071067811865476)"; /* IE8 */ } | |
190 |
|
190 | |||
191 | & + .label { |
|
191 | & + .label { | |
192 | float: left; |
|
192 | float: left; | |
193 | margin-top: 5px |
|
193 | margin-top: 5px | |
194 | } |
|
194 | } | |
195 | } |
|
195 | } | |
196 |
|
196 | |||
197 | input[type=checkbox]:not(#ie) { |
|
197 | input[type=checkbox]:not(#ie) { | |
198 | visibility: hidden; |
|
198 | visibility: hidden; | |
199 | &:checked + label:after { |
|
199 | &:checked + label:after { | |
@@ -231,6 +231,11 b' form.rcform {' | |||||
231 |
|
231 | |||
232 | .drop-menu { |
|
232 | .drop-menu { | |
233 | float: left; |
|
233 | float: left; | |
|
234 | ||||
|
235 | & + .last-item { | |||
|
236 | margin: 0; | |||
|
237 | } | |||
|
238 | ||||
234 | margin: 0 @input-padding 0 0; |
|
239 | margin: 0 @input-padding 0 0; | |
235 | } |
|
240 | } | |
236 |
|
241 | |||
@@ -244,7 +249,7 b' form.rcform {' | |||||
244 | .error-message { |
|
249 | .error-message { | |
245 | margin-top: 5px; |
|
250 | margin-top: 5px; | |
246 | } |
|
251 | } | |
247 |
|
252 | |||
248 | input[type=submit] { |
|
253 | input[type=submit] { | |
249 | &:extend(.btn-primary); |
|
254 | &:extend(.btn-primary); | |
250 |
|
255 | |||
@@ -271,14 +276,15 b' form.rcform {' | |||||
271 | .badged-field { |
|
276 | .badged-field { | |
272 | .user-badge { |
|
277 | .user-badge { | |
273 | line-height: 25px; |
|
278 | line-height: 25px; | |
274 |
padding: |
|
279 | padding: .4em; | |
275 | border-radius: @border-radius; |
|
280 | border-radius: @border-radius; | |
276 |
border-top: 1px solid @ |
|
281 | border-top: 1px solid @grey4; | |
277 |
border-left: 1px solid @ |
|
282 | border-left: 1px solid @grey4; | |
278 |
border-bottom: 1px solid @ |
|
283 | border-bottom: 1px solid @grey4; | |
279 | font-size: 14px; |
|
284 | font-size: 14px; | |
280 | font-style: normal; |
|
285 | font-style: normal; | |
281 | color: @text-light; |
|
286 | color: @text-light; | |
|
287 | background: @grey7; | |||
282 | display: inline-block; |
|
288 | display: inline-block; | |
283 | vertical-align: top; |
|
289 | vertical-align: top; | |
284 | cursor: default; |
|
290 | cursor: default; |
@@ -212,6 +212,13 b' div.markdown-block strong {' | |||||
212 | margin: 0; |
|
212 | margin: 0; | |
213 | } |
|
213 | } | |
214 |
|
214 | |||
|
215 | div.markdown-block ul.checkbox, | |||
|
216 | div.markdown-block ol.checkbox { | |||
|
217 | padding-left: 20px !important; | |||
|
218 | margin-top: 0px !important; | |||
|
219 | margin-bottom: 18px !important; | |||
|
220 | } | |||
|
221 | ||||
215 | div.markdown-block ul, |
|
222 | div.markdown-block ul, | |
216 | div.markdown-block ol { |
|
223 | div.markdown-block ol { | |
217 | padding-left: 30px !important; |
|
224 | padding-left: 30px !important; | |
@@ -219,6 +226,13 b' div.markdown-block ol {' | |||||
219 | margin-bottom: 18px !important; |
|
226 | margin-bottom: 18px !important; | |
220 | } |
|
227 | } | |
221 |
|
228 | |||
|
229 | div.markdown-block ul.checkbox li, | |||
|
230 | div.markdown-block ol.checkbox li { | |||
|
231 | list-style: none !important; | |||
|
232 | margin: 6px !important; | |||
|
233 | padding: 0 !important; | |||
|
234 | } | |||
|
235 | ||||
222 | div.markdown-block ul li, |
|
236 | div.markdown-block ul li, | |
223 | div.markdown-block ol li { |
|
237 | div.markdown-block ol li { | |
224 | list-style: disc !important; |
|
238 | list-style: disc !important; |
@@ -95,7 +95,7 b'' | |||||
95 | margin: 0 1em @padding 0; |
|
95 | margin: 0 1em @padding 0; | |
96 | } |
|
96 | } | |
97 | } |
|
97 | } | |
98 |
|
98 | |||
99 | .checkbox { |
|
99 | .checkbox { | |
100 | display: inline; |
|
100 | display: inline; | |
101 | width: auto; |
|
101 | width: auto; | |
@@ -198,15 +198,16 b'' | |||||
198 | } |
|
198 | } | |
199 |
|
199 | |||
200 | .user-menu.submenu { |
|
200 | .user-menu.submenu { | |
201 |
right: 0; |
|
201 | right: 0!important; | |
202 | left: auto; |
|
202 | left: auto!important; | |
203 | min-width: 290px; |
|
203 | min-width: 290px; | |
204 | } |
|
204 | } | |
205 |
|
205 | |||
206 |
|
||||
207 | .user-menu { |
|
206 | .user-menu { | |
208 | .bookmark-items { |
|
207 | .bookmark-items { | |
209 | padding: 4px 2px; |
|
208 | border-top: @border-thickness solid @grey6; | |
|
209 | margin-top: 1em; | |||
|
210 | padding: 1em .5em; | |||
210 | color: @grey3; |
|
211 | color: @grey3; | |
211 | border-bottom: @grey3; |
|
212 | border-bottom: @grey3; | |
212 |
|
213 | |||
@@ -227,8 +228,10 b'' | |||||
227 | padding: @menupadding; |
|
228 | padding: @menupadding; | |
228 | z-index: 999; |
|
229 | z-index: 999; | |
229 | overflow: hidden; |
|
230 | overflow: hidden; | |
230 |
background-color: @ |
|
231 | background-color: @white; | |
|
232 | border: 1px solid @grey5; | |||
231 | color: @grey2; |
|
233 | color: @grey2; | |
|
234 | box-shadow: @dropdown-shadow; | |||
232 |
|
235 | |||
233 | h4 { |
|
236 | h4 { | |
234 | margin-bottom: 12px; |
|
237 | margin-bottom: 12px; | |
@@ -261,7 +264,7 b'' | |||||
261 | .buttons .register { |
|
264 | .buttons .register { | |
262 | a { |
|
265 | a { | |
263 | color: @rcblue; |
|
266 | color: @rcblue; | |
264 |
|
267 | |||
265 | &:hover { |
|
268 | &:hover { | |
266 | color: @rcdarkblue; |
|
269 | color: @rcdarkblue; | |
267 | } |
|
270 | } | |
@@ -289,15 +292,16 b'' | |||||
289 | .big_gravatar { |
|
292 | .big_gravatar { | |
290 | float: left; |
|
293 | float: left; | |
291 | display: block; |
|
294 | display: block; | |
292 |
|
|
295 | padding: .5em; | |
293 | } |
|
296 | } | |
294 |
|
297 | |||
295 |
.full_name |
|
298 | .full_name { | |
296 | .email { |
|
299 | margin: 0 0 0 70px; | |
297 | margin: 0 0 0 65px; |
|
300 | padding-top: 1em; | |
298 | } |
|
301 | } | |
299 |
|
302 | |||
300 | .email { |
|
303 | .email { | |
|
304 | margin: 0 0 0 70px; | |||
301 | font-family: @text-light; |
|
305 | font-family: @text-light; | |
302 | } |
|
306 | } | |
303 |
|
307 | |||
@@ -307,8 +311,6 b'' | |||||
307 | padding: @padding 0 0 0; |
|
311 | padding: @padding 0 0 0; | |
308 |
|
312 | |||
309 | li { |
|
313 | li { | |
310 | border-top: @border-thickness solid @grey5; |
|
|||
311 |
|
||||
312 | input { |
|
314 | input { | |
313 | margin: @padding 0 0 0; |
|
315 | margin: @padding 0 0 0; | |
314 | } |
|
316 | } |
@@ -107,6 +107,12 b' input + .action-link, .action-link.first' | |||||
107 |
|
107 | |||
108 | .clipboard-action { |
|
108 | .clipboard-action { | |
109 | cursor: pointer; |
|
109 | cursor: pointer; | |
|
110 | color: @grey4; | |||
|
111 | margin-left: 5px; | |||
|
112 | ||||
|
113 | &:hover { | |||
|
114 | color: @grey2; | |||
|
115 | } | |||
110 | } |
|
116 | } | |
111 |
|
117 | |||
112 | ul.simple-list{ |
|
118 | ul.simple-list{ | |
@@ -237,7 +243,7 b' input.inline[type="file"] {' | |||||
237 | position: relative; |
|
243 | position: relative; | |
238 | vertical-align: bottom; |
|
244 | vertical-align: bottom; | |
239 | padding: 0 @header-padding; |
|
245 | padding: 0 @header-padding; | |
240 |
background-color: @grey |
|
246 | background-color: @grey1; | |
241 | color: @grey5; |
|
247 | color: @grey5; | |
242 |
|
248 | |||
243 | .title { |
|
249 | .title { | |
@@ -271,7 +277,9 b' input.inline[type="file"] {' | |||||
271 | // Gists |
|
277 | // Gists | |
272 | #files_data { |
|
278 | #files_data { | |
273 | clear: both; //for firefox |
|
279 | clear: both; //for firefox | |
|
280 | padding-top: 10px; | |||
274 | } |
|
281 | } | |
|
282 | ||||
275 | #gistid { |
|
283 | #gistid { | |
276 | margin-right: @padding; |
|
284 | margin-right: @padding; | |
277 | } |
|
285 | } | |
@@ -516,7 +524,7 b' ul.auth_plugins {' | |||||
516 | text-align: center; |
|
524 | text-align: center; | |
517 | vertical-align: middle; |
|
525 | vertical-align: middle; | |
518 | color: @grey2; |
|
526 | color: @grey2; | |
519 | background-color: @grey6; |
|
527 | font-size: 11px; | |
520 |
|
528 | |||
521 | p { |
|
529 | p { | |
522 | margin: 0; |
|
530 | margin: 0; | |
@@ -605,10 +613,20 b' button.close {' | |||||
605 | } |
|
613 | } | |
606 |
|
614 | |||
607 |
|
615 | |||
608 | input { |
|
616 | input, textarea { | |
609 | &.disabled { |
|
617 | &.disabled { | |
610 | opacity: .5; |
|
618 | opacity: .5; | |
611 | } |
|
619 | } | |
|
620 | ||||
|
621 | &:hover { | |||
|
622 | border-color: @grey3; | |||
|
623 | box-shadow: @button-shadow; | |||
|
624 | } | |||
|
625 | ||||
|
626 | &:focus { | |||
|
627 | border-color: @rcblue; | |||
|
628 | box-shadow: @button-shadow; | |||
|
629 | } | |||
612 | } |
|
630 | } | |
613 |
|
631 | |||
614 | // remove extra padding in firefox |
|
632 | // remove extra padding in firefox | |
@@ -643,16 +661,20 b' select {' | |||||
643 | padding: 0 18px 0 8px; |
|
661 | padding: 0 18px 0 8px; | |
644 | line-height:1em; |
|
662 | line-height:1em; | |
645 | font-size: @basefontsize; |
|
663 | font-size: @basefontsize; | |
646 |
border: @border-thickness solid @r |
|
664 | border: @border-thickness solid @grey5; | |
|
665 | border-radius: @border-radius; | |||
647 | background:white url("../images/dt-arrow-dn.png") no-repeat 100% 50%; |
|
666 | background:white url("../images/dt-arrow-dn.png") no-repeat 100% 50%; | |
648 |
color: @r |
|
667 | color: @grey4; | |
|
668 | box-shadow: @button-shadow; | |||
649 |
|
669 | |||
650 | &:after { |
|
670 | &:after { | |
651 | content: "\00A0\25BE"; |
|
671 | content: "\00A0\25BE"; | |
652 | } |
|
672 | } | |
653 |
|
673 | |||
654 | &:focus { |
|
674 | &:focus, &:hover { | |
655 | outline: none; |
|
675 | outline: none; | |
|
676 | border-color: @grey4; | |||
|
677 | color: @rcdarkblue; | |||
656 | } |
|
678 | } | |
657 | } |
|
679 | } | |
658 |
|
680 | |||
@@ -712,8 +734,8 b' label {' | |||||
712 | margin: -5px 0; |
|
734 | margin: -5px 0; | |
713 | padding: 0; |
|
735 | padding: 0; | |
714 | line-height: 1em; |
|
736 | line-height: 1em; | |
715 | border: 1px solid @grey4; |
|
|||
716 | box-sizing: content-box; |
|
737 | box-sizing: content-box; | |
|
738 | border-radius: 50%; | |||
717 |
|
739 | |||
718 | &.gravatar-large { |
|
740 | &.gravatar-large { | |
719 | margin: -0.5em .25em -0.5em 0; |
|
741 | margin: -0.5em .25em -0.5em 0; | |
@@ -938,9 +960,6 b' label {' | |||||
938 | } |
|
960 | } | |
939 |
|
961 | |||
940 |
|
962 | |||
941 | #graph_nodes { |
|
|||
942 | padding-top: 43px; |
|
|||
943 | } |
|
|||
944 |
|
963 | |||
945 | #graph_content{ |
|
964 | #graph_content{ | |
946 |
|
965 | |||
@@ -973,13 +992,12 b' label {' | |||||
973 | } |
|
992 | } | |
974 |
|
993 | |||
975 | .graph-col-wrapper { |
|
994 | .graph-col-wrapper { | |
976 | padding-left: 110px; |
|
|||
977 |
|
995 | |||
978 | #graph_nodes { |
|
996 | #graph_nodes { | |
979 | width: 100px; |
|
997 | width: 100px; | |
980 | margin-left: -110px; |
|
998 | position: absolute; | |
981 |
f |
|
999 | left: 70px; | |
982 |
|
|
1000 | z-index: -1; | |
983 | } |
|
1001 | } | |
984 | } |
|
1002 | } | |
985 |
|
1003 | |||
@@ -996,6 +1014,16 b' label {' | |||||
996 | } |
|
1014 | } | |
997 | } |
|
1015 | } | |
998 |
|
1016 | |||
|
1017 | .obsolete-toggle { | |||
|
1018 | line-height: 30px; | |||
|
1019 | margin-left: -15px; | |||
|
1020 | } | |||
|
1021 | ||||
|
1022 | #rev_range_container, #rev_range_clear, #rev_range_more { | |||
|
1023 | margin-top: -5px; | |||
|
1024 | margin-bottom: -5px; | |||
|
1025 | } | |||
|
1026 | ||||
999 | #filter_changelog { |
|
1027 | #filter_changelog { | |
1000 | float: left; |
|
1028 | float: left; | |
1001 | } |
|
1029 | } | |
@@ -1051,7 +1079,7 b' label {' | |||||
1051 | } |
|
1079 | } | |
1052 |
|
1080 | |||
1053 | .flag_status { |
|
1081 | .flag_status { | |
1054 |
margin: 2px |
|
1082 | margin: 2px; | |
1055 | &.under_review { |
|
1083 | &.under_review { | |
1056 | .circle(5px, @alert3); |
|
1084 | .circle(5px, @alert3); | |
1057 | } |
|
1085 | } | |
@@ -1222,24 +1250,37 b' table.integrations {' | |||||
1222 |
|
1250 | |||
1223 | .autocomplete-suggestions { |
|
1251 | .autocomplete-suggestions { | |
1224 | width: auto !important; // overrides autocomplete.js |
|
1252 | width: auto !important; // overrides autocomplete.js | |
|
1253 | min-width: 278px; | |||
1225 |
|
|
1254 | margin: 0; | |
1226 |
border: @border-thickness solid @r |
|
1255 | border: @border-thickness solid @grey5; | |
1227 | border-radius: @border-radius; |
|
1256 | border-radius: @border-radius; | |
1228 |
color: @r |
|
1257 | color: @grey2; | |
1229 | background-color: white; |
|
1258 | background-color: white; | |
1230 | } |
|
1259 | } | |
|
1260 | ||||
|
1261 | .autocomplete-qfilter-suggestions { | |||
|
1262 | width: auto !important; // overrides autocomplete.js | |||
|
1263 | max-height: 100% !important; | |||
|
1264 | min-width: 376px; | |||
|
1265 | margin: 0; | |||
|
1266 | border: @border-thickness solid @grey5; | |||
|
1267 | color: @grey2; | |||
|
1268 | background-color: white; | |||
|
1269 | } | |||
|
1270 | ||||
1231 | .autocomplete-selected { |
|
1271 | .autocomplete-selected { | |
1232 | background: #F0F0F0; |
|
1272 | background: #F0F0F0; | |
1233 | } |
|
1273 | } | |
|
1274 | ||||
1234 | .ac-container-wrap { |
|
1275 | .ac-container-wrap { | |
1235 | margin: 0; |
|
1276 | margin: 0; | |
1236 | padding: 8px; |
|
1277 | padding: 8px; | |
1237 |
border-bottom: @border-thickness solid @ |
|
1278 | border-bottom: @border-thickness solid @grey5; | |
1238 | list-style-type: none; |
|
1279 | list-style-type: none; | |
1239 | cursor: pointer; |
|
1280 | cursor: pointer; | |
1240 |
|
1281 | |||
1241 | &:hover { |
|
1282 | &:hover { | |
1242 |
background-color: @ |
|
1283 | background-color: @grey7; | |
1243 | } |
|
1284 | } | |
1244 |
|
1285 | |||
1245 | img { |
|
1286 | img { | |
@@ -1294,9 +1335,9 b' table.integrations {' | |||||
1294 | } |
|
1335 | } | |
1295 | } |
|
1336 | } | |
1296 |
|
1337 | |||
1297 | #editor_container{ |
|
1338 | #editor_container { | |
1298 |
|
|
1339 | position: relative; | |
1299 |
|
|
1340 | margin: @padding 10px; | |
1300 | } |
|
1341 | } | |
1301 | } |
|
1342 | } | |
1302 |
|
1343 | |||
@@ -1800,7 +1841,6 b' BIN_FILENODE = 7' | |||||
1800 | } |
|
1841 | } | |
1801 |
|
1842 | |||
1802 | #changeset_compare_view_content { |
|
1843 | #changeset_compare_view_content { | |
1803 | margin-bottom: @space; |
|
|||
1804 | clear: both; |
|
1844 | clear: both; | |
1805 | width: 100%; |
|
1845 | width: 100%; | |
1806 | box-sizing: border-box; |
|
1846 | box-sizing: border-box; | |
@@ -2031,15 +2071,15 b' BIN_FILENODE = 7' | |||||
2031 |
|
2071 | |||
2032 | // Files |
|
2072 | // Files | |
2033 | .edit-file-title { |
|
2073 | .edit-file-title { | |
2034 | border-bottom: @border-thickness solid @border-default-color; |
|
2074 | font-size: 16px; | |
2035 |
|
2075 | |||
2036 | .breadcrumbs { |
|
2076 | .title-heading { | |
2037 | margin-bottom: 0; |
|
2077 | padding: 2px; | |
2038 | } |
|
2078 | } | |
2039 | } |
|
2079 | } | |
2040 |
|
2080 | |||
2041 | .edit-file-fieldset { |
|
2081 | .edit-file-fieldset { | |
2042 |
margin |
|
2082 | margin: @sidebarpadding 0; | |
2043 |
|
2083 | |||
2044 | .fieldset { |
|
2084 | .fieldset { | |
2045 | .left-label { |
|
2085 | .left-label { | |
@@ -2084,8 +2124,29 b' BIN_FILENODE = 7' | |||||
2084 | .new-file, |
|
2124 | .new-file, | |
2085 | #filter_activate, |
|
2125 | #filter_activate, | |
2086 | #filter_deactivate { |
|
2126 | #filter_deactivate { | |
2087 |
float: |
|
2127 | float: right; | |
2088 |
margin: 0 0 0 1 |
|
2128 | margin: 0 0 0 10px; | |
|
2129 | } | |||
|
2130 | ||||
|
2131 | .file-upload-transaction-wrapper { | |||
|
2132 | margin-top: 57px; | |||
|
2133 | clear: both; | |||
|
2134 | } | |||
|
2135 | ||||
|
2136 | .file-upload-transaction-wrapper .error { | |||
|
2137 | color: @color5; | |||
|
2138 | } | |||
|
2139 | ||||
|
2140 | .file-upload-transaction { | |||
|
2141 | min-height: 200px; | |||
|
2142 | padding: 54px; | |||
|
2143 | border: 1px solid @grey5; | |||
|
2144 | text-align: center; | |||
|
2145 | clear: both; | |||
|
2146 | } | |||
|
2147 | ||||
|
2148 | .file-upload-transaction i { | |||
|
2149 | font-size: 48px | |||
2089 | } |
|
2150 | } | |
2090 |
|
2151 | |||
2091 | h3.files_location{ |
|
2152 | h3.files_location{ | |
@@ -2093,11 +2154,12 b' h3.files_location{' | |||||
2093 | } |
|
2154 | } | |
2094 |
|
2155 | |||
2095 | .browser-nav { |
|
2156 | .browser-nav { | |
|
2157 | width: 100%; | |||
2096 | display: table; |
|
2158 | display: table; | |
2097 |
|
|
2159 | margin-bottom: 20px; | |
2098 |
|
||||
2099 |
|
2160 | |||
2100 | .info_box { |
|
2161 | .info_box { | |
|
2162 | float: left; | |||
2101 | display: inline-table; |
|
2163 | display: inline-table; | |
2102 | height: 2.5em; |
|
2164 | height: 2.5em; | |
2103 |
|
2165 | |||
@@ -2106,36 +2168,58 b' h3.files_location{' | |||||
2106 | vertical-align: middle; |
|
2168 | vertical-align: middle; | |
2107 | } |
|
2169 | } | |
2108 |
|
2170 | |||
|
2171 | .drop-menu { | |||
|
2172 | margin: 0 10px; | |||
|
2173 | } | |||
|
2174 | ||||
2109 | .info_box_elem { |
|
2175 | .info_box_elem { | |
2110 |
border-top: @border-thickness solid @r |
|
2176 | border-top: @border-thickness solid @grey5; | |
2111 |
border-bottom: @border-thickness solid @r |
|
2177 | border-bottom: @border-thickness solid @grey5; | |
|
2178 | box-shadow: @button-shadow; | |||
2112 |
|
2179 | |||
2113 | #at_rev, a { |
|
2180 | #at_rev, a { | |
2114 |
padding: 0.6em 0. |
|
2181 | padding: 0.6em 0.4em; | |
2115 | margin: 0; |
|
2182 | margin: 0; | |
2116 | .box-shadow(none); |
|
2183 | .box-shadow(none); | |
2117 | border: 0; |
|
2184 | border: 0; | |
2118 | height: 12px; |
|
2185 | height: 12px; | |
|
2186 | color: @grey2; | |||
2119 | } |
|
2187 | } | |
2120 |
|
2188 | |||
2121 | input#at_rev { |
|
2189 | input#at_rev { | |
2122 | max-width: 50px; |
|
2190 | max-width: 50px; | |
2123 |
text-align: r |
|
2191 | text-align: center; | |
2124 | } |
|
2192 | } | |
2125 |
|
2193 | |||
2126 | &.previous { |
|
2194 | &.previous { | |
2127 |
border: @border-thickness solid @r |
|
2195 | border: @border-thickness solid @grey5; | |
|
2196 | border-top-left-radius: @border-radius; | |||
|
2197 | border-bottom-left-radius: @border-radius; | |||
|
2198 | ||||
|
2199 | &:hover { | |||
|
2200 | border-color: @grey4; | |||
|
2201 | } | |||
|
2202 | ||||
2128 | .disabled { |
|
2203 | .disabled { | |
2129 |
color: @grey |
|
2204 | color: @grey5; | |
2130 | cursor: not-allowed; |
|
2205 | cursor: not-allowed; | |
|
2206 | opacity: 0.5; | |||
2131 | } |
|
2207 | } | |
2132 | } |
|
2208 | } | |
2133 |
|
2209 | |||
2134 | &.next { |
|
2210 | &.next { | |
2135 |
border: @border-thickness solid @r |
|
2211 | border: @border-thickness solid @grey5; | |
|
2212 | border-top-right-radius: @border-radius; | |||
|
2213 | border-bottom-right-radius: @border-radius; | |||
|
2214 | ||||
|
2215 | &:hover { | |||
|
2216 | border-color: @grey4; | |||
|
2217 | } | |||
|
2218 | ||||
2136 | .disabled { |
|
2219 | .disabled { | |
2137 |
color: @grey |
|
2220 | color: @grey5; | |
2138 | cursor: not-allowed; |
|
2221 | cursor: not-allowed; | |
|
2222 | opacity: 0.5; | |||
2139 | } |
|
2223 | } | |
2140 | } |
|
2224 | } | |
2141 | } |
|
2225 | } | |
@@ -2152,8 +2236,14 b' h3.files_location{' | |||||
2152 | margin-right: @padding; |
|
2236 | margin-right: @padding; | |
2153 | } |
|
2237 | } | |
2154 | } |
|
2238 | } | |
|
2239 | ||||
2155 | } |
|
2240 | } | |
2156 |
|
2241 | |||
|
2242 | .select-index-number { | |||
|
2243 | margin: 0 0 0 20px; | |||
|
2244 | color: @grey3; | |||
|
2245 | } | |||
|
2246 | ||||
2157 | .search_activate { |
|
2247 | .search_activate { | |
2158 | display: table-cell; |
|
2248 | display: table-cell; | |
2159 | vertical-align: middle; |
|
2249 | vertical-align: middle; | |
@@ -2182,26 +2272,54 b' h3.files_location{' | |||||
2182 | margin: -25px 0px 5px 0px; |
|
2272 | margin: -25px 0px 5px 0px; | |
2183 | } |
|
2273 | } | |
2184 |
|
2274 | |||
2185 |
. |
|
2275 | .files-quick-filter { | |
2186 | font-size: @repo-title-fontsize; |
|
2276 | float: right; | |
2187 | padding: 4px 0px 0px 0px; |
|
2277 | width: 180px; | |
2188 |
|
2278 | position: relative; | ||
2189 | .node-filter-path { |
|
2279 | } | |
2190 | float: left; |
|
2280 | ||
2191 | color: @grey4; |
|
2281 | .files-filter-box { | |
|
2282 | display: flex; | |||
|
2283 | padding: 0px; | |||
|
2284 | border-radius: 3px; | |||
|
2285 | margin-bottom: 0; | |||
|
2286 | ||||
|
2287 | a { | |||
|
2288 | border: none !important; | |||
|
2289 | } | |||
|
2290 | ||||
|
2291 | li { | |||
|
2292 | list-style-type: none | |||
|
2293 | } | |||
|
2294 | } | |||
|
2295 | ||||
|
2296 | .files-filter-box-path { | |||
|
2297 | line-height: 33px; | |||
|
2298 | padding: 0; | |||
|
2299 | width: 20px; | |||
|
2300 | position: absolute; | |||
|
2301 | z-index: 11; | |||
|
2302 | left: 5px; | |||
|
2303 | } | |||
|
2304 | ||||
|
2305 | .files-filter-box-input { | |||
|
2306 | margin-right: 0; | |||
|
2307 | ||||
|
2308 | input { | |||
|
2309 | border: 1px solid @white; | |||
|
2310 | padding-left: 25px; | |||
|
2311 | width: 145px; | |||
|
2312 | ||||
|
2313 | &:hover { | |||
|
2314 | border-color: @grey6; | |||
2192 | } |
|
2315 | } | |
2193 | .node-filter-input { |
|
2316 | ||
2194 | float: left; |
|
2317 | &:focus { | |
2195 | margin: -2px 0px 0px 2px; |
|
2318 | border-color: @grey5; | |
2196 | input { |
|
|||
2197 | padding: 2px; |
|
|||
2198 | border: none; |
|
|||
2199 | font-size: @repo-title-fontsize; |
|
|||
2200 | } |
|
|||
2201 | } |
|
2319 | } | |
|
2320 | } | |||
2202 | } |
|
2321 | } | |
2203 |
|
2322 | |||
2204 |
|
||||
2205 | .browser-result{ |
|
2323 | .browser-result{ | |
2206 | td a{ |
|
2324 | td a{ | |
2207 | margin-left: 0.5em; |
|
2325 | margin-left: 0.5em; | |
@@ -2219,6 +2337,142 b' h3.files_location{' | |||||
2219 | } |
|
2337 | } | |
2220 |
|
2338 | |||
2221 |
|
2339 | |||
|
2340 | .edit-file-fieldset #location, | |||
|
2341 | .edit-file-fieldset #filename { | |||
|
2342 | display: flex; | |||
|
2343 | width: -moz-available; /* WebKit-based browsers will ignore this. */ | |||
|
2344 | width: -webkit-fill-available; /* Mozilla-based browsers will ignore this. */ | |||
|
2345 | width: fill-available; | |||
|
2346 | border: 0; | |||
|
2347 | } | |||
|
2348 | ||||
|
2349 | .path-items { | |||
|
2350 | display: flex; | |||
|
2351 | padding: 0; | |||
|
2352 | border: 1px solid #eeeeee; | |||
|
2353 | width: 100%; | |||
|
2354 | float: left; | |||
|
2355 | ||||
|
2356 | .breadcrumb-path { | |||
|
2357 | line-height: 30px; | |||
|
2358 | padding: 0 4px; | |||
|
2359 | white-space: nowrap; | |||
|
2360 | } | |||
|
2361 | ||||
|
2362 | .location-path { | |||
|
2363 | width: -moz-available; /* WebKit-based browsers will ignore this. */ | |||
|
2364 | width: -webkit-fill-available; /* Mozilla-based browsers will ignore this. */ | |||
|
2365 | width: fill-available; | |||
|
2366 | ||||
|
2367 | .file-name-input { | |||
|
2368 | padding: 0.5em 0; | |||
|
2369 | } | |||
|
2370 | ||||
|
2371 | } | |||
|
2372 | ||||
|
2373 | ul { | |||
|
2374 | display: flex; | |||
|
2375 | margin: 0; | |||
|
2376 | padding: 0; | |||
|
2377 | width: 100%; | |||
|
2378 | } | |||
|
2379 | ||||
|
2380 | li { | |||
|
2381 | list-style-type: none; | |||
|
2382 | } | |||
|
2383 | ||||
|
2384 | } | |||
|
2385 | ||||
|
2386 | .editor-items { | |||
|
2387 | height: 40px; | |||
|
2388 | margin: 10px 0 -17px 10px; | |||
|
2389 | ||||
|
2390 | .editor-action { | |||
|
2391 | cursor: pointer; | |||
|
2392 | } | |||
|
2393 | ||||
|
2394 | .editor-action.active { | |||
|
2395 | border-bottom: 2px solid #5C5C5C; | |||
|
2396 | } | |||
|
2397 | ||||
|
2398 | li { | |||
|
2399 | list-style-type: none; | |||
|
2400 | } | |||
|
2401 | } | |||
|
2402 | ||||
|
2403 | .edit-file-fieldset .message textarea { | |||
|
2404 | border: 1px solid #eeeeee; | |||
|
2405 | } | |||
|
2406 | ||||
|
2407 | #files_data .codeblock { | |||
|
2408 | background-color: #F5F5F5; | |||
|
2409 | } | |||
|
2410 | ||||
|
2411 | #editor_preview { | |||
|
2412 | background: white; | |||
|
2413 | } | |||
|
2414 | ||||
|
2415 | .show-editor { | |||
|
2416 | padding: 10px; | |||
|
2417 | background-color: white; | |||
|
2418 | ||||
|
2419 | } | |||
|
2420 | ||||
|
2421 | .show-preview { | |||
|
2422 | padding: 10px; | |||
|
2423 | background-color: white; | |||
|
2424 | border-left: 1px solid #eeeeee; | |||
|
2425 | } | |||
|
2426 | // quick filter | |||
|
2427 | .grid-quick-filter { | |||
|
2428 | float: right; | |||
|
2429 | position: relative; | |||
|
2430 | } | |||
|
2431 | ||||
|
2432 | .grid-filter-box { | |||
|
2433 | display: flex; | |||
|
2434 | padding: 0px; | |||
|
2435 | border-radius: 3px; | |||
|
2436 | margin-bottom: 0; | |||
|
2437 | ||||
|
2438 | a { | |||
|
2439 | border: none !important; | |||
|
2440 | } | |||
|
2441 | ||||
|
2442 | li { | |||
|
2443 | list-style-type: none | |||
|
2444 | } | |||
|
2445 | } | |||
|
2446 | ||||
|
2447 | .grid-filter-box-icon { | |||
|
2448 | line-height: 33px; | |||
|
2449 | padding: 0; | |||
|
2450 | width: 20px; | |||
|
2451 | position: absolute; | |||
|
2452 | z-index: 11; | |||
|
2453 | left: 5px; | |||
|
2454 | } | |||
|
2455 | ||||
|
2456 | .grid-filter-box-input { | |||
|
2457 | margin-right: 0; | |||
|
2458 | ||||
|
2459 | input { | |||
|
2460 | border: 1px solid @white; | |||
|
2461 | padding-left: 25px; | |||
|
2462 | width: 145px; | |||
|
2463 | ||||
|
2464 | &:hover { | |||
|
2465 | border-color: @grey6; | |||
|
2466 | } | |||
|
2467 | ||||
|
2468 | &:focus { | |||
|
2469 | border-color: @grey5; | |||
|
2470 | } | |||
|
2471 | } | |||
|
2472 | } | |||
|
2473 | ||||
|
2474 | ||||
|
2475 | ||||
2222 | // Search |
|
2476 | // Search | |
2223 |
|
2477 | |||
2224 | .search-form{ |
|
2478 | .search-form{ | |
@@ -2281,7 +2535,7 b' div.search-code-body {' | |||||
2281 | } |
|
2535 | } | |
2282 |
|
2536 | |||
2283 | .code-body { |
|
2537 | .code-body { | |
2284 |
border: @border-thickness solid @ |
|
2538 | border: @border-thickness solid @grey6; | |
2285 | .border-radius(@border-radius); |
|
2539 | .border-radius(@border-radius); | |
2286 | } |
|
2540 | } | |
2287 |
|
2541 | |||
@@ -2301,6 +2555,11 b' div.search-code-body {' | |||||
2301 | .break { background-color: #DDE7EF; width: 100%; color: #747474; display: block; } |
|
2555 | .break { background-color: #DDE7EF; width: 100%; color: #747474; display: block; } | |
2302 | } |
|
2556 | } | |
2303 |
|
2557 | |||
|
2558 | .path { | |||
|
2559 | border-bottom: none !important; | |||
|
2560 | border-left: 1px solid @grey6 !important; | |||
|
2561 | border-right: 1px solid @grey6 !important; | |||
|
2562 | } | |||
2304 | } |
|
2563 | } | |
2305 |
|
2564 | |||
2306 | table.rctable td.td-search-results div { |
|
2565 | table.rctable td.td-search-results div { | |
@@ -2476,3 +2735,56 b' form.markup-form {' | |||||
2476 | padding: 20px; |
|
2735 | padding: 20px; | |
2477 | background-color: white; |
|
2736 | background-color: white; | |
2478 | } |
|
2737 | } | |
|
2738 | ||||
|
2739 | ||||
|
2740 | .dropzone-wrapper { | |||
|
2741 | border: 1px solid @grey5; | |||
|
2742 | padding: 20px; | |||
|
2743 | } | |||
|
2744 | ||||
|
2745 | .dropzone, | |||
|
2746 | .dropzone-pure { | |||
|
2747 | border: 2px dashed @grey5; | |||
|
2748 | border-radius: 5px; | |||
|
2749 | background: white; | |||
|
2750 | min-height: 200px; | |||
|
2751 | padding: 54px; | |||
|
2752 | ||||
|
2753 | .dz-message { | |||
|
2754 | font-weight: 700; | |||
|
2755 | text-align: center; | |||
|
2756 | margin: 2em 0; | |||
|
2757 | } | |||
|
2758 | ||||
|
2759 | } | |||
|
2760 | ||||
|
2761 | .dz-preview { | |||
|
2762 | margin: 10px 0 !important; | |||
|
2763 | position: relative; | |||
|
2764 | vertical-align: top; | |||
|
2765 | padding: 10px; | |||
|
2766 | border-bottom: 1px solid @grey5; | |||
|
2767 | } | |||
|
2768 | ||||
|
2769 | .dz-filename { | |||
|
2770 | font-weight: 700; | |||
|
2771 | float:left; | |||
|
2772 | } | |||
|
2773 | ||||
|
2774 | .dz-sending { | |||
|
2775 | float: right; | |||
|
2776 | } | |||
|
2777 | ||||
|
2778 | .dz-response { | |||
|
2779 | clear:both | |||
|
2780 | } | |||
|
2781 | ||||
|
2782 | .dz-filename-size { | |||
|
2783 | float:right | |||
|
2784 | } | |||
|
2785 | ||||
|
2786 | .dz-error-message { | |||
|
2787 | color: @alert2; | |||
|
2788 | padding-top: 10px; | |||
|
2789 | clear: both; | |||
|
2790 | } |
@@ -2,10 +2,21 b'' | |||||
2 | // For use in RhodeCode applications; |
|
2 | // For use in RhodeCode applications; | |
3 | // see style guide documentation for guidelines. |
|
3 | // see style guide documentation for guidelines. | |
4 |
|
4 | |||
|
5 | // TOP MAIN DARK NAVIGATION | |||
|
6 | ||||
|
7 | .header .main_nav.horizontal-list { | |||
|
8 | float: right; | |||
|
9 | color: @grey4; | |||
|
10 | > li { | |||
|
11 | a { | |||
|
12 | color: @grey4; | |||
|
13 | } | |||
|
14 | } | |||
|
15 | } | |||
|
16 | ||||
5 | // HEADER NAVIGATION |
|
17 | // HEADER NAVIGATION | |
6 |
|
18 | |||
7 | .horizontal-list { |
|
19 | .horizontal-list { | |
8 | float: right; |
|
|||
9 | display: block; |
|
20 | display: block; | |
10 | margin: 0; |
|
21 | margin: 0; | |
11 | padding: 0; |
|
22 | padding: 0; | |
@@ -18,6 +29,7 b'' | |||||
18 | li { |
|
29 | li { | |
19 | line-height: 1em; |
|
30 | line-height: 1em; | |
20 | list-style-type: none; |
|
31 | list-style-type: none; | |
|
32 | margin: 0 20px 0 0; | |||
21 |
|
33 | |||
22 | a { |
|
34 | a { | |
23 | padding: 0 .5em; |
|
35 | padding: 0 .5em; | |
@@ -55,12 +67,6 b'' | |||||
55 | .user { |
|
67 | .user { | |
56 | padding-bottom: 10px; |
|
68 | padding-bottom: 10px; | |
57 | } |
|
69 | } | |
58 |
|
||||
59 | &.open { |
|
|||
60 | .user { |
|
|||
61 | border-bottom: 5px solid @rcblue; |
|
|||
62 | } |
|
|||
63 | } |
|
|||
64 | } |
|
70 | } | |
65 |
|
71 | |||
66 | &:before { content: none; } |
|
72 | &:before { content: none; } | |
@@ -80,10 +86,6 b'' | |||||
80 | } |
|
86 | } | |
81 | } |
|
87 | } | |
82 |
|
88 | |||
83 | &.active { |
|
|||
84 | border-bottom: 5px solid @rcblue; |
|
|||
85 | } |
|
|||
86 |
|
||||
87 | &.open { |
|
89 | &.open { | |
88 |
|
90 | |||
89 | a { |
|
91 | a { | |
@@ -118,14 +120,12 b'' | |||||
118 | > a, |
|
120 | > a, | |
119 | &.has_select2 a { |
|
121 | &.has_select2 a { | |
120 | display: block; |
|
122 | display: block; | |
121 |
padding: 10px 0 |
|
123 | padding: 10px 0; | |
122 | } |
|
124 | } | |
123 |
|
125 | |||
124 | .menulabel { |
|
126 | .menulabel { | |
125 | padding: 0 .5em; |
|
|||
126 | line-height: 1em; |
|
127 | line-height: 1em; | |
127 | // for this specifically we do not use a variable |
|
128 | // for this specifically we do not use a variable | |
128 | border-right: 1px solid @grey4; |
|
|||
129 | } |
|
129 | } | |
130 |
|
130 | |||
131 | .pr_notifications { |
|
131 | .pr_notifications { | |
@@ -141,7 +141,7 b'' | |||||
141 | &.open, |
|
141 | &.open, | |
142 | &.active { |
|
142 | &.active { | |
143 | a { |
|
143 | a { | |
144 |
color: @ |
|
144 | color: @rcblue; | |
145 | } |
|
145 | } | |
146 | } |
|
146 | } | |
147 | } |
|
147 | } | |
@@ -156,6 +156,14 b'' | |||||
156 | position: relative; |
|
156 | position: relative; | |
157 | } |
|
157 | } | |
158 |
|
158 | |||
|
159 | .menulink { | |||
|
160 | &.disabled { | |||
|
161 | color: @grey3; | |||
|
162 | cursor: default; | |||
|
163 | opacity: 0.5; | |||
|
164 | } | |||
|
165 | } | |||
|
166 | ||||
159 | #quick_login { |
|
167 | #quick_login { | |
160 |
|
168 | |||
161 | li a { |
|
169 | li a { | |
@@ -281,16 +289,19 b'' | |||||
281 | } |
|
289 | } | |
282 |
|
290 | |||
283 | .navigation li:last-child .submenu { |
|
291 | .navigation li:last-child .submenu { | |
284 |
right: |
|
292 | right: auto; | |
285 |
left: |
|
293 | left: 0; | |
|
294 | border: 1px solid @grey5; | |||
|
295 | background: @white; | |||
|
296 | box-shadow: @dropdown-shadow; | |||
286 | } |
|
297 | } | |
287 |
|
298 | |||
288 | .submenu { |
|
299 | .submenu { | |
289 | position: absolute; |
|
300 | position: absolute; | |
290 | top: 100%; |
|
301 | top: 100%; | |
291 | left: 0; |
|
302 | left: 0; | |
292 |
min-width: 1 |
|
303 | min-width: 180px; | |
293 |
margin: |
|
304 | margin: 2px 0 0; | |
294 | padding: 0; |
|
305 | padding: 0; | |
295 | text-align: left; |
|
306 | text-align: left; | |
296 | font-family: @text-light; |
|
307 | font-family: @text-light; | |
@@ -303,7 +314,7 b'' | |||||
303 | padding: 0 .5em; |
|
314 | padding: 0 .5em; | |
304 | line-height: 1em; |
|
315 | line-height: 1em; | |
305 | color: @grey3; |
|
316 | color: @grey3; | |
306 |
background-color: @ |
|
317 | background-color: @white; | |
307 | list-style-type: none; |
|
318 | list-style-type: none; | |
308 |
|
319 | |||
309 | a { |
|
320 | a { | |
@@ -324,7 +335,7 b'' | |||||
324 | z-index: 30; |
|
335 | z-index: 30; | |
325 | } |
|
336 | } | |
326 | &:hover { |
|
337 | &:hover { | |
327 |
background-color: @grey |
|
338 | background-color: @grey7; | |
328 | -webkit-transition: background .3s; |
|
339 | -webkit-transition: background .3s; | |
329 | -moz-transition: background .3s; |
|
340 | -moz-transition: background .3s; | |
330 | -o-transition: background .3s; |
|
341 | -o-transition: background .3s; | |
@@ -501,10 +512,10 b'' | |||||
501 |
|
512 | |||
502 | #context-bar { |
|
513 | #context-bar { | |
503 | display: block; |
|
514 | display: block; | |
504 | margin: 0 auto; |
|
515 | margin: 0 auto 20px 0; | |
505 | padding: 0 @header-padding; |
|
516 | padding: 0 @header-padding; | |
506 |
background-color: @grey |
|
517 | background-color: @grey7; | |
507 |
border-bottom: |
|
518 | border-bottom: 1px solid @grey5; | |
508 |
|
519 | |||
509 | .clear { |
|
520 | .clear { | |
510 | clear: both; |
|
521 | clear: both; | |
@@ -513,19 +524,22 b'' | |||||
513 |
|
524 | |||
514 | ul#context-pages { |
|
525 | ul#context-pages { | |
515 | li { |
|
526 | li { | |
516 | line-height: 1em; |
|
|||
517 | list-style-type: none; |
|
527 | list-style-type: none; | |
518 |
|
528 | |||
519 | a { |
|
529 | a { | |
520 |
color: @grey |
|
530 | color: @grey2; | |
|
531 | ||||
|
532 | &:hover { | |||
|
533 | color: @grey1; | |||
|
534 | } | |||
521 | } |
|
535 | } | |
522 |
|
536 | |||
523 | &.active { |
|
537 | &.active { | |
524 | // special case, non-variable color |
|
538 | // special case, non-variable color | |
525 |
border-bottom: |
|
539 | border-bottom: 2px solid @rcblue; | |
526 |
|
540 | |||
527 | a { |
|
541 | a { | |
528 |
color: @ |
|
542 | color: @rcblue; | |
529 | } |
|
543 | } | |
530 | } |
|
544 | } | |
531 | } |
|
545 | } | |
@@ -534,8 +548,9 b' ul#context-pages {' | |||||
534 | // PAGINATION |
|
548 | // PAGINATION | |
535 |
|
549 | |||
536 | .pagination { |
|
550 | .pagination { | |
537 |
border: @border-thickness solid @r |
|
551 | border: @border-thickness solid @grey5; | |
538 |
color: @r |
|
552 | color: @grey2; | |
|
553 | box-shadow: @button-shadow; | |||
539 |
|
554 | |||
540 | .current { |
|
555 | .current { | |
541 | color: @grey4; |
|
556 | color: @grey4; | |
@@ -552,33 +567,44 b' ul#context-pages {' | |||||
552 | .dataTables_paginate, .pagination-wh { |
|
567 | .dataTables_paginate, .pagination-wh { | |
553 | text-align: left; |
|
568 | text-align: left; | |
554 | display: inline-block; |
|
569 | display: inline-block; | |
555 |
border-left: 1px solid @r |
|
570 | border-left: 1px solid @grey5; | |
556 | float: none; |
|
571 | float: none; | |
557 | overflow: hidden; |
|
572 | overflow: hidden; | |
|
573 | box-shadow: @button-shadow; | |||
558 |
|
574 | |||
559 | .paginate_button, .pager_curpage, |
|
575 | .paginate_button, .pager_curpage, | |
560 | .pager_link, .pg-previous, .pg-next, .pager_dotdot { |
|
576 | .pager_link, .pg-previous, .pg-next, .pager_dotdot { | |
561 | display: inline-block; |
|
577 | display: inline-block; | |
562 | padding: @menupadding/4 @menupadding; |
|
578 | padding: @menupadding/4 @menupadding; | |
563 |
border: 1px solid @r |
|
579 | border: 1px solid @grey5; | |
564 | border-left: 0; |
|
580 | border-left: 0; | |
565 |
color: @r |
|
581 | color: @grey2; | |
566 | cursor: pointer; |
|
582 | cursor: pointer; | |
567 | float: left; |
|
583 | float: left; | |
|
584 | ||||
|
585 | &:hover { | |||
|
586 | color: @rcdarkblue; | |||
|
587 | } | |||
568 | } |
|
588 | } | |
569 |
|
589 | |||
570 | .pager_curpage, .pager_dotdot, |
|
590 | .paginate_button.disabled, | |
571 | .paginate_button.current, .paginate_button.disabled, |
|
|||
572 | .disabled { |
|
591 | .disabled { | |
573 | color: @grey3; |
|
592 | color: @grey3; | |
574 | cursor: default; |
|
593 | cursor: default; | |
|
594 | opacity: 0.5; | |||
|
595 | } | |||
|
596 | ||||
|
597 | .paginate_button.current, .pager_curpage { | |||
|
598 | background: @rcblue; | |||
|
599 | border-color: @rcblue; | |||
|
600 | color: @white; | |||
575 | } |
|
601 | } | |
576 |
|
602 | |||
577 | .ellipsis { |
|
603 | .ellipsis { | |
578 | display: inline-block; |
|
604 | display: inline-block; | |
579 | text-align: left; |
|
605 | text-align: left; | |
580 | padding: @menupadding/4 @menupadding; |
|
606 | padding: @menupadding/4 @menupadding; | |
581 |
border: 1px solid @r |
|
607 | border: 1px solid @grey5; | |
582 | border-left: 0; |
|
608 | border-left: 0; | |
583 | float: left; |
|
609 | float: left; | |
584 | } |
|
610 | } | |
@@ -595,14 +621,6 b' ul#context-pages {' | |||||
595 | font-family: @text-regular; |
|
621 | font-family: @text-regular; | |
596 | color: @grey1; |
|
622 | color: @grey1; | |
597 |
|
623 | |||
598 | &#graph_nodes { |
|
|||
599 | clear:both; |
|
|||
600 | width: auto; |
|
|||
601 | margin-left: -100px; |
|
|||
602 | padding: 0; |
|
|||
603 | border: none; |
|
|||
604 | } |
|
|||
605 |
|
||||
606 | .nav-pills { |
|
624 | .nav-pills { | |
607 | margin: 0; |
|
625 | margin: 0; | |
608 | } |
|
626 | } | |
@@ -631,14 +649,11 b' ul#context-pages {' | |||||
631 |
|
649 | |||
632 | .main_filter_help_box { |
|
650 | .main_filter_help_box { | |
633 | padding: 7px 7px; |
|
651 | padding: 7px 7px; | |
634 | border-top: 1px solid @grey4; |
|
|||
635 | border-right: 1px solid @grey4; |
|
|||
636 | border-bottom: 1px solid @grey4; |
|
|||
637 | display: inline-block; |
|
652 | display: inline-block; | |
638 | vertical-align: top; |
|
653 | vertical-align: top; | |
639 | background: inherit; |
|
654 | background: inherit; | |
640 | position: absolute; |
|
655 | position: absolute; | |
641 |
right: |
|
656 | right: 0; | |
642 | top: 9px; |
|
657 | top: 9px; | |
643 | } |
|
658 | } | |
644 |
|
659 | |||
@@ -647,8 +662,10 b' ul#context-pages {' | |||||
647 |
|
662 | |||
648 | .searchItems { |
|
663 | .searchItems { | |
649 | display:flex; |
|
664 | display:flex; | |
650 |
background: |
|
665 | background: @black; | |
651 | padding: 0px; |
|
666 | padding: 0px; | |
|
667 | border-radius: 3px; | |||
|
668 | border: 1px solid @black; | |||
652 |
|
669 | |||
653 | a { |
|
670 | a { | |
654 | border: none !important; |
|
671 | border: none !important; | |
@@ -657,26 +674,30 b' ul#context-pages {' | |||||
657 |
|
674 | |||
658 | .searchTag { |
|
675 | .searchTag { | |
659 | line-height: 28px; |
|
676 | line-height: 28px; | |
660 |
padding: 0 |
|
677 | padding: 0 5px; | |
661 |
|
678 | |||
662 | .tag { |
|
679 | .tag { | |
663 |
color: @ |
|
680 | color: @grey5; | |
664 |
border-color: @ |
|
681 | border-color: @grey2; | |
|
682 | background: @grey1; | |||
665 | } |
|
683 | } | |
666 | } |
|
684 | } | |
667 |
|
685 | |||
668 | .searchTagFilter { |
|
686 | .searchTagFilter { | |
669 |
background-color: @ |
|
687 | background-color: @black !important; | |
|
688 | margin-right: 0; | |||
670 | } |
|
689 | } | |
671 |
|
690 | |||
672 | .searchTagHelp { |
|
691 | .searchTagHelp { | |
673 |
background-color: @grey |
|
692 | background-color: @grey1 !important; | |
|
693 | margin: 0; | |||
674 | } |
|
694 | } | |
675 | .searchTagHelp:hover { |
|
695 | .searchTagHelp:hover { | |
676 |
background-color: @grey |
|
696 | background-color: @grey1 !important; | |
677 | } |
|
697 | } | |
678 | .searchTagInput { |
|
698 | .searchTagInput { | |
679 |
background-color: @grey |
|
699 | background-color: @grey1 !important; | |
|
700 | margin-right: 0; | |||
680 | } |
|
701 | } | |
681 | } |
|
702 | } | |
682 |
|
703 | |||
@@ -685,32 +706,33 b' ul#context-pages {' | |||||
685 | } |
|
706 | } | |
686 |
|
707 | |||
687 | #main_filter_help { |
|
708 | #main_filter_help { | |
688 |
background: @grey |
|
709 | background: @grey1; | |
689 | border: 1px solid black; |
|
710 | border: 1px solid black; | |
690 | position: absolute; |
|
711 | position: absolute; | |
691 | white-space: pre; |
|
712 | white-space: pre; | |
692 | z-index: 9999; |
|
713 | z-index: 9999; | |
693 | color: @nav-grey; |
|
714 | color: @nav-grey; | |
694 | margin: 1px 7px; |
|
|||
695 | padding: 0 10px; |
|
715 | padding: 0 10px; | |
696 | } |
|
716 | } | |
697 |
|
717 | |||
698 | .main_filter_input { |
|
718 | input { | |
699 | padding: 5px; |
|
|||
700 | min-width: 260px; |
|
|||
701 | color: @nav-grey; |
|
|||
702 | background: @grey3; |
|
|||
703 | min-height: 18px; |
|
|||
704 | border:none; |
|
|||
705 | border-radius: 0; |
|
|||
706 |
|
719 | |||
707 | &:active { |
|
720 | &.main_filter_input { | |
708 | color: @grey2 !important; |
|
721 | padding: 5px 10px; | |
709 | background: white !important; |
|
722 | min-width: 340px; | |
710 | } |
|
723 | color: @grey7; | |
711 | &:focus { |
|
724 | background: @black; | |
712 | color: @grey2 !important; |
|
725 | min-height: 18px; | |
713 | background: white !important; |
|
726 | border: 0; | |
|
727 | ||||
|
728 | &:active { | |||
|
729 | color: @grey2 !important; | |||
|
730 | background: white !important; | |||
|
731 | } | |||
|
732 | &:focus { | |||
|
733 | color: @grey2 !important; | |||
|
734 | background: white !important; | |||
|
735 | } | |||
714 | } |
|
736 | } | |
715 | } |
|
737 | } | |
716 |
|
738 |
@@ -47,7 +47,7 b'' | |||||
47 | min-height: 150px |
|
47 | min-height: 150px | |
48 | } |
|
48 | } | |
49 | } |
|
49 | } | |
50 |
|
50 | |||
51 | .panel-footer { |
|
51 | .panel-footer { | |
52 | background-color: white; |
|
52 | background-color: white; | |
53 | padding: .65em @panel-padding .5em; |
|
53 | padding: .65em @panel-padding .5em; | |
@@ -63,10 +63,6 b'' | |||||
63 | &.user-profile { |
|
63 | &.user-profile { | |
64 | float: left; |
|
64 | float: left; | |
65 |
|
65 | |||
66 | .panel-heading { |
|
|||
67 | margin-bottom: @padding; |
|
|||
68 | } |
|
|||
69 |
|
||||
70 | .panel-body { |
|
66 | .panel-body { | |
71 | &:extend(.clearfix); |
|
67 | &:extend(.clearfix); | |
72 | } |
|
68 | } |
@@ -1,11 +1,13 b'' | |||||
1 | @font-face { |
|
1 | @font-face { | |
2 | font-family: 'rcicons'; |
|
2 | font-family: 'rcicons'; | |
3 | src: url('../fonts/RCIcons/rcicons.eot?74666722'); |
|
3 | ||
4 |
src: url('../fonts/RCIcons/rcicons.eot? |
|
4 | src: url('../fonts/RCIcons/rcicons.eot?92789106'); | |
5 |
|
|
5 | src: url('../fonts/RCIcons/rcicons.eot?92789106#iefix') format('embedded-opentype'), | |
6 |
url('../fonts/RCIcons/rcicons.woff |
|
6 | url('../fonts/RCIcons/rcicons.woff2?92789106') format('woff2'), | |
7 |
url('../fonts/RCIcons/rcicons. |
|
7 | url('../fonts/RCIcons/rcicons.woff?92789106') format('woff'), | |
8 |
url('../fonts/RCIcons/rcicons. |
|
8 | url('../fonts/RCIcons/rcicons.ttf?92789106') format('truetype'), | |
|
9 | url('../fonts/RCIcons/rcicons.svg?92789106#rcicons') format('svg'); | |||
|
10 | ||||
9 | font-weight: normal; |
|
11 | font-weight: normal; | |
10 | font-style: normal; |
|
12 | font-style: normal; | |
11 | } |
|
13 | } | |
@@ -55,78 +57,164 b'' | |||||
55 | /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ |
|
57 | /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ | |
56 | } |
|
58 | } | |
57 |
|
59 | |||
|
60 | .animate-spin { | |||
|
61 | -moz-animation: spin 2s infinite linear; | |||
|
62 | -o-animation: spin 2s infinite linear; | |||
|
63 | -webkit-animation: spin 2s infinite linear; | |||
|
64 | animation: spin 2s infinite linear; | |||
|
65 | display: inline-block; | |||
|
66 | } | |||
|
67 | @-moz-keyframes spin { | |||
|
68 | 0% { | |||
|
69 | -moz-transform: rotate(0deg); | |||
|
70 | -o-transform: rotate(0deg); | |||
|
71 | -webkit-transform: rotate(0deg); | |||
|
72 | transform: rotate(0deg); | |||
|
73 | } | |||
|
74 | ||||
|
75 | 100% { | |||
|
76 | -moz-transform: rotate(359deg); | |||
|
77 | -o-transform: rotate(359deg); | |||
|
78 | -webkit-transform: rotate(359deg); | |||
|
79 | transform: rotate(359deg); | |||
|
80 | } | |||
|
81 | } | |||
|
82 | @-webkit-keyframes spin { | |||
|
83 | 0% { | |||
|
84 | -moz-transform: rotate(0deg); | |||
|
85 | -o-transform: rotate(0deg); | |||
|
86 | -webkit-transform: rotate(0deg); | |||
|
87 | transform: rotate(0deg); | |||
|
88 | } | |||
|
89 | ||||
|
90 | 100% { | |||
|
91 | -moz-transform: rotate(359deg); | |||
|
92 | -o-transform: rotate(359deg); | |||
|
93 | -webkit-transform: rotate(359deg); | |||
|
94 | transform: rotate(359deg); | |||
|
95 | } | |||
|
96 | } | |||
|
97 | @-o-keyframes spin { | |||
|
98 | 0% { | |||
|
99 | -moz-transform: rotate(0deg); | |||
|
100 | -o-transform: rotate(0deg); | |||
|
101 | -webkit-transform: rotate(0deg); | |||
|
102 | transform: rotate(0deg); | |||
|
103 | } | |||
|
104 | ||||
|
105 | 100% { | |||
|
106 | -moz-transform: rotate(359deg); | |||
|
107 | -o-transform: rotate(359deg); | |||
|
108 | -webkit-transform: rotate(359deg); | |||
|
109 | transform: rotate(359deg); | |||
|
110 | } | |||
|
111 | } | |||
|
112 | @-ms-keyframes spin { | |||
|
113 | 0% { | |||
|
114 | -moz-transform: rotate(0deg); | |||
|
115 | -o-transform: rotate(0deg); | |||
|
116 | -webkit-transform: rotate(0deg); | |||
|
117 | transform: rotate(0deg); | |||
|
118 | } | |||
|
119 | ||||
|
120 | 100% { | |||
|
121 | -moz-transform: rotate(359deg); | |||
|
122 | -o-transform: rotate(359deg); | |||
|
123 | -webkit-transform: rotate(359deg); | |||
|
124 | transform: rotate(359deg); | |||
|
125 | } | |||
|
126 | } | |||
|
127 | @keyframes spin { | |||
|
128 | 0% { | |||
|
129 | -moz-transform: rotate(0deg); | |||
|
130 | -o-transform: rotate(0deg); | |||
|
131 | -webkit-transform: rotate(0deg); | |||
|
132 | transform: rotate(0deg); | |||
|
133 | } | |||
|
134 | ||||
|
135 | 100% { | |||
|
136 | -moz-transform: rotate(359deg); | |||
|
137 | -o-transform: rotate(359deg); | |||
|
138 | -webkit-transform: rotate(359deg); | |||
|
139 | transform: rotate(359deg); | |||
|
140 | } | |||
|
141 | } | |||
|
142 | ||||
|
143 | ||||
|
144 | ||||
58 | .icon-no-margin::before { |
|
145 | .icon-no-margin::before { | |
59 | margin: 0; |
|
146 | margin: 0; | |
60 |
|
147 | |||
61 | } |
|
148 | } | |
62 | // -- ICON CLASSES -- // |
|
149 | // -- ICON CLASSES -- // | |
|
150 | // sorter = lambda s: '\n'.join(sorted(s.splitlines())) | |||
63 |
|
151 | |||
|
152 | .icon-delete:before { content: '\e800'; } /* '' */ | |||
|
153 | .icon-ok:before { content: '\e801'; } /* '' */ | |||
|
154 | .icon-comment:before { content: '\e802'; } /* '' */ | |||
64 | .icon-bookmark:before { content: '\e803'; } /* '' */ |
|
155 | .icon-bookmark:before { content: '\e803'; } /* '' */ | |
65 | .icon-branch:before { content: '\e804'; } /* '' */ |
|
156 | .icon-branch:before { content: '\e804'; } /* '' */ | |
|
157 | .icon-tag:before { content: '\e805'; } /* '' */ | |||
66 | .icon-lock:before { content: '\e806'; } /* '' */ |
|
158 | .icon-lock:before { content: '\e806'; } /* '' */ | |
67 | .icon-unlock:before { content: '\e807'; } /* '' */ |
|
159 | .icon-unlock:before { content: '\e807'; } /* '' */ | |
68 |
.icon- |
|
160 | .icon-feed:before { content: '\e808'; } /* '' */ | |
69 |
.icon- |
|
161 | .icon-left:before { content: '\e809'; } /* '' */ | |
70 |
|
162 | .icon-right:before { content: '\e80a'; } /* '' */ | ||
71 |
.icon- |
|
163 | .icon-down:before { content: '\e80b'; } /* '' */ | |
72 |
.icon- |
|
164 | .icon-folder:before { content: '\e80c'; } /* '' */ | |
73 |
|
165 | .icon-folder-open:before { content: '\e80d'; } /* '' */ | ||
74 |
.icon- |
|
166 | .icon-folder-empty:before { content: '\f114'; } /* '' */ | |
75 |
.icon- |
|
167 | .icon-folder-open-empty:before { content: '\f115'; } /* '' */ | |
76 |
.icon- |
|
168 | .icon-trash-empty:before { content: '\e80e'; } /* '' */ | |
77 |
|
169 | .icon-group:before { content: '\e80f'; } /* '' */ | ||
78 |
.icon- |
|
170 | .icon-remove:before { content: '\e810'; } /* '' */ | |
79 |
|
171 | .icon-fork:before { content: '\e811'; } /* '' */ | ||
80 |
.icon- |
|
172 | .icon-more:before { content: '\e812'; } /* '' */ | |
81 |
.icon- |
|
173 | .icon-search:before { content: '\e813'; } /* '' */ | |
82 |
|
174 | .icon-scissors:before { content: '\e814'; } /* '' */ | ||
83 |
.icon- |
|
175 | .icon-download:before { content: '\e815'; } /* '' */ | |
84 |
.icon- |
|
176 | .icon-doc:before { content: '\e816'; } /* '' */ | |
85 |
|
177 | .icon-cog:before { content: '\e817'; } /* '' */ | ||
86 |
.icon- |
|
178 | .icon-cog-alt:before { content: '\e818'; } /* '' */ | |
87 |
|
179 | .icon-eye:before { content: '\e819'; } /* '' */ | ||
88 |
.icon- |
|
180 | .icon-eye-off:before { content: '\e81a'; } /* '' */ | |
89 |
.icon- |
|
181 | .icon-cancel-circled2:before { content: '\e81b'; } /* '' */ | |
90 |
|
182 | .icon-cancel-circled:before { content: '\e81c'; } /* '' */ | ||
91 | .icon-more:before { content: '\e815'; } /* '' */ |
|
|||
92 |
|
||||
93 | .icon-more-linked { cursor: pointer; color: @grey3 } |
|
|||
94 | .icon-more-linked:before { content: '\e815'; } /* '' */ |
|
|||
95 |
|
||||
96 | .icon-expand-linked { cursor: pointer; color: @grey3; font-size: 8px } |
|
|||
97 | .icon-expand-linked:before { content: '\e80e'; } /* '' */ |
|
|||
98 |
|
||||
99 | .icon-git-inv:before { content: '\e80f'; } /* '' */ |
|
|||
100 | .icon-hg-inv:before { content: '\e810'; } /* '' */ |
|
|||
101 | .icon-svn-inv:before { content: '\e811'; } /* '' */ |
|
|||
102 |
|
||||
103 | .icon-git:before { content: '\e81a'; } /* '' */ |
|
|||
104 | .icon-hg:before { content: '\e81b'; } /* '' */ |
|
|||
105 | .icon-svn:before { content: '\e820'; } /* '' */ |
|
|||
106 |
|
||||
107 | .icon-minus:before { content: '\e81c'; } /* '' */ |
|
|||
108 | .icon-plus:before { content: '\e81d'; } /* '' */ |
|
183 | .icon-plus:before { content: '\e81d'; } /* '' */ | |
109 |
.icon- |
|
184 | .icon-plus-circled:before { content: '\e81e'; } /* '' */ | |
110 |
.icon- |
|
185 | .icon-minus-circled:before { content: '\e81f'; } /* '' */ | |
111 |
|
186 | .icon-minus:before { content: '\e820'; } /* '' */ | ||
112 |
.icon- |
|
187 | .icon-info-circled:before { content: '\e821'; } /* '' */ | |
113 |
|
188 | .icon-upload:before { content: '\e822'; } /* '' */ | ||
114 |
.icon- |
|
189 | .icon-home:before { content: '\e823'; } /* '' */ | |
115 |
.icon- |
|
190 | .icon-git:before { content: '\e82a'; } /* '' */ | |
116 |
.icon- |
|
191 | .icon-hg:before { content: '\e82d'; } /* '' */ | |
|
192 | .icon-svn:before { content: '\e82e'; } /* '' */ | |||
|
193 | .icon-comment-add:before { content: '\e82f'; } /* '' */ | |||
|
194 | .icon-comment-toggle:before { content: '\e830'; } /* '' */ | |||
|
195 | .icon-rhodecode:before { content: '\e831'; } /* '' */ | |||
|
196 | .icon-up:before { content: '\e832'; } /* '' */ | |||
|
197 | .icon-merge:before { content: '\e833'; } /* '' */ | |||
|
198 | .icon-docs:before { content: '\f0c5'; } /* '' */ | |||
|
199 | .icon-menu:before { content: '\f0c9'; } /* '' */ | |||
|
200 | .icon-paste:before { content: '\f0ea'; } /* '' */ | |||
|
201 | .icon-doc-text:before { content: '\f0f6'; } /* '' */ | |||
|
202 | .icon-plus-squared:before { content: '\f0fe'; } /* '' */ | |||
|
203 | .icon-minus-squared:before { content: '\f146'; } /* '' */ | |||
|
204 | .icon-minus-squared-alt:before { content: '\f147'; } /* '' */ | |||
|
205 | .icon-doc-inv:before { content: '\f15b'; } /* '' */ | |||
|
206 | .icon-doc-text-inv:before { content: '\f15c'; } /* '' */ | |||
|
207 | .icon-plus-squared-alt:before { content: '\f196'; } /* '' */ | |||
|
208 | .icon-file-code:before { content: '\f1c9'; } /* '' */ | |||
|
209 | .icon-history:before { content: '\f1da'; } /* '' */ | |||
|
210 | .icon-sliders:before { content: '\f1de'; } /* '' */ | |||
|
211 | .icon-trash:before { content: '\f1f8'; } /* '' */ | |||
|
212 | .icon-spin-alt:before { content: '\e834'; } /* '' */ | |||
|
213 | .icon-spin:before { content: '\e838'; } /* '' */ | |||
117 |
|
214 | |||
118 |
|
215 | |||
119 | .icon-folder:before { content: '\e813'; } /* '' */ |
|
216 | // MERGED ICONS BASED ON CURRENT ONES | |
120 | .icon-folder-close:before { content: '\e813'; } /* '' */ |
|
217 | .icon-repo-group:before { &:extend(.icon-folder-open:before); } | |
121 |
|
||||
122 | .icon-directory:before { content: '\e800'; } /* '' */ |
|
|||
123 | .icon-directory-empty:before { content: '\f114'; } /* '' */ |
|
|||
124 | .icon-file-text:before { content: '\f0f6'; } /* '' */ |
|
|||
125 | .icon-file-text-inv:before { content: '\f15c'; } /* '' */ |
|
|||
126 | .icon-file-code:before { content: '\f1c9'; } /* '' */ |
|
|||
127 |
|
||||
128 | // MERGED ICONS |
|
|||
129 |
|
||||
130 | .icon-repo-private:before { &:extend(.icon-lock:before); } |
|
218 | .icon-repo-private:before { &:extend(.icon-lock:before); } | |
131 | .icon-repo-lock:before { &:extend(.icon-lock:before); } |
|
219 | .icon-repo-lock:before { &:extend(.icon-lock:before); } | |
132 | .icon-unlock-alt:before { &:extend(.icon-unlock:before); } |
|
220 | .icon-unlock-alt:before { &:extend(.icon-unlock:before); } | |
@@ -134,9 +222,20 b'' | |||||
134 | .icon-repo-public:before { &:extend(.icon-unlock:before); } |
|
222 | .icon-repo-public:before { &:extend(.icon-unlock:before); } | |
135 | .icon-rss-sign:before { &:extend(.icon-feed:before); } |
|
223 | .icon-rss-sign:before { &:extend(.icon-feed:before); } | |
136 | .icon-code-fork:before { &:extend(.icon-fork:before); } |
|
224 | .icon-code-fork:before { &:extend(.icon-fork:before); } | |
|
225 | .icon-arrow_up:before { &:extend(.icon-up:before); } | |||
|
226 | .icon-file:before { &:extend(.icon-file-code:before); } | |||
|
227 | .icon-file-text:before { &:extend(.icon-file-code:before); } | |||
|
228 | .icon-directory:before { &:extend(.icon-folder:before); } | |||
|
229 | .icon-more-linked:before { &:extend(.icon-more:before); } | |||
|
230 | .icon-clipboard:before { &:extend(.icon-docs:before); } | |||
|
231 | .icon-copy:before { &:extend(.icon-docs:before); } | |||
|
232 | .icon-true:before { &:extend(.icon-ok:before); } | |||
|
233 | .icon-false:before { &:extend(.icon-delete:before); } | |||
|
234 | .icon-expand-linked:before { &:extend(.icon-down:before); } | |||
|
235 | .icon-pr-merge-fail:before { &:extend(.icon-delete:before); } | |||
137 |
|
236 | |||
138 | // TRANSFORM |
|
237 | // TRANSFORM | |
139 | .icon-arrow_up:before {transform: rotate(180deg);} |
|
238 | ||
140 | .icon-merge:before {transform: rotate(180deg);} |
|
239 | .icon-merge:before {transform: rotate(180deg);} | |
141 |
|
240 | |||
142 | // -- END ICON CLASSES -- // |
|
241 | // -- END ICON CLASSES -- // | |
@@ -152,6 +251,9 b'' | |||||
152 | .icon-svn-inv { color: @color1 !important; } |
|
251 | .icon-svn-inv { color: @color1 !important; } | |
153 | .icon-repo-lock { color: #FF0000; } |
|
252 | .icon-repo-lock { color: #FF0000; } | |
154 | .icon-repo-unlock { color: #FF0000; } |
|
253 | .icon-repo-unlock { color: #FF0000; } | |
|
254 | .icon-false { color: @grey5 } | |||
|
255 | .icon-expand-linked { cursor: pointer; color: @grey3; font-size: 14px } | |||
|
256 | .icon-more-linked { cursor: pointer; color: @grey3 } | |||
155 |
|
257 | |||
156 | .repo-switcher-dropdown .select2-result-label { |
|
258 | .repo-switcher-dropdown .select2-result-label { | |
157 | .icon-git:before { |
|
259 | .icon-git:before { |
@@ -88,7 +88,6 b' div.readme_box pre {' | |||||
88 | font-size: 13px !important; |
|
88 | font-size: 13px !important; | |
89 | overflow: visible !important; |
|
89 | overflow: visible !important; | |
90 | line-height: 140% !important; |
|
90 | line-height: 140% !important; | |
91 | background-color: @grey7; |
|
|||
92 | } |
|
91 | } | |
93 |
|
92 | |||
94 | div.readme_box img { |
|
93 | div.readme_box img { | |
@@ -156,10 +155,10 b' div.readme_box code {' | |||||
156 | } |
|
155 | } | |
157 |
|
156 | |||
158 | div.readme_box pre { |
|
157 | div.readme_box pre { | |
159 |
border: @border-thickness solid |
|
158 | border: @border-thickness solid #CBDBEB; | |
160 | overflow: auto; |
|
159 | overflow: auto; | |
161 | padding: .5em; |
|
160 | padding: .5em; | |
162 |
background-color: |
|
161 | background-color: #FCFEFF; | |
163 | } |
|
162 | } | |
164 |
|
163 | |||
165 | div.readme_box pre > code { |
|
164 | div.readme_box pre > code { |
@@ -17,7 +17,7 b'' | |||||
17 | .select2-search, |
|
17 | .select2-search, | |
18 | .select2-search input {.box-sizing(border-box);} |
|
18 | .select2-search input {.box-sizing(border-box);} | |
19 | .select2-container .select2-choice{display:block; line-height:1em; -webkit-touch-callout:none;-moz-user-select:none;-ms-user-select:none;user-select:none; } |
|
19 | .select2-container .select2-choice{display:block; line-height:1em; -webkit-touch-callout:none;-moz-user-select:none;-ms-user-select:none;user-select:none; } | |
20 | .main .select2-container .select2-choice { background-color: white; } |
|
20 | .main .select2-container .select2-choice { background-color: white; box-shadow: @button-shadow;} | |
21 | .select2-container .select2-choice abbr { display: none; width: 12px; height: 12px; position: absolute; right: 24px; top: 8px; font-size: 1px; text-decoration: none; border: 0; background: url('../images/select2.png') right top no-repeat; cursor: pointer; outline: 0; } |
|
21 | .select2-container .select2-choice abbr { display: none; width: 12px; height: 12px; position: absolute; right: 24px; top: 8px; font-size: 1px; text-decoration: none; border: 0; background: url('../images/select2.png') right top no-repeat; cursor: pointer; outline: 0; } | |
22 | .select2-container.select2-allowclear .select2-choice abbr {display: inline-block;} |
|
22 | .select2-container.select2-allowclear .select2-choice abbr {display: inline-block;} | |
23 | .select2-container .select2-choice abbr:hover { background-position: right -11px; cursor: pointer; } |
|
23 | .select2-container .select2-choice abbr:hover { background-position: right -11px; cursor: pointer; } | |
@@ -92,10 +92,18 b' select.select2{height:28px;visibility:hi' | |||||
92 | min-width: 160px; |
|
92 | min-width: 160px; | |
93 | margin: 0 @padding 0 0; |
|
93 | margin: 0 @padding 0 0; | |
94 | padding: 0; |
|
94 | padding: 0; | |
95 |
border: @border-thickness solid @r |
|
95 | border: @border-thickness solid @grey5; | |
96 | border-radius: @border-radius; |
|
96 | border-radius: @border-radius; | |
97 |
color: @r |
|
97 | color: @grey2; | |
98 | background-color: white; |
|
98 | background-color: white; | |
|
99 | ||||
|
100 | a { | |||
|
101 | color: @grey2; | |||
|
102 | ||||
|
103 | &:hover { | |||
|
104 | color: @rcdarkblue; | |||
|
105 | } | |||
|
106 | } | |||
99 | } |
|
107 | } | |
100 |
|
108 | |||
101 | .drop-menu-dropdown { |
|
109 | .drop-menu-dropdown { | |
@@ -120,7 +128,7 b' select.select2{height:28px;visibility:hi' | |||||
120 |
|
128 | |||
121 | a { |
|
129 | a { | |
122 | display:block; |
|
130 | display:block; | |
123 |
padding: . |
|
131 | padding: .7em; | |
124 | padding-right: 2em; |
|
132 | padding-right: 2em; | |
125 | position: relative; |
|
133 | position: relative; | |
126 |
|
134 | |||
@@ -129,7 +137,7 b' select.select2{height:28px;visibility:hi' | |||||
129 | content: "\00A0\25BE"; |
|
137 | content: "\00A0\25BE"; | |
130 | right: .1em; |
|
138 | right: .1em; | |
131 | line-height: 1em; |
|
139 | line-height: 1em; | |
132 |
top: 0. |
|
140 | top: 0.2em; | |
133 | width: 1em; |
|
141 | width: 1em; | |
134 | font-size: 20px; |
|
142 | font-size: 20px; | |
135 | } |
|
143 | } | |
@@ -157,6 +165,12 b' select.select2{height:28px;visibility:hi' | |||||
157 | width: 100%; |
|
165 | width: 100%; | |
158 | margin: .5em 0; |
|
166 | margin: .5em 0; | |
159 | padding: .5em; |
|
167 | padding: .5em; | |
|
168 | border-color: @grey4; | |||
|
169 | ||||
|
170 | &:focus, &:hover { | |||
|
171 | border-color: @rcblue; | |||
|
172 | box-shadow: @button-shadow; | |||
|
173 | } | |||
160 | } |
|
174 | } | |
161 |
|
175 | |||
162 | .select2-no-results { |
|
176 | .select2-no-results { | |
@@ -176,7 +190,13 b' select.select2{height:28px;visibility:hi' | |||||
176 |
|
190 | |||
177 | &:hover, |
|
191 | &:hover, | |
178 | &.select2-highlighted { |
|
192 | &.select2-highlighted { | |
179 |
background-color: @ |
|
193 | background-color: @grey7; | |
|
194 | ||||
|
195 | .select2-result-label { | |||
|
196 | &:hover { | |||
|
197 | color: @grey1!important; | |||
|
198 | } | |||
|
199 | } | |||
180 | } |
|
200 | } | |
181 |
|
201 | |||
182 | &.select2-result-with-children { |
|
202 | &.select2-result-with-children { | |
@@ -189,8 +209,7 b' select.select2{height:28px;visibility:hi' | |||||
189 | display:block; |
|
209 | display:block; | |
190 | padding: 8px; |
|
210 | padding: 8px; | |
191 | font-family: @text-regular; |
|
211 | font-family: @text-regular; | |
192 | border-bottom: @border-thickness solid @rclightblue; |
|
212 | color: @grey2; | |
193 | color: @rcblue; |
|
|||
194 | cursor: pointer; |
|
213 | cursor: pointer; | |
195 | } |
|
214 | } | |
196 | &.select2-result-with-children { |
|
215 | &.select2-result-with-children { | |
@@ -205,7 +224,7 b' select.select2{height:28px;visibility:hi' | |||||
205 | ul.select2-result-sub li .select2-result-label { |
|
224 | ul.select2-result-sub li .select2-result-label { | |
206 | padding-left: 16px; |
|
225 | padding-left: 16px; | |
207 | font-family: @text-regular; |
|
226 | font-family: @text-regular; | |
208 |
color: @r |
|
227 | color: @grey2; | |
209 | cursor: pointer; |
|
228 | cursor: pointer; | |
210 | } |
|
229 | } | |
211 | } |
|
230 | } |
@@ -3,30 +3,33 b'' | |||||
3 | // Used for headers and file detail summary screens. |
|
3 | // Used for headers and file detail summary screens. | |
4 |
|
4 | |||
5 | .summary { |
|
5 | .summary { | |
6 |
|
|
6 | clear: both; | |
|
7 | float: none; | |||
7 | position: relative; |
|
8 | position: relative; | |
8 | width: 100%; |
|
9 | width: 100%; | |
9 | margin: 0; |
|
10 | margin: 0; | |
10 | padding: 0; |
|
11 | padding: 0; | |
|
12 | background: #FCFCFC; | |||
|
13 | border: 1px solid #EAEAEA; | |||
|
14 | border-radius: @border-radius; | |||
|
15 | margin-bottom: 20px; | |||
11 |
|
16 | |||
12 | .summary-detail-header { |
|
17 | .summary-detail-header { | |
13 | float: left; |
|
|||
14 | display: block; |
|
18 | display: block; | |
15 | width: 100%; |
|
19 | width: 100%; | |
16 |
margin-bottom: |
|
20 | margin-bottom: 10px; | |
17 | padding: 0 0 .5em 0; |
|
21 | padding: 0 0 .5em 0; | |
18 | border-bottom: @border-thickness solid @border-default-color; |
|
22 | border-bottom: @border-thickness solid @border-default-color; | |
19 |
|
23 | |||
20 | .breadcrumbs { |
|
24 | .breadcrumbs { | |
21 | float: left; |
|
|||
22 | display: inline; |
|
25 | display: inline; | |
23 | margin: 0; |
|
26 | margin: 0; | |
24 | padding: 0; |
|
27 | padding: 0; | |
25 | } |
|
28 | } | |
|
29 | ||||
26 | h4 { |
|
30 | h4 { | |
27 | float: left; |
|
|||
28 | margin: 0 1em 0 0; |
|
31 | margin: 0 1em 0 0; | |
29 | padding: 0; |
|
32 | padding: 10px 0 5px 20px; | |
30 | line-height: 1.2em; |
|
33 | line-height: 1.2em; | |
31 | font-size: @basefontsize; |
|
34 | font-size: @basefontsize; | |
32 | } |
|
35 | } | |
@@ -42,11 +45,11 b'' | |||||
42 | } |
|
45 | } | |
43 |
|
46 | |||
44 | .summary-detail { |
|
47 | .summary-detail { | |
45 |
float: |
|
48 | float: none; | |
46 | position: relative; |
|
49 | position: relative; | |
47 |
width: |
|
50 | width: 100%; | |
48 |
margin: 0 |
|
51 | margin: 0; | |
49 | padding: 0; |
|
52 | padding: 0 0 20px 0; | |
50 |
|
53 | |||
51 | .file_diff_buttons { |
|
54 | .file_diff_buttons { | |
52 | margin-top: @space; |
|
55 | margin-top: @space; | |
@@ -62,18 +65,37 b'' | |||||
62 | height: 30px; |
|
65 | height: 30px; | |
63 | margin: 0; |
|
66 | margin: 0; | |
64 | padding: 0; |
|
67 | padding: 0; | |
|
68 | width: 130px; | |||
65 | font-weight: @text-semibold-weight; |
|
69 | font-weight: @text-semibold-weight; | |
66 | font-family: @text-semibold; |
|
70 | font-family: @text-semibold; | |
67 | } |
|
71 | } | |
|
72 | .left-clone select { | |||
|
73 | width: 130px; | |||
|
74 | margin-right: 0; | |||
|
75 | background-color: @grey7; | |||
|
76 | border-color: @grey4; | |||
|
77 | color: #5C5C5C; | |||
|
78 | border-top-right-radius: 0; | |||
|
79 | border-bottom-right-radius: 0; | |||
|
80 | } | |||
68 |
|
81 | |||
69 | .right-clone { |
|
82 | .right-clone { | |
70 |
float: |
|
83 | float: left; | |
71 |
width: |
|
84 | width: ~"calc(100% - 170px)"; | |
|
85 | ||||
|
86 | .clipboard-action { | |||
|
87 | margin-left: -30px; | |||
|
88 | } | |||
72 | } |
|
89 | } | |
73 |
|
90 | |||
74 | .clone_url_input { |
|
91 | .clone_url_input { | |
75 |
width: ~"calc(100% - |
|
92 | width: ~"calc(100% - 90px)"; | |
76 |
padding: |
|
93 | padding: 6px 30px 6px 10px; | |
|
94 | height: 14px; | |||
|
95 | box-shadow: 0 1px 1px 0 rgba(0,0,0,0.07); | |||
|
96 | border-top-left-radius: 0; | |||
|
97 | border-bottom-left-radius: 0; | |||
|
98 | margin-left: -1px; | |||
77 | } |
|
99 | } | |
78 |
|
100 | |||
79 | &.directory { |
|
101 | &.directory { | |
@@ -123,18 +145,32 b'' | |||||
123 | border: @border-thickness solid @border-default-color; |
|
145 | border: @border-thickness solid @border-default-color; | |
124 | .border-radius(@border-radius); |
|
146 | .border-radius(@border-radius); | |
125 | } |
|
147 | } | |
|
148 | ||||
|
149 | .btn-collapse { | |||
|
150 | clear: both; | |||
|
151 | float: none; | |||
|
152 | background: #F7F7F7; | |||
|
153 | text-align: center; | |||
|
154 | color: #949494; | |||
|
155 | font-size: 11px; | |||
|
156 | ||||
|
157 | &:hover { | |||
|
158 | background: #f1f1f1; | |||
|
159 | color: #2B2B2D; | |||
|
160 | } | |||
|
161 | } | |||
126 | } |
|
162 | } | |
127 |
|
163 | |||
128 | // this is used outside of just the summary |
|
164 | // this is used outside of just the summary | |
129 | .fieldset, // similar to form fieldset |
|
165 | .fieldset, // similar to form fieldset | |
130 | .summary .sidebar-right-content { // these have to match |
|
166 | .summary .sidebar-right-content { // these have to match | |
131 | clear: both; |
|
167 | clear: both; | |
132 |
float: |
|
168 | float: none; | |
133 | position: relative; |
|
169 | position: relative; | |
134 | display:block; |
|
170 | display:block; | |
135 | width: 100%; |
|
171 | width: 100%; | |
136 |
min-height: |
|
172 | min-height: 20px; | |
137 |
margin-bottom: |
|
173 | margin-bottom: 10px; | |
138 | padding: 0; |
|
174 | padding: 0; | |
139 | line-height: 1.2em; |
|
175 | line-height: 1.2em; | |
140 |
|
176 | |||
@@ -147,19 +183,28 b'' | |||||
147 | } |
|
183 | } | |
148 |
|
184 | |||
149 | .summary .sidebar-right-content { |
|
185 | .summary .sidebar-right-content { | |
150 |
margin-bottom: |
|
186 | margin-bottom: 0; | |
151 |
|
187 | |||
152 | .rc-user { |
|
188 | .rc-user { | |
153 | min-width: 0; |
|
189 | min-width: 0; | |
154 | } |
|
190 | } | |
|
191 | ||||
|
192 | li { | |||
|
193 | list-style: none; | |||
|
194 | line-height: normal; | |||
|
195 | } | |||
|
196 | } | |||
|
197 | ||||
|
198 | .summary { | |||
|
199 | .fieldset { | |||
|
200 | margin-bottom: 0; | |||
|
201 | } | |||
155 | } |
|
202 | } | |
156 |
|
203 | |||
157 | .fieldset { |
|
204 | .fieldset { | |
158 |
|
205 | |||
159 | .left-label { // similar to form legend |
|
206 | .left-label { // similar to form legend | |
160 | float: left; |
|
|||
161 | display: block; |
|
207 | display: block; | |
162 | width: 25%; |
|
|||
163 | margin: 0; |
|
208 | margin: 0; | |
164 | padding: 0; |
|
209 | padding: 0; | |
165 | font-weight: @text-semibold-weight; |
|
210 | font-weight: @text-semibold-weight; | |
@@ -167,16 +212,78 b'' | |||||
167 | } |
|
212 | } | |
168 |
|
213 | |||
169 | .left-label-summary { |
|
214 | .left-label-summary { | |
170 | .left-label; |
|
215 | padding-left: 20px; | |
171 |
|
|
216 | margin-bottom: 5px; | |
|
217 | ||||
|
218 | p { | |||
|
219 | margin-bottom: 5px; | |||
|
220 | color: @grey1; | |||
|
221 | float: left; | |||
|
222 | width: 130px; | |||
|
223 | ||||
|
224 | &.spacing { | |||
|
225 | margin-top: 10px; | |||
|
226 | } | |||
|
227 | } | |||
|
228 | ||||
|
229 | .right-label-summary { | |||
|
230 | float: left; | |||
|
231 | margin-top: 7px; | |||
|
232 | width: ~"calc(100% - 160px)"; | |||
|
233 | } | |||
172 | } |
|
234 | } | |
173 |
|
235 | |||
|
236 | .left-label-summary-files { | |||
|
237 | padding-left: 45px; | |||
|
238 | margin-top: 5px; | |||
|
239 | ||||
|
240 | p { | |||
|
241 | margin-bottom: 5px; | |||
|
242 | color: @grey1; | |||
|
243 | float: left; | |||
|
244 | width: 130px; | |||
|
245 | ||||
|
246 | &.spacing { | |||
|
247 | margin-top: 10px; | |||
|
248 | } | |||
|
249 | } | |||
|
250 | ||||
|
251 | .right-label-summary { | |||
|
252 | float: left; | |||
|
253 | margin-top: 7px; | |||
|
254 | } | |||
|
255 | } | |||
|
256 | ||||
|
257 | .left-content { | |||
|
258 | width: ~"calc(60% - 20px)"; | |||
|
259 | float: left; | |||
|
260 | margin: 15px 0 15px 20px; | |||
|
261 | ||||
|
262 | .rc-user { | |||
|
263 | min-width: auto; | |||
|
264 | max-width: none; | |||
|
265 | min-height: auto; | |||
|
266 | padding-right: 5px; | |||
|
267 | } | |||
|
268 | ||||
|
269 | .left-content-avatar { | |||
|
270 | width: 45px; | |||
|
271 | float: left; | |||
|
272 | margin-top: 8px; | |||
|
273 | } | |||
|
274 | ||||
|
275 | .left-content-message { | |||
|
276 | float: left; | |||
|
277 | width: ~"calc(100% - 45px)"; | |||
|
278 | } | |||
|
279 | } | |||
|
280 | ||||
174 | .right-content { // similar to form fields |
|
281 | .right-content { // similar to form fields | |
175 | float: left; |
|
282 | float: left; | |
176 | display: block; |
|
283 | display: block; | |
177 |
width: |
|
284 | width: ~"calc(40% - 20px)"; | |
178 | margin: 0 0 0 -15%; |
|
285 | text-align: right; | |
179 | padding: 0 0 0 15%; |
|
286 | margin: 15px 20px 15px 0; | |
180 |
|
287 | |||
181 | .truncate-wrap, |
|
288 | .truncate-wrap, | |
182 | .truncate { |
|
289 | .truncate { | |
@@ -187,11 +294,49 b'' | |||||
187 | .commit-long { |
|
294 | .commit-long { | |
188 | overflow-x: auto; |
|
295 | overflow-x: auto; | |
189 | } |
|
296 | } | |
|
297 | ||||
|
298 | .commit-info { | |||
|
299 | margin-top: 7px; | |||
|
300 | } | |||
|
301 | ||||
|
302 | .summary-tag, | |||
|
303 | .summary-tagtag, | |||
|
304 | .summary-branchtag, | |||
|
305 | .summary-booktag, | |||
|
306 | .summary-metatag, | |||
|
307 | .summary-perm_tag { | |||
|
308 | background:transparent; | |||
|
309 | border: none; | |||
|
310 | box-shadow: none; | |||
|
311 | margin-left: 10px; | |||
|
312 | font-size: 13px; | |||
|
313 | } | |||
|
314 | ||||
|
315 | .summary-tag span, | |||
|
316 | .summary-tag i, | |||
|
317 | .summary-tag a { | |||
|
318 | color: @grey1; | |||
|
319 | } | |||
|
320 | ||||
|
321 | } | |||
|
322 | .commit { | |||
|
323 | color: @grey1; | |||
|
324 | margin-bottom: 5px; | |||
|
325 | white-space: pre; | |||
190 | } |
|
326 | } | |
191 | .commit.truncate-wrap { |
|
327 | .commit.truncate-wrap { | |
192 | overflow:hidden; |
|
328 | overflow:hidden; | |
193 | text-overflow: ellipsis; |
|
329 | text-overflow: ellipsis; | |
194 | } |
|
330 | } | |
|
331 | .commit-author { | |||
|
332 | color: @grey1; | |||
|
333 | } | |||
|
334 | .commit-date { | |||
|
335 | color: @grey4; | |||
|
336 | } | |||
|
337 | .fieldset-text-line { | |||
|
338 | line-height: 36px; | |||
|
339 | } | |||
195 | } |
|
340 | } | |
196 |
|
341 | |||
197 | // expand commit message |
|
342 | // expand commit message | |
@@ -214,19 +359,46 b'' | |||||
214 |
|
359 | |||
215 | .comments-show { display: inline; } |
|
360 | .comments-show { display: inline; } | |
216 | .comments-hide { display: none; } |
|
361 | .comments-hide { display: none; } | |
217 |
|
362 | |||
218 | &.comments-visible { |
|
363 | &.comments-visible { | |
219 | .comments-show { display: none; } |
|
364 | .comments-show { display: none; } | |
220 | .comments-hide { display: inline; } |
|
365 | .comments-hide { display: inline; } | |
221 | } |
|
366 | } | |
222 | } |
|
367 | } | |
223 |
|
368 | |||
224 | // Quick Start section |
|
369 | // Quick Start section | |
|
370 | ||||
|
371 | .empty-repo { | |||
|
372 | border: 1px solid #EAEAEA; | |||
|
373 | border-bottom: 0; | |||
|
374 | border-radius: @border-radius; | |||
|
375 | padding: 0 20px; | |||
|
376 | } | |||
|
377 | ||||
|
378 | .empty-repo h3, .quick_start p { | |||
|
379 | margin-bottom: 10px; | |||
|
380 | } | |||
|
381 | ||||
|
382 | .quick_start pre { | |||
|
383 | background: #FCFEFF; | |||
|
384 | border: 1px solid #CBDBEB; | |||
|
385 | box-shadow: @button-shadow; | |||
|
386 | padding: 10px 15px; | |||
|
387 | border-radius: 4px; | |||
|
388 | color: @grey2; | |||
|
389 | } | |||
|
390 | ||||
|
391 | .clear-fix { | |||
|
392 | clear: both; | |||
|
393 | } | |||
|
394 | ||||
225 | .quick_start { |
|
395 | .quick_start { | |
226 | float: left; |
|
|||
227 | display: block; |
|
396 | display: block; | |
228 | position: relative; |
|
397 | position: relative; | |
229 | width: 100%; |
|
398 | border: 1px solid #EAEAEA; | |
|
399 | border-top: 0; | |||
|
400 | border-radius: @border-radius; | |||
|
401 | padding: 0 20px; | |||
230 |
|
402 | |||
231 | // adds some space to make copy and paste easier |
|
403 | // adds some space to make copy and paste easier | |
232 | .left-label, |
|
404 | .left-label, | |
@@ -235,6 +407,7 b'' | |||||
235 | } |
|
407 | } | |
236 | } |
|
408 | } | |
237 |
|
409 | |||
|
410 | ||||
238 | .submodule { |
|
411 | .submodule { | |
239 | .summary-detail { |
|
412 | .summary-detail { | |
240 | width: 100%; |
|
413 | width: 100%; | |
@@ -250,23 +423,32 b'' | |||||
250 | display: block; |
|
423 | display: block; | |
251 | width: 100%; |
|
424 | width: 100%; | |
252 | margin: 0; |
|
425 | margin: 0; | |
253 | padding: @space 0 10px 0; |
|
426 | ||
254 | border-top: @border-thickness solid @border-default-color; |
|
427 | .file-filename { | |
|
428 | float:left; | |||
|
429 | padding: 10px; | |||
|
430 | } | |||
255 |
|
431 | |||
256 | .stats { |
|
432 | .file-stats { | |
257 | float: left; |
|
433 | padding: 10px; | |
|
434 | float:right; | |||
258 | } |
|
435 | } | |
259 | .stats-filename { |
|
436 | ||
260 | font-size: 120%; |
|
437 | ||
261 | } |
|
|||
262 | .stats-first-item { |
|
438 | .stats-first-item { | |
263 | padding: 0px 0px 0px 3px; |
|
439 | padding: 0px 0px 0px 3px; | |
264 | } |
|
440 | } | |
265 |
|
441 | |||
|
442 | .stats-info { | |||
|
443 | font-size: 11px; | |||
|
444 | color: @grey4; | |||
|
445 | } | |||
|
446 | ||||
266 | .buttons { |
|
447 | .buttons { | |
267 | float: right; |
|
448 | float: right; | |
268 | text-align: right; |
|
449 | text-align: right; | |
269 | color: @grey4; |
|
450 | color: @grey4; | |
|
451 | padding: 10px; | |||
270 | } |
|
452 | } | |
271 |
|
453 | |||
272 | .file-container { |
|
454 | .file-container { | |
@@ -286,6 +468,25 b'' | |||||
286 | .repo-size { |
|
468 | .repo-size { | |
287 | margin-bottom: .5em; |
|
469 | margin-bottom: .5em; | |
288 | } |
|
470 | } | |
289 |
|
471 | |||
290 | } |
|
472 | } | |
291 |
|
473 | |||
|
474 | .rctable.repo_summary { | |||
|
475 | border: 1px solid #eaeaea; | |||
|
476 | border-radius: 2px; | |||
|
477 | border-collapse: inherit; | |||
|
478 | border-bottom: 0; | |||
|
479 | ||||
|
480 | th { | |||
|
481 | background: @grey7; | |||
|
482 | border-bottom: 0; | |||
|
483 | } | |||
|
484 | ||||
|
485 | td { | |||
|
486 | border-color: #eaeaea; | |||
|
487 | } | |||
|
488 | ||||
|
489 | td.td-status { | |||
|
490 | padding: 0 0 0 10px; | |||
|
491 | } | |||
|
492 | } |
@@ -33,7 +33,7 b' table.dataTable {' | |||||
33 | td { |
|
33 | td { | |
34 | height: auto; |
|
34 | height: auto; | |
35 | max-width: 20%; |
|
35 | max-width: 20%; | |
36 |
padding: .65em |
|
36 | padding: .65em 0 .65em 1em; | |
37 | vertical-align: middle; |
|
37 | vertical-align: middle; | |
38 | border-bottom: @border-thickness solid @grey5; |
|
38 | border-bottom: @border-thickness solid @grey5; | |
39 | white-space: normal; |
|
39 | white-space: normal; | |
@@ -103,6 +103,11 b' table.dataTable {' | |||||
103 | } |
|
103 | } | |
104 | } |
|
104 | } | |
105 |
|
105 | |||
|
106 | &.td-icon { | |||
|
107 | min-width: 20px; | |||
|
108 | width: 20px; | |||
|
109 | } | |||
|
110 | ||||
106 | &.td-hash { |
|
111 | &.td-hash { | |
107 | min-width: 80px; |
|
112 | min-width: 80px; | |
108 | width: 200px; |
|
113 | width: 200px; | |
@@ -113,6 +118,12 b' table.dataTable {' | |||||
113 | } |
|
118 | } | |
114 | } |
|
119 | } | |
115 |
|
120 | |||
|
121 | &.td-graphbox { | |||
|
122 | width: 100px; | |||
|
123 | max-width: 100px; | |||
|
124 | min-width: 100px; | |||
|
125 | } | |||
|
126 | ||||
116 | &.td-time { |
|
127 | &.td-time { | |
117 | width: 160px; |
|
128 | width: 160px; | |
118 | white-space: nowrap; |
|
129 | white-space: nowrap; | |
@@ -408,29 +419,11 b' table.trending_language_tbl {' | |||||
408 |
|
419 | |||
409 | .trending_language { |
|
420 | .trending_language { | |
410 | position: relative; |
|
421 | position: relative; | |
411 | width: 100%; |
|
|||
412 | height: 19px; |
|
|||
413 | overflow: hidden; |
|
422 | overflow: hidden; | |
414 | background-color: @grey6; |
|
423 | color: @text-color; | |
|
424 | width: 400px; | |||
415 |
|
425 | |||
416 | span, b{ |
|
426 | .lang-bar { | |
417 | position: absolute; |
|
|||
418 | display: block; |
|
|||
419 | height: 12px; |
|
|||
420 | margin-bottom: 0px; |
|
|||
421 | white-space: pre; |
|
|||
422 | padding: floor(@basefontsize/4); |
|
|||
423 | top: 0; |
|
|||
424 | left: 0; |
|
|||
425 | } |
|
|||
426 |
|
||||
427 | span{ |
|
|||
428 | color: @text-color; |
|
|||
429 | z-index: 0; |
|
|||
430 | min-width: 20px; |
|
|||
431 | } |
|
|||
432 |
|
||||
433 | b { |
|
|||
434 | z-index: 1; |
|
427 | z-index: 1; | |
435 | overflow: hidden; |
|
428 | overflow: hidden; | |
436 | background-color: @rcblue; |
|
429 | background-color: @rcblue; | |
@@ -442,6 +435,9 b' table.trending_language_tbl {' | |||||
442 |
|
435 | |||
443 | // Changesets |
|
436 | // Changesets | |
444 | #changesets.rctable { |
|
437 | #changesets.rctable { | |
|
438 | th { | |||
|
439 | padding: 0 1em 0.65em 0; | |||
|
440 | } | |||
445 |
|
441 | |||
446 | // td must be fixed height for graph |
|
442 | // td must be fixed height for graph | |
447 | td { |
|
443 | td { |
@@ -13,15 +13,19 b'' | |||||
13 | font-size: (-1 + @basefontsize); //fit in tables |
|
13 | font-size: (-1 + @basefontsize); //fit in tables | |
14 | line-height: .9em; |
|
14 | line-height: .9em; | |
15 | border: none; |
|
15 | border: none; | |
|
16 | box-shadow: @button-shadow; | |||
16 | .border-radius(@border-radius); |
|
17 | .border-radius(@border-radius); | |
17 | font-family: @text-regular; |
|
18 | font-family: @text-regular; | |
18 | background-image: none; |
|
19 | background-image: none; | |
19 | color: @grey4; |
|
20 | color: @grey4; | |
20 |
.border ( @border-thickness-tags, @grey |
|
21 | .border ( @border-thickness-tags, @grey5 ); | |
21 | white-space: nowrap; |
|
22 | white-space: nowrap; | |
22 | a { |
|
23 | a { | |
23 | color: inherit; |
|
24 | color: inherit; | |
24 | text-decoration: underline; |
|
25 | ||
|
26 | &:hover { | |||
|
27 | color: @grey2; | |||
|
28 | } | |||
25 |
|
29 | |||
26 | i, |
|
30 | i, | |
27 | [class^="icon-"]:before, |
|
31 | [class^="icon-"]:before, | |
@@ -29,6 +33,10 b'' | |||||
29 | text-decoration: none; |
|
33 | text-decoration: none; | |
30 | } |
|
34 | } | |
31 | } |
|
35 | } | |
|
36 | ||||
|
37 | &:hover { | |||
|
38 | border-color: @grey4; | |||
|
39 | } | |||
32 | } |
|
40 | } | |
33 |
|
41 | |||
34 | .tag0 { .border ( @border-thickness-tags, @grey4 ); color:@grey4; } |
|
42 | .tag0 { .border ( @border-thickness-tags, @grey4 ); color:@grey4; } |
@@ -46,6 +46,13 b' h6, .h6 { font-size: 1em; font-weight' | |||||
46 | .breadcrumbs { |
|
46 | .breadcrumbs { | |
47 | font-size: @repo-title-fontsize; |
|
47 | font-size: @repo-title-fontsize; | |
48 | margin: 0; |
|
48 | margin: 0; | |
|
49 | width: ~"calc(100% - 180px)"; | |||
|
50 | float: left; | |||
|
51 | ||||
|
52 | h4 { | |||
|
53 | font-size: @basefontsize; | |||
|
54 | margin-bottom: 15px; | |||
|
55 | } | |||
49 | } |
|
56 | } | |
50 |
|
57 | |||
51 | .breadcrumbs_light { |
|
58 | .breadcrumbs_light { | |
@@ -156,6 +163,19 b' pre {' | |||||
156 |
|
163 | |||
157 | // Emphasis & misc |
|
164 | // Emphasis & misc | |
158 | // ------------------------- |
|
165 | // ------------------------- | |
|
166 | .discreet { | |||
|
167 | color: @grey4; | |||
|
168 | font-size: 85%; | |||
|
169 | font-weight: normal; | |||
|
170 | ||||
|
171 | a { | |||
|
172 | color: @grey4; | |||
|
173 | ||||
|
174 | &:hover { | |||
|
175 | color: @rcdarkblue; | |||
|
176 | } | |||
|
177 | } | |||
|
178 | } | |||
159 |
|
179 | |||
160 | small, |
|
180 | small, | |
161 | .small { |
|
181 | .small { | |
@@ -231,7 +251,8 b' mark,' | |||||
231 | clear: both; |
|
251 | clear: both; | |
232 | float: left; |
|
252 | float: left; | |
233 | width: 100%; |
|
253 | width: 100%; | |
234 | margin: @pagepadding/2 0 @pagepadding; |
|
254 | margin: @pagepadding/2 0 @pagepadding/4; | |
|
255 | min-height: 25px; | |||
235 |
|
256 | |||
236 | .breadcrumbs { |
|
257 | .breadcrumbs { | |
237 | float: left; |
|
258 | float: left; | |
@@ -285,6 +306,11 b' mark,' | |||||
285 | } |
|
306 | } | |
286 |
|
307 | |||
287 | .title-content { |
|
308 | .title-content { | |
|
309 | ||||
|
310 | &.repo-title { | |||
|
311 | float: none | |||
|
312 | } | |||
|
313 | ||||
288 | float: left; |
|
314 | float: left; | |
289 | margin: 0; |
|
315 | margin: 0; | |
290 | padding: 0; |
|
316 | padding: 0; |
@@ -8,13 +8,15 b'' | |||||
8 | @rchighlightblue: lighten(@rcblue, 35%); |
|
8 | @rchighlightblue: lighten(@rcblue, 35%); | |
9 |
|
9 | |||
10 | // Secondary Colors (greyscale) |
|
10 | // Secondary Colors (greyscale) | |
11 | @grey1: #202020; //midnight |
|
11 | @black: #000; | |
12 | @grey2: #323232; //charcoal |
|
12 | @white: #fff; | |
13 | @grey3: #666666; //tungsten |
|
13 | @grey1: #2B2B2D; //midnight | |
14 | @grey4: #979797; //light grey |
|
14 | @grey2: #5C5C5C; //charcoal | |
|
15 | @grey3: #7E7F7F; //tungsten | |||
|
16 | @grey4: #949494; //light grey | |||
15 | @grey5: #dbd9da; //greyish |
|
17 | @grey5: #dbd9da; //greyish | |
16 | @grey6: #eeeeee; //silver |
|
18 | @grey6: #eeeeee; //silver | |
17 |
@grey7: # |
|
19 | @grey7: #F5F5F5; //light silver | |
18 |
|
20 | |||
19 | // special for navigation |
|
21 | // special for navigation | |
20 | @nav-grey: #CDCCCD; |
|
22 | @nav-grey: #CDCCCD; | |
@@ -102,7 +104,7 b'' | |||||
102 |
|
104 | |||
103 | // FORMS (new) |
|
105 | // FORMS (new) | |
104 | @border-thickness-inputs: 1px; |
|
106 | @border-thickness-inputs: 1px; | |
105 |
@input-padding: |
|
107 | @input-padding: .6em; //needs to match button padding | |
106 | // TODO: johbo: Needed for working computation of paddings around labels etc. |
|
108 | // TODO: johbo: Needed for working computation of paddings around labels etc. | |
107 | // Expected to be replaced once we are done with the form refactoring. |
|
109 | // Expected to be replaced once we are done with the form refactoring. | |
108 | @input-padding-px: 12px; |
|
110 | @input-padding-px: 12px; | |
@@ -128,10 +130,14 b'' | |||||
128 | @fields-input-l: 720px; |
|
130 | @fields-input-l: 720px; | |
129 |
|
131 | |||
130 | // BUTTONS |
|
132 | // BUTTONS | |
131 |
@button-padding: . |
|
133 | @button-padding: .7em; | |
|
134 | @button-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.07); | |||
|
135 | ||||
|
136 | // DROPDOWNS | |||
|
137 | @dropdown-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.07); | |||
132 |
|
138 | |||
133 | // DEFAULT WIDTHS |
|
139 | // DEFAULT WIDTHS | |
134 |
@wrapper-maxwidth: 1 |
|
140 | @wrapper-maxwidth: 1600px; | |
135 | @sidebar-width: 145px; |
|
141 | @sidebar-width: 145px; | |
136 | @sidebar-all-width: @sidebar-width + 2 * @sidebarpadding; |
|
142 | @sidebar-all-width: @sidebar-width + 2 * @sidebarpadding; | |
137 | @sidebar-small-width: 100px; |
|
143 | @sidebar-small-width: 100px; |
1 | NO CONTENT: modified file, binary diff hidden |
|
NO CONTENT: modified file, binary diff hidden |
@@ -1,78 +1,134 b'' | |||||
1 | <?xml version="1.0" standalone="no"?> |
|
1 | <?xml version="1.0" standalone="no"?> | |
2 | <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> |
|
2 | <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> | |
3 | <svg xmlns="http://www.w3.org/2000/svg"> |
|
3 | <svg xmlns="http://www.w3.org/2000/svg"> | |
4 |
<metadata>Copyright (C) 201 |
|
4 | <metadata>Copyright (C) 2019 by original authors @ fontello.com</metadata> | |
5 | <defs> |
|
5 | <defs> | |
6 | <font id="rcicons" horiz-adv-x="1000" > |
|
6 | <font id="rcicons" horiz-adv-x="1000" > | |
7 | <font-face font-family="rcicons" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" /> |
|
7 | <font-face font-family="rcicons" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" /> | |
8 | <missing-glyph horiz-adv-x="1000" /> |
|
8 | <missing-glyph horiz-adv-x="1000" /> | |
9 | <glyph glyph-name="directory" unicode="" d="M929 511v-393q0-51-37-88t-88-37h-679q-51 0-88 37t-37 88v536q0 51 37 88t88 37h179q51 0 88-37t37-88v-18h375q51 0 88-37t37-88z" horiz-adv-x="928.6" /> |
|
9 | <glyph glyph-name="delete" unicode="" d="M515 758c-211 0-384-173-384-385 0-211 173-385 384-385s385 174 385 385c0 212-173 385-385 385z m227-416c0-15-11-27-30-27h-397c-15 0-30 12-30 27v62c0 15 11 27 30 27h397c15 0 30-12 30-27v-62z" horiz-adv-x="1000" /> | |
10 |
|
10 | |||
11 | <glyph glyph-name="bookmark" unicode="" d="M767-96l-234 267c-8 12-25 12-33 0l-233-267c-17-17-42-4-42 25v842c0 17 13 33 25 33h533c13 0 25-16 25-33v-838c0-29-25-46-41-29z" horiz-adv-x="1000" /> |
|
11 | <glyph glyph-name="ok" unicode="" d="M515 735c-211 0-384-173-384-385 0-211 173-385 384-385s385 174 385 385c0 212-173 385-385 385z m239-296l-304-304c-11-12-27-12-38 0l-139 138c-11 12-11 27 0 39l42 42c12 11 27 11 39 0l58-58c11-11 27-11 38 0l219 219c12 12 27 12 39 0l42-42c15-8 15-23 4-34z" horiz-adv-x="1000" /> | |
|
12 | ||||
|
13 | <glyph glyph-name="comment" unicode="" d="M131 65v504c0 73 58 131 131 131h507c73 0 131-58 131-131v-288c0-73-58-131-131-131h-496c-4 0-11-4-15-8l-93-92c-11-15-34-4-34 15z m131 574c-39 0-73-31-73-74v-411l46 46c4 4 7 8 15 8h519c39 0 73 31 73 73v288c0 39-30 73-73 73h-507z" horiz-adv-x="1000" /> | |||
12 |
|
14 | |||
13 | <glyph glyph-name="branch" unicode="" d="M829 579c0 67-54 121-121 121s-125-54-125-121c0-41 21-79 59-104-17-129-125-167-192-179v287c38 21 63 59 63 105 0 66-55 120-125 120s-121-54-121-120c0-46 25-84 62-105v-458c-37-25-62-62-62-108 0-67 54-121 121-121s120 54 120 121c0 46-25 83-62 104v50c58 8 154 29 225 100 50 50 79 117 87 196 46 25 71 66 71 112z m-441 150c20 0 41-16 41-41s-16-42-41-42c-21 0-42 17-42 42s21 41 42 41z m0-750c-21 0-42 17-42 42 0 21 17 42 42 42 20 0 41-17 41-42 0-25-16-42-41-42z m320 642c21 0 42-17 42-42s-17-41-42-41c-20 0-41 16-41 41s16 42 41 42z" horiz-adv-x="1000" /> |
|
15 | <glyph glyph-name="bookmark" unicode="" d="M780-140l-260 290c-10 10-25 10-35 0l-260-295c-20-20-45-5-45 30v930c-5 20 10 35 25 35h590c15 0 30-15 30-35v-925c0-35-30-50-45-30z" horiz-adv-x="1000" /> | |
|
16 | ||||
|
17 | <glyph glyph-name="branch" unicode="" d="M875 600c0 76-58 134-134 134s-134-58-134-134c0-49 27-89 63-112-18-142-139-183-210-196v313c45 22 71 62 71 111 0 76-58 134-134 134s-134-58-134-134c0-49 27-94 67-116v-500c-40-22-67-67-67-116 0-76 58-134 134-134s134 58 134 134c0 49-26 94-67 116v58c63 9 166 31 246 112 58 58 89 129 98 214 40 22 67 67 67 116z m-478 161c27 0 45-18 45-45s-18-45-45-45-44 18-44 45 18 45 44 45z m0-822c-26 0-44 18-44 45s18 45 44 45 45-18 45-45-22-45-45-45z m344 706c27 0 45-18 45-45s-18-45-45-45-45 18-45 45 23 45 45 45z" horiz-adv-x="1000" /> | |||
14 |
|
18 | |||
15 | <glyph glyph-name="lock" unicode="" d="M817 429h-50v109c0 8 0 12 0 20 0 5 0 9 0 13 0 4 0 4 0 8 0 9-4 17-4 25 0 4 0 9-5 9-4 8-4 16-8 25 0 0 0 0 0 4-4 8-8 21-12 29 0 4-5 4-5 4-4 8-8 13-12 21 0 4-4 4-4 8-4 4-9 13-13 17 0 4-4 4-4 8-8 9-12 13-21 21 0 0-4 0-4 4-8 4-12 13-21 17-4 0-4 4-8 4-8 4-13 8-21 13-4 0-4 4-8 4-9 4-17 8-29 12 0 0 0 0 0 0-9 4-21 4-30 9-4 0-4 0-8 0-4 0-8 0-8 0 0 0-4 0-4 0 0 0-5 0-5 0 0 0 0 0 0 0 0 0 0 0 0 0-4 0-8 0-8 0-4 0-4 0-8 0-4 0-4 0-9 0 0 0 0 0 0 0-4 0-8 0-8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0-4 0-4 0 0 0-4 0-4 0-4 0-9 0-9 0-4 0-8 0-8 0-8 0-21-5-29-9 0 0 0 0 0 0-38-12-50-16-58-21-5 0-5-4-9-4-4 0-12-4-16-8-5-4-9-4-9-4-8-4-16-13-25-17 0 0-4 0-4-4-4-4-12-13-21-21 0 0-4-4-4-8-4 0-12-9-17-13 0-4-4-4-4-8-4-8-8-13-12-21 0 0-4-4-4-4-5-13-9-21-13-29 0-4 0-4-4-9-4-8-4-12-8-20 0-5 0-9-5-9 0-8-4-16-4-25 0-4 0-4 0-8 0-4 0-8 0-13 0-8 0-12 0-20v-109h-46c-16 0-29-12-29-29v-475c0-17 13-29 29-29h638c17 0 29 12 29 29v475c-4 17-17 29-33 29z m-459 109c0 66 50 125 113 137 0 0 4 0 4 0 8 0 17 0 21 4 0 0 4 0 4 0 0 0 0 0 0 0 8 0 17 0 21-4 0 0 4 0 4 0 63-12 113-71 113-137v-109h-280v109z" horiz-adv-x="1000" /> |
|
19 | <glyph glyph-name="tag" unicode="" d="M460 788l-366 8c-18 0-31-13-31-31l13-366c0-9 4-13 9-22l464-465c14-13 31-13 45 0l352 353c14 14 14 31 0 45l-468 469c-5 4-14 9-18 9z m-103-224c0-35-31-67-67-67-35 0-67 32-67 67 0 36 32 67 67 67s67-26 67-67z" horiz-adv-x="1000" /> | |
|
20 | ||||
|
21 | <glyph glyph-name="lock" unicode="" d="M813 426h-54v107c0 9 0 13 0 18 0 4 0 9 0 13 0 5 0 5 0 9 0 9 0 14-4 23 0 4 0 4-5 9 0 8-4 13-9 22 0 0 0 4-4 4-5 9-9 18-14 27 0 0-4 5-4 5 4 8 0 17-5 22 0 4-4 4-4 9-5 4-9 13-14 18 0 0-4 4-4 4-9 9-13 14-22 22 0 0-5 0-5 5-4 4-13 9-22 13-5 0-5 5-9 5-4 4-13 9-18 9-4 0-4 4-9 4-9 5-18 9-27 9 0 0 0 0 0 0-9 5-17 5-31 9-4 0-4 0-9 0-4 0-4 0-9 0 0 0-4 0-4 0 0 0-5 0-5 0 0 0 0 0 0 0 0 0 0 0 0 0-4 0-9 0-9 0 0 0-4 0-4 0-4 0-4 0-9 0 0 0 0 0 0 0-4 0-9 0-9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0-4 0-4 0 0 0-5 0-5 0-4 0-4 0-9 0-4 0-4 0-9 0-9 0-22-4-31-9 0 0 0 0 0 0-22 0-36-4-45-9-4 0-4-4-8-4-5-5-9-5-18-9 0-5-5-5-5-5-9-4-18-9-22-18 0 0-5 0-5-4-9-4-13-9-22-18 0 0-4-4-4-4-5-5-9-14-14-18 0-5-4-5-4-9-9-5-14-14-14-18-4 0-4-4-4-4-5-9-9-18-13-27 0 0 0-5-5-5 0-13-4-18-4-26 0-5 0-5-5-9 0-9-4-14-4-23 0-4 0-4 0-9 0-4 0-9 0-13 0-5 0-13 0-18v-107h-49c-18 0-27-13-27-27v-464c0-18 13-27 27-27h620c18 0 27 13 27 27v464c4 18-9 27-22 27z m-451 107c0 67 49 121 111 134 0 0 0 0 5 0 9 0 13 0 22 0 0 0 5 0 5 0 0 0 0 0 0 0 8 0 13 0 22 0 0 0 0 0 4 0 63-13 112-67 112-134v-107h-281v107z" horiz-adv-x="1000" /> | |||
16 |
|
22 | |||
17 | <glyph glyph-name="unlock" unicode="" d="M817 429h-459v109c0 66 50 125 113 137 0 0 4 0 4 0 8 0 17 0 21 4 0 0 4 0 4 0 0 0 0 0 4 0 9 0 17 0 25-4 0 0 0 0 0 0 9 0 17-4 25-8 0 0 4 0 4-4 9-5 13-9 21-13 0 0 0 0 0 0 9-4 13-8 17-17 0 0 4-4 4-4 4-4 8-8 13-16 0 0 0-5 4-5 4-8 8-12 12-20 0 0 0-5 4-5 5-8 5-12 5-20 0 0 0-5 0-5 0 0 0 0 0-4 4-12 16-25 29-25h66c17 0 30 17 30 34 0 0 0 0 0 0 0 4 0 4 0 4 0 8-5 16-5 25 0 4 0 8-4 8-4 8-4 17-8 21 4 17 4 17 4 21-4 8-8 16-12 29 0 4-5 4-5 4-4 8-8 13-12 21 0 4-4 4-4 8-4 4-9 13-13 17 0 4-4 4-4 8-8 9-12 13-21 21 0 0-4 0-4 4-8 4-12 13-21 17-12-4-16-4-16-4-9 4-13 8-21 12-4 0-4 4-9 4-8 5-16 9-29 13 0 0 0 0 0 0-8 4-21 4-29 8-4 0-4 0-8 0-9 0-17 0-25 4-4 0-9 0-9 0-8 0-16 0-29 0 0 0-4 0-4 0-8 0-21-4-29-4-8 0-13-4-21-4 0 0-4 0-4 0-113-42-188-142-188-262v-109h-50c-16 0-29-12-29-29v-475c0-17 13-29 29-29h634c16 0 29 12 29 29v475c0 17-13 29-29 29z" horiz-adv-x="1000" /> |
|
23 | <glyph glyph-name="unlock" unicode="" d="M781 415h-385v93c0 57 43 104 96 115 0 0 0 0 4 0 8 0 12 0 19 0 0 0 4 0 4 0 0 0 0 0 4 0 8 0 16 0 23-4 0 0 0 0 0 0 8 0 12-4 19-7 0 0 4 0 4-4 4-4 12-4 16-8 0 0 0 0 0 0 4-4 11-8 15-11 0 0 4-4 4-4 4-4 8-8 11-12 0 0 0 0 4-4 4-4 8-11 12-19 0 0 0-4 0-4 4-4 4-11 4-15 0 0 0-4 0-4 0 0 0 0 0-4 4-11 11-19 23-19h57c16 0 27 11 24 27 0 0 0 0 0 0 0 0 0 4 0 4 0 7-4 11-4 19 0 4 0 4-4 8 0 15 0 19-4 27 0 0 0 3-4 3-4 8-8 16-11 23 0 0-4 4-4 4-4 8-8 12-12 16 0 4-4 4-4 7-3 4-7 12-11 16 0 0-4 4-4 4-8 7-12 11-19 19 0 0-4 0-4 4-4 4-12 7-19 11-4 0-4 4-8 4-4 4-12 8-15 8-4 0-4 4-8 4-8 3-15 7-23 7 0 0 0 0 0 0-8 4-16 4-27 8-4 0-4 0-8 0-7 0-11 0-19 4-4 0-8 0-8 0-7 0-15 0-23 0 0 0-4 0-4 0-7 0-15-4-27-4-3 0-11-4-15-4 0 0-4 0-4 0-92-27-157-115-157-215v-93h-43c-15 0-23-11-23-23v-400c0-15 12-23 23-23h535c15 0 23 12 23 23v400c4 12-8 23-23 23z" horiz-adv-x="1000" /> | |
18 |
|
24 | |||
19 | <glyph glyph-name="delete" unicode="" d="M500 804c-254 0-454-204-454-454 0-250 204-454 454-454s454 204 454 454c0 250-204 454-454 454z m267-491c0-17-17-34-34-34h-466c-21 0-34 13-34 34v75c0 16 17 33 34 33h466c21 0 34-13 34-33v-75z" horiz-adv-x="1000" /> |
|
25 | <glyph glyph-name="feed" unicode="" d="M842 739h-653c-35 0-58-27-58-58v-658c0-31 27-58 58-58h657c31 0 58 27 58 58v658c-4 31-31 58-62 58z m-534-666c-39 0-73 31-73 73s30 73 73 73c38 0 73-30 73-73s-35-73-73-73z m246-11c-35 0-58 27-58 57 0 112-88 200-200 200-31 0-65 27-65 58 0 35 23 62 54 62l11 0c177 0 319-143 319-320-3-30-30-57-61-57z m196 0c-35 0-58 27-58 57 0 220-180 400-400 400-30 0-65 27-65 62 0 34 23 61 54 61l11 0c285 0 520-230 520-519 0-34-27-61-62-61z" horiz-adv-x="1000" /> | |
|
26 | ||||
|
27 | <glyph glyph-name="left" unicode="" d="M692 773l70-69c11-12 11-27 0-39l-289-288c-11-12-11-27 0-38l296-297c12-11 12-27 0-38l-69-69c-11-12-27-12-38 0l-404 404c-12 11-12 26 0 38l396 396c11 12 27 12 38 0z" horiz-adv-x="1000" /> | |||
20 |
|
28 | |||
21 | <glyph glyph-name="ok" unicode="" d="M500 804c-250 0-454-204-454-454 0-250 204-454 454-454s454 204 454 454c0 250-204 454-454 454z m283-346l-358-358c-12-12-33-12-46 0l-162 163c-13 12-13 33 0 45l50 50c12 13 33 13 46 0l66-66c13-13 34-13 46 0l263 262c12 13 33 13 45 0l50-50c13-16 13-37 0-46z" horiz-adv-x="1000" /> |
|
29 | <glyph glyph-name="right" unicode="" d="M339-65l-74 69c-11 11-11 27 0 38l289 289c11 11 11 27 0 38l-296 296c-12 12-12 27 0 39l69 69c12 12 27 12 38 0l404-404c12-11 12-27 0-38l-392-396c-12-12-31-12-38 0z" horiz-adv-x="1000" /> | |
|
30 | ||||
|
31 | <glyph glyph-name="down" unicode="" d="M704 454l-173-219c-8-8-23-8-27 0l-173 219c-8 11 0 31 15 31h346c12 0 20-20 12-31z" horiz-adv-x="1000" /> | |||
22 |
|
32 | |||
23 | <glyph glyph-name="comment" unicode="" d="M42-13v601c0 87 71 154 154 154h600c87 0 154-71 154-154v-342c0-88-71-154-154-154h-583c-9 0-13-4-17-9l-113-112c-12-17-41-4-41 16z m158 684c-46 0-87-38-87-88v-487l54 54c4 4 12 8 16 8h617c46 0 88 38 88 88v342c0 45-38 87-88 87h-600z" horiz-adv-x="1000" /> |
|
33 | <glyph glyph-name="folder" unicode="" d="M929 511v-393q0-51-37-88t-88-37h-679q-51 0-88 37t-37 88v536q0 51 37 88t88 37h179q51 0 88-37t37-88v-18h375q51 0 88-37t37-88z" horiz-adv-x="928.6" /> | |
|
34 | ||||
|
35 | <glyph glyph-name="folder-open" unicode="" d="M1049 319q0-17-18-37l-187-221q-24-28-67-48t-81-20h-607q-19 0-33 7t-15 24q0 17 17 37l188 221q24 28 67 48t80 20h607q19 0 34-7t15-24z m-192 192v-90h-464q-53 0-110-26t-92-67l-188-221-2-3q0 2-1 7t0 7v536q0 51 37 88t88 37h179q51 0 88-37t37-88v-18h303q52 0 88-37t37-88z" horiz-adv-x="1071.4" /> | |||
24 |
|
36 | |||
25 | <glyph glyph-name="feed" unicode="" d="M888 804h-780c-37 0-66-29-66-66v-780c0-37 29-66 66-66h780c37 0 66 29 66 66v780c0 37-29 66-66 66z m-638-787c-46 0-83 37-83 83 0 46 37 88 87 88 46 0 88-38 88-88-4-46-46-83-92-83z m292-13c-38 0-71 34-71 71 0 133-108 238-238 238-37 0-75 29-75 66 0 38 25 71 63 71l12 0c209 0 380-171 380-379 0-33-30-67-71-67z m237 0c-37 0-71 34-71 71 0 263-212 475-475 475-37 0-75 29-75 67 0 37 25 71 63 71l12 0c338 0 613-275 613-613 4-37-29-71-67-71z" horiz-adv-x="1000" /> |
|
37 | <glyph glyph-name="trash-empty" unicode="" d="M286 439v-321q0-8-5-13t-13-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q8 0 13-5t5-13z m143 0v-321q0-8-5-13t-13-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q8 0 13-5t5-13z m142 0v-321q0-8-5-13t-12-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q7 0 12-5t5-13z m72-404v529h-500v-529q0-12 4-22t8-15 6-5h464q2 0 6 5t8 15 4 22z m-375 601h250l-27 65q-4 5-9 6h-177q-6-1-10-6z m518-18v-36q0-8-5-13t-13-5h-54v-529q0-46-26-80t-63-34h-464q-37 0-63 33t-27 79v531h-53q-8 0-13 5t-5 13v36q0 8 5 13t13 5h172l39 93q9 21 31 35t44 15h178q23 0 44-15t30-35l39-93h173q8 0 13-5t5-13z" horiz-adv-x="785.7" /> | |
26 |
|
38 | |||
27 | <glyph glyph-name="right" unicode="" d="M308-96l-75 75c-12 13-12 29 0 42l309 308c12 13 12 29 0 42l-317 312c-12 13-12 30 0 42l75 75c13 13 29 13 42 0l433-433c13-13 13-29 0-42l-425-421c-8-12-29-12-42 0z" horiz-adv-x="1000" /> |
|
39 | <glyph glyph-name="group" unicode="" d="M962 219v-15c0-4-4-12-12-12h-161-4c-16 20-39 39-77 43-35 7-54 15-69 23 7 7 19 11 30 15 46 8 58 23 66 35 7 11 7 23 0 38-8 16-31 43-31 81 0 38 0 104 73 104h8 7c73-4 77-66 73-104 0-38-23-69-30-81-8-15-8-27 0-38 7-12 23-27 65-35 54-4 62-46 62-54 0 0 0 0 0 0z m-708-15c15 15 38 31 69 35 39 7 62 15 73 26-7 8-19 16-34 20-47 7-58 23-66 34-7 12-7 23 0 39 8 15 31 42 31 81 0 38 0 103-73 103h-8-11c-73-3-77-65-73-103 0-39 23-70 30-81 8-16 8-27 0-39-7-11-23-27-65-34-46-8-54-50-54-54 0 0 0 0 0 0v-16c0-3 4-11 12-11h161 8z m454 11c-73 12-96 35-108 54-11 20-11 39 0 62 12 23 50 69 54 131 4 61 0 165-119 169h-16-15c-119-4-123-104-119-166 4-61 38-107 54-130 11-23 11-43 0-62-12-19-35-42-108-54-73-11-85-80-85-88 0 0 0 0 0 0v-23c0-8 8-16 16-16h257 258c8 0 15 8 15 16v23c0 0 0 0 0 0-3 4-11 73-84 84z" horiz-adv-x="1000" /> | |
|
40 | ||||
|
41 | <glyph glyph-name="remove" unicode="" d="M724 112q0-22-15-38l-76-76q-16-15-38-15t-38 15l-164 165-164-165q-16-15-38-15t-38 15l-76 76q-16 16-16 38t16 38l164 164-164 164q-16 16-16 38t16 38l76 76q16 16 38 16t38-16l164-164 164 164q16 16 38 16t38-16l76-76q15-15 15-38t-15-38l-164-164 164-164q15-15 15-38z" horiz-adv-x="785.7" /> | |||
28 |
|
42 | |||
29 | <glyph glyph-name="left" unicode="" d="M683 800l75-75c13-12 13-29 0-42l-308-308c-12-12-12-29 0-42l317-316c12-13 12-30 0-42l-75-75c-13-13-29-13-42 0l-433 433c-13 13-13 30 0 42l425 425c12 13 29 13 41 0z" horiz-adv-x="1000" /> |
|
43 | <glyph glyph-name="fork" unicode="" d="M792 654c0 58-46 100-100 100-57 0-100-46-100-100 0-35 20-65 47-85-12-84-70-123-127-142-58 15-116 54-127 142 27 20 46 50 46 85 0 58-46 100-100 100s-108-42-108-100c0-39 23-73 54-89 12-107 77-188 181-226v-162c-31-19-50-50-50-88 0-58 46-101 100-101s100 47 100 101c0 38-19 69-50 88v162c104 38 169 119 181 226 30 20 53 50 53 89z m-465 35c19 0 35-16 35-35s-16-31-35-31-35 12-35 31 16 35 35 35z m181-635c-19 0-35 15-35 35s16 34 35 34c19 0 34-15 34-34s-15-35-34-35z m184 635c20 0 35-16 35-35s-15-31-35-31-34 16-34 35 15 31 34 31z" horiz-adv-x="1000" /> | |
|
44 | ||||
|
45 | <glyph glyph-name="more" unicode="" d="M546 435h-100c-15 0-27-12-27-27v-100c0-16 12-27 27-27h100c16 0 27 11 27 27v100c0 15-11 27-27 27z m0 307h-100c-15 0-27-11-27-27v-100c0-15 12-26 27-26h100c16 0 27 11 27 26v100c0 16-11 27-27 27z m0-615h-100c-15 0-27-12-27-27v-100c0-15 12-27 27-27h100c16 0 27 12 27 27v100c0 15-11 27-27 27z" horiz-adv-x="1000" /> | |||
30 |
|
46 | |||
31 | <glyph glyph-name="arrow_down" unicode="" d="M950 542l-412-521c-17-21-50-21-67 0l-417 521c-21 25-4 71 34 71h829c37 0 58-46 33-71z" horiz-adv-x="1000" /> |
|
47 | <glyph glyph-name="search" unicode="" d="M643 386q0 103-73 176t-177 74-177-74-73-176 73-177 177-73 177 73 73 177z m286-465q0-29-22-50t-50-21q-30 0-50 21l-191 191q-100-69-223-69-80 0-153 31t-125 84-84 125-31 153 31 152 84 126 125 84 153 31 153-31 125-84 84-126 31-152q0-123-69-223l191-191q21-21 21-51z" horiz-adv-x="928.6" /> | |
|
48 | ||||
|
49 | <glyph glyph-name="scissors" unicode="" d="M536 350q14 0 25-11t10-25-10-25-25-10-25 10-11 25 11 25 25 11z m167-36l283-222q16-11 14-31-3-20-19-28l-72-36q-7-4-16-4-10 0-17 4l-385 216-62-36q-4-3-7-3 8-28 6-54-4-43-31-83t-74-69q-74-47-154-47-76 0-124 44-51 47-44 116 4 42 31 82t73 69q74 47 155 47 46 0 84-18 5 8 13 13l68 40-68 41q-8 5-13 12-38-17-84-17-81 0-155 47-46 30-73 69t-31 82q-3 33 8 63t36 52q47 44 124 44 80 0 154-47 46-29 74-68t31-83q2-27-6-54 3-1 7-3l62-37 385 216q7 5 17 5 9 0 16-4l72-36q16-9 19-28 2-20-14-32z m-380 145q26 24 12 61t-59 65q-52 33-107 33-42 0-63-20-26-24-12-60t59-66q51-33 107-33 41 0 63 20z m-47-415q45 28 59 65t-12 60q-22 20-63 20-56 0-107-33-45-28-59-65t12-60q21-20 63-20 55 0 107 33z m99 342l54-33v7q0 20 18 31l8 4-44 26-15-14q-1-2-5-6t-7-7q-1-1-2-2t-2-1z m125-125l54-18 410 321-71 36-429-240v-64l-89-53 5-5q1-1 4-3 2-2 6-7t6-6l15-15z m393-232l71 35-290 228-99-77q-1-2-7-4z" horiz-adv-x="1000" /> | |||
32 |
|
50 | |||
33 | <glyph glyph-name="git" unicode="" d="M896 808h-792c-33 0-62-29-62-62v-792c0-33 29-62 62-62h792c33 0 62 29 62 62v792c0 33-29 62-62 62z m-4-850h-788v788h788v-788z m-667 338c-4 12-8 25-8 42 0 12 0 25 4 37 4 13 8 21 12 33s13 21 21 30 17 16 25 20c13 0 21 5 34 9 8 4 20 4 33 4 8 0 21 0 29-4 8 0 17-4 21-9 8-4 12-8 17-12 4-4 8-8 12-13l-17-20c-4-5-4-5-8-9-4 0-8 0-12 4-5 5-9 5-13 9-4 0-8 4-8 4-4 0-9 4-13 4-4 0-8 0-12 0-9 0-21-4-29-8-9-4-17-13-21-17-4-8-13-17-13-29-4-13-4-25-4-38 0-8 0-20 4-29 4-8 4-16 13-21 4-4 8-8 16-12 9-4 13-4 21-4 9 0 13 0 17 0 4 0 8 4 17 4l4 37h-25c-4 0-4 0-9 5s0 8 0 12l5 29h79l-13-100c-4-4-12-8-16-12-9-4-13-4-21-9-9 0-13-4-21-4-8 0-17 0-25 0-13 0-29 4-42 9-12 4-21 12-29 20-12 13-21 21-25 38z m300-63h-54l29 234h54l-29-234z m146 192h-58l4 42h171l-5-42h-58l-25-192h-54l25 192z" horiz-adv-x="1000" /> |
|
51 | <glyph glyph-name="download" unicode="" d="M714 100q0 15-10 25t-25 11-25-11-11-25 11-25 25-11 25 11 10 25z m143 0q0 15-10 25t-26 11-25-11-10-25 10-25 25-11 26 11 10 25z m72 125v-179q0-22-16-37t-38-16h-821q-23 0-38 16t-16 37v179q0 22 16 38t38 16h259l75-76q33-32 76-32t76 32l76 76h259q22 0 38-16t16-38z m-182 318q10-23-8-39l-250-250q-10-11-25-11t-25 11l-250 250q-17 16-8 39 10 21 33 21h143v250q0 15 11 25t25 11h143q14 0 25-11t10-25v-250h143q24 0 33-21z" horiz-adv-x="928.6" /> | |
|
52 | ||||
|
53 | <glyph glyph-name="doc" unicode="" d="M819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 17-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 16t-16 37v233h-429v-858h715z" horiz-adv-x="857.1" /> | |||
34 |
|
54 | |||
35 | <glyph glyph-name="hg" unicode="" d="M896 808h-792c-33 0-62-29-62-62v-792c0-33 29-62 62-62h792c33 0 62 29 62 62v792c-4 33-29 62-62 62z m-4-850h-788v788h788v-788z m-571 275h-54l29 234h54l-12-100h83l12 100h55l-30-234h-54l13 100h-84l-12-100z m217 63c-5 12-9 25-9 42 0 12 0 25 4 37 5 13 9 21 13 33 4 9 12 21 21 25s16 17 25 21c8 4 21 9 29 13 12 4 21 4 33 4 9 0 21 0 29-4s17-4 21-9c9-4 13-8 17-12 4-4 8-8 12-13l-16-20c-4-5-4-5-9-9-4 0-8 0-12 4-4 5-8 5-13 9-4 0-8 4-8 4-4 0-8 4-12 4-5 0-9 0-13 0-8 0-21-4-29-8-8-4-17-13-21-17s-12-17-12-29c-5-13-5-25-5-38 0-8 0-20 5-29 4-8 4-16 12-21 4-4 8-8 17-12 8-4 12-4 21-4 8 0 12 0 16 0 4 0 9 4 17 4l4 37h-21c-4 0-4 0-8 5s-4 4 0 8l4 29h79l-12-100c-4-4-13-8-17-12-8-5-12-5-21-9-8 0-12-4-21-4-8 0-16 0-25 0-12 0-29 4-41 8-13 5-21 13-29 21-13 17-21 29-25 42z" horiz-adv-x="1000" /> |
|
55 | <glyph glyph-name="cog" unicode="" d="M571 350q0 59-41 101t-101 42-101-42-42-101 42-101 101-42 101 42 41 101z m286 61v-124q0-7-4-13t-11-7l-104-16q-10-30-21-51 19-27 59-77 6-6 6-13t-5-13q-15-21-55-61t-53-39q-7 0-14 5l-77 60q-25-13-51-21-9-76-16-104-4-16-20-16h-124q-8 0-14 5t-6 12l-16 103q-27 9-50 21l-79-60q-6-5-14-5-8 0-14 6-70 64-92 94-4 5-4 13 0 6 5 12 8 12 28 37t30 40q-15 28-23 55l-102 15q-7 1-11 7t-5 13v124q0 7 5 13t10 7l104 16q8 25 22 51-23 32-60 77-6 7-6 14 0 5 5 12 15 20 55 60t53 40q7 0 15-5l77-60q24 13 50 21 9 76 17 104 3 16 20 16h124q7 0 13-5t7-12l15-103q28-9 51-20l79 59q5 5 13 5 7 0 14-5 72-67 92-95 4-5 4-12 0-7-4-13-9-12-29-37t-30-40q15-28 23-54l102-16q7-1 12-7t4-13z" horiz-adv-x="857.1" /> | |
|
56 | ||||
|
57 | <glyph glyph-name="cog-alt" unicode="" d="M500 350q0 59-42 101t-101 42-101-42-42-101 42-101 101-42 101 42 42 101z m429-286q0 29-22 51t-50 21-50-21-21-51q0-29 21-50t50-21 51 21 21 50z m0 572q0 29-22 50t-50 21-50-21-21-50q0-30 21-51t50-21 51 21 21 51z m-215-235v-103q0-6-4-11t-8-6l-87-14q-6-19-18-42 19-27 50-64 4-6 4-11 0-7-4-11-12-17-46-50t-43-33q-7 0-12 4l-64 50q-21-11-43-17-6-60-13-87-4-13-17-13h-104q-6 0-11 4t-5 10l-13 85q-19 6-42 18l-66-50q-4-4-11-4-6 0-12 4-80 75-80 90 0 5 4 10 5 8 23 30t26 34q-13 24-20 46l-85 13q-5 1-9 5t-4 11v104q0 5 4 10t9 6l86 14q7 19 18 42-19 27-50 64-4 6-4 11 0 7 4 12 12 16 46 49t44 33q6 0 12-4l64-50q19 10 43 18 6 60 13 86 3 13 16 13h104q6 0 11-4t6-10l13-85q19-6 42-17l65 49q5 4 12 4 6 0 11-4 81-75 81-90 0-4-4-10-7-9-24-30t-25-34q13-27 19-46l85-12q6-2 9-6t4-11z m357-298v-78q0-9-83-17-6-15-16-29 28-63 28-77 0-2-2-4-68-40-69-40-5 0-26 27t-29 37q-11-1-17-1t-17 1q-7-11-29-37t-25-27q-1 0-69 40-3 2-3 4 0 14 29 77-10 14-17 29-83 8-83 17v78q0 9 83 18 7 16 17 29-29 63-29 77 0 2 3 4 2 1 19 11t33 19 17 9q4 0 25-26t29-38q12 1 17 1t17-1q28 40 51 63l4 1q2 0 69-39 2-2 2-4 0-14-28-77 9-13 16-29 83-9 83-18z m0 572v-78q0-9-83-18-6-15-16-29 28-63 28-77 0-2-2-4-68-39-69-39-5 0-26 26t-29 38q-11-1-17-1t-17 1q-7-12-29-38t-25-26q-1 0-69 39-3 2-3 4 0 14 29 77-10 14-17 29-83 9-83 18v78q0 9 83 17 7 16 17 29-29 63-29 77 0 2 3 4 2 1 19 11t33 19 17 9q4 0 25-26t29-37q12 1 17 1t17-1q28 39 51 62l4 1q2 0 69-39 2-2 2-4 0-14-28-77 9-13 16-29 83-8 83-17z" horiz-adv-x="1071.4" /> | |||
36 |
|
58 | |||
37 | <glyph glyph-name="svn" unicode="" d="M896 808h-792c-33 0-62-29-62-62v-796c0-29 29-58 62-58h796c33 0 63 29 63 62v792c-5 33-34 62-67 62z m0-854h-792v792h788v-792z m-717 296c-4 4-8 8-12 13l21 25c0 0 4 4 4 4 4 0 4 0 8 0 4 0 4 0 8-4 5 0 5-5 9-9 4-4 8-4 12-8 4 0 9-4 17-4 8 0 17 4 21 8 4 4 8 13 8 25 0 4 0 8-4 13-4 4-4 4-8 8-5 4-9 4-13 4-4 0-8 4-17 4-4 0-12 4-16 9-4 4-9 8-13 12-4 4-8 8-8 17-4 4-4 12-4 21 0 12 0 20 4 29 4 8 8 16 17 25 8 8 16 12 25 16 12 9 25 13 37 13 8 0 13 0 21 0 8 0 12-4 17-4 4-4 12-4 16-9 4-8 9-12 9-16l-17-21c0-4-4-4-4-4 0 0-4 0-9 0-4 0-4 0-8 4-4 0-4 4-8 4-4 0-9 4-13 4-4 0-8 4-12 4-4 0-9 0-13 0-4 0-8-4-8-4-4-4-4-4-4-8 0-4 0-8 0-13 0-4 0-8 4-12 4-4 4-4 8-8 4-5 9-5 13-5 4 0 8-4 16-4 5-4 13-4 17-8 4-4 8-8 13-13s8-8 8-16c4-4 4-13 4-21 0-13 0-25-4-33-4-13-8-21-17-30-8-8-16-12-29-16-12-4-25-9-37-9-9 0-13 0-21 5s-13 4-21 8c-4-4-13 0-17 4z m250-17l-54 234h42c4 0 8 0 12-4 4-5 4-5 4-9l25-129c0-4 5-12 5-17 0-8 4-12 4-20 4 8 4 12 8 20 4 9 4 13 8 17l55 129c0 0 0 4 4 4 0 0 4 5 4 5 0 0 4 0 4 4 0 0 4 0 4 0h42l-117-238h-50z m221 0h-46l29 238h30c4 0 4 0 4 0 0 0 4 0 4 0 0 0 4 0 4-4 0 0 0-4 4-4l84-146c0 4 0 8 0 12 0 4 0 9 0 9l16 133h46l-29-238h-29c-4 0-9 0-9 0-4 0-4 5-8 9l-83 146c0-5 0-5 0-9 0-4 0-4 0-8l-17-138z" horiz-adv-x="1000" /> |
|
59 | <glyph glyph-name="eye" unicode="" d="M929 314q-85 132-213 197 34-58 34-125 0-103-73-177t-177-73-177 73-73 177q0 67 34 125-128-65-213-197 75-114 187-182t242-68 243 68 186 182z m-402 215q0 11-8 19t-19 7q-70 0-120-50t-50-119q0-11 8-19t19-8 19 8 8 19q0 48 34 82t82 34q11 0 19 8t8 19z m473-215q0-19-11-38-78-129-210-206t-279-77-279 77-210 206q-11 19-11 38t11 39q78 128 210 205t279 78 279-78 210-205q11-20 11-39z" horiz-adv-x="1000" /> | |
|
60 | ||||
|
61 | <glyph glyph-name="eye-off" unicode="" d="M310 105l43 79q-48 35-76 88t-27 114q0 67 34 125-128-65-213-197 94-144 239-209z m217 424q0 11-8 19t-19 7q-70 0-120-50t-50-119q0-11 8-19t19-8 19 8 8 19q0 48 34 82t82 34q11 0 19 8t8 19z m202 106q0-4 0-5-59-105-176-316t-176-316l-28-50q-5-9-15-9-7 0-75 39-9 6-9 16 0 7 25 49-80 36-147 96t-117 137q-11 17-11 38t11 39q86 131 212 207t277 76q50 0 100-10l31 54q5 9 15 9 3 0 10-3t18-9 18-10 18-10 10-7q9-5 9-15z m21-249q0-78-44-142t-117-91l157 280q4-25 4-47z m250-72q0-19-11-38-22-36-61-81-84-96-194-149t-234-53l41 74q119 10 219 76t169 171q-65 100-158 164l35 63q53-36 102-85t81-103q11-19 11-39z" horiz-adv-x="1000" /> | |||
38 |
|
62 | |||
39 | <glyph glyph-name="group" unicode="" d="M958 221v-17c0-4-4-8-8-8h-167-4c-16 21-41 37-79 46-37 4-58 16-71 25 9 8 17 12 34 16 45 9 62 21 66 38s9 25 0 37c-8 13-33 46-33 84 0 41 0 104 75 108h8 13c75-4 79-71 75-108 0-42-25-71-34-84-8-16-8-25 0-37s21-29 67-38c54-12 58-58 58-62 0 0 0 0 0 0z m-725-17c17 17 38 34 71 38 42 8 63 16 75 25-8 8-21 16-37 21-46 8-63 20-67 37-8 13-8 25 0 38 8 12 33 45 33 83 0 42 0 104-75 108h-12-8c-75-4-80-71-80-108 0-42 25-71 34-83 8-17 8-25 0-38-9-12-21-29-67-37-50-9-54-50-54-59 0 0 0 0 0 0v-16c0-5 4-9 8-9h167 12z m463 13c-75 12-96 37-108 58-13 21-13 42 0 63 12 25 50 70 54 133 4 62 0 167-121 175h-21-17c-116-4-120-113-120-175 4-63 41-113 54-133 12-25 12-42 0-63-13-21-38-46-109-58-75-13-87-84-87-92 0 0 0 0 0 0v-25c0-8 8-17 17-17h262 267c8 0 16 9 16 17v25c0 0 0 0 0 0 0 8-8 79-87 92z" horiz-adv-x="1000" /> |
|
63 | <glyph glyph-name="cancel-circled2" unicode="" d="M612 248l-81-82q-6-5-13-5t-13 5l-76 77-77-77q-5-5-13-5t-12 5l-82 82q-6 6-6 13t6 13l76 76-76 77q-6 5-6 12t6 13l82 82q5 5 12 5t13-5l77-77 76 77q6 5 13 5t13-5l81-82q6-5 6-13t-6-12l-76-77 76-76q6-6 6-13t-6-13z m120 102q0 83-41 152t-110 111-152 41-153-41-110-111-41-152 41-152 110-111 153-41 152 41 110 111 41 152z m125 0q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" /> | |
|
64 | ||||
|
65 | <glyph glyph-name="cancel-circled" unicode="" d="M641 224q0 14-10 25l-101 101 101 101q10 11 10 25 0 15-10 26l-51 50q-10 11-25 11-15 0-25-11l-101-101-101 101q-11 11-25 11-16 0-26-11l-50-50q-11-11-11-26 0-14 11-25l101-101-101-101q-11-11-11-25 0-15 11-26l50-50q10-11 26-11 14 0 25 11l101 101 101-101q10-11 25-11 15 0 25 11l51 50q10 11 10 26z m216 126q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" /> | |||
40 |
|
66 | |||
41 | <glyph glyph-name="folder" unicode="" d="M742 17h-659c-12 0-25 8-33 16-8 13-8 25 0 38l179 342c4 12 17 20 34 20h658c12 0 25-8 33-16 9-13 9-25 0-38l-179-341c-8-13-21-21-33-21z m-596 75h575l142 266h-580l-137-266z m-29-38h-75v550c0 21 16 38 37 38h246c8 0 21-4 25-13l54-54h325c21 0 38-17 38-37v-105h-75v67h-300c-9 0-17 4-25 8l-59 59h-191v-513z" horiz-adv-x="1000" /> |
|
67 | <glyph glyph-name="plus" unicode="" d="M786 439v-107q0-22-16-38t-38-15h-232v-233q0-22-16-37t-38-16h-107q-22 0-38 16t-15 37v233h-232q-23 0-38 15t-16 38v107q0 23 16 38t38 16h232v232q0 22 15 38t38 16h107q23 0 38-16t16-38v-232h232q23 0 38-16t16-38z" horiz-adv-x="785.7" /> | |
42 |
|
68 | |||
43 | <glyph glyph-name="fork" unicode="" d="M838 688c0 66-55 120-121 120-67 0-121-54-121-120 0-42 21-80 54-100-12-100-83-146-150-167-71 21-137 67-150 167 33 20 54 58 54 100 0 66-54 120-121 120s-120-54-120-120c0-46 29-88 66-109 13-129 88-225 213-271v-191c-38-21-63-59-63-100 0-67 54-121 121-121s121 54 121 121c0 46-25 83-58 104v192c120 45 200 137 212 270 33 17 63 59 63 105z m-555 37c21 0 42-17 42-42s-17-41-42-41-41 16-41 41 21 42 41 42z m217-750c-21 0-42 17-42 42 0 21 17 41 42 41s42-16 42-41c0-25-21-42-42-42z m217 750c21 0 41-17 41-42s-16-41-41-41-42 16-42 41 21 42 42 42z" horiz-adv-x="1000" /> |
|
69 | <glyph glyph-name="plus-circled" unicode="" d="M679 314v72q0 14-11 25t-25 10h-143v143q0 15-11 25t-25 11h-71q-15 0-25-11t-11-25v-143h-143q-14 0-25-10t-10-25v-72q0-14 10-25t25-10h143v-143q0-15 11-25t25-11h71q15 0 25 11t11 25v143h143q14 0 25 10t11 25z m178 36q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" /> | |
|
70 | ||||
|
71 | <glyph glyph-name="minus-circled" unicode="" d="M679 314v72q0 14-11 25t-25 10h-429q-14 0-25-10t-10-25v-72q0-14 10-25t25-10h429q14 0 25 10t11 25z m178 36q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" /> | |||
44 |
|
72 | |||
45 | <glyph glyph-name="more" unicode="" d="M592 408v-120c0-17-13-34-34-34h-120c-17 0-34 13-34 34v120c0 17 13 34 34 34h120c21 0 34-17 34-34z m-34 400h-120c-17 0-34-12-34-33v-121c0-16 13-33 34-33h120c17 0 34 12 34 33v121c0 21-13 33-34 33z m0-733h-120c-17 0-34-12-34-33v-121c0-17 13-34 34-34h120c17 0 34 13 34 34v121c0 16-13 33-34 33z" horiz-adv-x="1000" /> |
|
73 | <glyph glyph-name="minus" unicode="" d="M786 439v-107q0-22-16-38t-38-15h-678q-23 0-38 15t-16 38v107q0 23 16 38t38 16h678q23 0 38-16t16-38z" horiz-adv-x="785.7" /> | |
|
74 | ||||
|
75 | <glyph glyph-name="info-circled" unicode="" d="M571 82v89q0 8-5 13t-12 5h-54v286q0 8-5 13t-13 5h-178q-8 0-13-5t-5-13v-89q0-8 5-13t13-5h53v-179h-53q-8 0-13-5t-5-13v-89q0-8 5-13t13-5h250q7 0 12 5t5 13z m-71 500v89q0 8-5 13t-13 5h-107q-8 0-13-5t-5-13v-89q0-8 5-13t13-5h107q8 0 13 5t5 13z m357-232q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" /> | |||
46 |
|
76 | |||
47 | <glyph glyph-name="comment-add" unicode="" d="M48-12v593c0 86 69 155 154 155h596c85 0 154-69 154-155v-338c0-86-69-155-154-155h-584c-7 0-12-2-16-7l-110-110c-14-14-40-4-40 17z m154 679c-47 0-85-38-85-86v-486l52 53c5 4 10 7 17 7h612c47 0 85 38 85 86v340c0 48-38 86-85 86h-596z m479-284l0 48c0 5-5 10-10 10l-114 0c-5 0-9 4-9 9v114c0 5-5 10-10 10h-47c-5 0-10-5-10-10v-114c0-5-5-9-10-9h-114c-5 0-9-5-9-10v-48c0-4 4-9 9-9h114c5 0 10-5 10-10l0-114c0-5 5-9 10-9l47 0c5 0 10 4 10 9v114c0 5 4 10 9 10h114c5-3 10 2 10 9z" horiz-adv-x="1000" /> |
|
77 | <glyph glyph-name="upload" unicode="" d="M714 29q0 14-10 25t-25 10-25-10-11-25 11-25 25-11 25 11 10 25z m143 0q0 14-10 25t-26 10-25-10-10-25 10-25 25-11 26 11 10 25z m72 125v-179q0-22-16-38t-38-16h-821q-23 0-38 16t-16 38v179q0 22 16 38t38 15h238q12-31 39-51t62-20h143q34 0 61 20t40 51h238q22 0 38-15t16-38z m-182 361q-9-22-33-22h-143v-250q0-15-10-25t-25-11h-143q-15 0-25 11t-11 25v250h-143q-23 0-33 22-9 22 8 39l250 250q10 10 25 10t25-10l250-250q18-17 8-39z" horiz-adv-x="928.6" /> | |
|
78 | ||||
|
79 | <glyph glyph-name="home" unicode="" d="M888 336q16-16 11-27t-27-11l-84 0 0-310q0-14-1-21t-8-13-23-6l-204 0 0 310-204 0 0-310-194 0q-28 0-35 10t-7 30l0 310-84 0q-22 0-27 11t11 27l400 402q16 16 38 16t38-16z" horiz-adv-x="900" /> | |||
48 |
|
80 | |||
49 | <glyph glyph-name="comment_toggle" unicode="" d="M798 736h-596c-85 0-154-69-154-155v-593c0-19 22-29 36-20 2 1 5 3 7 5l109 109c2 2 5 4 8 5 2 1 4 1 6 1h584c85 0 154 69 154 155v338c0 86-69 155-154 155z m-680-639v484c0 47 38 85 86 85h476c-86-84-504-511-509-515l-53-54z" horiz-adv-x="1000" /> |
|
81 | <glyph glyph-name="git" unicode="" d="M929 844h-858c-36 0-65-30-65-65v-857c0-36 30-65 65-65h857c36 0 65 30 65 65v857c1 35-29 65-64 65z m-729-549c4-11 9-20 14-27 6-8 14-14 22-18 9-4 19-6 29-6 9 0 16 1 24 2 7 2 14 4 20 7l6 51h-27c-4 0-8 1-10 4-2 1-3 5-3 7l5 39h105l-16-131c-8-7-16-12-25-15-9-4-18-8-28-10-10-3-18-5-30-7-10-1-21-2-33-2-20 0-38 4-54 11-16 8-30 18-41 30-12 13-20 28-27 45-6 18-10 36-10 56 0 18 3 34 7 50 3 17 10 30 17 44 8 14 16 25 26 36 10 12 22 20 34 28 13 7 26 14 41 17 15 4 30 7 47 7 13 0 25-2 36-4 11-3 21-6 29-10 8-4 16-9 22-14 6-5 13-11 18-16l-20-31c-4-5-9-8-14-9-5-1-10 0-16 4-5 3-10 6-14 8-5 3-9 5-14 7-5 1-10 2-15 3-5 2-11 2-17 2-14 0-27-3-38-9-11-6-21-14-29-25-8-10-15-24-18-38-5-15-7-31-7-48-1-14 2-27 4-38z m336-102h-71l39 315h71l-39-315z m343 258h-80l-33-258h-70l32 258h-80l7 57h231l-7-57z" horiz-adv-x="1000" /> | |
50 |
|
82 | |||
51 | <glyph glyph-name="git-inv" unicode="" d="M929 844h-858c-36 0-65-30-65-65v-857c0-36 30-65 65-65h857c36 0 65 30 65 65v857c1 35-29 65-64 65z m-729-549c4-11 9-20 14-27 6-8 14-14 22-18 9-4 19-6 29-6 9 0 16 1 24 2 7 2 14 4 20 7l6 51h-27c-4 0-8 1-10 4-2 1-3 5-3 7l5 39h105l-16-131c-8-7-16-12-25-15-9-4-18-8-28-10-10-3-18-5-30-7-10-1-21-2-33-2-20 0-38 4-54 11-16 8-30 18-41 30-12 13-20 28-27 45-6 18-10 36-10 56 0 18 3 34 7 50 3 17 10 30 17 44 8 14 16 25 26 36 10 12 22 20 34 28 13 7 26 14 41 17 15 4 30 7 47 7 13 0 25-2 36-4 11-3 21-6 29-10 8-4 16-9 22-14 6-5 13-11 18-16l-20-31c-4-5-9-8-14-9-5-1-10 0-16 4-5 3-10 6-14 8-5 3-9 5-14 7-5 1-10 2-15 3-5 2-11 2-17 2-14 0-27-3-38-9-11-6-21-14-29-25-8-10-15-24-18-38-5-15-7-31-7-48-1-14 2-27 4-38z m336-102h-71l39 315h71l-39-315z m343 258h-80l-33-258h-70l32 258h-80l7 57h231l-7-57z" horiz-adv-x="1000" /> |
|
83 | <glyph glyph-name="hg" unicode="" d="M927 841h-853c-36 0-65-29-65-65v-853c0-36 29-65 65-65h853c36 0 65 29 65 65v853c0 36-29 65-65 65z m-483-648h-70l16 133h-113l-17-133h-70l39 313h70l-16-132h113l16 132h71l-39-313z m177 101c3-11 8-20 14-27 7-8 14-14 23-18 8-4 18-6 28-6 9 0 16 1 23 3 7 1 14 3 20 6l6 51h-27c-4 0-7 1-9 3-3 3-3 6-3 9l5 39h104l-16-131c-8-6-16-11-25-15-9-5-18-8-27-11-9-2-19-4-30-6-10-1-21-2-33-2-19 0-37 4-53 11-16 7-30 17-41 29-11 13-20 28-26 45-7 17-10 35-10 55 0 17 2 34 6 50 4 15 10 30 17 43 7 14 16 26 26 36 10 11 22 20 34 28 13 7 27 13 41 17 14 4 30 7 46 7 13 0 25-2 36-4 11-3 20-6 29-10 8-4 16-9 23-14 7-5 13-11 18-17l-23-28c-4-5-8-8-13-9-5-1-11 0-16 3-5 4-10 7-14 9-5 3-9 5-14 6-4 2-9 3-14 4-5 1-11 1-17 1-14 0-27-3-38-8-11-6-21-14-29-25-8-10-15-23-19-38-5-15-7-31-7-49 0-13 2-26 5-37z" horiz-adv-x="1000" /> | |
|
84 | ||||
|
85 | <glyph glyph-name="svn" unicode="" d="M933 841h-852c-36 0-65-29-65-65v-853c0-36 29-65 65-65h852c36 0 66 29 66 65v853c0 36-30 65-66 65z m-765-438c3-4 7-7 13-10 5-3 11-6 18-8 7-3 14-5 21-8 7-3 14-6 21-10 7-4 13-9 18-14 5-6 10-13 13-20 3-8 5-18 5-29 0-16-3-30-8-44-6-14-14-26-24-37-10-10-22-18-37-24-15-7-31-10-49-10-9 0-18 1-27 3s-18 5-27 9c-8 4-16 8-23 13-7 5-13 10-18 17l25 32c2 3 4 5 7 6 3 2 6 3 9 3 4 0 8-2 12-4 3-3 8-6 12-10 5-3 10-6 16-9 6-3 14-4 23-4 13 0 23 3 30 10 7 7 10 18 10 32 0 6-1 12-4 16-4 4-8 7-13 10-5 3-11 6-18 8-7 2-14 5-21 7-7 3-14 6-21 9-6 4-12 8-18 14-5 6-9 13-12 21-3 8-5 18-5 30 0 14 3 28 8 40 5 13 12 25 22 35 10 9 22 17 36 23 14 6 29 9 47 9 9 0 17-1 26-3s16-4 23-8c7-3 14-7 20-11 6-5 11-10 15-15l-21-29c-2-3-5-6-7-7-3-2-6-3-9-3-3 0-7 1-10 3-3 3-7 5-11 8-4 2-9 4-14 7-5 2-12 3-19 3-6 0-12-1-17-3-5-2-9-4-12-8-4-3-6-7-8-11-1-5-2-10-2-15 0-5 2-10 5-14z m312-210h-64l-77 313h57c6 0 10-1 14-4 4-3 6-6 7-11l32-173c2-7 4-14 6-23 1-8 3-17 4-26 3 9 6 18 9 26 4 9 7 16 11 23l73 173c1 2 2 4 4 6 2 2 4 3 6 5 2 1 4 2 7 3 3 1 5 1 8 1h57l-154-313z m423 0h-37c-5 0-10 1-13 2-4 2-7 5-10 9l-109 194c-1-4-1-8-1-12-1-4-1-7-1-10l-22-183h-62l39 313h37c3 0 6 0 8 0 2 0 4-1 5-1 2-1 3-2 4-4s3-3 5-5l110-194c0 5 0 10 1 14 0 5 1 9 1 13l21 177h62l-38-313z" horiz-adv-x="1000" /> | |||
52 |
|
86 | |||
53 | <glyph glyph-name="hg-inv" unicode="" d="M927 841h-853c-36 0-65-29-65-65v-853c0-36 29-65 65-65h853c36 0 65 29 65 65v853c0 36-29 65-65 65z m-483-648h-70l16 133h-113l-17-133h-70l39 313h70l-16-132h113l16 132h71l-39-313z m177 101c3-11 8-20 14-27 7-8 14-14 23-18 8-4 18-6 28-6 9 0 16 1 23 3 7 1 14 3 20 6l6 51h-27c-4 0-7 1-9 3-3 3-3 6-3 9l5 39h104l-16-131c-8-6-16-11-25-15-9-5-18-8-27-11-9-2-19-4-30-6-10-1-21-2-33-2-19 0-37 4-53 11-16 7-30 17-41 29-11 13-20 28-26 45-7 17-10 35-10 55 0 17 2 34 6 50 4 15 10 30 17 43 7 14 16 26 26 36 10 11 22 20 34 28 13 7 27 13 41 17 14 4 30 7 46 7 13 0 25-2 36-4 11-3 20-6 29-10 8-4 16-9 23-14 7-5 13-11 18-17l-23-28c-4-5-8-8-13-9-5-1-11 0-16 3-5 4-10 7-14 9-5 3-9 5-14 6-4 2-9 3-14 4-5 1-11 1-17 1-14 0-27-3-38-8-11-6-21-14-29-25-8-10-15-23-19-38-5-15-7-31-7-49 0-13 2-26 5-37z" horiz-adv-x="1000" /> |
|
87 | <glyph glyph-name="comment-add" unicode="" d="M952 258v317c0 7 0 13 0 20-1 12-4 24-8 36-7 22-20 43-37 59-16 17-36 30-58 37-12 4-25 7-37 8-7 1-13 1-19 1h-576c-13 0-26 0-38-2-13-2-25-5-36-10-22-9-41-23-57-40-15-18-27-39-33-62-3-12-5-25-5-38-1-13 0-26 0-39v-557c0-9 5-17 13-21 6-3 15-3 21 0 3 1 5 3 7 5 2 2 4 5 7 7 4 5 9 9 14 14l28 28c9 10 19 19 28 29 9 9 19 18 28 27 4 5 8 9 14 10 2 1 5 1 8 1h567c13 0 25 0 38 2 24 4 47 13 66 27 19 13 35 31 46 51 12 22 19 46 19 71 1 6 0 13 0 19z m-69 307v-317c0-7 0-13 0-19-1-6-3-13-5-18-4-10-9-20-16-28-15-17-37-27-59-28-7 0-13 0-19 0h-576c-7 0-13 0-20 0-3 0-6 0-9-1-3-1-5-2-7-4-2-2-4-4-6-6-3-2-5-4-7-7-5-4-10-9-14-14-10-9-19-18-28-28v485c0 12 2 24 7 35 4 10 10 19 18 27 16 16 38 25 60 25h590c6 0 12 0 18-1 22-3 42-15 56-33 7-9 12-20 15-31 1-5 2-12 2-18 1-6 0-13 0-19z m-214-117h-131c-4 0-11 8-11 12v126c0 8-8 16-12 16h-50c-7 0-15-8-15-12v-130c0-4-8-12-12-12h-126c-8 0-16-8-16-11v-50c0-8 8-16 12-16h127c7 0 15-7 15-11v-127c0-8 8-15 11-15h50c8 0 16 7 16 11v127c0 8 7 15 11 15h127c8 0 15 8 15 12v50c0 7-7 15-11 15z" horiz-adv-x="1000" /> | |
|
88 | ||||
|
89 | <glyph glyph-name="comment-toggle" unicode="" d="M798 736h-596c-85 0-154-69-154-155v-593c0-19 22-29 36-20 2 1 5 3 7 5l109 109c2 2 5 4 8 5 2 1 4 1 6 1h584c85 0 154 69 154 155v338c0 86-69 155-154 155z m-680-639v484c0 47 38 85 86 85h476c-86-84-504-511-509-515l-53-54z" horiz-adv-x="1000" /> | |||
54 |
|
90 | |||
55 | <glyph glyph-name="minus" unicode="" d="M895 269h-790c-5 0-10 5-10 10v142c0 5 5 10 10 10h793c5 0 9-5 9-10v-142c-2-5-7-10-12-10z" horiz-adv-x="1000" /> |
|
91 | <glyph glyph-name="rhodecode" unicode="" d="M175 633c-2-4-3-8-4-12-3-10-6-20-9-30-3-13-7-25-11-38-3-11-6-23-10-35-2-7-4-15-6-22-1-1-1-2-1-4 0 0 0 0 0 0 0-1 1-2 1-2 2-7 5-14 7-21 4-11 8-22 12-33 4-12 9-25 13-37 4-11 8-23 12-34 3-7 5-14 7-21 1-1 1-2 2-3 0-1 1-1 1-2 4-6 8-12 11-17 7-10 13-19 19-29 7-11 14-22 22-33 6-10 13-21 20-31 5-7 9-15 14-22 1-2 3-4 4-5 0-1 1-1 1-2 3-3 6-5 8-8 7-6 13-12 19-19 9-8 17-16 25-24 10-10 19-19 29-28 9-9 18-18 27-27 8-8 16-15 23-23 5-5 11-10 16-15 1-1 3-3 5-5 7-5 14-10 21-15 11-8 21-15 31-23 4-2 7-5 11-7 0-1 1-2 2-2 0 0 0-1 1 0 7 3 14 7 21 11 11 6 23 11 34 17 6 4 12 7 19 10 0 0 0 1 1 1 1 2 2 3 3 5 4 5 8 10 13 15 6 8 12 16 18 24 8 9 15 19 23 28 8 11 16 21 24 31 8 11 16 21 24 31 8 10 15 19 23 28 6 8 12 16 18 24 4 5 8 10 12 15 2 2 3 3 4 5 0 0 0 0 0 0-1 1-2 1-3 1-3 0-6 1-9 2-5 1-10 2-15 3-6 2-13 4-20 5-8 3-16 5-24 7-9 3-19 6-28 9-10 3-21 7-31 11-12 4-23 8-34 13-12 5-24 10-36 15-13 6-26 12-38 18-13 7-26 14-39 21-13 7-27 15-39 23-14 9-27 17-40 27-13 9-26 19-39 29-13 11-25 22-37 33-13 11-25 23-36 36-12 13-23 26-34 40-11 14-21 28-31 43-9 15-19 31-27 47 0 1 0 1 0 1z m-3 3c-1-5-3-9-4-14-3-10-7-21-10-32-4-12-8-25-12-37-3-10-6-20-9-30-1-3-2-6-3-8 0-1 0-2 0-2 1-5 3-10 5-15 3-10 6-20 10-30 4-12 8-24 12-37 4-12 8-24 12-36 3-9 6-18 9-26 1-3 1-5 2-8 0 0 1-1 1-2 2-4 5-8 7-12 5-10 10-19 15-28 6-11 12-23 19-34 6-11 12-22 18-33 4-8 8-15 12-23 1-2 2-4 4-6 4-5 8-9 13-14 7-8 15-16 23-24 9-10 18-20 26-29 9-9 17-18 25-26 5-6 10-11 15-17 2-1 3-3 5-5 5-5 11-11 17-17 9-8 17-17 26-26 9-9 18-18 27-27 7-7 14-14 21-21 2-2 3-3 5-5 0 0 1-1 1-1 0 0 1 0 1 0 11 2 22 3 32 5 9 1 17 2 26 3 0 0 1 1 1 1 1 1 2 3 4 4 4 5 9 10 13 15 7 8 14 15 20 22 9 9 17 18 25 27 9 10 18 20 27 30 8 9 17 19 26 29 8 9 16 17 24 26 7 7 13 15 20 22 4 5 8 9 13 14 1 1 2 2 3 3 0 1 1 1 1 1 0 1-3 1-3 1-3 1-7 2-10 3-4 2-9 3-14 5-6 2-13 4-19 6-8 3-16 6-24 9-9 3-18 7-27 11-10 4-20 8-30 13-11 5-22 10-33 16-12 5-23 11-35 18-12 6-24 13-36 20-12 8-25 16-37 24-13 8-25 17-37 26-13 10-25 19-38 29-12 11-24 21-36 33-12 11-24 23-35 35-11 13-22 25-33 39-10 13-21 27-30 42-10 15-19 30-27 45-9 16-17 32-24 48z m-2 10c-1-4-2-8-3-11-1-10-3-19-5-29-2-12-5-25-7-37-3-13-5-26-8-39-1-10-3-20-5-30-1-5-2-10-3-15 0-1 0-1 0-2 1-3 2-5 3-8 3-9 7-19 10-29 4-12 9-25 13-37 4-11 8-22 11-33 2-5 4-11 6-16 0-1 1-2 1-2 1-3 2-5 4-7 4-9 8-18 13-27 6-12 11-23 17-35 6-11 11-22 17-33 3-7 7-14 11-21 0-2 1-3 1-4 1-1 2-1 2-2 5-6 9-11 14-17 8-9 15-18 22-27 9-10 17-20 26-30 7-9 15-18 22-27 5-6 10-11 15-17 0-1 1-2 2-3 0 0 0 0 0 0 1-1 2-1 3-2 7-4 14-9 21-14 10-7 21-14 31-22 11-7 21-14 31-20 6-4 12-9 18-13 3-2 7-5 10-8 10-8 19-16 29-24 7-5 13-11 20-17 1 0 1 0 1 1 1 1 2 2 3 3 4 4 8 8 12 13 6 6 12 13 18 20 8 8 16 17 23 25 9 10 18 19 26 29 9 9 18 19 27 29 9 9 18 19 26 28 8 9 16 17 23 26 6 6 13 13 19 20 4 4 7 8 11 12 1 2 3 3 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0-3 1-3 1-3 1-6 2-9 2-5 2-10 4-15 5-6 2-12 5-18 7-8 3-16 6-24 9-8 4-17 8-26 12-10 4-20 9-30 13-11 6-22 11-32 16-12 6-23 13-35 19-12 7-23 14-35 21-13 8-25 16-37 24-12 8-25 17-37 26-12 9-24 19-36 29-13 10-25 21-36 32-12 11-24 22-35 34-12 12-22 25-33 38-11 13-21 26-30 40-10 14-19 29-28 44-9 15-17 30-24 46-4 10-8 20-12 30z m696 21c-2 4-5 7-9 9-5 3-11 5-16 8-11 4-23 9-34 13-23 8-47 14-71 20-24 6-49 12-74 17-25 6-50 10-76 15-25 4-50 8-75 10-13 1-26 1-39 0-6-1-13-2-19-3-6-1-13-2-19-3-26-4-51-9-77-14-25-5-50-10-75-16-25-5-49-12-74-20-12-4-24-9-36-13-6-3-11-5-17-8-3-1-6-2-9-3-3-1-5-2-8-4-4-2-7-5-10-9-1-2-2-4-3-7-1-3-2-6-3-9-4-11-7-24-9-36-5-24-7-49-6-74 0-13 1-25 3-38 1-12 3-25 5-37 5-25 12-50 20-74 4-12 8-24 13-36 4-11 10-22 15-33 10-21 21-42 34-62 12-20 25-39 39-58 14-19 28-37 43-55 16-18 33-36 50-54 17-18 34-35 52-52 18-17 36-33 55-49 10-7 19-15 28-22 10-8 19-15 28-23 2-2 5-4 7-7 0 0 1-1 1-1 0 0 1 0 1 0 0 0 1 0 2 0 4 4 9 8 14 11 9 8 19 15 28 23 18 15 36 31 54 47 18 16 35 32 52 49 17 16 33 34 49 51 16 18 32 37 47 56 14 18 28 38 41 57 13 20 25 40 36 61 11 21 21 43 30 65 9 22 17 45 23 68 6 23 11 47 13 70 3 24 3 49 2 73 0 3-1 6-2 9 0 3-1 6-2 9-1 6-2 12-3 18-3 11-5 22-8 33-4 9-7 19-11 28-2 5 13-29 0 0z m-51-210c-7-25-15-49-26-73-9-22-19-44-30-64-12-21-24-40-37-59-13-19-27-38-42-56-15-18-31-36-47-54-17-18-34-36-52-53-18-17-37-34-56-50-9-7-19-15-28-23-1 0-2-1-2-1-1 0-2 0-2 0-1 0-2 1-2 1 0 0-1 1-1 1-2 1-3 3-4 4-4 3-9 7-14 11-2 1-4 3-7 5-2 2-4 4-6 6-5 4-9 8-14 13-9 8-18 17-27 25-10 9-18 18-27 27-4 4-8 9-13 13-4 4-8 9-12 13-17 17-33 35-49 53-15 18-30 37-44 57-14 20-27 40-38 61-12 21-23 42-32 64-10 22-18 45-25 67-2 6-4 12-5 19-1 6-2 12-3 19-2 13-4 26-4 39-1 13-2 26-1 39 0 12 1 25 3 37 0 4 0 7 1 10 0 1 0 3 0 5 1 1 1 3 1 4 0 3 1 5 2 7 0 2 0 3 0 4 0 1 1 2 2 3 1 0 2 1 3 2 0 0 1 0 1 1 1 0 2 0 3 1 3 1 6 2 9 3 6 2 12 5 18 7 23 8 47 16 72 23 12 3 24 6 37 9 6 1 12 2 18 4 7 1 13 2 19 4 26 5 51 9 77 13 13 1 26 3 39 5 3 0 7 1 10 1 1 1 3 1 4 1 2 0 3 0 4 0 6 0 12 0 17-1 1 0 2-1 4-1 1 0 3-1 4-1 3 0 6-1 9-1 7-1 13-2 19-3 13-2 25-4 38-6 25-4 51-8 76-13 25-6 50-12 75-19 12-4 24-8 37-12 6-2 12-4 18-6 3-1 6-2 9-3 1-1 3-1 4-2 1 0 1 0 2 0 1-1 2-1 2-1 2-2 3-2 4-4 1-1 1-1 1-2 0-1 0-2 0-2 1-1 1-2 1-3 2-6 3-13 4-19 1-7 2-13 3-20 0-3 0-6 0-9 0-1 0-2 0-2 0-1 0-2 0-3 1-1 1-3 1-5 5-23 7-48 5-72-1-13-3-26-6-38-8-29 8 35 0 0z m-197 0c-2 4-3 9-5 13 0 1 0 1 0 2-1 0 0 1-1 1 0 1 0 2 0 2 0 1-1 2-1 3-1 2-3 4-4 5-2 2-5 4-7 4 2 2 4 3 7 5 1 1 2 2 3 2 1 1 2 1 2 2 0 1 0 1 0 2 1 0 1 1 2 1 0 1 1 2 1 4 0 2 0 4 0 6 0 3 0 5 0 7 0 3 0 5-1 7-1 6-4 10-8 14-1 2-3 3-5 4-3 2-5 4-8 5-3 1-6 2-9 3-3 0-5 0-7 0-3 0-6 0-8 0-13 0-25 0-37 0-5 0-10 0-14 0-1 0-2 0-3 0 0 0 0-4 0-5 0-3 0-6 0-9 0-1 0-2 0-3 0-1 0-1 1-1 1 0 12 0 12 0 0-8 0-16 0-24 0-13 0-25 0-38 0-4 0-7 0-11 0 0 0-1 0-1-3 0-5 0-8 0-1 0-2 0-4 0 0 0-1 0-1-1 0-2 0-4 0-6 0-1 0-14 0-14 10 0 19 0 29 0 5 0 11 0 16 0 1 0 3 0 4 0 0 0 0 3 0 3 0 6 0 11 0 17 0 1 0 1-1 1-1 0-2 0-4 0-1 0-3 0-4 0 0 0-1-1-1 0 0 5 0 10 0 15 0 2 0 5 0 8 0 1 0 1 0 2 0 0 0 0 1 0 2 0 5 0 8 0 2 0 4 0 6 0 1 0 3 0 4 0 1 0 2-1 3-2 1-1 2-2 3-3 0-1 0-1 0-2 0-2 1-3 1-4 1-1 1-2 2-3 0-1 0-1 0-1 0-1 0-2 0-2 1-6 2-12 3-17 1-3 1-5 2-8 0 0 0-1 0-1 0 0 0 0 0 0 11 0 21 0 32 0 0 0 1 0 1 0 0 0 0 0 0 0 0 3 0 5 0 8 0 5 0 10 0 15 0 0 0 0 0 0-1-2-1-4-2-5z m-26 53c0-2-3-3-4-4-1 0-1-1-1-1 0 0-1 0-1 0 0 0-1 0-1 0-1-1-1-2-2-2-1 0-2 0-3 0-2 0-4 0-5 0-1 0-2 0-2 0-3 0-7 0-10 0 0 0-4 0-4 0 0 9 0 19 0 28 0 0 13 0 14 0 4 0 8 0 12-1 1 0 3-1 4-2 1 0 2-1 3-2 1-2 2-4 3-6 0-1 0-1 0-2-1-1-1-1-1-2-1-1-1-1-1-2-1-1-1-2-1-4z m131-53c0 9 0 18 0 27 0 9-2 18-8 24-7 7-19 8-28 7-2 0-4 0-6-1-1 0-1-1-2-2-1 0-2 0-2-1-3-1-6-3-8-6 0 9 0 18 0 27 0 6 0 12 0 18 0 2 0 3 0 5 0 1 0 1 0 1-11 0-22 0-32 0-1 0-3 0-4 0 0 0 0-4 0-4 0-5 0-11 0-16 0 0 1 0 1 0 1 0 3 0 4 0 3 0 5 0 8 0 0 0 0-5 0-6 0-11 0-23 0-34 0-11 0-22 0-33 0-1 0-2 0-3 0-1 0-1-1-1-3 0-6 0-9 0-1 0-2 0-3 0 0 0 0-1 0-1 0-6 0-11 0-17 0-1 0-1 0-2 0 0 0 0 0 0 2 0 3 0 4 0 12 0 24 0 36 0 0 0 9 0 9 0 0 5 0 10 0 15 0 1 0 3 0 5 0 0-6 0-7 0 0 0-6 0-6 0 0 1 0 3 0 4 0 6 0 12 0 18 0 3 0 5 0 7 0 1 0 1 0 2 0 0 1 1 2 2 1 1 2 2 3 2 1 1 1 1 2 1 1 0 1 0 1 1 2 1 3 1 4 1 3 1 5 0 7-1 1-1 2-2 3-3 1-1 2-2 2-3 1-2 1-4 1-6 0-3 0-7 0-11 0-11 0-22 0-33 0-1 0-2 1-2 1 0 3 0 5 0 6 0 12 0 19 0 3 0 7 0 11 0 0 0 0 14 0 15 0 2 0 4 0 6-2-1-5-2-7-2z m7 122c-2 0-5 0-7 0-1 0-2 0-3 0 0 0 0 0 0 0-3-5-7-10-10-14-1-2-3-5-4-7 0 0-1-1-1-2 0 0 0-1 0-1 0-1 0-4 0-4 0 0 1 0 2 0 3 0 5 0 8 0 3 0 5 0 8 0 0 0 0-1 0-1 0-1 0-3 0-4 0-2 0-3 0-4 0-1 0-1 1-1 1 0 3 0 4 0 1 0 2 0 2 0 0 3 0 6 0 8 0 1 0 2 1 2 1 0 2 0 4 0 0 0 0 0 0 0 0 1 0 1 0 2 0 0 0 3 0 3-1 0-2 0-3 0-1 0-2 0-2 1 0 7 0 15 0 22z m-7-15c0-1 0-2 0-4 0-1 0-1 0-2 0 0 0-1 0-2 0 0-1 0-1 0-1 0-2 0-3 0-1 0-3 0-4 0 1 2 3 4 4 6 1 1 1 2 2 3 1 2 2 4 2 7 0-3 0-5 0-8z m41-2c-3 2-8 2-11 2-1 0-2 0-2 0 0 0 0 1 0 1 0 2 0 3 0 4 0 0 13 0 14 0 1 0 1 0 1 1 0 1 0 2 0 4 0 1 0 2 0 3 0 0-1 0-1 0-6 0-11 0-17 0-1 0-1 0-2 0 0 0 0-1 0-1-1-2-1-4-1-6-1-5-1-9-2-14 4 0 9 1 12-1 3-1 4-4 4-7-1-4-5-4-7-4-2 0-9-1-9 2-1-2-1-5-2-8 1 0 3-1 5-1 2-1 5-1 7-1 4 0 8 2 11 5 2 3 2 7 2 11 0 2 0 5 0 7 0 1-1 2-2 3 0 0 0 0 0 0-3 2 2 0 0 0z" horiz-adv-x="1000" /> | |
|
92 | ||||
|
93 | <glyph glyph-name="up" unicode="" d="M687 254l-173 217c-8 9-22 9-29 0l-173-217c-9-12-1-29 15-29h345c16 0 24 17 15 29z" horiz-adv-x="1000" /> | |||
56 |
|
94 | |||
57 | <glyph glyph-name="plus" unicode="" d="M917 291v116c0 14-12 24-24 24h-283c-15 0-24 12-24 24v288c0 14-12 24-24 24h-117c-14 0-24-12-24-24v-283c0-15-11-24-23-24h-291c-14 0-24-12-24-24v-117c0-14 12-23 24-23h283c15 0 24-12 24-24v-284c0-14 12-23 24-23h117c14 0 24 11 24 23v279c0 14 11 24 23 24h284c19 0 31 12 31 24z" horiz-adv-x="1000" /> |
|
95 | <glyph glyph-name="merge" unicode="" d="M200 110c0-72 58-131 130-131s130 59 130 131c0 45-24 86-60 109 18 139 133 179 202 190v-301c-38-23-65-64-65-112 0-72 59-130 130-130s130 58 130 130c0 48-26 89-65 112v487c39 23 65 64 65 112 0 72-58 130-130 130s-130-58-130-130c0-48 27-89 65-112v-55c-60-8-162-32-238-108-54-54-86-124-94-208-42-22-70-65-70-114z m468-158c-24 0-44 20-44 43s20 44 44 44c24 0 43-20 43-44s-19-43-43-43z m0 798c24 0 43-19 43-43s-20-43-43-43c-24 0-44 19-44 43s20 43 44 43z m-338-684c-24 0-43 20-43 43s19 44 43 44c24 0 43-20 43-44s-19-43-43-43z" horiz-adv-x="1000" /> | |
58 |
|
96 | |||
59 | <glyph glyph-name="remove" unicode="" d="M836 602l-84 84c-9 9-26 9-35 0l-200-200c-10-10-26-10-36 0l-200 200c-9 9-26 9-36 0l-83-84c-9-9-9-26 0-35l200-200c10-10 10-26 0-36l-200-200c-9-9-9-26 0-36l83-83c10-9 27-9 36 0l200 200c10 10 26 10 36 0l200-200c9-9 26-9 35 0l84 83c9 10 9 27 0 36l-200 200c-10 10-10 26 0 36l200 200c9 12 9 26 0 35z" horiz-adv-x="1000" /> |
|
97 | <glyph glyph-name="spin-alt" unicode="" d="M498 850c-114 0-228-39-320-116l0 0c173 140 428 130 588-31 134-134 164-332 89-495-10-29-5-50 12-68 21-20 61-23 84 0 3 3 12 15 15 24 71 180 33 393-112 539-99 98-228 147-356 147z m-409-274c-14 0-29-5-39-16-3-3-13-15-15-24-71-180-34-393 112-539 185-185 479-195 676-31l0 0c-173-140-428-130-589 31-134 134-163 333-89 495 11 29 6 50-12 68-11 11-27 17-44 16z" horiz-adv-x="1001" /> | |
|
98 | ||||
|
99 | <glyph glyph-name="spin" unicode="" d="M462 850c-6 0-11-5-11-11l0-183 0 0c0-6 5-11 11-11l69 0c1 0 1 0 1 0 7 0 12 5 12 11l0 183 0 0c0 6-5 11-12 11l-69 0c0 0 0 0-1 0z m250-47c-4 1-8-2-10-5l-91-158 0 0c-4-6-2-13 4-16l60-34c0-1 0-1 0-1 6-3 13-1 16 4l91 158c3 6 2 13-4 16l-61 35c-1 1-3 1-5 1z m-428-2c-2 0-4-1-6-2l-61-35c-5-3-7-10-4-16l91-157c0 0 0 0 0 0 3-6 10-8 16-5l61 35c5 4 7 11 4 16l-91 157c0 1 0 1 0 1-2 4-6 6-10 6z m620-163c-2 0-4 0-6-1l-157-91c0 0 0 0 0 0-6-3-8-10-5-16l35-61c4-5 11-7 16-4l157 91c1 0 1 0 1 0 6 3 7 11 4 16l-35 61c-2 4-6 6-10 5z m-810-4c-5 0-9-2-11-6l-35-61c-3-5-1-12 4-15l158-91 0 0c6-4 13-2 16 4l35 60c0 0 0 0 0 0 3 6 1 13-4 16l-158 91c-2 1-4 2-5 2z m712-235l0 0c-6 0-11-5-11-11l0-69c0-1 0-1 0-1 0-7 5-12 11-12l183 0 0 0c6 0 11 5 11 12l0 69c0 0 0 0 0 1 0 6-5 11-11 11l-183 0z m-794-5l0 0c-7 0-12-5-12-12l0-69c0 0 0 0 0-1 0-6 5-11 12-11l182 0 0 0c6 0 11 5 11 11l0 69c0 1 0 1 0 1 0 7-5 12-11 12l-182 0z m772-153c-4 0-8-2-10-6l-34-60c-1 0-1 0-1 0-3-6-1-13 4-16l158-91c6-3 13-1 16 4l35 61c3 5 1 12-4 15l-158 92 0 0c-2 1-4 1-6 1z m-566-5c-1 0-3 0-5-1l-157-91c0 0-1 0-1 0-5-3-7-10-4-16l35-61c3-5 10-7 16-4l157 91c0 0 0 0 0 0 6 3 8 10 5 16l-35 61c-3 3-7 6-11 5z m468-121c-2 0-4 0-6-1l-61-35c-5-4-7-11-4-16l91-157c0-1 0-1 0-1 3-6 11-7 16-4l61 35c5 3 7 10 4 16l-91 157c0 0 0 0 0 0-2 4-6 6-10 6z m-367-2c-4 0-8-2-10-6l-91-158c-3-6-1-13 4-16l61-35c5-3 12-1 15 4l92 158 0 0c3 6 1 13-5 16l-60 35c0 0 0 0 0 0-2 1-4 1-6 2z m149-58c-7 0-12-5-12-11l0-183 0 0c0-6 5-11 12-11l69 0c0 0 0 0 1 0 6 0 11 5 11 11l0 183 0 0c0 6-5 11-11 11l-69 0c-1 0-1 0-1 0z" horiz-adv-x="1000" /> | |||
60 |
|
100 | |||
61 | <glyph glyph-name="rhodecode" unicode="" d="M175 633c-2-4-3-8-4-12-3-10-6-20-9-30-3-13-7-25-11-38-3-11-6-23-10-35-2-7-4-15-6-22-1-1-1-2-1-4 0 0 0 0 0 0 0-1 1-2 1-2 2-7 5-14 7-21 4-11 8-22 12-33 4-12 9-25 13-37 4-11 8-23 12-34 3-7 5-14 7-21 1-1 1-2 2-3 0-1 1-1 1-2 4-6 8-12 11-17 7-10 13-19 19-29 7-11 14-22 22-33 6-10 13-21 20-31 5-7 9-15 14-22 1-2 3-4 4-5 0-1 1-1 1-2 3-3 6-5 8-8 7-6 13-12 19-19 9-8 17-16 25-24 10-10 19-19 29-28 9-9 18-18 27-27 8-8 16-15 23-23 5-5 11-10 16-15 1-1 3-3 5-5 7-5 14-10 21-15 11-8 21-15 31-23 4-2 7-5 11-7 0-1 1-2 2-2 0 0 0-1 1 0 7 3 14 7 21 11 11 6 23 11 34 17 6 4 12 7 19 10 0 0 0 1 1 1 1 2 2 3 3 5 4 5 8 10 13 15 6 8 12 16 18 24 8 9 15 19 23 28 8 11 16 21 24 31 8 11 16 21 24 31 8 10 15 19 23 28 6 8 12 16 18 24 4 5 8 10 12 15 2 2 3 3 4 5 0 0 0 0 0 0-1 1-2 1-3 1-3 0-6 1-9 2-5 1-10 2-15 3-6 2-13 4-20 5-8 3-16 5-24 7-9 3-19 6-28 9-10 3-21 7-31 11-12 4-23 8-34 13-12 5-24 10-36 15-13 6-26 12-38 18-13 7-26 14-39 21-13 7-27 15-39 23-14 9-27 17-40 27-13 9-26 19-39 29-13 11-25 22-37 33-13 11-25 23-36 36-12 13-23 26-34 40-11 14-21 28-31 43-9 15-19 31-27 47 0 1 0 1 0 1z m-3 3c-1-5-3-9-4-14-3-10-7-21-10-32-4-12-8-25-12-37-3-10-6-20-9-30-1-3-2-6-3-8 0-1 0-2 0-2 1-5 3-10 5-15 3-10 6-20 10-30 4-12 8-24 12-37 4-12 8-24 12-36 3-9 6-18 9-26 1-3 1-5 2-8 0 0 1-1 1-2 2-4 5-8 7-12 5-10 10-19 15-28 6-11 12-23 19-34 6-11 12-22 18-33 4-8 8-15 12-23 1-2 2-4 4-6 4-5 8-9 13-14 7-8 15-16 23-24 9-10 18-20 26-29 9-9 17-18 25-26 5-6 10-11 15-17 2-1 3-3 5-5 5-5 11-11 17-17 9-8 17-17 26-26 9-9 18-18 27-27 7-7 14-14 21-21 2-2 3-3 5-5 0 0 1-1 1-1 0 0 1 0 1 0 11 2 22 3 32 5 9 1 17 2 26 3 0 0 1 1 1 1 1 1 2 3 4 4 4 5 9 10 13 15 7 8 14 15 20 22 9 9 17 18 25 27 9 10 18 20 27 30 8 9 17 19 26 29 8 9 16 17 24 26 7 7 13 15 20 22 4 5 8 9 13 14 1 1 2 2 3 3 0 1 1 1 1 1 0 1-3 1-3 1-3 1-7 2-10 3-4 2-9 3-14 5-6 2-13 4-19 6-8 3-16 6-24 9-9 3-18 7-27 11-10 4-20 8-30 13-11 5-22 10-33 16-12 5-23 11-35 18-12 6-24 13-36 20-12 8-25 16-37 24-13 8-25 17-37 26-13 10-25 19-38 29-12 11-24 21-36 33-12 11-24 23-35 35-11 13-22 25-33 39-10 13-21 27-30 42-10 15-19 30-27 45-9 16-17 32-24 48z m-2 10c-1-4-2-8-3-11-1-10-3-19-5-29-2-12-5-25-7-37-3-13-5-26-8-39-1-10-3-20-5-30-1-5-2-10-3-15 0-1 0-1 0-2 1-3 2-5 3-8 3-9 7-19 10-29 4-12 9-25 13-37 4-11 8-22 11-33 2-5 4-11 6-16 0-1 1-2 1-2 1-3 2-5 4-7 4-9 8-18 13-27 6-12 11-23 17-35 6-11 11-22 17-33 3-7 7-14 11-21 0-2 1-3 1-4 1-1 2-1 2-2 5-6 9-11 14-17 8-9 15-18 22-27 9-10 17-20 26-30 7-9 15-18 22-27 5-6 10-11 15-17 0-1 1-2 2-3 0 0 0 0 0 0 1-1 2-1 3-2 7-4 14-9 21-14 10-7 21-14 31-22 11-7 21-14 31-20 6-4 12-9 18-13 3-2 7-5 10-8 10-8 19-16 29-24 7-5 13-11 20-17 1 0 1 0 1 1 1 1 2 2 3 3 4 4 8 8 12 13 6 6 12 13 18 20 8 8 16 17 23 25 9 10 18 19 26 29 9 9 18 19 27 29 9 9 18 19 26 28 8 9 16 17 23 26 6 6 13 13 19 20 4 4 7 8 11 12 1 2 3 3 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0-3 1-3 1-3 1-6 2-9 2-5 2-10 4-15 5-6 2-12 5-18 7-8 3-16 6-24 9-8 4-17 8-26 12-10 4-20 9-30 13-11 6-22 11-32 16-12 6-23 13-35 19-12 7-23 14-35 21-13 8-25 16-37 24-12 8-25 17-37 26-12 9-24 19-36 29-13 10-25 21-36 32-12 11-24 22-35 34-12 12-22 25-33 38-11 13-21 26-30 40-10 14-19 29-28 44-9 15-17 30-24 46-4 10-8 20-12 30z m696 21c-2 4-5 7-9 9-5 3-11 5-16 8-11 4-23 9-34 13-23 8-47 14-71 20-24 6-49 12-74 17-25 6-50 10-76 15-25 4-50 8-75 10-13 1-26 1-39 0-6-1-13-2-19-3-6-1-13-2-19-3-26-4-51-9-77-14-25-5-50-10-75-16-25-5-49-12-74-20-12-4-24-9-36-13-6-3-11-5-17-8-3-1-6-2-9-3-3-1-5-2-8-4-4-2-7-5-10-9-1-2-2-4-3-7-1-3-2-6-3-9-4-11-7-24-9-36-5-24-7-49-6-74 0-13 1-25 3-38 1-12 3-25 5-37 5-25 12-50 20-74 4-12 8-24 13-36 4-11 10-22 15-33 10-21 21-42 34-62 12-20 25-39 39-58 14-19 28-37 43-55 16-18 33-36 50-54 17-18 34-35 52-52 18-17 36-33 55-49 10-7 19-15 28-22 10-8 19-15 28-23 2-2 5-4 7-7 0 0 1-1 1-1 0 0 1 0 1 0 0 0 1 0 2 0 4 4 9 8 14 11 9 8 19 15 28 23 18 15 36 31 54 47 18 16 35 32 52 49 17 16 33 34 49 51 16 18 32 37 47 56 14 18 28 38 41 57 13 20 25 40 36 61 11 21 21 43 30 65 9 22 17 45 23 68 6 23 11 47 13 70 3 24 3 49 2 73 0 3-1 6-2 9 0 3-1 6-2 9-1 6-2 12-3 18-3 11-5 22-8 33-4 9-7 19-11 28-2 5 13-29 0 0z m-51-210c-7-25-15-49-26-73-9-22-19-44-30-64-12-21-24-40-37-59-13-19-27-38-42-56-15-18-31-36-47-54-17-18-34-36-52-53-18-17-37-34-56-50-9-7-19-15-28-23-1 0-2-1-2-1-1 0-2 0-2 0-1 0-2 1-2 1 0 0-1 1-1 1-2 1-3 3-4 4-4 3-9 7-14 11-2 1-4 3-7 5-2 2-4 4-6 6-5 4-9 8-14 13-9 8-18 17-27 25-10 9-18 18-27 27-4 4-8 9-13 13-4 4-8 9-12 13-17 17-33 35-49 53-15 18-30 37-44 57-14 20-27 40-38 61-12 21-23 42-32 64-10 22-18 45-25 67-2 6-4 12-5 19-1 6-2 12-3 19-2 13-4 26-4 39-1 13-2 26-1 39 0 12 1 25 3 37 0 4 0 7 1 10 0 1 0 3 0 5 1 1 1 3 1 4 0 3 1 5 2 7 0 2 0 3 0 4 0 1 1 2 2 3 1 0 2 1 3 2 0 0 1 0 1 1 1 0 2 0 3 1 3 1 6 2 9 3 6 2 12 5 18 7 23 8 47 16 72 23 12 3 24 6 37 9 6 1 12 2 18 4 7 1 13 2 19 4 26 5 51 9 77 13 13 1 26 3 39 5 3 0 7 1 10 1 1 1 3 1 4 1 2 0 3 0 4 0 6 0 12 0 17-1 1 0 2-1 4-1 1 0 3-1 4-1 3 0 6-1 9-1 7-1 13-2 19-3 13-2 25-4 38-6 25-4 51-8 76-13 25-6 50-12 75-19 12-4 24-8 37-12 6-2 12-4 18-6 3-1 6-2 9-3 1-1 3-1 4-2 1 0 1 0 2 0 1-1 2-1 2-1 2-2 3-2 4-4 1-1 1-1 1-2 0-1 0-2 0-2 1-1 1-2 1-3 2-6 3-13 4-19 1-7 2-13 3-20 0-3 0-6 0-9 0-1 0-2 0-2 0-1 0-2 0-3 1-1 1-3 1-5 5-23 7-48 5-72-1-13-3-26-6-38-8-29 8 35 0 0z m-197 0c-2 4-3 9-5 13 0 1 0 1 0 2-1 0 0 1-1 1 0 1 0 2 0 2 0 1-1 2-1 3-1 2-3 4-4 5-2 2-5 4-7 4 2 2 4 3 7 5 1 1 2 2 3 2 1 1 2 1 2 2 0 1 0 1 0 2 1 0 1 1 2 1 0 1 1 2 1 4 0 2 0 4 0 6 0 3 0 5 0 7 0 3 0 5-1 7-1 6-4 10-8 14-1 2-3 3-5 4-3 2-5 4-8 5-3 1-6 2-9 3-3 0-5 0-7 0-3 0-6 0-8 0-13 0-25 0-37 0-5 0-10 0-14 0-1 0-2 0-3 0 0 0 0-4 0-5 0-3 0-6 0-9 0-1 0-2 0-3 0-1 0-1 1-1 1 0 12 0 12 0 0-8 0-16 0-24 0-13 0-25 0-38 0-4 0-7 0-11 0 0 0-1 0-1-3 0-5 0-8 0-1 0-2 0-4 0 0 0-1 0-1-1 0-2 0-4 0-6 0-1 0-14 0-14 10 0 19 0 29 0 5 0 11 0 16 0 1 0 3 0 4 0 0 0 0 3 0 3 0 6 0 11 0 17 0 1 0 1-1 1-1 0-2 0-4 0-1 0-3 0-4 0 0 0-1-1-1 0 0 5 0 10 0 15 0 2 0 5 0 8 0 1 0 1 0 2 0 0 0 0 1 0 2 0 5 0 8 0 2 0 4 0 6 0 1 0 3 0 4 0 1 0 2-1 3-2 1-1 2-2 3-3 0-1 0-1 0-2 0-2 1-3 1-4 1-1 1-2 2-3 0-1 0-1 0-1 0-1 0-2 0-2 1-6 2-12 3-17 1-3 1-5 2-8 0 0 0-1 0-1 0 0 0 0 0 0 11 0 21 0 32 0 0 0 1 0 1 0 0 0 0 0 0 0 0 3 0 5 0 8 0 5 0 10 0 15 0 0 0 0 0 0-1-2-1-4-2-5z m-26 53c0-2-3-3-4-4-1 0-1-1-1-1 0 0-1 0-1 0 0 0-1 0-1 0-1-1-1-2-2-2-1 0-2 0-3 0-2 0-4 0-5 0-1 0-2 0-2 0-3 0-7 0-10 0 0 0-4 0-4 0 0 9 0 19 0 28 0 0 13 0 14 0 4 0 8 0 12-1 1 0 3-1 4-2 1 0 2-1 3-2 1-2 2-4 3-6 0-1 0-1 0-2-1-1-1-1-1-2-1-1-1-1-1-2-1-1-1-2-1-4z m131-53c0 9 0 18 0 27 0 9-2 18-8 24-7 7-19 8-28 7-2 0-4 0-6-1-1 0-1-1-2-2-1 0-2 0-2-1-3-1-6-3-8-6 0 9 0 18 0 27 0 6 0 12 0 18 0 2 0 3 0 5 0 1 0 1 0 1-11 0-22 0-32 0-1 0-3 0-4 0 0 0 0-4 0-4 0-5 0-11 0-16 0 0 1 0 1 0 1 0 3 0 4 0 3 0 5 0 8 0 0 0 0-5 0-6 0-11 0-23 0-34 0-11 0-22 0-33 0-1 0-2 0-3 0-1 0-1-1-1-3 0-6 0-9 0-1 0-2 0-3 0 0 0 0-1 0-1 0-6 0-11 0-17 0-1 0-1 0-2 0 0 0 0 0 0 2 0 3 0 4 0 12 0 24 0 36 0 0 0 9 0 9 0 0 5 0 10 0 15 0 1 0 3 0 5 0 0-6 0-7 0 0 0-6 0-6 0 0 1 0 3 0 4 0 6 0 12 0 18 0 3 0 5 0 7 0 1 0 1 0 2 0 0 1 1 2 2 1 1 2 2 3 2 1 1 1 1 2 1 1 0 1 0 1 1 2 1 3 1 4 1 3 1 5 0 7-1 1-1 2-2 3-3 1-1 2-2 2-3 1-2 1-4 1-6 0-3 0-7 0-11 0-11 0-22 0-33 0-1 0-2 1-2 1 0 3 0 5 0 6 0 12 0 19 0 3 0 7 0 11 0 0 0 0 14 0 15 0 2 0 4 0 6-2-1-5-2-7-2z m7 122c-2 0-5 0-7 0-1 0-2 0-3 0 0 0 0 0 0 0-3-5-7-10-10-14-1-2-3-5-4-7 0 0-1-1-1-2 0 0 0-1 0-1 0-1 0-4 0-4 0 0 1 0 2 0 3 0 5 0 8 0 3 0 5 0 8 0 0 0 0-1 0-1 0-1 0-3 0-4 0-2 0-3 0-4 0-1 0-1 1-1 1 0 3 0 4 0 1 0 2 0 2 0 0 3 0 6 0 8 0 1 0 2 1 2 1 0 2 0 4 0 0 0 0 0 0 0 0 1 0 1 0 2 0 0 0 3 0 3-1 0-2 0-3 0-1 0-2 0-2 1 0 7 0 15 0 22z m-7-15c0-1 0-2 0-4 0-1 0-1 0-2 0 0 0-1 0-2 0 0-1 0-1 0-1 0-2 0-3 0-1 0-3 0-4 0 1 2 3 4 4 6 1 1 1 2 2 3 1 2 2 4 2 7 0-3 0-5 0-8z m41-2c-3 2-8 2-11 2-1 0-2 0-2 0 0 0 0 1 0 1 0 2 0 3 0 4 0 0 13 0 14 0 1 0 1 0 1 1 0 1 0 2 0 4 0 1 0 2 0 3 0 0-1 0-1 0-6 0-11 0-17 0-1 0-1 0-2 0 0 0 0-1 0-1-1-2-1-4-1-6-1-5-1-9-2-14 4 0 9 1 12-1 3-1 4-4 4-7-1-4-5-4-7-4-2 0-9-1-9 2-1-2-1-5-2-8 1 0 3-1 5-1 2-1 5-1 7-1 4 0 8 2 11 5 2 3 2 7 2 11 0 2 0 5 0 7 0 1-1 2-2 3 0 0 0 0 0 0-3 2 2 0 0 0z" horiz-adv-x="1000" /> |
|
101 | <glyph glyph-name="docs" unicode="" d="M946 636q23 0 38-16t16-38v-678q0-23-16-38t-38-16h-535q-23 0-38 16t-16 38v160h-303q-23 0-38 16t-16 38v375q0 22 11 49t27 42l228 228q15 16 42 27t49 11h232q23 0 38-16t16-38v-183q38 23 71 23h232z m-303-119l-167-167h167v167z m-357 214l-167-167h167v167z m109-361l176 176v233h-214v-233q0-22-15-37t-38-16h-233v-357h286v143q0 22 11 49t27 42z m534-449v643h-215v-232q0-22-15-38t-38-15h-232v-358h500z" horiz-adv-x="1000" /> | |
|
102 | ||||
|
103 | <glyph glyph-name="menu" unicode="" d="M857 100v-71q0-15-10-25t-26-11h-785q-15 0-25 11t-11 25v71q0 15 11 25t25 11h785q15 0 26-11t10-25z m0 286v-72q0-14-10-25t-26-10h-785q-15 0-25 10t-11 25v72q0 14 11 25t25 10h785q15 0 26-10t10-25z m0 285v-71q0-14-10-25t-26-11h-785q-15 0-25 11t-11 25v71q0 15 11 26t25 10h785q15 0 26-10t10-26z" horiz-adv-x="857.1" /> | |||
62 |
|
104 | |||
63 | <glyph glyph-name="svn-inv" unicode="" d="M933 841h-852c-36 0-65-29-65-65v-853c0-36 29-65 65-65h852c36 0 66 29 66 65v853c0 36-30 65-66 65z m-765-438c3-4 7-7 13-10 5-3 11-6 18-8 7-3 14-5 21-8 7-3 14-6 21-10 7-4 13-9 18-14 5-6 10-13 13-20 3-8 5-18 5-29 0-16-3-30-8-44-6-14-14-26-24-37-10-10-22-18-37-24-15-7-31-10-49-10-9 0-18 1-27 3s-18 5-27 9c-8 4-16 8-23 13-7 5-13 10-18 17l25 32c2 3 4 5 7 6 3 2 6 3 9 3 4 0 8-2 12-4 3-3 8-6 12-10 5-3 10-6 16-9 6-3 14-4 23-4 13 0 23 3 30 10 7 7 10 18 10 32 0 6-1 12-4 16-4 4-8 7-13 10-5 3-11 6-18 8-7 2-14 5-21 7-7 3-14 6-21 9-6 4-12 8-18 14-5 6-9 13-12 21-3 8-5 18-5 30 0 14 3 28 8 40 5 13 12 25 22 35 10 9 22 17 36 23 14 6 29 9 47 9 9 0 17-1 26-3s16-4 23-8c7-3 14-7 20-11 6-5 11-10 15-15l-21-29c-2-3-5-6-7-7-3-2-6-3-9-3-3 0-7 1-10 3-3 3-7 5-11 8-4 2-9 4-14 7-5 2-12 3-19 3-6 0-12-1-17-3-5-2-9-4-12-8-4-3-6-7-8-11-1-5-2-10-2-15 0-5 2-10 5-14z m312-210h-64l-77 313h57c6 0 10-1 14-4 4-3 6-6 7-11l32-173c2-7 4-14 6-23 1-8 3-17 4-26 3 9 6 18 9 26 4 9 7 16 11 23l73 173c1 2 2 4 4 6 2 2 4 3 6 5 2 1 4 2 7 3 3 1 5 1 8 1h57l-154-313z m423 0h-37c-5 0-10 1-13 2-4 2-7 5-10 9l-109 194c-1-4-1-8-1-12-1-4-1-7-1-10l-22-183h-62l39 313h37c3 0 6 0 8 0 2 0 4-1 5-1 2-1 3-2 4-4s3-3 5-5l110-194c0 5 0 10 1 14 0 5 1 9 1 13l21 177h62l-38-313z" horiz-adv-x="1000" /> |
|
105 | <glyph glyph-name="paste" unicode="" d="M429-79h500v358h-233q-22 0-37 15t-16 38v232h-214v-643z m142 804v36q0 7-5 12t-12 6h-393q-7 0-13-6t-5-12v-36q0-7 5-13t13-5h393q7 0 12 5t5 13z m143-375h167l-167 167v-167z m286-71v-375q0-23-16-38t-38-16h-535q-23 0-38 16t-16 38v89h-303q-23 0-38 16t-16 37v750q0 23 16 38t38 16h607q22 0 38-16t15-38v-183q12-7 20-15l228-228q16-15 27-42t11-49z" horiz-adv-x="1000" /> | |
|
106 | ||||
|
107 | <glyph glyph-name="doc-text" unicode="" d="M819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 17-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 16t-16 37v233h-429v-858h715z m-572 483q0 7 5 12t13 5h393q8 0 13-5t5-12v-36q0-8-5-13t-13-5h-393q-8 0-13 5t-5 13v36z m411-125q8 0 13-5t5-13v-36q0-8-5-13t-13-5h-393q-8 0-13 5t-5 13v36q0 8 5 13t13 5h393z m0-143q8 0 13-5t5-13v-36q0-8-5-13t-13-5h-393q-8 0-13 5t-5 13v36q0 8 5 13t13 5h393z" horiz-adv-x="857.1" /> | |||
64 |
|
108 | |||
65 | <glyph glyph-name="tag" unicode="" d="M450 791l-371 11c-17 0-31-14-31-31l12-369c0-7 2-16 9-21l471-471c12-12 31-12 46 0l359 359c12 12 12 31 0 45l-474 467c-7 7-14 10-21 10z m-86-222c0-45-38-83-83-83s-83 38-83 83 38 83 83 83 83-38 83-83z" horiz-adv-x="1000" /> |
|
109 | <glyph glyph-name="plus-squared" unicode="" d="M714 314v72q0 14-10 25t-25 10h-179v179q0 15-11 25t-25 11h-71q-15 0-25-11t-11-25v-179h-178q-15 0-25-10t-11-25v-72q0-14 11-25t25-10h178v-179q0-14 11-25t25-11h71q15 0 25 11t11 25v179h179q14 0 25 10t10 25z m143 304v-536q0-66-47-113t-114-48h-535q-67 0-114 48t-47 113v536q0 66 47 113t114 48h535q67 0 114-48t47-113z" horiz-adv-x="857.1" /> | |
|
110 | ||||
|
111 | <glyph glyph-name="folder-empty" unicode="" d="M857 118v393q0 22-15 38t-38 15h-393q-23 0-38 16t-16 38v36q0 22-15 38t-38 15h-179q-22 0-38-15t-16-38v-536q0-22 16-38t38-16h679q22 0 38 16t15 38z m72 393v-393q0-51-37-88t-88-37h-679q-51 0-88 37t-37 88v536q0 51 37 88t88 37h179q51 0 88-37t37-88v-18h375q51 0 88-37t37-88z" horiz-adv-x="928.6" /> | |||
66 |
|
112 | |||
67 | <glyph glyph-name="copy" unicode="" d="M946 636q23 0 38-16t16-38v-678q0-23-16-38t-38-16h-535q-23 0-38 16t-16 38v160h-303q-23 0-38 16t-16 38v375q0 22 11 49t27 42l228 228q15 16 42 27t49 11h232q23 0 38-16t16-38v-183q38 23 71 23h232z m-303-119l-167-167h167v167z m-357 214l-167-167h167v167z m109-361l176 176v233h-214v-233q0-22-15-37t-38-16h-233v-357h286v143q0 22 11 49t27 42z m534-449v643h-215v-232q0-22-15-38t-38-15h-232v-358h500z" horiz-adv-x="1000" /> |
|
113 | <glyph glyph-name="folder-open-empty" unicode="" d="M994 331q0 19-30 19h-607q-22 0-48-12t-39-29l-164-203q-11-13-11-22 0-20 30-20h607q23 0 48 13t40 29l164 203q10 12 10 22z m-637 90h429v90q0 22-16 38t-38 15h-321q-23 0-38 16t-16 38v36q0 22-15 38t-38 15h-179q-22 0-38-15t-16-38v-476l143 175q25 30 65 49t78 19z m708-90q0-35-25-67l-165-203q-24-30-65-49t-78-19h-607q-51 0-88 37t-37 88v536q0 51 37 88t88 37h179q51 0 88-37t37-88v-18h303q52 0 88-37t37-88v-90h107q30 0 56-13t37-40q8-17 8-37z" horiz-adv-x="1071.4" /> | |
|
114 | ||||
|
115 | <glyph glyph-name="minus-squared" unicode="" d="M714 314v72q0 14-10 25t-25 10h-500q-15 0-25-10t-11-25v-72q0-14 11-25t25-10h500q14 0 25 10t10 25z m143 304v-536q0-66-47-113t-114-48h-535q-67 0-114 48t-47 113v536q0 66 47 113t114 48h535q67 0 114-48t47-113z" horiz-adv-x="857.1" /> | |||
68 |
|
116 | |||
69 | <glyph glyph-name="file-text" unicode="" d="M819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 17-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 16t-16 37v233h-429v-858h715z m-572 483q0 7 5 12t13 5h393q8 0 13-5t5-12v-36q0-8-5-13t-13-5h-393q-8 0-13 5t-5 13v36z m411-125q8 0 13-5t5-13v-36q0-8-5-13t-13-5h-393q-8 0-13 5t-5 13v36q0 8 5 13t13 5h393z m0-143q8 0 13-5t5-13v-36q0-8-5-13t-13-5h-393q-8 0-13 5t-5 13v36q0 8 5 13t13 5h393z" horiz-adv-x="857.1" /> |
|
117 | <glyph glyph-name="minus-squared-alt" unicode="" d="M643 404v-36q0-8-5-13t-13-5h-464q-8 0-13 5t-5 13v36q0 7 5 12t13 5h464q8 0 13-5t5-12z m71-250v464q0 37-26 63t-63 26h-464q-37 0-63-26t-27-63v-464q0-37 27-63t63-27h464q37 0 63 27t26 63z m72 464v-464q0-67-47-114t-114-47h-464q-67 0-114 47t-47 114v464q0 66 47 113t114 48h464q66 0 114-48t47-113z" horiz-adv-x="785.7" /> | |
|
118 | ||||
|
119 | <glyph glyph-name="doc-inv" unicode="" d="M571 564v264q13-8 21-16l227-228q8-7 16-20h-264z m-71-18q0-22 16-37t38-16h303v-589q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h446v-304z" horiz-adv-x="857.1" /> | |||
70 |
|
120 | |||
71 | <glyph glyph-name="directory-empty" unicode="" d="M857 118v393q0 22-15 38t-38 15h-393q-23 0-38 16t-16 38v36q0 22-15 38t-38 15h-179q-22 0-38-15t-16-38v-536q0-22 16-38t38-16h679q22 0 38 16t15 38z m72 393v-393q0-51-37-88t-88-37h-679q-51 0-88 37t-37 88v536q0 51 37 88t88 37h179q51 0 88-37t37-88v-18h375q51 0 88-37t37-88z" horiz-adv-x="928.6" /> |
|
121 | <glyph glyph-name="doc-text-inv" unicode="" d="M819 584q8-7 16-20h-264v264q13-8 21-16z m-265-91h303v-589q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h446v-304q0-22 16-37t38-16z m89-411v36q0 8-5 13t-13 5h-393q-8 0-13-5t-5-13v-36q0-8 5-13t13-5h393q8 0 13 5t5 13z m0 143v36q0 8-5 13t-13 5h-393q-8 0-13-5t-5-13v-36q0-8 5-13t13-5h393q8 0 13 5t5 13z m0 143v36q0 7-5 12t-13 5h-393q-8 0-13-5t-5-12v-36q0-8 5-13t13-5h393q8 0 13 5t5 13z" horiz-adv-x="857.1" /> | |
72 |
|
122 | |||
73 | <glyph glyph-name="file-text-inv" unicode="" d="M819 584q8-7 16-20h-264v264q13-8 21-16z m-265-91h303v-589q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h446v-304q0-22 16-37t38-16z m89-411v36q0 8-5 13t-13 5h-393q-8 0-13-5t-5-13v-36q0-8 5-13t13-5h393q8 0 13 5t5 13z m0 143v36q0 8-5 13t-13 5h-393q-8 0-13-5t-5-13v-36q0-8 5-13t13-5h393q8 0 13 5t5 13z m0 143v36q0 7-5 12t-13 5h-393q-8 0-13-5t-5-12v-36q0-8 5-13t13-5h393q8 0 13 5t5 13z" horiz-adv-x="857.1" /> |
|
123 | <glyph glyph-name="plus-squared-alt" unicode="" d="M643 404v-36q0-8-5-13t-13-5h-196v-196q0-8-5-13t-13-5h-36q-8 0-13 5t-5 13v196h-196q-8 0-13 5t-5 13v36q0 7 5 12t13 5h196v197q0 8 5 13t13 5h36q8 0 13-5t5-13v-197h196q8 0 13-5t5-12z m71-250v464q0 37-26 63t-63 26h-464q-37 0-63-26t-27-63v-464q0-37 27-63t63-27h464q37 0 63 27t26 63z m72 464v-464q0-67-47-114t-114-47h-464q-67 0-114 47t-47 114v464q0 66 47 113t114 48h464q66 0 114-48t47-113z" horiz-adv-x="785.7" /> | |
74 |
|
124 | |||
75 | <glyph glyph-name="file-code" unicode="" d="M819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 17-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 16t-16 37v233h-429v-858h715z m-518 500q4 7 12 7t13-3l28-21q7-5 7-12t-3-13l-102-136 102-136q4-6 3-13t-7-12l-28-21q-6-4-13-4t-12 7l-126 168q-8 11 0 22z m447-167q8-11 0-22l-126-168q-4-6-11-7t-14 4l-28 21q-6 5-7 12t3 13l102 136-102 136q-4 6-3 13t7 12l28 21q6 4 14 3t11-7z m-346-258q-7 1-11 8t-3 13l77 464q1 7 7 11t14 3l35-5q7-2 11-8t3-13l-77-464q-1-7-7-11t-13-3z" horiz-adv-x="857.1" /> |
|
125 | <glyph glyph-name="file-code" unicode="" d="M819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 17-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 16t-16 37v233h-429v-858h715z m-518 500q4 7 12 7t13-3l28-21q7-5 7-12t-3-13l-102-136 102-136q4-6 3-13t-7-12l-28-21q-6-4-13-4t-12 7l-126 168q-8 11 0 22z m447-167q8-11 0-22l-126-168q-4-6-11-7t-14 4l-28 21q-6 5-7 12t3 13l102 136-102 136q-4 6-3 13t7 12l28 21q6 4 14 3t11-7z m-346-258q-7 1-11 8t-3 13l77 464q1 7 7 11t14 3l35-5q7-2 11-8t3-13l-77-464q-1-7-7-11t-13-3z" horiz-adv-x="857.1" /> | |
|
126 | ||||
|
127 | <glyph glyph-name="history" unicode="" d="M857 350q0-87-34-166t-91-137-137-92-166-34q-96 0-183 41t-147 114q-4 6-4 13t5 11l76 77q6 5 14 5 9-1 13-7 41-53 100-82t126-29q58 0 110 23t92 61 61 91 22 111-22 111-61 91-92 61-110 23q-55 0-105-20t-90-57l77-77q17-16 8-38-10-23-33-23h-250q-15 0-25 11t-11 25v250q0 24 22 33 22 10 39-8l72-72q60 57 137 88t159 31q87 0 166-34t137-92 91-137 34-166z m-357 161v-250q0-8-5-13t-13-5h-178q-8 0-13 5t-5 13v35q0 8 5 13t13 5h125v197q0 8 5 13t12 5h36q8 0 13-5t5-13z" horiz-adv-x="857.1" /> | |||
|
128 | ||||
|
129 | <glyph glyph-name="sliders" unicode="" d="M196 64v-71h-196v71h196z m197 72q14 0 25-11t11-25v-143q0-14-11-25t-25-11h-143q-14 0-25 11t-11 25v143q0 15 11 25t25 11h143z m89 214v-71h-482v71h482z m-357 286v-72h-125v72h125z m732-572v-71h-411v71h411z m-536 643q15 0 26-10t10-26v-142q0-15-10-25t-26-11h-142q-15 0-25 11t-11 25v142q0 15 11 26t25 10h142z m358-286q14 0 25-10t10-25v-143q0-15-10-25t-25-11h-143q-15 0-25 11t-11 25v143q0 14 11 25t25 10h143z m178-71v-71h-125v71h125z m0 286v-72h-482v72h482z" horiz-adv-x="857.1" /> | |||
|
130 | ||||
|
131 | <glyph glyph-name="trash" unicode="" d="M286 82v393q0 8-5 13t-13 5h-36q-8 0-13-5t-5-13v-393q0-8 5-13t13-5h36q8 0 13 5t5 13z m143 0v393q0 8-5 13t-13 5h-36q-8 0-13-5t-5-13v-393q0-8 5-13t13-5h36q8 0 13 5t5 13z m142 0v393q0 8-5 13t-12 5h-36q-8 0-13-5t-5-13v-393q0-8 5-13t13-5h36q7 0 12 5t5 13z m-303 554h250l-27 65q-4 5-9 6h-177q-6-1-10-6z m518-18v-36q0-8-5-13t-13-5h-54v-529q0-46-26-80t-63-34h-464q-37 0-63 33t-27 79v531h-53q-8 0-13 5t-5 13v36q0 8 5 13t13 5h172l39 93q9 21 31 35t44 15h178q23 0 44-15t30-35l39-93h173q8 0 13-5t5-13z" horiz-adv-x="785.7" /> | |||
76 | </font> |
|
132 | </font> | |
77 | </defs> |
|
133 | </defs> | |
78 | </svg> No newline at end of file |
|
134 | </svg> |
1 | NO CONTENT: modified file, binary diff hidden |
|
NO CONTENT: modified file, binary diff hidden |
1 | NO CONTENT: modified file, binary diff hidden |
|
NO CONTENT: modified file, binary diff hidden |
1 | NO CONTENT: modified file, binary diff hidden |
|
NO CONTENT: modified file, binary diff hidden |
@@ -98,7 +98,7 b' function setRCMouseBindings(repoName, re' | |||||
98 | }); |
|
98 | }); | |
99 | Mousetrap.bind(['g c'], function(e) { |
|
99 | Mousetrap.bind(['g c'], function(e) { | |
100 | window.location = pyroutes.url( |
|
100 | window.location = pyroutes.url( | |
101 |
'repo_c |
|
101 | 'repo_commits', {'repo_name': repoName}); | |
102 | }); |
|
102 | }); | |
103 | Mousetrap.bind(['g F'], function(e) { |
|
103 | Mousetrap.bind(['g F'], function(e) { | |
104 | window.location = pyroutes.url( |
|
104 | window.location = pyroutes.url( |
@@ -131,6 +131,7 b' function registerRCRoutes() {' | |||||
131 | pyroutes.register('repo_new', '/_admin/repos/new', []); |
|
131 | pyroutes.register('repo_new', '/_admin/repos/new', []); | |
132 | pyroutes.register('repo_create', '/_admin/repos/create', []); |
|
132 | pyroutes.register('repo_create', '/_admin/repos/create', []); | |
133 | pyroutes.register('repo_groups', '/_admin/repo_groups', []); |
|
133 | pyroutes.register('repo_groups', '/_admin/repo_groups', []); | |
|
134 | pyroutes.register('repo_groups_data', '/_admin/repo_groups_data', []); | |||
134 | pyroutes.register('repo_group_new', '/_admin/repo_group/new', []); |
|
135 | pyroutes.register('repo_group_new', '/_admin/repo_group/new', []); | |
135 | pyroutes.register('repo_group_create', '/_admin/repo_group/create', []); |
|
136 | pyroutes.register('repo_group_create', '/_admin/repo_group/create', []); | |
136 | pyroutes.register('channelstream_connect', '/_admin/channelstream/connect', []); |
|
137 | pyroutes.register('channelstream_connect', '/_admin/channelstream/connect', []); | |
@@ -148,6 +149,7 b' function registerRCRoutes() {' | |||||
148 | pyroutes.register('repo_group_list_data', '/_repo_groups', []); |
|
149 | pyroutes.register('repo_group_list_data', '/_repo_groups', []); | |
149 | pyroutes.register('goto_switcher_data', '/_goto_data', []); |
|
150 | pyroutes.register('goto_switcher_data', '/_goto_data', []); | |
150 | pyroutes.register('markup_preview', '/_markup_preview', []); |
|
151 | pyroutes.register('markup_preview', '/_markup_preview', []); | |
|
152 | pyroutes.register('file_preview', '/_file_preview', []); | |||
151 | pyroutes.register('store_user_session_value', '/_store_session_attr', []); |
|
153 | pyroutes.register('store_user_session_value', '/_store_session_attr', []); | |
152 | pyroutes.register('journal', '/_admin/journal', []); |
|
154 | pyroutes.register('journal', '/_admin/journal', []); | |
153 | pyroutes.register('journal_rss', '/_admin/journal/rss', []); |
|
155 | pyroutes.register('journal_rss', '/_admin/journal/rss', []); | |
@@ -195,14 +197,17 b' function registerRCRoutes() {' | |||||
195 | pyroutes.register('repo_files_edit_file', '/%(repo_name)s/edit_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']); |
|
197 | pyroutes.register('repo_files_edit_file', '/%(repo_name)s/edit_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']); | |
196 | pyroutes.register('repo_files_update_file', '/%(repo_name)s/update_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']); |
|
198 | pyroutes.register('repo_files_update_file', '/%(repo_name)s/update_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']); | |
197 | pyroutes.register('repo_files_add_file', '/%(repo_name)s/add_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']); |
|
199 | pyroutes.register('repo_files_add_file', '/%(repo_name)s/add_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']); | |
|
200 | pyroutes.register('repo_files_upload_file', '/%(repo_name)s/upload_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']); | |||
198 | pyroutes.register('repo_files_create_file', '/%(repo_name)s/create_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']); |
|
201 | pyroutes.register('repo_files_create_file', '/%(repo_name)s/create_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']); | |
199 | pyroutes.register('repo_refs_data', '/%(repo_name)s/refs-data', ['repo_name']); |
|
202 | pyroutes.register('repo_refs_data', '/%(repo_name)s/refs-data', ['repo_name']); | |
200 | pyroutes.register('repo_refs_changelog_data', '/%(repo_name)s/refs-data-changelog', ['repo_name']); |
|
203 | pyroutes.register('repo_refs_changelog_data', '/%(repo_name)s/refs-data-changelog', ['repo_name']); | |
201 | pyroutes.register('repo_stats', '/%(repo_name)s/repo_stats/%(commit_id)s', ['repo_name', 'commit_id']); |
|
204 | pyroutes.register('repo_stats', '/%(repo_name)s/repo_stats/%(commit_id)s', ['repo_name', 'commit_id']); | |
|
205 | pyroutes.register('repo_commits', '/%(repo_name)s/commits', ['repo_name']); | |||
|
206 | pyroutes.register('repo_commits_file', '/%(repo_name)s/commits/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']); | |||
|
207 | pyroutes.register('repo_commits_elements', '/%(repo_name)s/commits_elements', ['repo_name']); | |||
|
208 | pyroutes.register('repo_commits_elements_file', '/%(repo_name)s/commits_elements/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']); | |||
202 | pyroutes.register('repo_changelog', '/%(repo_name)s/changelog', ['repo_name']); |
|
209 | pyroutes.register('repo_changelog', '/%(repo_name)s/changelog', ['repo_name']); | |
203 | pyroutes.register('repo_changelog_file', '/%(repo_name)s/changelog/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']); |
|
210 | pyroutes.register('repo_changelog_file', '/%(repo_name)s/changelog/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']); | |
204 | pyroutes.register('repo_changelog_elements', '/%(repo_name)s/changelog_elements', ['repo_name']); |
|
|||
205 | pyroutes.register('repo_changelog_elements_file', '/%(repo_name)s/changelog_elements/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']); |
|
|||
206 | pyroutes.register('repo_compare_select', '/%(repo_name)s/compare', ['repo_name']); |
|
211 | pyroutes.register('repo_compare_select', '/%(repo_name)s/compare', ['repo_name']); | |
207 | pyroutes.register('repo_compare', '/%(repo_name)s/compare/%(source_ref_type)s@%(source_ref)s...%(target_ref_type)s@%(target_ref)s', ['repo_name', 'source_ref_type', 'source_ref', 'target_ref_type', 'target_ref']); |
|
212 | pyroutes.register('repo_compare', '/%(repo_name)s/compare/%(source_ref_type)s@%(source_ref)s...%(target_ref_type)s@%(target_ref)s', ['repo_name', 'source_ref_type', 'source_ref', 'target_ref_type', 'target_ref']); | |
208 | pyroutes.register('tags_home', '/%(repo_name)s/tags', ['repo_name']); |
|
213 | pyroutes.register('tags_home', '/%(repo_name)s/tags', ['repo_name']); | |
@@ -356,6 +361,12 b' function registerRCRoutes() {' | |||||
356 | pyroutes.register('my_account_auth_tokens_add', '/_admin/my_account/auth_tokens/new', []); |
|
361 | pyroutes.register('my_account_auth_tokens_add', '/_admin/my_account/auth_tokens/new', []); | |
357 | pyroutes.register('my_account_external_identity', '/_admin/my_account/external-identity', []); |
|
362 | pyroutes.register('my_account_external_identity', '/_admin/my_account/external-identity', []); | |
358 | pyroutes.register('my_account_external_identity_delete', '/_admin/my_account/external-identity/delete', []); |
|
363 | pyroutes.register('my_account_external_identity_delete', '/_admin/my_account/external-identity/delete', []); | |
|
364 | pyroutes.register('repo_artifacts_list', '/%(repo_name)s/artifacts', ['repo_name']); | |||
|
365 | pyroutes.register('repo_artifacts_data', '/%(repo_name)s/artifacts_data', ['repo_name']); | |||
|
366 | pyroutes.register('repo_artifacts_new', '/%(repo_name)s/artifacts/new', ['repo_name']); | |||
|
367 | pyroutes.register('repo_artifacts_get', '/%(repo_name)s/artifacts/download/%(uid)s', ['repo_name', 'uid']); | |||
|
368 | pyroutes.register('repo_artifacts_store', '/%(repo_name)s/artifacts/store', ['repo_name']); | |||
|
369 | pyroutes.register('repo_artifacts_delete', '/%(repo_name)s/artifacts/delete/%(uid)s', ['repo_name', 'uid']); | |||
359 | pyroutes.register('repo_automation', '/%(repo_name)s/settings/automation', ['repo_name']); |
|
370 | pyroutes.register('repo_automation', '/%(repo_name)s/settings/automation', ['repo_name']); | |
360 | pyroutes.register('repo_automation_update', '/%(repo_name)s/settings/automation/%(entry_id)s/update', ['repo_name', 'entry_id']); |
|
371 | pyroutes.register('repo_automation_update', '/%(repo_name)s/settings/automation/%(entry_id)s/update', ['repo_name', 'entry_id']); | |
361 | pyroutes.register('edit_repo_remote_push', '/%(repo_name)s/settings/remote/push', ['repo_name']); |
|
372 | pyroutes.register('edit_repo_remote_push', '/%(repo_name)s/settings/remote/push', ['repo_name']); |
@@ -102,7 +102,7 b' var showRepoStats = function(target, dat' | |||||
102 | var total = 0; |
|
102 | var total = 0; | |
103 | var no_data = true; |
|
103 | var no_data = true; | |
104 | var tbl = document.createElement('table'); |
|
104 | var tbl = document.createElement('table'); | |
105 | tbl.setAttribute('class', 'trending_language_tbl'); |
|
105 | tbl.setAttribute('class', 'trending_language_tbl rctable'); | |
106 |
|
106 | |||
107 | $.each(data, function(key, val){ |
|
107 | $.each(data, function(key, val){ | |
108 | total += val.count; |
|
108 | total += val.count; | |
@@ -120,54 +120,47 b' var showRepoStats = function(target, dat' | |||||
120 | cnt += 1; |
|
120 | cnt += 1; | |
121 | no_data = false; |
|
121 | no_data = false; | |
122 |
|
122 | |||
123 | var hide = cnt > 2; |
|
|||
124 | var tr = document.createElement('tr'); |
|
123 | var tr = document.createElement('tr'); | |
125 | if (hide) { |
|
|||
126 | tr.setAttribute('style', 'display:none'); |
|
|||
127 | tr.setAttribute('class', 'stats_hidden'); |
|
|||
128 | } |
|
|||
129 |
|
124 | |||
130 | var key = val[0]; |
|
125 | var key = val[0]; | |
131 | var obj = {"desc": val[1].desc, "count": val[1].count}; |
|
126 | var obj = {"desc": val[1].desc, "count": val[1].count}; | |
132 |
|
127 | |||
133 | var percentage = Math.round((obj.count / total * 100), 2); |
|
128 | // meta language names | |
134 |
|
||||
135 | var td1 = document.createElement('td'); |
|
129 | var td1 = document.createElement('td'); | |
136 | td1.width = 300; |
|
|||
137 | var trending_language_label = document.createElement('div'); |
|
130 | var trending_language_label = document.createElement('div'); | |
138 |
trending_language_label.innerHTML = obj.desc |
|
131 | trending_language_label.innerHTML = obj.desc; | |
139 | td1.appendChild(trending_language_label); |
|
132 | td1.appendChild(trending_language_label); | |
140 |
|
133 | |||
|
134 | // extensions | |||
141 | var td2 = document.createElement('td'); |
|
135 | var td2 = document.createElement('td'); | |
142 |
var |
|
136 | var extension = document.createElement('div'); | |
143 | var nr_files = obj.count +" "+ _ngettext('file', 'files', obj.count); |
|
137 | extension.innerHTML = ".{0}".format(key) | |
144 |
|
138 | td2.appendChild(extension); | ||
145 | trending_language.title = key + " " + nr_files; |
|
|||
146 |
|
139 | |||
147 | trending_language.innerHTML = "<span>" + percentage + "% " + nr_files |
|
140 | // number of files | |
148 | + "</span><b>" + percentage + "% " + nr_files + "</b>"; |
|
141 | var td3 = document.createElement('td'); | |
|
142 | var file_count = document.createElement('div'); | |||
|
143 | var percentage_num = Math.round((obj.count / total * 100), 2); | |||
|
144 | var label = _ngettext('file', 'files', obj.count); | |||
|
145 | file_count.innerHTML = "{0} {1} ({2}%)".format(obj.count, label, percentage_num) ; | |||
|
146 | td3.appendChild(file_count); | |||
149 |
|
147 | |||
150 | trending_language.setAttribute("class", 'trending_language'); |
|
148 | // percentage | |
151 | $('b', trending_language)[0].style.width = percentage + "%"; |
|
149 | var td4 = document.createElement('td'); | |
152 |
td |
|
150 | td4.setAttribute("class", 'trending_language'); | |
|
151 | ||||
|
152 | var percentage = document.createElement('div'); | |||
|
153 | percentage.setAttribute('class', 'lang-bar'); | |||
|
154 | percentage.innerHTML = " "; | |||
|
155 | percentage.style.width = percentage_num + '%'; | |||
|
156 | td4.appendChild(percentage); | |||
153 |
|
157 | |||
154 | tr.appendChild(td1); |
|
158 | tr.appendChild(td1); | |
155 | tr.appendChild(td2); |
|
159 | tr.appendChild(td2); | |
|
160 | tr.appendChild(td3); | |||
|
161 | tr.appendChild(td4); | |||
156 | tbl.appendChild(tr); |
|
162 | tbl.appendChild(tr); | |
157 | if (cnt == 3) { |
|
|||
158 | var show_more = document.createElement('tr'); |
|
|||
159 | var td = document.createElement('td'); |
|
|||
160 | lnk = document.createElement('a'); |
|
|||
161 |
|
163 | |||
162 | lnk.href = '#'; |
|
|||
163 | lnk.innerHTML = _gettext('Show more'); |
|
|||
164 | lnk.id = 'code_stats_show_more'; |
|
|||
165 | td.appendChild(lnk); |
|
|||
166 |
|
||||
167 | show_more.appendChild(td); |
|
|||
168 | show_more.appendChild(document.createElement('td')); |
|
|||
169 | tbl.appendChild(show_more); |
|
|||
170 | } |
|
|||
171 | }); |
|
164 | }); | |
172 |
|
165 | |||
173 | $(container).html(tbl); |
|
166 | $(container).html(tbl); |
@@ -46,6 +46,8 b' var CommitsController = function () {' | |||||
46 | self.$graphCanvas.html(''); |
|
46 | self.$graphCanvas.html(''); | |
47 |
|
47 | |||
48 | var edgeData = $("[data-graph]").data('graph') || this.$graphCanvas.data('graph') || []; |
|
48 | var edgeData = $("[data-graph]").data('graph') || this.$graphCanvas.data('graph') || []; | |
|
49 | var prev_link = $('.load-more-commits').find('.prev-commits').get(0); | |||
|
50 | var next_link = $('.load-more-commits').find('.next-commits').get(0); | |||
49 |
|
51 | |||
50 | // Determine max number of edges per row in graph |
|
52 | // Determine max number of edges per row in graph | |
51 | var edgeCount = 1; |
|
53 | var edgeCount = 1; | |
@@ -57,10 +59,20 b' var CommitsController = function () {' | |||||
57 | }); |
|
59 | }); | |
58 | }); |
|
60 | }); | |
59 |
|
61 | |||
|
62 | if (prev_link && next_link) { | |||
|
63 | var graph_padding = -64; | |||
|
64 | } | |||
|
65 | else if (next_link) { | |||
|
66 | var graph_padding = -32; | |||
|
67 | } else { | |||
|
68 | var graph_padding = 0; | |||
|
69 | } | |||
|
70 | ||||
60 | var x_step = Math.min(10, Math.floor(86 / edgeCount)); |
|
71 | var x_step = Math.min(10, Math.floor(86 / edgeCount)); | |
|
72 | var height = $('#changesets').find('.commits-range').height() + graph_padding; | |||
61 | var graph_options = { |
|
73 | var graph_options = { | |
62 | width: 100, |
|
74 | width: 100, | |
63 | height: $('#changesets').find('.commits-range').height(), |
|
75 | height: height, | |
64 | x_step: x_step, |
|
76 | x_step: x_step, | |
65 | y_step: 42, |
|
77 | y_step: 42, | |
66 | dotRadius: 3.5, |
|
78 | dotRadius: 3.5, | |
@@ -85,11 +97,11 b' var CommitsController = function () {' | |||||
85 | this.$graphCanvas.commits(graph_options); |
|
97 | this.$graphCanvas.commits(graph_options); | |
86 |
|
98 | |||
87 | this.setLabelText(edgeData); |
|
99 | this.setLabelText(edgeData); | |
88 | if ($('.load-more-commits').find('.prev-commits').get(0)) { |
|
|||
89 | var padding = 75; |
|
|||
90 |
|
100 | |||
91 | } else { |
|
101 | var padding = 90; | |
92 | var padding = 43; |
|
102 | if (prev_link) { | |
|
103 | padding += 34; | |||
|
104 | ||||
93 | } |
|
105 | } | |
94 | $('#graph_nodes').css({'padding-top': padding}); |
|
106 | $('#graph_nodes').css({'padding-top': padding}); | |
95 | }; |
|
107 | }; | |
@@ -112,10 +124,10 b' var CommitsController = function () {' | |||||
112 | } |
|
124 | } | |
113 |
|
125 | |||
114 | if (urlData['commit_id'] && urlData['f_path']) { |
|
126 | if (urlData['commit_id'] && urlData['f_path']) { | |
115 |
return pyroutes.url('repo_c |
|
127 | return pyroutes.url('repo_commits_elements_file', urlData); | |
116 | } |
|
128 | } | |
117 | else { |
|
129 | else { | |
118 |
return pyroutes.url('repo_c |
|
130 | return pyroutes.url('repo_commits_elements', urlData); | |
119 | } |
|
131 | } | |
120 |
|
132 | |||
121 | }; |
|
133 | }; |
@@ -204,7 +204,12 b' var CodeMirrorCompleteAfter = function(c' | |||||
204 | }; |
|
204 | }; | |
205 |
|
205 | |||
206 | var initCodeMirror = function(textAreadId, resetUrl, focus, options) { |
|
206 | var initCodeMirror = function(textAreadId, resetUrl, focus, options) { | |
207 | var ta = $('#' + textAreadId).get(0); |
|
207 | if (textAreadId.substr(0,1) === "#"){ | |
|
208 | var ta = $(textAreadId).get(0); | |||
|
209 | }else { | |||
|
210 | var ta = $('#' + textAreadId).get(0); | |||
|
211 | } | |||
|
212 | ||||
208 | if (focus === undefined) { |
|
213 | if (focus === undefined) { | |
209 | focus = true; |
|
214 | focus = true; | |
210 | } |
|
215 | } | |
@@ -644,18 +649,6 b' var fillCodeMirrorOptions = function(tar' | |||||
644 | } |
|
649 | } | |
645 | }; |
|
650 | }; | |
646 |
|
651 | |||
647 | var CodeMirrorPreviewEnable = function(edit_mode) { |
|
|||
648 | // in case it a preview enabled mode enable the button |
|
|||
649 | if (['markdown', 'rst', 'gfm'].indexOf(edit_mode) !== -1) { |
|
|||
650 | $('#render_preview').removeClass('hidden'); |
|
|||
651 | } |
|
|||
652 | else { |
|
|||
653 | if (!$('#render_preview').hasClass('hidden')) { |
|
|||
654 | $('#render_preview').addClass('hidden'); |
|
|||
655 | } |
|
|||
656 | } |
|
|||
657 | }; |
|
|||
658 |
|
||||
659 |
|
652 | |||
660 | /* markup form */ |
|
653 | /* markup form */ | |
661 | (function(mod) { |
|
654 | (function(mod) { |
@@ -587,12 +587,14 b' var CommentsController = function() {' | |||||
587 | $('#content').removeClass("wrapper"); |
|
587 | $('#content').removeClass("wrapper"); | |
588 | $('#content').addClass("wide-mode-wrapper"); |
|
588 | $('#content').addClass("wide-mode-wrapper"); | |
589 | $(node).addClass('btn-success'); |
|
589 | $(node).addClass('btn-success'); | |
|
590 | return true | |||
590 | } else { |
|
591 | } else { | |
591 | $('#content').removeClass("wide-mode-wrapper"); |
|
592 | $('#content').removeClass("wide-mode-wrapper"); | |
592 | $('#content').addClass("wrapper"); |
|
593 | $('#content').addClass("wrapper"); | |
593 | $(node).removeClass('btn-success'); |
|
594 | $(node).removeClass('btn-success'); | |
|
595 | return false | |||
594 | } |
|
596 | } | |
595 | return false; |
|
597 | ||
596 | }; |
|
598 | }; | |
597 |
|
599 | |||
598 | this.toggleComments = function(node, show) { |
|
600 | this.toggleComments = function(node, show) { |
This diff has been collapsed as it changes many lines, (627 lines changed) Show them Hide them | |||||
@@ -19,234 +19,254 b'' | |||||
19 | /** |
|
19 | /** | |
20 | * Search file list |
|
20 | * Search file list | |
21 | */ |
|
21 | */ | |
22 | // global reference to file-node filter |
|
22 | ||
23 | var _NODEFILTER = {}; |
|
23 | var NodeFilter = {}; | |
24 |
|
24 | |||
25 | var fileBrowserListeners = function(node_list_url, url_base){ |
|
25 | var fileBrowserListeners = function (node_list_url, url_base) { | |
26 |
var |
|
26 | var $filterInput = $('#node_filter'); | |
27 |
|
27 | var n_filter = $filterInput.get(0); | ||
28 | _NODEFILTER.filterTimeout = null; |
|
|||
29 | var nodes = null; |
|
|||
30 |
|
28 | |||
31 | _NODEFILTER.fetchNodes = function(callback) { |
|
29 | NodeFilter.filterTimeout = null; | |
32 | $.ajax({url: node_list_url, headers: {'X-PARTIAL-XHR': true}}) |
|
30 | var nodes = null; | |
33 | .done(function(data){ |
|
|||
34 | nodes = data.nodes; |
|
|||
35 | if (callback) { |
|
|||
36 | callback(); |
|
|||
37 | } |
|
|||
38 | }) |
|
|||
39 | .fail(function(data){ |
|
|||
40 | console.log('failed to load'); |
|
|||
41 | }); |
|
|||
42 | }; |
|
|||
43 |
|
31 | |||
44 | _NODEFILTER.fetchNodesCallback = function() { |
|
32 | NodeFilter.focus = function () { | |
45 | $('#node_filter_box_loading').hide(); |
|
33 | $filterInput.focus() | |
46 | $('#node_filter_box').removeClass('hidden').show(); |
|
34 | }; | |
47 | n_filter.focus(); |
|
|||
48 | if ($('#node_filter').hasClass('init')){ |
|
|||
49 | n_filter.value = ''; |
|
|||
50 | $('#node_filter').removeClass('init'); |
|
|||
51 | } |
|
|||
52 | }; |
|
|||
53 |
|
35 | |||
54 | _NODEFILTER.initFilter = function(){ |
|
36 | NodeFilter.fetchNodes = function (callback) { | |
55 | $('#node_filter_box_loading').removeClass('hidden').show(); |
|
37 | $.ajax( | |
56 | $('#search_activate_id').hide(); |
|
38 | {url: node_list_url, headers: {'X-PARTIAL-XHR': true}}) | |
57 | $('#search_deactivate_id').removeClass('hidden').show(); |
|
39 | .done(function (data) { | |
58 | $('#add_node_id').hide(); |
|
40 | nodes = data.nodes; | |
59 | _NODEFILTER.fetchNodes(_NODEFILTER.fetchNodesCallback); |
|
41 | if (callback) { | |
60 | }; |
|
42 | callback(); | |
|
43 | } | |||
|
44 | }) | |||
|
45 | .fail(function (data) { | |||
|
46 | console.log('failed to load'); | |||
|
47 | }); | |||
|
48 | }; | |||
61 |
|
49 | |||
62 |
|
|
50 | NodeFilter.initFilter = function (e) { | |
63 | $('#node_filter_box_loading').hide(); |
|
51 | if ($filterInput.hasClass('loading')) { | |
64 | $('#node_filter_box').hide(); |
|
52 | return | |
65 | $('#search_activate_id').show(); |
|
|||
66 | $('#search_deactivate_id').hide(); |
|
|||
67 | $('#add_node_id').show(); |
|
|||
68 | $('#tbody').show(); |
|
|||
69 | $('#tbody_filtered').hide(); |
|
|||
70 | $('#node_filter').val(''); |
|
|||
71 | }; |
|
|||
72 |
|
||||
73 | _NODEFILTER.fuzzy_match = function(filepath, query) { |
|
|||
74 | var highlight = []; |
|
|||
75 | var order = 0; |
|
|||
76 | for (var i = 0; i < query.length; i++) { |
|
|||
77 | var match_position = filepath.indexOf(query[i]); |
|
|||
78 | if (match_position !== -1) { |
|
|||
79 | var prev_match_position = highlight[highlight.length-1]; |
|
|||
80 | if (prev_match_position === undefined) { |
|
|||
81 | highlight.push(match_position); |
|
|||
82 | } else { |
|
|||
83 | var current_match_position = prev_match_position + match_position + 1; |
|
|||
84 | highlight.push(current_match_position); |
|
|||
85 | order = order + current_match_position - prev_match_position; |
|
|||
86 | } |
|
53 | } | |
87 | filepath = filepath.substring(match_position+1); |
|
|||
88 | } else { |
|
|||
89 | return false; |
|
|||
90 | } |
|
|||
91 | } |
|
|||
92 | return {'order': order, |
|
|||
93 | 'highlight': highlight}; |
|
|||
94 | }; |
|
|||
95 |
|
54 | |||
96 | _NODEFILTER.sortPredicate = function(a, b) { |
|
55 | // in case we are already loaded, do nothing | |
97 | if (a.order < b.order) return -1; |
|
56 | if (!$filterInput.hasClass('init')) { | |
98 | if (a.order > b.order) return 1; |
|
57 | return NodeFilter.handleKey(e); | |
99 | if (a.filepath < b.filepath) return -1; |
|
|||
100 | if (a.filepath > b.filepath) return 1; |
|
|||
101 | return 0; |
|
|||
102 | }; |
|
|||
103 |
|
||||
104 | _NODEFILTER.updateFilter = function(elem, e) { |
|
|||
105 | return function(){ |
|
|||
106 | // Reset timeout |
|
|||
107 | _NODEFILTER.filterTimeout = null; |
|
|||
108 | var query = elem.value.toLowerCase(); |
|
|||
109 | var match = []; |
|
|||
110 | var matches_max = 20; |
|
|||
111 | if (query !== ""){ |
|
|||
112 | var results = []; |
|
|||
113 | for(var k=0;k<nodes.length;k++){ |
|
|||
114 | var result = _NODEFILTER.fuzzy_match( |
|
|||
115 | nodes[k].name.toLowerCase(), query); |
|
|||
116 | if (result) { |
|
|||
117 | result.type = nodes[k].type; |
|
|||
118 | result.filepath = nodes[k].name; |
|
|||
119 | results.push(result); |
|
|||
120 | } |
|
|||
121 | } |
|
|||
122 | results = results.sort(_NODEFILTER.sortPredicate); |
|
|||
123 | var limit = matches_max; |
|
|||
124 | if (results.length < matches_max) { |
|
|||
125 | limit = results.length; |
|
|||
126 | } |
|
58 | } | |
127 | for (var i=0; i<limit; i++){ |
|
59 | var iconLoading = 'icon-spin animate-spin'; | |
128 | if(query && results.length > 0){ |
|
60 | var iconSearch = 'icon-search'; | |
129 | var n = results[i].filepath; |
|
61 | $('.files-filter-box-path i').removeClass(iconSearch).addClass(iconLoading); | |
130 | var t = results[i].type; |
|
62 | $filterInput.addClass('loading'); | |
131 | var n_hl = n.split(""); |
|
|||
132 | var pos = results[i].highlight; |
|
|||
133 | for (var j = 0; j < pos.length; j++) { |
|
|||
134 | n_hl[pos[j]] = "<em>" + n_hl[pos[j]] + "</em>"; |
|
|||
135 | } |
|
|||
136 | n_hl = n_hl.join(""); |
|
|||
137 | var new_url = url_base.replace('__FPATH__',n); |
|
|||
138 |
|
63 | |||
139 | var typeObj = { |
|
64 | var callback = function (org) { | |
140 | dir: 'icon-directory browser-dir', |
|
65 | return function () { | |
141 | file: 'icon-file-text browser-file' |
|
66 | if ($filterInput.hasClass('init')) { | |
142 | }; |
|
67 | $filterInput.removeClass('init'); | |
|
68 | $filterInput.removeClass('loading'); | |||
|
69 | } | |||
|
70 | $('.files-filter-box-path i').removeClass(iconLoading).addClass(iconSearch); | |||
143 |
|
71 | |||
144 | var typeIcon = '<i class="{0}"></i>'.format(typeObj[t]); |
|
72 | // auto re-filter if we filled in the input | |
145 | match.push('<tr class="browser-result"><td><a class="pjax-link" href="{0}">{1}{2}</a></td><td colspan="5"></td></tr>'.format(new_url,typeIcon, n_hl)); |
|
73 | if (n_filter.value !== "") { | |
146 | } |
|
74 | NodeFilter.updateFilter(n_filter, e)() | |
147 | } |
|
75 | } | |
148 | if(results.length > limit){ |
|
|||
149 | var truncated_count = results.length - matches_max; |
|
|||
150 | if (truncated_count === 1) { |
|
|||
151 | match.push('<tr><td>{0} {1}</td><td colspan="5"></td></tr>'.format(truncated_count, _gettext('truncated result'))); |
|
|||
152 | } else { |
|
|||
153 | match.push('<tr><td>{0} {1}</td><td colspan="5"></td></tr>'.format(truncated_count, _gettext('truncated results'))); |
|
|||
154 | } |
|
|||
155 | } |
|
|||
156 | } |
|
|||
157 | if (query !== ""){ |
|
|||
158 | $('#tbody').hide(); |
|
|||
159 | $('#tbody_filtered').show(); |
|
|||
160 |
|
76 | |||
161 | if (match.length === 0){ |
|
77 | } | |
162 | match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(_gettext('No matching files'))); |
|
78 | }; | |
163 | } |
|
79 | // load node data | |
164 | $('#tbody_filtered').html(match.join("")); |
|
80 | NodeFilter.fetchNodes(callback()); | |
165 | } |
|
81 | ||
166 | else{ |
|
82 | }; | |
|
83 | ||||
|
84 | NodeFilter.resetFilter = function () { | |||
167 | $('#tbody').show(); |
|
85 | $('#tbody').show(); | |
168 | $('#tbody_filtered').hide(); |
|
86 | $('#tbody_filtered').hide(); | |
169 | } |
|
87 | $filterInput.val(''); | |
|
88 | }; | |||
|
89 | ||||
|
90 | NodeFilter.handleKey = function (e) { | |||
|
91 | var scrollDown = function (element) { | |||
|
92 | var elementBottom = element.offset().top + $(element).outerHeight(); | |||
|
93 | var windowBottom = window.innerHeight + $(window).scrollTop(); | |||
|
94 | if (elementBottom > windowBottom) { | |||
|
95 | var offset = elementBottom - window.innerHeight; | |||
|
96 | $('html,body').scrollTop(offset); | |||
|
97 | return false; | |||
|
98 | } | |||
|
99 | return true; | |||
|
100 | }; | |||
|
101 | ||||
|
102 | var scrollUp = function (element) { | |||
|
103 | if (element.offset().top < $(window).scrollTop()) { | |||
|
104 | $('html,body').scrollTop(element.offset().top); | |||
|
105 | return false; | |||
|
106 | } | |||
|
107 | return true; | |||
|
108 | }; | |||
|
109 | var $hlElem = $('.browser-highlight'); | |||
|
110 | ||||
|
111 | if (e.keyCode === 40) { // Down | |||
|
112 | if ($hlElem.length === 0) { | |||
|
113 | $('.browser-result').first().addClass('browser-highlight'); | |||
|
114 | } else { | |||
|
115 | var next = $hlElem.next(); | |||
|
116 | if (next.length !== 0) { | |||
|
117 | $hlElem.removeClass('browser-highlight'); | |||
|
118 | next.addClass('browser-highlight'); | |||
|
119 | } | |||
|
120 | } | |||
|
121 | ||||
|
122 | if ($hlElem.get(0) !== undefined){ | |||
|
123 | scrollDown($hlElem); | |||
|
124 | } | |||
|
125 | } | |||
|
126 | if (e.keyCode === 38) { // Up | |||
|
127 | e.preventDefault(); | |||
|
128 | if ($hlElem.length !== 0) { | |||
|
129 | var next = $hlElem.prev(); | |||
|
130 | if (next.length !== 0) { | |||
|
131 | $('.browser-highlight').removeClass('browser-highlight'); | |||
|
132 | next.addClass('browser-highlight'); | |||
|
133 | } | |||
|
134 | } | |||
|
135 | ||||
|
136 | if ($hlElem.get(0) !== undefined){ | |||
|
137 | scrollUp($hlElem); | |||
|
138 | } | |||
|
139 | ||||
|
140 | } | |||
|
141 | if (e.keyCode === 13) { // Enter | |||
|
142 | if ($('.browser-highlight').length !== 0) { | |||
|
143 | var url = $('.browser-highlight').find('.match-link').attr('href'); | |||
|
144 | window.location = url; | |||
|
145 | } | |||
|
146 | } | |||
|
147 | if (e.keyCode === 27) { // Esc | |||
|
148 | NodeFilter.resetFilter(); | |||
|
149 | $('html,body').scrollTop(0); | |||
|
150 | } | |||
|
151 | ||||
|
152 | var capture_keys = [ | |||
|
153 | 40, // ArrowDown | |||
|
154 | 38, // ArrowUp | |||
|
155 | 39, // ArrowRight | |||
|
156 | 37, // ArrowLeft | |||
|
157 | 13, // Enter | |||
|
158 | 27 // Esc | |||
|
159 | ]; | |||
|
160 | ||||
|
161 | if ($.inArray(e.keyCode, capture_keys) === -1) { | |||
|
162 | clearTimeout(NodeFilter.filterTimeout); | |||
|
163 | NodeFilter.filterTimeout = setTimeout(NodeFilter.updateFilter(n_filter, e), 200); | |||
|
164 | } | |||
170 |
|
165 | |||
171 | }; |
|
166 | }; | |
172 | }; |
|
|||
173 |
|
||||
174 | var scrollDown = function(element){ |
|
|||
175 | var elementBottom = element.offset().top + $(element).outerHeight(); |
|
|||
176 | var windowBottom = window.innerHeight + $(window).scrollTop(); |
|
|||
177 | if (elementBottom > windowBottom) { |
|
|||
178 | var offset = elementBottom - window.innerHeight; |
|
|||
179 | $('html,body').scrollTop(offset); |
|
|||
180 | return false; |
|
|||
181 | } |
|
|||
182 | return true; |
|
|||
183 | }; |
|
|||
184 |
|
167 | |||
185 | var scrollUp = function(element){ |
|
168 | NodeFilter.fuzzy_match = function (filepath, query) { | |
186 | if (element.offset().top < $(window).scrollTop()) { |
|
169 | var highlight = []; | |
187 | $('html,body').scrollTop(element.offset().top); |
|
170 | var order = 0; | |
188 | return false; |
|
171 | for (var i = 0; i < query.length; i++) { | |
189 | } |
|
172 | var match_position = filepath.indexOf(query[i]); | |
190 | return true; |
|
173 | if (match_position !== -1) { | |
191 | }; |
|
174 | var prev_match_position = highlight[highlight.length - 1]; | |
|
175 | if (prev_match_position === undefined) { | |||
|
176 | highlight.push(match_position); | |||
|
177 | } else { | |||
|
178 | var current_match_position = prev_match_position + match_position + 1; | |||
|
179 | highlight.push(current_match_position); | |||
|
180 | order = order + current_match_position - prev_match_position; | |||
|
181 | } | |||
|
182 | filepath = filepath.substring(match_position + 1); | |||
|
183 | } else { | |||
|
184 | return false; | |||
|
185 | } | |||
|
186 | } | |||
|
187 | return { | |||
|
188 | 'order': order, | |||
|
189 | 'highlight': highlight | |||
|
190 | }; | |||
|
191 | }; | |||
192 |
|
192 | |||
193 | $('#filter_activate').click(function() { |
|
193 | NodeFilter.sortPredicate = function (a, b) { | |
194 | _NODEFILTER.initFilter(); |
|
194 | if (a.order < b.order) return -1; | |
195 | }); |
|
195 | if (a.order > b.order) return 1; | |
196 |
|
196 | if (a.filepath < b.filepath) return -1; | ||
197 | $('#filter_deactivate').click(function() { |
|
197 | if (a.filepath > b.filepath) return 1; | |
198 | _NODEFILTER.resetFilter(); |
|
198 | return 0; | |
199 |
} |
|
199 | }; | |
200 |
|
||||
201 | $(n_filter).click(function() { |
|
|||
202 | if ($('#node_filter').hasClass('init')){ |
|
|||
203 | n_filter.value = ''; |
|
|||
204 | $('#node_filter').removeClass('init'); |
|
|||
205 | } |
|
|||
206 | }); |
|
|||
207 |
|
200 | |||
208 | $(n_filter).keydown(function(e) { |
|
201 | NodeFilter.updateFilter = function (elem, e) { | |
209 | if (e.keyCode === 40){ // Down |
|
202 | return function () { | |
210 | if ($('.browser-highlight').length === 0){ |
|
203 | // Reset timeout | |
211 | $('.browser-result').first().addClass('browser-highlight'); |
|
204 | NodeFilter.filterTimeout = null; | |
212 | } else { |
|
205 | var query = elem.value.toLowerCase(); | |
213 | var next = $('.browser-highlight').next(); |
|
206 | var match = []; | |
214 | if (next.length !== 0) { |
|
207 | var matches_max = 20; | |
215 | $('.browser-highlight').removeClass('browser-highlight'); |
|
208 | if (query !== "") { | |
216 | next.addClass('browser-highlight'); |
|
209 | var results = []; | |
217 | } |
|
210 | for (var k = 0; k < nodes.length; k++) { | |
218 | } |
|
211 | var result = NodeFilter.fuzzy_match( | |
219 | scrollDown($('.browser-highlight')); |
|
212 | nodes[k].name.toLowerCase(), query); | |
220 | } |
|
213 | if (result) { | |
221 | if (e.keyCode === 38){ // Up |
|
214 | result.type = nodes[k].type; | |
222 | e.preventDefault(); |
|
215 | result.filepath = nodes[k].name; | |
223 | if ($('.browser-highlight').length !== 0){ |
|
216 | results.push(result); | |
224 | var next = $('.browser-highlight').prev(); |
|
217 | } | |
225 | if (next.length !== 0) { |
|
218 | } | |
226 | $('.browser-highlight').removeClass('browser-highlight'); |
|
219 | results = results.sort(NodeFilter.sortPredicate); | |
227 | next.addClass('browser-highlight'); |
|
220 | var limit = matches_max; | |
228 | } |
|
221 | if (results.length < matches_max) { | |
229 | } |
|
222 | limit = results.length; | |
230 | scrollUp($('.browser-highlight')); |
|
223 | } | |
231 | } |
|
224 | for (var i = 0; i < limit; i++) { | |
232 | if (e.keyCode === 13){ // Enter |
|
225 | if (query && results.length > 0) { | |
233 | if ($('.browser-highlight').length !== 0){ |
|
226 | var n = results[i].filepath; | |
234 | var url = $('.browser-highlight').find('.pjax-link').attr('href'); |
|
227 | var t = results[i].type; | |
235 | $.pjax({url: url, container: '#pjax-container', timeout: pjaxTimeout}); |
|
228 | var n_hl = n.split(""); | |
236 | } |
|
229 | var pos = results[i].highlight; | |
237 | } |
|
230 | for (var j = 0; j < pos.length; j++) { | |
238 | if (e.keyCode === 27){ // Esc |
|
231 | n_hl[pos[j]] = "<em>" + n_hl[pos[j]] + "</em>"; | |
239 | _NODEFILTER.resetFilter(); |
|
232 | } | |
240 | $('html,body').scrollTop(0); |
|
233 | n_hl = n_hl.join(""); | |
241 | } |
|
234 | var new_url = url_base.replace('__FPATH__', n); | |
242 | }); |
|
235 | ||
243 | var capture_keys = [40, 38, 39, 37, 13, 27]; |
|
236 | var typeObj = { | |
244 | $(n_filter).keyup(function(e) { |
|
237 | dir: 'icon-directory browser-dir', | |
245 | if ($.inArray(e.keyCode, capture_keys) === -1){ |
|
238 | file: 'icon-file-text browser-file' | |
246 | clearTimeout(_NODEFILTER.filterTimeout); |
|
239 | }; | |
247 | _NODEFILTER.filterTimeout = setTimeout(_NODEFILTER.updateFilter(n_filter, e),200); |
|
240 | ||
248 | } |
|
241 | var typeIcon = '<i class="{0}"></i>'.format(typeObj[t]); | |
249 | }); |
|
242 | match.push('<tr class="browser-result"><td><a class="match-link" href="{0}">{1}{2}</a></td><td colspan="5"></td></tr>'.format(new_url, typeIcon, n_hl)); | |
|
243 | } | |||
|
244 | } | |||
|
245 | if (results.length > limit) { | |||
|
246 | var truncated_count = results.length - matches_max; | |||
|
247 | if (truncated_count === 1) { | |||
|
248 | match.push('<tr><td>{0} {1}</td><td colspan="5"></td></tr>'.format(truncated_count, _gettext('truncated result'))); | |||
|
249 | } else { | |||
|
250 | match.push('<tr><td>{0} {1}</td><td colspan="5"></td></tr>'.format(truncated_count, _gettext('truncated results'))); | |||
|
251 | } | |||
|
252 | } | |||
|
253 | } | |||
|
254 | if (query !== "") { | |||
|
255 | $('#tbody').hide(); | |||
|
256 | $('#tbody_filtered').show(); | |||
|
257 | ||||
|
258 | if (match.length === 0) { | |||
|
259 | match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(_gettext('No matching files'))); | |||
|
260 | } | |||
|
261 | $('#tbody_filtered').html(match.join("")); | |||
|
262 | } else { | |||
|
263 | $('#tbody').show(); | |||
|
264 | $('#tbody_filtered').hide(); | |||
|
265 | } | |||
|
266 | ||||
|
267 | }; | |||
|
268 | }; | |||
|
269 | ||||
250 | }; |
|
270 | }; | |
251 |
|
271 | |||
252 | var getIdentNode = function(n){ |
|
272 | var getIdentNode = function(n){ | |
@@ -308,3 +328,190 b' var getSelectionLink = function(e) {' | |||||
308 | } |
|
328 | } | |
309 | } |
|
329 | } | |
310 | }; |
|
330 | }; | |
|
331 | ||||
|
332 | var getFileState = function() { | |||
|
333 | // relies on a global set filesUrlData | |||
|
334 | var f_path = filesUrlData['f_path']; | |||
|
335 | var commit_id = filesUrlData['commit_id']; | |||
|
336 | ||||
|
337 | var url_params = { | |||
|
338 | repo_name: templateContext.repo_name, | |||
|
339 | commit_id: commit_id, | |||
|
340 | f_path:'__FPATH__' | |||
|
341 | }; | |||
|
342 | if (atRef !== '') { | |||
|
343 | url_params['at'] = atRef | |||
|
344 | } | |||
|
345 | ||||
|
346 | var _url_base = pyroutes.url('repo_files', url_params); | |||
|
347 | var _node_list_url = pyroutes.url('repo_files_nodelist', | |||
|
348 | {repo_name: templateContext.repo_name, | |||
|
349 | commit_id: commit_id, f_path: f_path}); | |||
|
350 | ||||
|
351 | return { | |||
|
352 | f_path: f_path, | |||
|
353 | commit_id: commit_id, | |||
|
354 | node_list_url: _node_list_url, | |||
|
355 | url_base: _url_base | |||
|
356 | }; | |||
|
357 | }; | |||
|
358 | ||||
|
359 | var getFilesMetadata = function() { | |||
|
360 | // relies on metadataRequest global state | |||
|
361 | if (metadataRequest && metadataRequest.readyState != 4) { | |||
|
362 | metadataRequest.abort(); | |||
|
363 | } | |||
|
364 | ||||
|
365 | if ($('#file-tree-wrapper').hasClass('full-load')) { | |||
|
366 | // in case our HTML wrapper has full-load class we don't | |||
|
367 | // trigger the async load of metadata | |||
|
368 | return false; | |||
|
369 | } | |||
|
370 | ||||
|
371 | var state = getFileState(); | |||
|
372 | var url_data = { | |||
|
373 | 'repo_name': templateContext.repo_name, | |||
|
374 | 'commit_id': state.commit_id, | |||
|
375 | 'f_path': state.f_path | |||
|
376 | }; | |||
|
377 | ||||
|
378 | var url = pyroutes.url('repo_nodetree_full', url_data); | |||
|
379 | ||||
|
380 | metadataRequest = $.ajax({url: url}); | |||
|
381 | ||||
|
382 | metadataRequest.done(function(data) { | |||
|
383 | $('#file-tree').html(data); | |||
|
384 | timeagoActivate(); | |||
|
385 | }); | |||
|
386 | metadataRequest.fail(function (data, textStatus, errorThrown) { | |||
|
387 | if (data.status != 0) { | |||
|
388 | alert("Error while fetching metadata.\nError code {0} ({1}).Please consider reloading the page".format(data.status,data.statusText)); | |||
|
389 | } | |||
|
390 | }); | |||
|
391 | }; | |||
|
392 | ||||
|
393 | // show more authors | |||
|
394 | var showAuthors = function(elem, annotate) { | |||
|
395 | var state = getFileState('callbacks'); | |||
|
396 | ||||
|
397 | var url = pyroutes.url('repo_file_authors', | |||
|
398 | {'repo_name': templateContext.repo_name, | |||
|
399 | 'commit_id': state.commit_id, 'f_path': state.f_path}); | |||
|
400 | ||||
|
401 | $.pjax({ | |||
|
402 | url: url, | |||
|
403 | data: 'annotate={0}'.format(annotate), | |||
|
404 | container: '#file_authors', | |||
|
405 | push: false, | |||
|
406 | timeout: 5000 | |||
|
407 | }).complete(function(){ | |||
|
408 | $(elem).hide(); | |||
|
409 | $('#file_authors_title').html(_gettext('All Authors')) | |||
|
410 | }) | |||
|
411 | }; | |||
|
412 | ||||
|
413 | ||||
|
414 | (function (mod) { | |||
|
415 | ||||
|
416 | if (typeof exports == "object" && typeof module == "object") { | |||
|
417 | // CommonJS | |||
|
418 | module.exports = mod(); | |||
|
419 | } else { | |||
|
420 | // Plain browser env | |||
|
421 | (this || window).FileEditor = mod(); | |||
|
422 | } | |||
|
423 | ||||
|
424 | })(function () { | |||
|
425 | "use strict"; | |||
|
426 | ||||
|
427 | function FileEditor(textAreaElement, options) { | |||
|
428 | if (!(this instanceof FileEditor)) { | |||
|
429 | return new FileEditor(textAreaElement, options); | |||
|
430 | } | |||
|
431 | // bind the element instance to our Form | |||
|
432 | var te = $(textAreaElement).get(0); | |||
|
433 | if (te !== undefined) { | |||
|
434 | te.FileEditor = this; | |||
|
435 | } | |||
|
436 | ||||
|
437 | this.modes_select = '#set_mode'; | |||
|
438 | this.filename_selector = '#filename'; | |||
|
439 | this.commit_btn_selector = '#commit_btn'; | |||
|
440 | this.line_wrap_selector = '#line_wrap'; | |||
|
441 | this.editor_preview_selector = '#editor_preview'; | |||
|
442 | ||||
|
443 | if (te !== undefined) { | |||
|
444 | this.cm = initCodeMirror(textAreaElement, null, false); | |||
|
445 | } | |||
|
446 | ||||
|
447 | // FUNCTIONS and helpers | |||
|
448 | var self = this; | |||
|
449 | ||||
|
450 | this.submitHandler = function() { | |||
|
451 | $(self.commit_btn_selector).on('click', function(e) { | |||
|
452 | ||||
|
453 | var filename = $(self.filename_selector).val(); | |||
|
454 | if (filename === "") { | |||
|
455 | alert("Missing filename"); | |||
|
456 | e.preventDefault(); | |||
|
457 | } | |||
|
458 | ||||
|
459 | var button = $(this); | |||
|
460 | if (button.hasClass('clicked')) { | |||
|
461 | button.attr('disabled', true); | |||
|
462 | } else { | |||
|
463 | button.addClass('clicked'); | |||
|
464 | } | |||
|
465 | }); | |||
|
466 | }; | |||
|
467 | this.submitHandler(); | |||
|
468 | ||||
|
469 | // on select line wraps change the editor | |||
|
470 | this.lineWrapHandler = function () { | |||
|
471 | $(self.line_wrap_selector).on('change', function (e) { | |||
|
472 | var selected = e.currentTarget; | |||
|
473 | var line_wraps = {'on': true, 'off': false}[selected.value]; | |||
|
474 | setCodeMirrorLineWrap(self.cm, line_wraps) | |||
|
475 | }); | |||
|
476 | }; | |||
|
477 | this.lineWrapHandler(); | |||
|
478 | ||||
|
479 | ||||
|
480 | this.showPreview = function () { | |||
|
481 | ||||
|
482 | var _text = self.cm.getValue(); | |||
|
483 | var _file_path = $(self.filename_selector).val(); | |||
|
484 | if (_text && _file_path) { | |||
|
485 | $('.show-preview').addClass('active'); | |||
|
486 | $('.show-editor').removeClass('active'); | |||
|
487 | ||||
|
488 | $(self.editor_preview_selector).show(); | |||
|
489 | $(self.cm.getWrapperElement()).hide(); | |||
|
490 | ||||
|
491 | ||||
|
492 | var post_data = {'text': _text, 'file_path': _file_path, 'csrf_token': CSRF_TOKEN}; | |||
|
493 | $(self.editor_preview_selector).html(_gettext('Loading ...')); | |||
|
494 | ||||
|
495 | var url = pyroutes.url('file_preview'); | |||
|
496 | ||||
|
497 | ajaxPOST(url, post_data, function (o) { | |||
|
498 | $(self.editor_preview_selector).html(o); | |||
|
499 | }) | |||
|
500 | } | |||
|
501 | ||||
|
502 | }; | |||
|
503 | ||||
|
504 | this.showEditor = function () { | |||
|
505 | $(self.editor_preview_selector).hide(); | |||
|
506 | $('.show-editor').addClass('active'); | |||
|
507 | $('.show-preview').removeClass('active'); | |||
|
508 | ||||
|
509 | $(self.cm.getWrapperElement()).show(); | |||
|
510 | }; | |||
|
511 | ||||
|
512 | ||||
|
513 | } | |||
|
514 | ||||
|
515 | return FileEditor; | |||
|
516 | }); | |||
|
517 |
@@ -16,58 +16,44 b'' | |||||
16 | // # RhodeCode Enterprise Edition, including its added features, Support services, |
|
16 | // # RhodeCode Enterprise Edition, including its added features, Support services, | |
17 | // # and proprietary license terms, please see https://rhodecode.com/licenses/ |
|
17 | // # and proprietary license terms, please see https://rhodecode.com/licenses/ | |
18 |
|
18 | |||
19 | var onSuccessFollow = function(target){ |
|
19 | var onSuccessFollow = function (target) { | |
20 |
var |
|
20 | var targetEl = $(target); | |
21 | var f_cnt = $('#current_followers_count'); |
|
|||
22 |
|
21 | |||
23 | if(f.hasClass('follow')){ |
|
22 | var callback = function () { | |
24 | f.removeClass('follow'); |
|
23 | targetEl.animate({'opacity': 1.00}, 200); | |
25 |
f. |
|
24 | if (targetEl.hasClass('watching')) { | |
26 | f.attr('title', _gettext('Stop following this repository')); |
|
25 | targetEl.removeClass('watching'); | |
27 | $(f).html(_gettext('Unfollow')); |
|
26 | targetEl.attr('title', _gettext('Stopped watching this repository')); | |
28 | if(f_cnt.length){ |
|
27 | $(targetEl).html('<i class="icon-eye"></i>'+_gettext('Watch')); | |
29 | var cnt = Number(f_cnt.html())+1; |
|
28 | } else { | |
30 | f_cnt.html(cnt); |
|
29 | targetEl.addClass('watching'); | |
|
30 | targetEl.attr('title', _gettext('Started watching this repository')); | |||
|
31 | $(targetEl).html('<i class="icon-eye-off"></i>'+_gettext('Unwatch')); | |||
31 | } |
|
32 | } | |
32 | } |
|
33 | }; | |
33 | else{ |
|
34 | targetEl.animate({'opacity': 0.15}, 200, callback); | |
34 | f.removeClass('following'); |
|
|||
35 | f.addClass('follow'); |
|
|||
36 | f.attr('title', _gettext('Start following this repository')); |
|
|||
37 | $(f).html(_gettext('Follow')); |
|
|||
38 | if(f_cnt.length){ |
|
|||
39 | var cnt = Number(f_cnt.html())-1; |
|
|||
40 | f_cnt.html(cnt); |
|
|||
41 | } |
|
|||
42 | } |
|
|||
43 | }; |
|
35 | }; | |
44 |
|
36 | |||
45 | // TODO:: check if the function is needed. 0 usage found |
|
37 | ||
46 |
var toggleFollowingUser = function(target,follows_user_id |
|
38 | var toggleFollowingUser = function (target, follows_user_id) { | |
47 | var args = { |
|
39 | var args = { | |
48 | 'follows_user_id': follows_user_id, |
|
40 | 'follows_user_id': follows_user_id, | |
49 | 'auth_token': token, |
|
|||
50 | 'csrf_token': CSRF_TOKEN |
|
41 | 'csrf_token': CSRF_TOKEN | |
51 | }; |
|
42 | }; | |
52 | if(user_id != undefined){ |
|
43 | ||
53 | args.user_id = user_id |
|
44 | ajaxPOST(pyroutes.url('toggle_following'), args, function () { | |
54 | } |
|
|||
55 | ajaxPOST(pyroutes.url('toggle_following'), args, function(){ |
|
|||
56 | onSuccessFollow(target); |
|
45 | onSuccessFollow(target); | |
57 | }); |
|
46 | }); | |
58 | return false; |
|
47 | return false; | |
59 | }; |
|
48 | }; | |
60 |
|
49 | |||
61 |
var toggleFollowingRepo = function(target,follows_repo_id |
|
50 | var toggleFollowingRepo = function (target, follows_repo_id) { | |
62 | var args = { |
|
51 | var args = { | |
63 | 'follows_repo_id': follows_repo_id, |
|
52 | 'follows_repo_id': follows_repo_id, | |
64 | 'auth_token': token, |
|
|||
65 | 'csrf_token': CSRF_TOKEN |
|
53 | 'csrf_token': CSRF_TOKEN | |
66 | }; |
|
54 | }; | |
67 | if(user_id != undefined){ |
|
55 | ||
68 | args.user_id = user_id |
|
56 | ajaxPOST(pyroutes.url('toggle_following'), args, function () { | |
69 | } |
|
|||
70 | ajaxPOST(pyroutes.url('toggle_following'), args, function(){ |
|
|||
71 | onSuccessFollow(target); |
|
57 | onSuccessFollow(target); | |
72 | }); |
|
58 | }); | |
73 | return false; |
|
59 | return false; |
@@ -73,10 +73,3 b' var select2RefSwitcher = function(target' | |||||
73 | {'repo_name': templateContext.repo_name}); |
|
73 | {'repo_name': templateContext.repo_name}); | |
74 | select2RefBaseSwitcher(targetElement, loadUrl, initialData); |
|
74 | select2RefBaseSwitcher(targetElement, loadUrl, initialData); | |
75 | }; |
|
75 | }; | |
76 |
|
||||
77 | var select2FileHistorySwitcher = function(targetElement, initialData, state) { |
|
|||
78 | var loadUrl = pyroutes.url('repo_file_history', |
|
|||
79 | {'repo_name': templateContext.repo_name, 'commit_id': state.rev, |
|
|||
80 | 'f_path': state.f_path}); |
|
|||
81 | select2RefBaseSwitcher(targetElement, loadUrl, initialData); |
|
|||
82 | }; |
|
@@ -9,20 +9,23 b'' | |||||
9 | %endif |
|
9 | %endif | |
10 | </%def> |
|
10 | </%def> | |
11 |
|
11 | |||
12 | <%def name="breadcrumbs_links()"> |
|
12 | <%def name="breadcrumbs_links()"></%def> | |
13 | ${_('Audit long entry')} ${c.audit_log_entry.entry_id} |
|
|||
14 | </%def> |
|
|||
15 |
|
13 | |||
16 | <%def name="menu_bar_nav()"> |
|
14 | <%def name="menu_bar_nav()"> | |
17 | ${self.menu_items(active='admin')} |
|
15 | ${self.menu_items(active='admin')} | |
18 | </%def> |
|
16 | </%def> | |
|
17 | ||||
|
18 | <%def name="menu_bar_subnav()"> | |||
|
19 | ${self.admin_menu(active='audit_logs')} | |||
|
20 | </%def> | |||
|
21 | ||||
19 | <%def name="main()"> |
|
22 | <%def name="main()"> | |
20 | <div class="box"> |
|
23 | <div class="box"> | |
21 | <!-- box / title --> |
|
24 | ||
22 | <div class="title"> |
|
25 | <div class="title"> | |
23 | ${self.breadcrumbs()} |
|
26 | ${_('Audit long entry')} ${c.audit_log_entry.entry_id} | |
24 | </div> |
|
27 | </div> | |
25 | <!-- end box / title --> |
|
28 | ||
26 | <div class="table"> |
|
29 | <div class="table"> | |
27 | <div id="user_log"> |
|
30 | <div id="user_log"> | |
28 | <table class="rctable audit-log"> |
|
31 | <table class="rctable audit-log"> |
@@ -8,27 +8,28 b'' | |||||
8 | %endif |
|
8 | %endif | |
9 | </%def> |
|
9 | </%def> | |
10 |
|
10 | |||
11 | <%def name="breadcrumbs_links()"> |
|
11 | <%def name="breadcrumbs_links()"></%def> | |
12 | ${h.form(None, id_="filter_form", method="get")} |
|
|||
13 | <input class="q_filter_box ${'' if c.search_term else 'initial'}" id="j_filter" size="15" type="text" name="filter" value="${c.search_term or ''}" placeholder="${_('filter...')}"/> |
|
|||
14 | <input type='submit' value="${_('filter')}" class="btn" /> |
|
|||
15 | ${_('Audit logs')} - ${_ungettext('%s entry', '%s entries', c.audit_logs.item_count) % (c.audit_logs.item_count)} |
|
|||
16 | ${h.end_form()} |
|
|||
17 | <p class="filterexample" style="position: inherit" onclick="$('#search-help').toggle()">${_('Example Queries')}</p> |
|
|||
18 | <pre id="search-help" style="display: none">${h.tooltip(h.journal_filter_help(request))}</pre> |
|
|||
19 | </%def> |
|
|||
20 |
|
12 | |||
21 | <%def name="menu_bar_nav()"> |
|
13 | <%def name="menu_bar_nav()"> | |
22 | ${self.menu_items(active='admin')} |
|
14 | ${self.menu_items(active='admin')} | |
23 | </%def> |
|
15 | </%def> | |
24 |
|
16 | |||
|
17 | <%def name="menu_bar_subnav()"> | |||
|
18 | ${self.admin_menu(active='audit_logs')} | |||
|
19 | </%def> | |||
|
20 | ||||
25 | <%def name="main()"> |
|
21 | <%def name="main()"> | |
26 | <div class="box"> |
|
22 | <div class="box"> | |
27 | <!-- box / title --> |
|
|||
28 | <div class="title"> |
|
23 | <div class="title"> | |
29 | ${self.breadcrumbs()} |
|
24 | ${h.form(None, id_="filter_form", method="get")} | |
|
25 | <input class="q_filter_box ${'' if c.search_term else 'initial'}" id="j_filter" size="15" type="text" name="filter" value="${c.search_term or ''}" placeholder="${_('filter...')}"/> | |||
|
26 | <input type='submit' value="${_('filter')}" class="btn" /> | |||
|
27 | ${_('Audit logs')} - ${_ungettext('%s entry', '%s entries', c.audit_logs.item_count) % (c.audit_logs.item_count)} | |||
|
28 | ${h.end_form()} | |||
|
29 | <p class="filterexample" style="position: inherit" onclick="$('#search-help').toggle()">${_('Example Queries')}</p> | |||
|
30 | <pre id="search-help" style="display: none">${h.tooltip(h.journal_filter_help(request))}</pre> | |||
30 | </div> |
|
31 | </div> | |
31 | <!-- end box / title --> |
|
32 | ||
32 | <div class="table"> |
|
33 | <div class="table"> | |
33 | <div id="user_log"> |
|
34 | <div id="user_log"> | |
34 | <%include file="/admin/admin_log_base.mako" /> |
|
35 | <%include file="/admin/admin_log_base.mako" /> |
@@ -8,29 +8,26 b'' | |||||
8 | %endif |
|
8 | %endif | |
9 | </%def> |
|
9 | </%def> | |
10 |
|
10 | |||
11 | <%def name="breadcrumbs_links()"> |
|
11 | <%def name="breadcrumbs_links()"></%def> | |
12 | ${h.link_to(_('Admin'),h.route_path('admin_home'))} |
|
|||
13 | » |
|
|||
14 | ${_('Authentication Plugins')} |
|
|||
15 | </%def> |
|
|||
16 |
|
12 | |||
17 | <%def name="menu_bar_nav()"> |
|
13 | <%def name="menu_bar_nav()"> | |
18 | ${self.menu_items(active='admin')} |
|
14 | ${self.menu_items(active='admin')} | |
19 | </%def> |
|
15 | </%def> | |
20 |
|
16 | |||
|
17 | <%def name="menu_bar_subnav()"> | |||
|
18 | ${self.admin_menu(active='authentication')} | |||
|
19 | </%def> | |||
|
20 | ||||
21 | <%def name="main()"> |
|
21 | <%def name="main()"> | |
22 |
|
22 | |||
23 | <div class="box"> |
|
23 | <div class="box"> | |
24 | <div class="title"> |
|
|||
25 | ${self.breadcrumbs()} |
|
|||
26 | </div> |
|
|||
27 |
|
24 | |||
28 | <div class='sidebar-col-wrapper'> |
|
25 | <div class='sidebar-col-wrapper'> | |
29 |
|
26 | |||
30 | <div class="sidebar"> |
|
27 | <div class="sidebar"> | |
31 | <ul class="nav nav-pills nav-stacked"> |
|
28 | <ul class="nav nav-pills nav-stacked"> | |
32 | % for item in resource.get_root().get_nav_list(): |
|
29 | % for item in resource.get_root().get_nav_list(): | |
33 | <li ${'class=active' if item == resource else ''}> |
|
30 | <li ${('class=active' if item == resource else '')}> | |
34 | <a href="${request.resource_path(item, route_name='auth_home')}">${item.display_name}</a> |
|
31 | <a href="${request.resource_path(item, route_name='auth_home')}">${item.display_name}</a> | |
35 | </li> |
|
32 | </li> | |
36 | % endfor |
|
33 | % endfor | |
@@ -66,10 +63,10 b'' | |||||
66 | <th>${_('Plugin ID')}</th> |
|
63 | <th>${_('Plugin ID')}</th> | |
67 | <th>${_('Enabled')}</th> |
|
64 | <th>${_('Enabled')}</th> | |
68 | %for plugin in available_plugins: |
|
65 | %for plugin in available_plugins: | |
69 | <tr class="${'inactive' if (not plugin.is_active() and plugin.get_id() in enabled_plugins) else ''}"> |
|
66 | <tr class="${('inactive' if (not plugin.is_active() and plugin.get_id() in enabled_plugins) else '')}"> | |
70 | <td> |
|
67 | <td> | |
71 | <span plugin_id="${plugin.get_id()}" class="toggle-plugin btn ${'btn-success' if plugin.get_id() in enabled_plugins else ''}"> |
|
68 | <span plugin_id="${plugin.get_id()}" class="toggle-plugin btn ${('btn-success' if plugin.get_id() in enabled_plugins else '')}"> | |
72 | ${_('activated') if plugin.get_id() in enabled_plugins else _('not active')} |
|
69 | ${(_('activated') if plugin.get_id() in enabled_plugins else _('not active'))} | |
73 | </span> |
|
70 | </span> | |
74 | </td> |
|
71 | </td> | |
75 | <td>${plugin.get_display_name()}</td> |
|
72 | <td>${plugin.get_display_name()}</td> |
@@ -2,10 +2,10 b'' | |||||
2 | <%inherit file="/base/base.mako"/> |
|
2 | <%inherit file="/base/base.mako"/> | |
3 |
|
3 | |||
4 | <%def name="title()"> |
|
4 | <%def name="title()"> | |
5 | ${_('Authentication Settings')} |
|
5 | ${_('Authentication Settings')} | |
6 | %if c.rhodecode_name: |
|
6 | %if c.rhodecode_name: | |
7 | · ${h.branding(c.rhodecode_name)}} |
|
7 | · ${h.branding(c.rhodecode_name)}} | |
8 | %endif |
|
8 | %endif | |
9 | </%def> |
|
9 | </%def> | |
10 |
|
10 | |||
11 | <%def name="breadcrumbs_links()"> |
|
11 | <%def name="breadcrumbs_links()"> | |
@@ -17,22 +17,23 b'' | |||||
17 | </%def> |
|
17 | </%def> | |
18 |
|
18 | |||
19 | <%def name="menu_bar_nav()"> |
|
19 | <%def name="menu_bar_nav()"> | |
20 | ${self.menu_items(active='admin')} |
|
20 | ${self.menu_items(active='admin')} | |
|
21 | </%def> | |||
|
22 | ||||
|
23 | <%def name="menu_bar_subnav()"> | |||
|
24 | ${self.admin_menu(active='authentication')} | |||
21 | </%def> |
|
25 | </%def> | |
22 |
|
26 | |||
23 | <%def name="main()"> |
|
27 | <%def name="main()"> | |
|
28 | ||||
24 | <div class="box"> |
|
29 | <div class="box"> | |
25 | <div class="title"> |
|
30 | ||
26 | ${self.breadcrumbs()} |
|
|||
27 | </div> |
|
|||
28 | <div class='sidebar-col-wrapper'> |
|
31 | <div class='sidebar-col-wrapper'> | |
29 |
|
32 | |||
30 | ## TODO: This is repeated in the auth root template and should be merged |
|
|||
31 | ## into a single solution. |
|
|||
32 | <div class="sidebar"> |
|
33 | <div class="sidebar"> | |
33 | <ul class="nav nav-pills nav-stacked"> |
|
34 | <ul class="nav nav-pills nav-stacked"> | |
34 | % for item in resource.get_root().get_nav_list(): |
|
35 | % for item in resource.get_root().get_nav_list(): | |
35 | <li ${'class=active' if item == resource else ''}> |
|
36 | <li ${('class=active' if item == resource else '')}> | |
36 | <a href="${request.resource_path(item, route_name='auth_home')}">${item.display_name}</a> |
|
37 | <a href="${request.resource_path(item, route_name='auth_home')}">${item.display_name}</a> | |
37 | </li> |
|
38 | </li> | |
38 | % endfor |
|
39 | % endfor |
@@ -18,11 +18,12 b'' | |||||
18 | ${self.menu_items(active='admin')} |
|
18 | ${self.menu_items(active='admin')} | |
19 | </%def> |
|
19 | </%def> | |
20 |
|
20 | |||
|
21 | <%def name="menu_bar_subnav()"> | |||
|
22 | ${self.admin_menu(active='defaults')} | |||
|
23 | </%def> | |||
|
24 | ||||
21 | <%def name="main()"> |
|
25 | <%def name="main()"> | |
22 | <div class="box"> |
|
26 | <div class="box"> | |
23 | <div class="title"> |
|
|||
24 | ${self.breadcrumbs()} |
|
|||
25 | </div> |
|
|||
26 |
|
27 | |||
27 | ##main |
|
28 | ##main | |
28 | <div class="sidebar-col-wrapper"> |
|
29 | <div class="sidebar-col-wrapper"> |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: file renamed from rhodecode/templates/changelog/changelog.mako to rhodecode/templates/commits/changelog.mako |
|
NO CONTENT: file renamed from rhodecode/templates/changelog/changelog.mako to rhodecode/templates/commits/changelog.mako | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: file renamed from rhodecode/templates/changelog/changelog_elements.mako to rhodecode/templates/commits/changelog_elements.mako |
|
NO CONTENT: file renamed from rhodecode/templates/changelog/changelog_elements.mako to rhodecode/templates/commits/changelog_elements.mako | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: file renamed from rhodecode/templates/changelog/changelog_file_history.mako to rhodecode/templates/commits/changelog_file_history.mako |
|
NO CONTENT: file renamed from rhodecode/templates/changelog/changelog_file_history.mako to rhodecode/templates/commits/changelog_file_history.mako | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: file renamed from rhodecode/templates/files/files_detail.mako to rhodecode/templates/files/files_source_header.mako |
|
NO CONTENT: file renamed from rhodecode/templates/files/files_detail.mako to rhodecode/templates/files/files_source_header.mako | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: file renamed from rhodecode/templates/files/file_tree_detail.mako to rhodecode/templates/files/files_tree_header.mako |
|
NO CONTENT: file renamed from rhodecode/templates/files/file_tree_detail.mako to rhodecode/templates/files/files_tree_header.mako | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: modified file |
|
NO CONTENT: modified file | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: file was removed |
|
NO CONTENT: file was removed |
1 | NO CONTENT: file was removed |
|
NO CONTENT: file was removed | ||
The requested commit or file is too big and content was truncated. Show full diff |
General Comments 0
You need to be logged in to leave comments.
Login now